Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Client drops `_meta` from `input_required` results when `allowInputRequired: true` (2026-07-28)

Aperta Adatta ai principianti
#2,861 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

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

v2
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:

  1. core-internal/src/wire/rev2026-07-28/codec.ts, in decodeResult, in the input_required branch:
    return {
        kind: 'input_required',
        inputRequests,
        ...(typeof requestState === 'string' && { requestState })
    };
    
  2. core-internal/src/shared/inputRequiredEngine.ts, in manualInputRequiredValue:
    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/client 2.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

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di modelcontextprotocol/typescript-sdk

Tutte le issue di modelcontextprotocol/typescript-sdk

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.