modelcontextprotocol / modelcontextprotocol/python-sdk

[Bug] check_capability does not validate elicitation sub-capabilities (form/url)

Đang mở Phù hợp với người mới
#2,965 2 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

bug needs confirmation P2 v2
Ngôn ngữ chính
Python
Star
24.3k
Fork
4k
Merge trung bình
1 ngày 1 giờ
Pull request đã merge (30 ngày)
31

Mô tả

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_capability is public API (via ServerSession.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)

  • extensionsClientCapabilities.extensions is not checked at all
  • tasksClientCapabilities.tasks and 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).

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. 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.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Bắt đầu trong src/mcp/server/connection.py quanh dòng 340-341 và so sánh cách xử lý elicitation với các kiểm tra sampling hiện có. Tái hiện trường hợp URL-only so với form-only capabilities trong issue, sau đó xác minh rằng các form/url capabilities khớp và không khớp trả về kết quả mong đợi trong test suite liên quan.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
python
Lĩnh vực
api
Loại issue
Lỗi
Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Đặc tả rõ ràng
Mức phù hợp với người mới
82/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.