mcp: streamable client keeps the session ID from a rejected server/discover, so the fallback initialize fails
Maintainers usually reply within 1 day
Assessment
This issue has not been assessed yet.
Description
Checklist
- I searched the existing issues, and this has not been reported before.
- This is a real problem that I ran into myself, using the latest release of the SDK.
- I ran into it in a production system, not in a toy example, a benchmark, or an automated or AI-driven scan of the code.
- I (a human) examined the relevant SDK code, and wrote or reviewed every line of this report. It is not unreviewed AI output.
- This report is brief and concise, and sticks to the facts needed to understand the problem.
What happened?
Client.Connect over StreamableClientTransport fails with mismatching session IDs against a legacy (2025-06-18) server that answers server/discover with HTTP 200, a JSON-RPC -32601 error, and an Mcp-Session-Id header.
streamableClientConn.Write stores the session ID from the rejected discover response. The fallback initialize is then sent with that ID, the server assigns a new one, and the session-ID check in streamable.go fails. Servers that reject server/discover with HTTP 400 are not affected, because checkResponse returns before the header is read.
Expected: the fallback initialize is sent without a session ID, and the session uses the ID returned with the InitializeResult. Under 2025-11-25 a session ID is assigned "on the HTTP response containing the InitializeResult", and 2026-07-28 has no sessions, so a session ID on a server/discover response should not be kept.
How to reproduce
// The server sets Mcp-Session-Id: discover-session on its -32601 reply to server/discover,
// and Mcp-Session-Id: initialize-session on its reply to initialize.
cs, err := mcp.NewClient(impl, nil).Connect(ctx, &mcp.StreamableClientTransport{Endpoint: url}, nil)
// err: mismatching session IDs "discover-session" and "initialize-session"
Where did you hit this?
An MCP gateway that uses go-sdk to list and call tools on third-party remote MCP servers.
Go MCP SDK version
v1.8.0 (also on main at 328036e)
Go version
go1.26
Proposed fix
Skip storing the session ID when the request is server/discover. I have a one-line change with a table test covering the 200/-32601 case and the existing HTTP 400 rejection shapes, and I'm happy to send it if this is assigned to me.
AI disclosure: I used Claude Code to trace the code and draft this report, and I reviewed it.
- Dominant language
- Go
- Stars
- 5.3k
- Forks
- 614
- Avg merge
- 23h 55m
- Merged PRs (30d)
- 62
Getting set up
Starts the project's dev container in your browser, under your own GitHub account.
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing 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.
More from modelcontextprotocol/go-sdk
-
mcp: typed tool handlers lose wrapped JSON-RPC errorsMay be free again A pull request for this issue was closed without being merged. Open
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
modelcontextprotocol/go-sdk#1529 · 1 comment ·
Maintainers usually reply within 1 day
-
Expose generic `SendNotification` on `ServerSession` for custom protocol extensionsMay be free again A pull request for this issue was closed without being merged. Openneeds investigation
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
modelcontextprotocol/go-sdk#745 · 13 comments · 1 reaction ·
Maintainers usually reply within 1 day
-
mcp: ClientSession.ReadResource keeps uncacheable and expired results until the session endsMay be free again A pull request for this issue was closed without being merged. Open
Difficulty 3/5 1-2 days Newbie friendliness 74/100
modelcontextprotocol/go-sdk#1526 ·
Maintainers usually reply within 1 day
-
auth: OAuth client rejects protected resource metadata when the MCP server URL has a query stringPossibly taken @beiryu claimed this 2 days ago. Open
Difficulty 3/5 1-2 days Newbie friendliness 74/100
modelcontextprotocol/go-sdk#1519 · 2 comments ·
Maintainers usually reply within 1 day
-
`ping` and `logging/setLevel` still sent for protocol 2026-07-28Possibly taken @nahapetyan-serob claimed this 1 day ago. Open
Difficulty 3/5 1-2 days Newbie friendliness 65/100
modelcontextprotocol/go-sdk#1518 · 1 comment · 1 assignee ·
Maintainers usually reply within 1 day
All issues in modelcontextprotocol/go-sdk
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
-
evener-transcript-v2-upgrade tool still scans transcript files through bufio's 4 KiB default bufferOpen
Difficulty 1/5 Under an hour Newbie friendliness 78/100
prime-radiant-inc/evener#6370 ·
Maintainers usually reply within 1 day
-
ManageSieve proxy: a backend's NO/BYE greeting is skipped as a capability line and reported as EOFOpenbug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Mend: dependency security vulnerability
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
-
Mend: dependency security vulnerability
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
ManageIQ/manageiq-pods#1476 ·
Maintainers usually reply within 1 day