v0.8.41 — MCP 2026-07-28 final-spec hardening + ToolPrivBench OPUR
Added
- feat(preset): MCP 2026-07-28 final-spec hardening —
mcp_spec_2026_07_defaults/MCP_SPEC_2026_07, composed from existing airlock primitives (no new mechanism, Pydantic-only zero-dep core):- SEP-2468 / RFC 9207 authorization-response
issvalidation —validate_authorization_response_iss(params, *, expected_issuer, require_iss=True)(+IssuerMismatchError) inmcp_spec/oauth.py: the client-side check that defends against an authorization-server mix-up attack, deny-by-default (missing/mismatchedissrefused). Adds a check; does not weaken existing OAuth validation. - Server-Card trust boundary —
check_server_card(card)reuses the shippedToolOutputTrustGuardto classify a tool description fetched from a server card as untrusted output and block the card on an injection-shaped (Agentjacking-class) description. - SEP-2468 / RFC 9207 are spec ids, not CVEs — the preset cites no CVE (enforced by the placeholder-CVE guard + a test). Auto-registered via
list_active(). (#111)
- SEP-2468 / RFC 9207 authorization-response
- bench: ToolPrivBench OPUR (over-privileged tool-use rate) baseline-vs-enforced columns on the least-privilege benchmark — OPUR 100% → 0% enforced (−100pp) across all 5 risk categories, deterministic (no model call), with the honest "measures enforcement, not model behaviour" caveat. (#110)
Zero new runtime deps. Badge: 3,312 tests / v0.8.41.