Files
Max 837ef904f8
Deploy Docs / deploy-docs (push) Has been cancelled
CI / checks (push) Failing after 24m23s
CI / all-green (push) Has been cancelled
Conformance Tests / server-conformance (push) Has been cancelled
Conformance Tests / client-conformance (push) Has been cancelled
GitHub Actions Security Analysis / zizmor (push) Has been cancelled
Align with spec #3002: optional clientInfo, serverInfo in result _meta (#3143)
2026-07-23 12:00:36 +01:00

43 lines
1.6 KiB
Python

"""Shared helper: strip the 2026-era serverInfo `_meta` stamp from a result.
Servers stamp `io.modelcontextprotocol/serverInfo` into every 2026-era
result's `_meta` and never into handshake-era ones. Suites whose expected
payloads should stay identity-free strip the stamp before exact comparison -
and the strip is strict, so a modern result that lost its stamp fails the
test instead of passing silently.
The interaction matrix does not use this function directly: its `unstamped`
fixture (tests/interaction/conftest.py) resolves per cell to this strict
strip on modern cells and to a must-not-be-stamped assertion on
handshake-era cells, so one comparison line enforces both eras.
"""
from typing import Any, Protocol, TypeVar
from mcp_types import SERVER_INFO_META_KEY, Result
R = TypeVar("R", bound=Result)
class Unstamp(Protocol):
"""An era-appropriate stamp normalizer: strips or forbids the stamp."""
def __call__(self, result: R) -> R: ...
def unstamped(result: R) -> R:
"""Assert the result carries a well-formed serverInfo stamp, then remove it.
Returns the result for inline use in comparisons. Use only where a stamp
is required (a 2026-era result); the interaction matrix's `unstamped`
fixture handles the era split.
"""
meta = result.meta
assert meta is not None and SERVER_INFO_META_KEY in meta, "expected a serverInfo stamp on this result"
stamp: Any = meta.pop(SERVER_INFO_META_KEY)
assert isinstance(stamp, dict)
assert "name" in stamp and "version" in stamp
if not meta:
result.meta = None
return result