Client drops `_meta` from `input_required` results when `allowInputRequired: true` (2026-07-28)
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 90/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- typescript
- Ambito
- api
Direzione di ricerca
Leggi decodeResult in core-internal/src/wire/rev2026-07-28/codec.ts e manualInputRequiredValue in core-internal/src/shared/inputRequiredEngine.ts, iniziando dai rami input_required. Mantieni il _meta a livello di risultato del server attraverso entrambe le trasformazioni, quindi verifica che la riproduzione HTTP reale fornita restituisca i metadati da client.callTool.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the bug
With protocol revision 2026-07-28, a client that calls a tool with { allowInputRequired: true } gets an InputRequiredResult that has no _meta, even when the server's result includes _meta.
InputRequiredResult is a Result, so _meta is valid on it, and the SDK's own InputRequiredResultSchema (wireResult(...)) includes _meta. But the manual input_required path rebuilds the result from only inputRequests and requestState, so the field is lost. A server cannot send result-level metadata (for example display hints for the inputRequests) to a client that fulfils rounds by itself.
Where it happens
The field is dropped in two places:
core-internal/src/wire/rev2026-07-28/codec.ts, indecodeResult, in theinput_requiredbranch:return { kind: 'input_required', inputRequests, ...(typeof requestState === 'string' && { requestState }) };core-internal/src/shared/inputRequiredEngine.ts, inmanualInputRequiredValue:return { resultType: 'input_required', inputRequests: decoded.inputRequests, ...(decoded.requestState !== undefined && { requestState: decoded.requestState }) };
The transport's JSONRPCMessageSchema.parse keeps result._meta. The field is lost only in these two steps.
To reproduce
Server: return this from a tools/call handler:
{
"resultType": "input_required",
"requestState": "state-1",
"inputRequests": {
"approval": {
"method": "elicitation/create",
"params": { "mode": "form", "message": "Allow?", "requestedSchema": { "type": "object", "properties": {} } }
}
},
"_meta": { "example/hint": { "tools": ["a"] } }
}
Client:
const client = new Client(
{ name: "repro", version: "0.0.0" },
{
capabilities: { elicitation: { form: {} } },
supportedProtocolVersions: ["2026-07-28"],
versionNegotiation: { mode: { pin: "2026-07-28" } },
inputRequired: { autoFulfill: false },
},
);
await client.connect(new StreamableHTTPClientTransport(new URL(url)));
const result = await client.callTool({ name: "tool", arguments: {} }, { allowInputRequired: true });
console.log(result._meta); // undefined
Expected behavior
result._meta equals the _meta that the server sent, the same as for a complete result.
Actual behavior
result._meta is undefined.
Suggested fix
Carry _meta through both steps:
// codec.ts, input_required branch
const meta = raw['_meta'];
return {
kind: 'input_required',
inputRequests,
...(typeof requestState === 'string' && { requestState }),
...(isPlainObject(meta) && { _meta: meta })
};
// inputRequiredEngine.ts
return {
resultType: 'input_required',
inputRequests: decoded.inputRequests as InputRequiredResult['inputRequests'],
...(decoded.requestState !== undefined && { requestState: decoded.requestState }),
...(decoded._meta !== undefined && { _meta: decoded._meta })
};
We use this change as a local pnpm patch on @modelcontextprotocol/[email protected], and a real-HTTP test confirms that _meta reaches the caller.
Versions
@modelcontextprotocol/client2.0.0 (the same code is in 2.1.0)- Protocol revision
2026-07-28 - Node.js 22.19.0
- Lingua principale
- TypeScript
- Stelle
- 13.5k
- Fork
- 2.2k
- Merge medio
- 5g 3h
- PR unite (30g)
- 4
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di modelcontextprotocol/typescript-sdk
-
v1 v2
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
modelcontextprotocol/typescript-sdk#2867 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
v1 v2
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
modelcontextprotocol/typescript-sdk#2854 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
v1 v2
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
modelcontextprotocol/typescript-sdk#2843 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Auth metadata discovery: fallback URL built on resource host instead of authorization-server hostApertav1 v2
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
modelcontextprotocol/typescript-sdk#2784 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
v1 v2
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
modelcontextprotocol/typescript-sdk#2783 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di modelcontextprotocol/typescript-sdk
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
rohitg00/agentmemory#1428 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
boxlite-ai/boxlite#1729 ·
I maintainer di solito rispondono entro 1 giorno
-
detectors enhancement good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
SM260845/readme-gen#1 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
angular/angularfire#3774 ·
I maintainer di solito rispondono entro 2 giorni