mcp: streamable client keeps the session ID from a rejected server/discover, so the fallback initialize fails

Đang mở
#1,522 1 bình luận 0 reaction 1 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@simon0191 đang làm issue này rồi.

Từ ngày 13/11/2026.

  • #1523 của @simon0191 — đang mở

Đánh giá

Issue này chưa được đánh giá.

Mô tả

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.

Ngôn ngữ chính
Go
Star
5.3k
Fork
614
Merge trung bình
23 giờ 55 phút
Pull request đã merge (30 ngày)
62

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của modelcontextprotocol/go-sdk

Tất cả issue của modelcontextprotocol/go-sdk

Issue tương tự

Thêm issue về Go

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.