Skip to content

Tasks requests over Streamable HTTP omit the required Mcp-Name header (SEP-2663) #1917

Description

@jwcarman

Summary

When driving the io.modelcontextprotocol/tasks extension (protocol 2026-07-28),
Inspector sends tasks/get / tasks/update / tasks/cancel without the Mcp-Name
header. SEP-2663's Streamable HTTP binding makes that header a client MUST for
these methods, so a conforming server rejects every task poll with a JSON-RPC
-32020 (HeaderMismatch) and HTTP 400 — task-based tools are unusable from
Inspector against strict servers.

Spec citation (SEP-2663, Streamable HTTP transport binding)

When tasks/get, tasks/update, or tasks/cancel is sent over the Streamable
HTTP transport, the client MUST set the Mcp-Name header to the value of
params.taskId. This allows transport intermediaries and load balancers to route
subsequent requests for the same task to the server instance holding its state,
which is typically required for correctness. The Mcp-Method header is set to
the JSON-RPC method name per standard header conventions.

Note the MUST is unconditional: even against servers that keep task state in a
shared store (and don't need routing affinity for correctness), the client is
required to send the header so intermediaries can route for the servers that do.

Reproduction

  1. Start any 2026-07-28 server that validates transport routing headers and
    exposes a task-augmented tool (observed against mocapi's
    tasks example, which validates headers before dispatch per the transport prose).
  2. In Inspector, call the task tool (the tools/call itself succeeds — Inspector
    correctly sends Mcp-Method and Mcp-Name: <tool name> there).
  3. Inspector's follow-up tasks/get poll fails.

Actual — request is sent with Mcp-Method: tasks/get but no Mcp-Name;
server responds HTTP 400:

{"jsonrpc":"2.0","error":{"code":-32020,"message":"HeaderMismatch: missing required header Mcp-Name for method tasks/get"},"id":1}

Expected — per the SEP, the request carries:

Mcp-Method: tasks/get
Mcp-Name: <params.taskId>

and the poll succeeds.

Fix

Wherever Inspector builds Streamable HTTP requests for the tasks extension, set
Mcp-Name to params.taskId for all three methods (tasks/get, tasks/update,
tasks/cancel) — mirroring the existing behavior for tools/call (params.name),
prompts/get (params.name), and resources/read (params.uri).

(Possibly related to the header work tracked in #1628, which is closed.)

Environment

  • Inspector: 2.0.0
  • Protocol: 2026-07-28, tasks extension (SEP-2663)
  • Server: mocapi 1.3.0-SNAPSHOT (Streamable HTTP, header validation per transport prose)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions