modelcontextprotocol / modelcontextprotocol/python-sdk
[Bug] check_capability does not validate elicitation sub-capabilities (form/url)
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 24.3k
- フォーク
- 4k
- 平均マージ
- 1日 1時間
- マージ済み PR(30日)
- 31
説明
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).
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
src/mcp/server/connection.py の340~341行付近から始め、既存のsamplingチェックとelicitationの処理を比較します。issueにあるURL-only対form-only capabilitiesのケースを再現し、一致するform/url capabilitiesと一致しないform/url capabilitiesが、関連するテストスイートで期待される結果を返すことを確認します。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- api
- issue の種類
- バグ
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 活発さ
- 静か
- 明瞭さ
- 明確に書かれている
- 初心者へのやさしさ
- 82/100