Title: Expose session, auth, and transport information on handler Context · Issue #2098 · modelcontextprotocol/python-sdk · GitHub
Open Graph Title: Expose session, auth, and transport information on handler Context · Issue #2098 · modelcontextprotocol/python-sdk
X Title: Expose session, auth, and transport information on handler Context · Issue #2098 · modelcontextprotocol/python-sdk
Description: Problem Users consistently need access to transport-level information from inside tool, resource, and prompt handlers. Today, this data exists in the system but is not accessible through the Context object that handlers receive. There ar...
Open Graph Description: Problem Users consistently need access to transport-level information from inside tool, resource, and prompt handlers. Today, this data exists in the system but is not accessible through the Contex...
X Description: Problem Users consistently need access to transport-level information from inside tool, resource, and prompt handlers. Today, this data exists in the system but is not accessible through the Contex...
Opengraph URL: https://github.com/modelcontextprotocol/python-sdk/issues/2098
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Expose session, auth, and transport information on handler Context","articleBody":"## Problem\n\nUsers consistently need access to transport-level information from inside tool, resource, and prompt handlers. Today, this data exists in the system but is not accessible through the `Context` object that handlers receive.\n\nThere are three categories of information users are asking for:\n\n### Session identity\n\nUsers need to identify which client session they are serving — for per-session state, logging, debugging, or multi-tenant scenarios. The session ID exists at the transport layer (e.g., `Mcp-Session-Id` header for streamable HTTP, UUID query param for SSE) but there is no way to read it from a handler.\n\n- #485 — \"How to get session_id in tool\"\n- #942 — \"How to expose mcp_session_id to user?\"\n\n### Auth credentials\n\nUsers completing an OAuth flow need to access the authenticated token or claims inside their handlers. The auth middleware already validates tokens and stores them in a `ContextVar` (`auth_context_var`), but `Context` does not expose this.\n\n- #638 — \"FastMCP Auth Context in tools\"\n\n### Transport metadata (HTTP headers, client info)\n\nUsers need access to HTTP request headers, client IP, or other request-level metadata. The Starlette `Request` object is passed through as `ServerMessageMetadata.request_context` and lands on `ServerRequestContext.request`, but it is typed as `Any` and not surfaced on `Context`.\n\n- #750 — \"How to get HTTP request headers in tools\"\n- #375 — \"Passing client context to tools\"\n\n## Current state\n\nThe underlying data is available in the system — it just is not reachable from `Context`:\n\n- **Session ID**: managed by `StreamableHTTPSessionManager` / `SseServerTransport`, not exposed to handlers\n- **Auth info**: stored in `auth_context_var` by `AuthContextMiddleware`, not exposed to handlers\n- **HTTP request**: passed through as `request_context: Any` on `ServerMessageMetadata`, available on `ServerRequestContext.request` but not on `Context`\n\n## Scope\n\nThis issue is about designing and implementing access to these three categories of information on the handler `Context`. Key design considerations:\n\n- Behavior varies by transport — stdio has no session ID, headers, or auth; stateless HTTP has no session ID; SSE has a different session ID mechanism than streamable HTTP\n- The solution should work for both MCPServer (high-level) and low-level server handlers\n- Should be consistent with the direction of #2021 (typed transport context) and #1684 (explicit context parameters)\n\n## Prior art\n\n- PR #1608 — adds `ctx.session_id` by threading through `InitializationOptions` → `ServerSession` → `RequestContext` → `Context`\n\n## Related issues\n\n- #2021 — Refactor handler context to be transport- and handler-type-aware (v2 architectural)\n- #1684 — Refactor global contextvars into explicit parameters (v2 architectural)\n- #2054 — Add dependency injection support to MCPServer (v2 architectural)\n\n\u003csub\u003e[AI Disclaimer](https://gist.github.com/maxisbey/6123d132484e4c533eab519a2800693d)\u003c/sub\u003e","author":{"url":"https://github.com/maxisbey","@type":"Person","name":"maxisbey"},"datePublished":"2026-02-19T13:20:17.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/2098/python-sdk/issues/2098"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:5ba5df81-b05e-47cf-15fe-b71253982d0c |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 9FDE:38BA0C:2BDD1EA:3F9E638:6A60DE04 |
| html-safe-nonce | 9befbc4ac16b5a908bf0b422196e73c1362f24eb95d71b8d307cfd4db8ee4d65 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5RkRFOjM4QkEwQzoyQkREMUVBOjNGOUU2Mzg6NkE2MERFMDQiLCJ2aXNpdG9yX2lkIjoiMjczMTAzNjkxNzgwNzI0Mjc1NiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | ef9f06e06c7ac70fa5afc6bb4e4e3dad710d31b00e7ffae532db1873a0169356 |
| hovercard-subject-tag | issue:3962964311 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/modelcontextprotocol/python-sdk/2098/issue_layout |
| twitter:image | https://opengraph.githubassets.com/f11648348b97eee2858a9d73905767c0e742de9c85b39cb206ebc5b0626b8353/modelcontextprotocol/python-sdk/issues/2098 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/f11648348b97eee2858a9d73905767c0e742de9c85b39cb206ebc5b0626b8353/modelcontextprotocol/python-sdk/issues/2098 |
| og:image:alt | Problem Users consistently need access to transport-level information from inside tool, resource, and prompt handlers. Today, this data exists in the system but is not accessible through the Contex... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | maxisbey |
| hostname | github.com |
| expected-hostname | github.com |
| None | 8302bdfafed4cf34ac9c1d3593108fafa53bc3f86b893907e38fa6bdd74361ac |
| turbo-cache-control | no-preview |
| go-import | github.com/modelcontextprotocol/python-sdk git https://github.com/modelcontextprotocol/python-sdk.git |
| octolytics-dimension-user_id | 182288589 |
| octolytics-dimension-user_login | modelcontextprotocol |
| octolytics-dimension-repository_id | 862584018 |
| octolytics-dimension-repository_nwo | modelcontextprotocol/python-sdk |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 862584018 |
| octolytics-dimension-repository_network_root_nwo | modelcontextprotocol/python-sdk |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | c3c2ff0c76b34772c83c9498a08cefee28f53da0 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width