What happened?
With mcp==2.1.0, a tool registered through the high-level mcp.server.mcpserver.MCPServer API receives mcp.server.mcpserver.Context. That context does not expose a public cancel_requested event, although the lower-level mcp.shared.context.BaseContext does.
from mcp.server.mcpserver.context import Context as MCPServerContext
from mcp.shared.context import BaseContext
assert not hasattr(MCPServerContext, "cancel_requested")
assert hasattr(BaseContext, "cancel_requested")
The server dispatcher processes notifications/cancelled and holds the event in its per-request dispatch context, but normal tool handlers cannot cooperatively observe it through the supported high-level context API. A handler that owns cleanup-sensitive work (for example, a bounded child process) must either rely only on task interruption or traverse private session/dispatch internals to relay cancellation.
Expected behavior
Expose the current request's cancellation event on the high-level tool context (for example, await ctx.cancel_requested.wait()), or document an equivalent supported API. It should allow a handler to trigger its own cooperative cleanup without using private SDK attributes.
If this is already addressed in a later release, a version pointer would also resolve the report; the reproduction above is against 2.1.0.
Reproduction steps
- Install
mcp==2.1.0.
- Register an async tool with
MCPServer that accepts its injected Context.
- Attempt to access
ctx.cancel_requested; the attribute is absent.
- Compare with
BaseContext.cancel_requested, which is present.
SDK version
mcp==2.1.0 (Python 3.12)
Area
Server / high-level MCPServer tool context API.
AI assistance disclosure: drafted with AI assistance; the reporter is responsible for this report.
What happened?
With
mcp==2.1.0, a tool registered through the high-levelmcp.server.mcpserver.MCPServerAPI receivesmcp.server.mcpserver.Context. That context does not expose a publiccancel_requestedevent, although the lower-levelmcp.shared.context.BaseContextdoes.The server dispatcher processes
notifications/cancelledand holds the event in its per-request dispatch context, but normal tool handlers cannot cooperatively observe it through the supported high-level context API. A handler that owns cleanup-sensitive work (for example, a bounded child process) must either rely only on task interruption or traverse private session/dispatch internals to relay cancellation.Expected behavior
Expose the current request's cancellation event on the high-level tool context (for example,
await ctx.cancel_requested.wait()), or document an equivalent supported API. It should allow a handler to trigger its own cooperative cleanup without using private SDK attributes.If this is already addressed in a later release, a version pointer would also resolve the report; the reproduction above is against 2.1.0.
Reproduction steps
mcp==2.1.0.MCPServerthat accepts its injectedContext.ctx.cancel_requested; the attribute is absent.BaseContext.cancel_requested, which is present.SDK version
mcp==2.1.0(Python 3.12)Area
Server / high-level
MCPServertool context API.AI assistance disclosure: drafted with AI assistance; the reporter is responsible for this report.