modelcontextprotocol / modelcontextprotocol/ext-apps
`tools/call` requests no longer echo `Mcp-Session-Id` (violates Streamable HTTP spec)
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 2.9k
- Forks
- 387
- Avg merge
- 3h 21m
- Merged PRs (30d)
- 6
Description
Describe the bug
ChatGPT (host) no longer sends Mcp-Session-Id back to the server on tools/call requests, violating the Streamable HTTP transport rule that clients MUST include the session id on all subsequent HTTP requests once the server returned one during initialization.
If an
Mcp-Session-Idis returned by the server during initialization, clients using the Streamable HTTP transport MUST include it in theMcp-Session-Idheader on all of their subsequent HTTP requests.
— Spec 2025-11-25 / Streamable HTTP / session management
sequenceDiagram
participant CTRL as ChatGPT (CTRL plane)<br/>UA: openai-mcp/1.0.0 (ChatGPT)
participant TOOL as ChatGPT (TOOL plane)<br/>UA: openai-mcp/1.0.0
participant Server as MCP Server
CTRL->>Server: POST initialize
Server-->>CTRL: Mcp-Session-Id: ctrl-aaa
CTRL->>Server: POST tools/list (Mcp-Session-Id: ctrl-aaa) ✅
CTRL->>Server: POST resources/read (Mcp-Session-Id: ctrl-aaa) ✅
TOOL->>Server: POST initialize
Server-->>TOOL: Mcp-Session-Id: tool-bbb
TOOL->>Server: POST tools/call (no Mcp-Session-Id) ❌
TOOL->>Server: POST tools/call (no Mcp-Session-Id) ❌
Note over TOOL,Server: Subsequent tool calls never carry the session id<br/>→ server falls into stateless code path<br/>→ capabilities learned at initialize are lost
To Reproduce
Steps to reproduce the behavior:
- Stand up a Streamable HTTP MCP server that returns
Mcp-Session-Idoninitialize. - Connect from ChatGPT and trigger any tool that produces multiple
tools/callrequests (e.g. a polling tool driven by an MCP App / widget). - Inspect inbound HTTP headers grouped by
User-Agent:openai-mcp/1.0.0 (ChatGPT)requests carryMcp-Session-Id.openai-mcp/1.0.0tools/callrequests do not.
Expected behavior
Per the Streamable HTTP transport spec: once the server returns Mcp-Session-Id on a plane's initialize, every subsequent request on that plane — including tools/call — MUST include the Mcp-Session-Id header.
Logs
Additional context
On ChatGPT web it seems ok, as of writing this, but iOS App and MacOS App still do not echo id.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by tracing the TypeScript Streamable HTTP transport handling for initialization and subsequent tools/call requests, then reproduce the behavior with a server that returns Mcp-Session-Id. Done means tools/call requests from the affected client plane consistently include the session header, matching the specification and the issue's expected request sequence.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- api
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100