Skip to content

fix(examples): return 404 for invalid session IDs#1707

Open
owendevereaux wants to merge 2 commits intomodelcontextprotocol:mainfrom
owendevereaux:fix/invalid-session-id-404
Open

fix(examples): return 404 for invalid session IDs#1707
owendevereaux wants to merge 2 commits intomodelcontextprotocol:mainfrom
owendevereaux:fix/invalid-session-id-404

Conversation

@owendevereaux
Copy link

Summary

Fixes #389

The streamable HTTP server examples were returning HTTP 400 for both missing and invalid session IDs. Per the MCP spec, these should be handled differently:

  • Missing session ID (non-init request) → 400 Bad Request
  • Invalid session ID (not found) → 404 Not Found

The 404 status is important because it signals to clients that they should start a new session. Per the spec:

When a client receives HTTP 404 in response to a request containing an Mcp-Session-Id, it MUST start a new session

Changes

Updated all streamable HTTP examples to differentiate between missing and invalid session IDs:

  • jsonResponseStreamableHttp.ts
  • simpleStreamableHttp.ts (POST, GET, DELETE handlers)
  • standaloneSseWithGetStreamableHttp.ts (POST, GET handlers)
  • elicitationFormExample.ts (POST, GET, DELETE handlers)
  • elicitationUrlExample.ts (POST, GET, DELETE handlers)
  • simpleTaskInteractive.ts (POST, GET, DELETE handlers)

Testing

Manually verified the logic by code review. The changes are straightforward: split the existing !sessionId || !transports[sessionId] checks into separate conditions with appropriate status codes.

Spec Reference

From the MCP Transport specification:

Servers that require a session ID SHOULD respond to requests without an Mcp-Session-Id header (other than initialization) with HTTP 400 Bad Request.

When a client receives HTTP 404 in response to a request containing an Mcp-Session-Id, it MUST start a new session by sending a new InitializeRequest without a session ID attached.

Fixes modelcontextprotocol#389

The streamable HTTP server examples were returning 400 for both
missing and invalid session IDs. Per the MCP spec:

- Missing session ID (non-init request) → 400 Bad Request
- Invalid session ID (not found) → 404 Not Found

The 404 status is important because it signals to clients that
they should start a new session (per spec: 'When a client receives
HTTP 404 in response to a request containing an Mcp-Session-Id,
it MUST start a new session').

Updated the following examples:
- jsonResponseStreamableHttp.ts
- simpleStreamableHttp.ts (POST, GET, DELETE handlers)
- standaloneSseWithGetStreamableHttp.ts (POST, GET handlers)
- elicitationFormExample.ts (POST, GET, DELETE handlers)
- elicitationUrlExample.ts (POST, GET, DELETE handlers)
- simpleTaskInteractive.ts (POST, GET, DELETE handlers)
@owendevereaux owendevereaux requested a review from a team as a code owner March 19, 2026 03:59
@changeset-bot
Copy link

changeset-bot bot commented Mar 19, 2026

🦋 Changeset detected

Latest commit: 64c7a4a

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Streamable HTTP examples use incorrect status code for invalid session IDs

2 participants