modelcontextprotocol / modelcontextprotocol/python-sdk

Expose session, auth, and transport information on handler Context

未关闭
#2,098 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

enhancement P1 v2
主要语言
Python
星标
24.3k
派生
4k
平均合并
1 天 1 小时
30 天内合并 PR
31

描述

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 are three categories of information users are asking for:

Session identity

Users 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.

  • #485 — "How to get session_id in tool"
  • #942 — "How to expose mcp_session_id to user?"
Auth credentials

Users 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.

  • #638 — "FastMCP Auth Context in tools"
Transport metadata (HTTP headers, client info)

Users 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.

  • #750 — "How to get HTTP request headers in tools"
  • #375 — "Passing client context to tools"

Current state

The underlying data is available in the system — it just is not reachable from Context:

  • Session ID: managed by StreamableHTTPSessionManager / SseServerTransport, not exposed to handlers
  • Auth info: stored in auth_context_var by AuthContextMiddleware, not exposed to handlers
  • HTTP request: passed through as request_context: Any on ServerMessageMetadata, available on ServerRequestContext.request but not on Context

Scope

This issue is about designing and implementing access to these three categories of information on the handler Context. Key design considerations:

  • 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
  • The solution should work for both MCPServer (high-level) and low-level server handlers
  • Should be consistent with the direction of #2021 (typed transport context) and #1684 (explicit context parameters)

Prior art

  • PR #1608 — adds ctx.session_id by threading through InitializationOptionsServerSessionRequestContextContext

Related issues

  • #2021 — Refactor handler context to be transport- and handler-type-aware (v2 architectural)
  • #1684 — Refactor global contextvars into explicit parameters (v2 architectural)
  • #2054 — Add dependency injection support to MCPServer (v2 architectural)

AI Disclaimer

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

首先跟踪 Context、ServerRequestContext 和 ServerMessageMetadata.request_context,然后检查 StreamableHTTPSessionManager、SseServerTransport 和 AuthContextMiddleware。比较 #2021、#1684 和 #1608 中的实现方式。完成的标准是:在所有受支持的 transport 中,handlers 都能一致地访问适用的 session、身份验证和 transport 信息,包括文档中说明的数据不可用的情况。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
api, authentication, backend
Issue 类型
功能
难度
5/5
预计耗时
一周以上
活跃度
冷清
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。