Skip to content

Commit 8c6b78b

Browse files
committed
Record two divergences as intentional, ecosystem-consistent choices
Two interaction-suite divergence notes described their gaps as unenforced spec MUSTs without saying whether closing them was planned. Both are deliberate, and the notes now say so. transport:stdio:stream-purity -- stdio_server does not redirect sys.stdout, so a handler print() corrupts the protocol stream. No MCP SDK redirects stdout, and a redirect would only catch print(), not os.write(1, ...) or C extensions writing to file descriptor 1, so it would be a partial guard rather than a structural fix. docs/tutorial/logging.md already tells server authors to log to stderr and never print() in a stdio server, so no docs change was needed. protocol:progress:monotonic -- no MCP SDK validates sender-side progress monotonicity; the spec MUST is a contract on the handler author, not on the transport, and the test pins the unvalidated pass-through. No code or test behaviour changes.
1 parent f551eff commit 8c6b78b

1 file changed

Lines changed: 12 additions & 7 deletions

File tree

tests/interaction/_requirements.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -668,10 +668,11 @@ def __post_init__(self) -> None:
668668
divergence=Divergence(
669669
note=(
670670
"Intentional, not a gap to close: no MCP SDK (typescript, go, csharp) validates "
671-
"sender-side progress monotonicity, and this one does not either. The spec MUST "
672-
"binds the handler author, not the transport; non-increasing values are forwarded "
673-
"to the callback unchanged so the receiving application sees what the sender sent. "
674-
"docs/tutorial/progress.md states the author's obligation."
671+
"sender-side progress monotonicity, and this one does not either. The spec MUST is "
672+
"a contract on the handler author, not on the transport; non-increasing values are "
673+
"forwarded to the callback unchanged so the receiving application sees what the "
674+
"sender sent, and the test pins that pass-through. docs/tutorial/progress.md "
675+
"states the author's obligation."
675676
),
676677
),
677678
known_failures=(
@@ -3626,9 +3627,13 @@ def __post_init__(self) -> None:
36263627
note="Only observable over stdio: stdin/stdout purity is stdio-specific.",
36273628
divergence=Divergence(
36283629
note=(
3629-
"stdio_server's own writes satisfy this, but it does not redirect or guard sys.stdout: "
3630-
"handler code that calls print() writes directly to the protocol stream and corrupts the "
3631-
"framing. The spec MUST is satisfied only as long as application code behaves."
3630+
"Intentional, not a gap to close: the SDK's own writes are pure, but sys.stdout is not "
3631+
"redirected, so handler code that calls print() writes into the protocol stream and "
3632+
"corrupts the framing. This matches every other MCP SDK -- none redirects stdout. A "
3633+
"redirect would only catch print(): os.write(1, ...) and C extensions that write to file "
3634+
"descriptor 1 bypass sys.stdout entirely, so it would be a partial guard rather than a "
3635+
"structural fix. docs/tutorial/logging.md tells server authors to log to stderr and "
3636+
"never print() in a stdio server."
36323637
),
36333638
),
36343639
),

0 commit comments

Comments
 (0)