Remove Context.client_id (#3167)

This commit is contained in:
Max 2026-07-25 19:11:51 +01:00 • committed by GitHub
commit 5dd062d077
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 21 additions and 11 deletions

View file

@ -916,6 +916,27 @@ await ctx.log(level="info", data="hello")
Positional calls (`await ctx.info("hello")`) are unaffected.
### `Context.client_id` removed
`Context.client_id` has been removed. It never returned an authenticated client identity: it echoed a non-standard `client_id` key from the request's `_meta`, which nothing in the SDK or the MCP spec populates, so it was `None` unless a caller injected `meta={"client_id": ...}` by hand. The name also collided with the OAuth `client_id`, which is what callers usually mean by "the client".
If you were reading a custom `_meta` key, read it from the meta dict directly. If you want the authenticated OAuth client, use the access token:
```python
# Before (v1)
client_id = ctx.client_id
# After (v2) — the raw _meta key, if you were setting it yourself
meta = ctx.request_context.meta
client_id = meta.get("client_id") if meta else None
# After (v2) — the authenticated OAuth client (usually what you want)
from mcp.server.auth.middleware.auth_context import get_access_token
token = get_access_token()
client_id = token.client_id if token else None
```
### `ProgressContext` and `progress()` context manager removed
The `mcp.shared.progress` module (`ProgressContext`, `Progress`, and the `progress()` context manager) has been removed. This module had no real-world adoption — all users send progress notifications via `Context.report_progress()` or `session.send_progress_notification()` directly.

View file

@ -54,7 +54,6 @@ class Context(BaseModel, Generic[LifespanContextT, RequestT]):
# Get request info
request_id = ctx.request_id
client_id = ctx.client_id
return str(x)
```
@ -275,16 +274,6 @@ class Context(BaseModel, Generic[LifespanContextT, RequestT]):
related_request_id=self.request_id,
)
# TODO(maxisbey): see if this is needed otherwise remove
@property
def client_id(self) -> str | None:
"""Get the client ID if available.
Note: this reads from the MCP request's `_meta` params, not the OAuth
bearer token. For that, use `get_access_token().client_id`.
"""
return self.request_context.meta.get("client_id") if self.request_context.meta else None # pragma: no cover
@property
def headers(self) -> Mapping[str, str] | None:
"""Request headers carried by this message, when the transport has them.