Skip to content

Commit 87f0d14

Browse files
committed
Refresh the interaction manifest after main's notification-POST and output-schema changes
Drop the deferred hosting:http:modern:notification-post entry: the modern HTTP entry now takes the spec's accept branch (202, not dispatched) and main ships its own tested entry, hosting:http:modern:notification-post-202, for the same streamable-http sentence, so the branch's undecided-design deferral is superseded. Rewrite the client:jsonschema:ref-resolution:no-network-fetch deferral: the client now validates output schemas against an explicitly empty reference registry, so an external $ref is never fetched and a result reaching one fails with the SDK's 'Invalid schema for tool <name>' error. The premise that no behaviour exists to pin is false; the entry becomes a not-yet-covered flip candidate describing the test to write. Tighten the two 2025:jsonschema:ref-rewrite deferrals: the output-schema generator now inlines a self-referential model's bare root $ref into an object root, so 'no code rewrites schema documents' was imprecise. No pointer is ever re-targeted, which is the substance both entries defer on.
1 parent cebba5d commit 87f0d14

1 file changed

Lines changed: 15 additions & 31 deletions

File tree

tests/interaction/_requirements.py

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1595,11 +1595,13 @@ def __post_init__(self) -> None:
15951595
),
15961596
added_in="2026-07-28",
15971597
deferred=(
1598-
"Untestable negative through the public API: proving the validator never performs a network "
1599-
"fetch is a universally-quantified negative this suite refuses -- the client hands the "
1600-
"advertised outputSchema to the jsonschema library with no custom resolver "
1601-
"(src/mcp/client/session.py), and no public knob configures network retrieval whose absence "
1602-
"a test could pin."
1598+
"Not yet covered here: the client compiles each advertised outputSchema against an explicitly "
1599+
"empty reference registry (src/mcp/client/session.py), so a $ref naming a URI outside the schema "
1600+
"document is never retrieved, and a result whose validation reaches one fails with the "
1601+
"SDK-authored 'Invalid schema for tool <name>' error instead of passing; "
1602+
"tests/client/test_output_schema_validation.py pins that rejection with a file URI. The test "
1603+
"here advertises an outputSchema whose property $ref names an https URI from a low-level Server "
1604+
"and asserts call_tool raises that error."
16031605
),
16041606
),
16051607
"client:jsonschema:unsupported-dialect-graceful": Requirement(
@@ -1808,10 +1810,12 @@ def __post_init__(self) -> None:
18081810
"Era-bound: 2025-era-only legacy interop projection (see 2025:jsonschema:non-object-output-wrapped's note)."
18091811
),
18101812
deferred=(
1811-
"Not implemented in the SDK: no $ref rewriting exists anywhere in src/mcp/server/ -- "
1812-
"schemas are generated whole from pydantic models with $defs at the document root "
1813-
"(src/mcp/server/mcpserver/utilities/func_metadata.py), and the SEP-2106 wrap-then-rewrite "
1814-
"projection that would create dangling pointers does not exist."
1813+
"Not implemented in the SDK: no $ref pointer is ever re-targeted anywhere in src/mcp/server/ -- "
1814+
"schemas are generated whole from pydantic models with $defs at the document root, and the one "
1815+
"schema edit the generator makes (inlining a self-referential return model's bare root $ref into "
1816+
"an object root, src/mcp/server/mcpserver/utilities/func_metadata.py) leaves every pointer into "
1817+
"$defs intact; the SEP-2106 wrap-then-rewrite projection that would create dangling pointers "
1818+
"does not exist."
18151819
),
18161820
),
18171821
"2025:jsonschema:ref-rewrite-scope": Requirement(
@@ -1827,8 +1831,8 @@ def __post_init__(self) -> None:
18271831
),
18281832
deferred=(
18291833
"Not implemented in the SDK: the rewrite whose scoping this entry refines does not exist "
1830-
"(see 2025:jsonschema:ref-rewrite-on-wrap); no code in src/mcp/server/ walks or rewrites "
1831-
"schema documents."
1834+
"(see 2025:jsonschema:ref-rewrite-on-wrap); no code in src/mcp/server/ walks a schema "
1835+
"document or re-targets its $ref or $dynamicRef pointers."
18321836
),
18331837
),
18341838
"2025:jsonschema:schemaless-non-object-sc-wrapped": Requirement(
@@ -6265,26 +6269,6 @@ def __post_init__(self) -> None:
62656269
"proposal, not yet a manifest entry)."
62666270
),
62676271
),
6268-
"hosting:http:modern:notification-post": Requirement(
6269-
source=f"{SPEC_2026_BASE_URL}/basic/transports/streamable-http#sending-messages",
6270-
behavior=(
6271-
"A POST to the modern entry whose body is a notification (no id) is acknowledged without a "
6272-
"JSON-RPC response: 202 Accepted with an empty body, or the explicit cannot-accept "
6273-
"rejection -- the transport's two sanctioned responses."
6274-
),
6275-
added_in="2026-07-28",
6276-
transports=("streamable-http",),
6277-
deferred=(
6278-
"Not yet covered here: which sanctioned response the modern entry gives is an explicitly "
6279-
"unmade design choice -- the cannot-accept branch it takes today carries the in-code TODO "
6280-
"recording strict-vs-lenient as open (src/mcp/server/_streamable_http_modern.py) -- so "
6281-
"pinning the current rejection would manufacture churn when the choice lands."
6282-
),
6283-
note=(
6284-
"Only observable over streamable HTTP. The legacy path's 202 for notification POSTs is "
6285-
"pinned by hosting:http:notifications-202."
6286-
),
6287-
),
62886272
"hosting:http:modern-only:initialize-rejection-names-versions": Requirement(
62896273
source="sdk",
62906274
behavior=(

0 commit comments

Comments
 (0)