OAuth scope selection falls back to the authorization server's scopes_supported, which the spec does not allow
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 79/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- python
- Lĩnh vực
- authentication
Hướng nghiên cứu
Bắt đầu tại src/mcp/client/auth/utils.py, ở get_client_metadata_scopes, rồi theo dõi các nhánh chọn scope và đối chiếu với hành vi spec được trích dẫn trong issue. Kiểm tra hoặc bổ sung các bài kiểm tra tập trung cho trường hợp thiếu challenge scope và PRM scopes_supported; hoàn thành khi các trường hợp đó chọn PRM scopes nếu có, nếu không thì bỏ qua scope, mà không dùng scopes của authorization server.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Initial Checks
- I confirm that I'm using the latest version of MCP Python SDK
- I confirm that I searched for my issue in https://github.com/modelcontextprotocol/python-sdk/issues before opening this issue
Description
When the 401 carries no scope and the Protected Resource Metadata (PRM) has no scopes_supported, get_client_metadata_scopes (src/mcp/client/auth/utils.py) requests every scope the authorization server lists:
# MCP spec scope selection priority:
# 1. WWW-Authenticate header scope
# 2. PRM scopes_supported
# 3. AS scopes_supported (SDK fallback)
# 4. Omit scope parameter
...
elif authorization_server_metadata is not None and authorization_server_metadata.scopes_supported is not None:
selected_scope = " ".join(authorization_server_metadata.scopes_supported)
The spec has two steps, and the second one ends in omitting scope (2026-07-28, Authorization → Scope Selection Strategy):
- Use
scopeparameter from the initialWWW-Authenticateheader in the 401 response, if provided- If
scopeis not available, use all scopes defined inscopes_supportedfrom the Protected Resource Metadata document, omitting thescopeparameter ifscopes_supportedis undefined.
The same section says clients SHOULD request "only the scopes necessary for their intended operations."
An authorization server's scopes_supported describes the whole authorization server, not this resource. Often that's a shared IdP serving many APIs (openid, profile, email, org-admin and write scopes for unrelated services). Tier 3 therefore turns "the resource didn't say" into "ask for everything the IdP has". The results:
- an over-privileged token for an MCP server that needed none of it;
- a broad consent screen for the user;
- a login failure when the authorization server refuses to issue some of the listed scopes to a public or dynamically registered client (
invalid_scope), where omittingscopewould have succeeded with the authorization server's default.
Example Code
The selection function on its own (works on 1.26.0, 1.30.0 and 2.3.0):
from mcp.client.auth.utils import get_client_metadata_scopes
from mcp.shared.auth import OAuthMetadata, ProtectedResourceMetadata
prm = ProtectedResourceMetadata(
resource="https://mcp.example.com/mcp",
authorization_servers=["https://auth.example.com"],
) # no scopes_supported
asm = OAuthMetadata(
issuer="https://auth.example.com",
authorization_endpoint="https://auth.example.com/authorize",
token_endpoint="https://auth.example.com/token",
scopes_supported=["openid", "profile", "email", "admin:org", "repo:write"],
)
print(get_client_metadata_scopes(None, prm, asm))
# 'openid profile email admin:org repo:write' — expected: None (omit scope)
In the real flow, OAuthClientProvider.async_auth_flow assigns this result to client_metadata.scope on every 401. So a client can't avoid it by configuring a narrower scope: that is #2317, which has several production reports.
Expected behaviour
Follow the spec: (1) the challenge scope, (2) PRM scopes_supported, otherwise omit scope. If a fallback beyond the spec is wanted, make it something a client turns on, not the default.
Relation to existing issues
- #2317: a configured
client_metadata.scopeis overwritten. This issue is separate: even with no configured scope, the SDK should omitscoperather than take the authorization server's list. Fixing #2317 alone would leave clients that don't configure a scope on tier 3. - #3172 (closed): put the configured scope after tier 3. That doesn't help here, because the AS-wide list still wins whenever the authorization server advertises any scopes.
Python & MCP Python SDK
- MCP Python SDK: reproduced on 1.26.0, 1.30.0, 2.3.0. The same code is on
mainatd7845c0. - Python 3.12
- Ngôn ngữ chính
- Python
- Star
- 24.7k
- Fork
- 4.1k
- Merge trung bình
- 18 giờ 27 phút
- Pull request đã merge (30 ngày)
- 15
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của modelcontextprotocol/python-sdk
-
bug v2
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
modelcontextprotocol/python-sdk#3811 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug v2
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 79/100
modelcontextprotocol/python-sdk#3810 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[Bug]: Inconsistent structured output wrapping and opt-out for typing.Dict and typing sequence generics in func_metadataCó thể làm lại được Pull request cho issue này đã bị đóng mà không được merge. Đang mởbug v1 v2
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
modelcontextprotocol/python-sdk#3771 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug v2
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
modelcontextprotocol/python-sdk#3769 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
2026 Streamable HTTP rejects whitespace-padded Mcp-Name valuesCó thể làm lại được Pull request cho issue này đã bị đóng mà không được merge. Đang mởbug spec-2026-07-28 v2
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
modelcontextprotocol/python-sdk#3763 · 4 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của modelcontextprotocol/python-sdk
Issue tương tự
-
bug ready-for-dev
Độ khó 1/5 1-3 giờ Mức phù hợp với người mới 92/100
OpenHands/extensions#897 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
tensorflow/datasets#11253 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
fix(core): a config section with all keys commented out crashes startupCó thể đã có người làm @Aryanbhargava18 đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
kubeflow/mcp-server#512 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Stop trusting the compromised eMudhra CA certificatesCó thể đã có người làm @anth-volk đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
PolicyEngine/uk-triple-lock#54 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
DBFS append mode silently overwrites existing filesCó thể đã có người làm @IlyaKhalafi đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 77/100
fsspec/filesystem_spec#2429 ·
Maintainer thường phản hồi trong vòng 1 ngày