Initial Checks
Description
[BUG] MCP Python SDK sessionId not maintained in browser with TypeScript SDK client
Issue: MCP Python SDK as Server, TypeScript SDK as Client – Node.js works, browser session management fails
Description
When using the official MCP Python SDK (fastmcp) as the server and the TypeScript SDK as the client, session management (mcp-session-id) works correctly in Node.js, but fails in browser environments. This results in repeated "Missing session ID" errors or lost sessions for every request.
Environment
- Server: MCP Python SDK (
fastmcp), streamable_http_app, Starlette/uvicorn - Client: TypeScript SDK (
@modelcontextprotocol/sdk), StreamableHTTPClientTransport - Node.js: Session management works out of the box
- Browser (React/Vitest): Session cannot be maintained
- All code is reverted to official logic, no monkey patching or custom fetch
Key Code Snippets
Server (http-server-streamable.py):
app=mcp.streamable_http_app()
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"]
)
uvicorn.run(app, host="127.0.0.1", port=8000)
Client (mcpService.ts):
// MCPService (browser and Node.js):consttransport=newStreamableHTTPClientTransport(newURL(this.url));awaitmcp.connect(transport);// In browser, MCPService does not automatically manage sessionId between requests.// The first response from the server includes Mcp-Session-Id, but MCPService does not persist or inject it for subsequent requests.// In Node.js, sessionId is managed via cookies and works as expected.
Test Case (mcp-streamable-browser.test.ts):
import{describe,it,expect}from'vitest';import{MCPService}from'../../../engine/service/mcpService';describe('MCPService streamable http tool list',()=>{it('should fetch tool list from MCP Python server',async()=>{constmcp=newMCPService('http://127.0.0.1:8000/mcp','STREAMABLE_HTTP');constresult=awaitPromise.race([mcp.listTools(),newPromise<{data: null;error: string}>(resolve=>setTimeout(()=>resolve({data: null,error: 'timeout'}),5000))]);const{ data, error }=resultas{data: any;error: any};console.log('Tool list:',data,error);console.log('SessionId:',mcp['transport']?.sessionId);});});Steps to Reproduce
- Start MCP Python server with the CORS config above (expose_headers tried, but does not help).
- The SDK makes two requests: the first response from the server includes a valid
Mcp-Session-Id header, but the client does not send the sessionId in the header for the second request, causing session management to fail. - Same code in Node.js maintains sessionId correctly.
Expected Behavior
- Browser environment should maintain session just like Node.js, with
mcp-session-id correctly read and reused, so all requests are in the same session.
Request
- Please confirm if there is a bug in the TypeScript SDK sessionId handling for browsers, or a compatibility issue in the Python SDK server.
- Please provide best practices or a fix for browser session management.
Log Output
Please see the following log output for reference:
1st fetch 200ok
{"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"mcp-client","version":"1.0.0"}},"jsonrpc":"2.0","id":0}
response header
...
mcp-session-id:68709f581d3740ae82a3dcb523f0ac8c
...
request header (dont have mcp-session-id)
2st fetch 400 Bad Request
{"method":"notifications/initialized","jsonrpc":"2.0"}
{
"jsonrpc": "2.0",
"id": "server-error",
"error": {
"code": -32600,
"message": "Bad Request: Missing session ID"
}
}
response header
...
mcp-session-id:44295e965b524e97b45ccf6351201c13
...
request header (dont have mcp-session-id)
nodejs test log out Tool list: [ ... ] undefined ([explain,not test log] sucess get toollist,no error)
SessionId: a9911fbfa8fa4eb78dad791b2dddfc33
Python & MCP Python SDK
python python version 3.12
mcp 1.9.2
typescript
@modelcontextprotocol/sdk": "^1.13.0
node version v22.17.0
Other information
When both the MCP server and client use the official TypeScript SDK, session management works as expected.
Initial Checks
Description
[BUG] MCP Python SDK sessionId not maintained in browser with TypeScript SDK client
Issue: MCP Python SDK as Server, TypeScript SDK as Client – Node.js works, browser session management fails
Description
When using the official MCP Python SDK (
fastmcp) as the server and the TypeScript SDK as the client, session management (mcp-session-id) works correctly in Node.js, but fails in browser environments. This results in repeated "Missing session ID" errors or lost sessions for every request.Environment
fastmcp),streamable_http_app, Starlette/uvicorn@modelcontextprotocol/sdk),StreamableHTTPClientTransportKey Code Snippets
Server (
http-server-streamable.py):Client (
mcpService.ts):Test Case (
mcp-streamable-browser.test.ts):Steps to Reproduce
Mcp-Session-Idheader, but the client does not send the sessionId in the header for the second request, causing session management to fail.Expected Behavior
mcp-session-idcorrectly read and reused, so all requests are in the same session.Request
Log Output
Please see the following log output for reference:
Python & MCP Python SDK
Other information
When both the MCP server and client use the official TypeScript SDK, session management works as expected.