Summary
The Phase 3A.2-E real-host validation gate caught a real bug (rmcp graceful-shutdown panic, fixed in #25) that the existing CI smoke did not. The fix added regression sentinels (graceful_shutdown_does_not_panic in tests/mcp_protocol.rs and the post-dialog exit-status assertion in ci_smoke.py), but those still use raw JSON-RPC. Adding an SDK-driven CI job would catch ecosystem-level regressions earlier.
Why this matters
ci_smoke.py uses hand-crafted JSON-RPC; it does not exercise the same code paths a real MCP client does.
- An SDK-driven CI job validates the actual wire interactions adopters will see.
- The cost is small: one extra workflow job that pip-installs the SDK.
Acceptance criteria
Where to read
.github/workflows/rust.yml for the existing mcp-smoke job (template)
examples/mcp/ci_smoke.py for the current raw-JSON-RPC smoke
- The reference SDK client used during Phase 3A.2-E validation lived in
/tmp/ncp-real-host-validation.py during the publish gate (pattern reference)
Summary
The Phase 3A.2-E real-host validation gate caught a real bug (rmcp graceful-shutdown panic, fixed in #25) that the existing CI smoke did not. The fix added regression sentinels (
graceful_shutdown_does_not_panicintests/mcp_protocol.rsand the post-dialog exit-status assertion inci_smoke.py), but those still use raw JSON-RPC. Adding an SDK-driven CI job would catch ecosystem-level regressions earlier.Why this matters
ci_smoke.pyuses hand-crafted JSON-RPC; it does not exercise the same code paths a real MCP client does.Acceptance criteria
.github/workflows/rust.ymlor a separate workflow).pip install mcp).ncp-mcp-serveras a subprocess, performsinitializethentools/listthentools/call, closes stdin gracefully, asserts clean subprocess exit.ci_smoke.pyas the required dependency-free check. Do not break it.Where to read
.github/workflows/rust.ymlfor the existingmcp-smokejob (template)examples/mcp/ci_smoke.pyfor the current raw-JSON-RPC smoke/tmp/ncp-real-host-validation.pyduring the publish gate (pattern reference)