[Bug] check_capability does not validate elicitation sub-capabilities (form/url)
还没有人认领这个 Issue。
评估
调研方向
从 src/mcp/server/connection.py 的第340-341行附近开始,将 elicitation 处理与现有的 sampling 检查进行比较。复现 issue 中 URL-only 与 form-only capabilities 的情况,然后验证匹配和不匹配的 form/url capabilities 是否在相关测试套件中返回预期结果。
由索引模型根据 Issue 内容生成。
描述
Summary
Connection.check_capability() returns True when a client has URL-mode elicitation but the caller checks for form-mode elicitation — the sub-capability (ElicitationCapability.form / .url) is never inspected.
Root cause
In src/mcp/server/connection.py:340-341:
if capability.elicitation is not None and have.elicitation is None:
return False
This only returns False when the client has no elicitation at all. It does not check individual sub-capabilities (form / url). Compare with sampling, which correctly checks sub-capabilities:
if capability.sampling is not None:
if have.sampling is None:
return False
if capability.sampling.context is not None and have.sampling.context is None:
return False
if capability.sampling.tools is not None and have.sampling.tools is None:
return False
Reproduction
# Client supports URL elicitation only
have = ClientCapabilities(elicitation=ElicitationCapability(url=UrlElicitationCapability()))
# Check for form elicitation — should be False (client does not have form)
want = ClientCapabilities(elicitation=ElicitationCapability(form=FormElicitationCapability()))
Connection.from_envelope("2025-11-25", client_info, have).check_capability(want) # Returns True (BUG)
Impact
check_capabilityis public API (viaServerSession.check_client_capability)- Currently no production callers use elicitation sub-capability checks — low immediate impact
- But once someone relies on it (e.g., checking if the client supports form elicitation before calling
elicit_form), it will return wrong results
Additional gaps (lower priority)
extensions—ClientCapabilities.extensionsis not checked at alltasks—ClientCapabilities.tasksand sub-capabilities entirely unhandled
Proposed fix
Add form / url sub-capability checks, matching the sampling pattern:
if capability.elicitation is not None:
if have.elicitation is None:
return False
if capability.elicitation.form is not None and have.elicitation.form is None:
return False
if capability.elicitation.url is not None and have.elicitation.url is None:
return False
AI assistance: Bug discovered and analyzed with AI assistance (opencode).
- 主要语言
- Python
- 星标
- 24.3k
- 派生
- 4k
- 平均合并
- 1 天 19 分钟
- 30 天内合并 PR
- 29
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
modelcontextprotocol/python-sdk 的其他 Issue
-
v1 v2
难度 2/5 1-3 小时 新手友好度 85/100
modelcontextprotocol/python-sdk#3546 · 5 条评论 ·
-
v1 v2
难度 2/5 1-3 小时 新手友好度 76/100
modelcontextprotocol/python-sdk#3545 · 1 条评论 ·
-
v1 v2
难度 1/5 1 小时以内 新手友好度 91/100
modelcontextprotocol/python-sdk#3508 · 2 条评论 ·
-
难度 2/5 1-3 小时 新手友好度 64/100
modelcontextprotocol/python-sdk#3504 ·
-
v1 v2
难度 2/5 1-3 小时 新手友好度 82/100
modelcontextprotocol/python-sdk#3492 · 1 条评论 ·
查看 modelcontextprotocol/python-sdk 的全部 Issue
相似的 Issue
-
documentation help wanted
难度 2/5 1-3 小时 新手友好度 90/100
-
难度 2/5 1-3 小时 新手友好度 90/100
simonw/sqlite-utils#872 ·
-
难度 2/5 1-3 小时 新手友好度 88/100
-
难度 2/5 1-3 小时 新手友好度 82/100
-
难度 2/5 1-3 小时 新手友好度 78/100