modelcontextprotocol / modelcontextprotocol/python-sdk

FastMCP server death on client HEAD calls

Open
#1,269 6 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug P2 ready for work
Dominant language
Python
Stars
24.3k
Forks
4k
Avg merge
1d 1h
Merged PRs (30d)
31

Description

Initial Checks
Description

I am using streamable HTTP for MCP. I see HTTP HEAD calls in the log which killing the server. I expect the server to be resilient to poor user behavior.

My code:
https://github.com/deephaven/deephaven-mcp/tree/main/src/deephaven_mcp/mcp_docs_server

Example logs:

2025-08-13 09:29:26.178 PDT
[2025-08-13 16:29:26,179] INFO: [mcp_docs_server:app_lifespan] MCP docs server ready and yielding context
2025-08-13 09:29:26.179 PDT
INFO: 169.254.169.126:65146 - "HEAD /mcp HTTP/1.1" 405 Method Not Allowed
2025-08-13 09:29:26.179 PDT
[2025-08-13 16:29:26,180] INFO: Terminating session: None
2025-08-13 09:29:26.183 PDT
[2025-08-13 16:29:26,180] ERROR: Error in message router
2025-08-13 09:29:26.183 PDT
Traceback (most recent call last):
  File "/app/.venv/lib/python3.12/site-packages/mcp/server/streamable_http.py", line 831, in message_router
    async for session_message in write_stream_reader:
  File "/app/.venv/lib/python3.12/site-packages/anyio/abc/_streams.py", line 41, in __anext__
    return await self.receive()

2025-08-13 09:29:26.183 PDT
^^^^^^^^^^^^^^^^^^^^
2025-08-13 09:29:26.183 PDT
File "/app/.venv/lib/python3.12/site-packages/anyio/streams/memory.py", line 111, in receive
2025-08-13 09:29:26.183 PDT
return self.receive_nowait()
2025-08-13 09:29:26.183 PDT
^^^^^^^^^^^^^^^^^^^^^
2025-08-13 09:29:26.183 PDT
File "/app/.venv/lib/python3.12/site-packages/anyio/streams/memory.py", line 93, in receive_nowait
2025-08-13 09:29:26.183 PDT
raise ClosedResourceError
2025-08-13 09:29:26.183 PDT
anyio.ClosedResourceError
2025-08-13 09:29:26.183 PDT
[2025-08-13 16:29:26,184] INFO: [mcp_docs_server:app_lifespan] Context manager exiting normally
2025-08-13 09:29:26.184 PDT
[2025-08-13 16:29:26,184] INFO: [mcp_docs_server:app_lifespan] Final memory usage: 109.02 MB
2025-08-13 09:29:26.184 PDT
[2025-08-13 16:29:26,184] INFO: [mcp_docs_server:app_lifespan] Final CPU percent: 0.0%
2025-08-13 09:29:26.184 PDT
[2025-08-13 16:29:26,184] INFO: [mcp_docs_server:app_lifespan] Final open file descriptors: 11
2025-08-13 09:29:26.184 PDT
[2025-08-13 16:29:26,185] INFO: [mcp_docs_server:app_lifespan] shutdown active asyncio tasks: 3
2025-08-13 09:29:26.184 PDT
[2025-08-13 16:29:26,185] WARNING: [mcp_docs_server:app_lifespan] Running tasks during shutdown: 3
2025-08-13 09:29:26.184 PDT
[2025-08-13 16:29:26,185] WARNING: [mcp_docs_server:app_lifespan] Running task 1: mcp.server.streamable_http_manager.StreamableHTTPSessionManager._handle_stateless_request.<locals>.run_stateless_server
2025-08-13 09:29:26.184 PDT
[2025-08-13 16:29:26,185] WARNING: [mcp_docs_server:app_lifespan] Running task 2: Task-2
2025-08-13 09:29:26.184 PDT
[2025-08-13 16:29:26,185] WARNING: [mcp_docs_server:app_lifespan] Running task 3: mcp.server.fastmcp.server.FastMCP.run_streamable_http_async
2025-08-13 09:29:26.184 PDT
[2025-08-13 16:29:26,185] INFO: [mcp_docs_server:app_lifespan] shutdown active threads: 1
2025-08-13 09:29:26.185 PDT
[2025-08-13 16:29:26,185] INFO: [mcp_docs_server:app_lifespan] MCP docs server shutting down

My attempts to work around this problem are in this PR. You would need to look at the whole history of what I tried. I included different middleware changes, increasing versions, etc.
https://github.com/deephaven/deephaven-mcp/pull/89

Example Code
My code:
https://github.com/deephaven/deephaven-mcp/tree/main/src/deephaven_mcp/mcp_docs_server
Python & MCP Python SDK
The build can be found at https://github.com/deephaven/deephaven-mcp/blob/main/ops/docker/mcp-docs/Dockerfile.  It is python 3.12 with the latest mcp (version >= 1.12.4).

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Read mcp/server/streamable_http.py, especially message_router, and follow the FastMCP.run_streamable_http_async entry point described in the traceback. Reproduce a HEAD request against the streamable HTTP endpoint, review the attempted middleware and version changes in deephaven-mcp PR #89, and verify that the server remains running without an unexpected ClosedResourceError shutdown.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
api, backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.