3434 - name : Build conformance binaries
3535 run : cargo build -p mcp-conformance
3636
37- - name : Start conformance server
37+ - name : Start 2025-11-25 server
3838 run : |
3939 PORT=8001 ./target/debug/conformance-server &
4040 echo $! > server.pid
4747 echo "conformance server did not become ready" >&2
4848 exit 1
4949
50- - name : Run server conformance suite
50+ - name : Run 2025-11-25 server suite
5151 run : |
5252 npx -y "@modelcontextprotocol/conformance@${CONFORMANCE_VERSION}" server \
5353 --url http://127.0.0.1:8001/mcp \
5656
5757 # These pass today but are excluded from the default "active" suite;
5858 # run them explicitly so regressions are still caught.
59- - name : Run pending scenarios
59+ - name : Run 2025-11-25 pending scenarios
6060 run : |
6161 for scenario in json-schema-2020-12 server-sse-polling; do
6262 npx -y "@modelcontextprotocol/conformance@${CONFORMANCE_VERSION}" server \
6565 -o conformance-results
6666 done
6767
68- - name : Start draft conformance server
68+ - name : Start draft server
6969 run : |
7070 STATELESS=1 PORT=8002 ./target/debug/conformance-server &
7171 echo $! > draft-server.pid
@@ -78,22 +78,87 @@ jobs:
7878 echo "draft conformance server did not become ready" >&2
7979 exit 1
8080
81- - name : Run draft SEP scenarios
81+ # The upstream server-stateless scenario also covers client capability
82+ # enforcement and subscriptions/listen, which land in follow-up PRs.
83+ # Exercise the discovery/version-negotiation contract independently until
84+ # the full draft suite is enabled by #985.
85+ - name : Run SEP-2575 discovery contract
8286 run : |
83- for scenario in sep-2164-resource-not-found caching http-header-validation; do
84- npx -y "@modelcontextprotocol/conformance@${DRAFT_CONFORMANCE_VERSION}" server \
85- --url http://127.0.0.1:8002/mcp \
86- --scenario "$scenario" \
87- --spec-version draft \
88- -o conformance-results
89- done
90-
91- # SEP-2322 MRTR scenarios (spec 2026-07-28). They speak the stateless
92- # lifecycle (bare JSON-RPC POSTs, no initialize handshake), so they run
93- # against the stateless draft server.
94- - name : Run SEP-2322 MRTR scenarios
87+ endpoint=http://127.0.0.1:8002/mcp
88+ common_headers=(
89+ -H "Content-Type: application/json"
90+ -H "Accept: application/json, text/event-stream"
91+ -H "Mcp-Method: server/discover"
92+ )
93+
94+ discover_response="$(
95+ curl --fail-with-body --silent --show-error \
96+ "${common_headers[@]}" \
97+ -H "MCP-Protocol-Version: 2026-07-28" \
98+ --data '{
99+ "jsonrpc": "2.0",
100+ "id": "discover",
101+ "method": "server/discover",
102+ "params": {
103+ "_meta": {
104+ "io.modelcontextprotocol/protocolVersion": "2026-07-28",
105+ "io.modelcontextprotocol/clientInfo": {
106+ "name": "conformance-workflow",
107+ "version": "1.0.0"
108+ },
109+ "io.modelcontextprotocol/clientCapabilities": {}
110+ }
111+ }
112+ }' \
113+ "$endpoint"
114+ )"
115+ jq -e '
116+ .result.resultType == "complete" and
117+ (.result.supportedVersions | index("2026-07-28") != null) and
118+ (.result.capabilities | type == "object") and
119+ (.result.serverInfo.name | type == "string") and
120+ .result.ttlMs == 0 and
121+ .result.cacheScope == "private"
122+ ' <<<"$discover_response"
123+
124+ status="$(
125+ curl --silent --show-error \
126+ --output /tmp/unsupported-version.json \
127+ --write-out "%{http_code}" \
128+ "${common_headers[@]}" \
129+ -H "MCP-Protocol-Version: 2099-01-01" \
130+ --data '{
131+ "jsonrpc": "2.0",
132+ "id": "unsupported",
133+ "method": "server/discover",
134+ "params": {
135+ "_meta": {
136+ "io.modelcontextprotocol/protocolVersion": "2099-01-01",
137+ "io.modelcontextprotocol/clientInfo": {
138+ "name": "conformance-workflow",
139+ "version": "1.0.0"
140+ },
141+ "io.modelcontextprotocol/clientCapabilities": {}
142+ }
143+ }
144+ }' \
145+ "$endpoint"
146+ )"
147+ test "$status" = "400"
148+ jq -e '
149+ .id == "unsupported" and
150+ .error.code == -32022 and
151+ .error.data.requested == "2099-01-01" and
152+ (.error.data.supported | index("2026-07-28") != null)
153+ ' /tmp/unsupported-version.json
154+
155+ # Keep this explicit list until the full draft suite is enabled by #985.
156+ - name : Run supported draft server scenarios
95157 run : |
96158 for scenario in \
159+ sep-2164-resource-not-found \
160+ caching \
161+ http-header-validation \
97162 input-required-result-basic-elicitation \
98163 input-required-result-basic-sampling \
99164 input-required-result-basic-list-roots \
@@ -112,17 +177,15 @@ jobs:
112177 npx -y "@modelcontextprotocol/conformance@${DRAFT_CONFORMANCE_VERSION}" server \
113178 --url http://127.0.0.1:8002/mcp \
114179 --scenario "$scenario" \
180+ --spec-version draft \
115181 -o conformance-results
116182 done
117183
118- - name : Stop draft conformance server
119- if : always()
120- run : kill "$(cat draft-server.pid)" 2>/dev/null || true
121-
122-
123- - name : Stop conformance server
184+ - name : Stop conformance servers
124185 if : always()
125- run : kill "$(cat server.pid)" 2>/dev/null || true
186+ run : |
187+ kill "$(cat draft-server.pid)" 2>/dev/null || true
188+ kill "$(cat server.pid)" 2>/dev/null || true
126189
127190 - name : Upload results
128191 if : always()
@@ -146,7 +209,7 @@ jobs:
146209 - name : Build conformance binaries
147210 run : cargo build -p mcp-conformance
148211
149- - name : Run full client conformance suite
212+ - name : Run 2025-11-25 client suite
150213 run : |
151214 npx -y "@modelcontextprotocol/conformance@${CONFORMANCE_VERSION}" client \
152215 --command "$(pwd)/target/debug/conformance-client" \
@@ -155,7 +218,7 @@ jobs:
155218 -o conformance-client-results/full
156219
157220 # SEP-2322 MRTR client scenario (spec 2026-07-28).
158- - name : Run SEP-2322 MRTR client scenario
221+ - name : Run draft SEP-2322 client scenario
159222 run : |
160223 npx -y "@modelcontextprotocol/conformance@${DRAFT_CONFORMANCE_VERSION}" client \
161224 --command "$(pwd)/target/debug/conformance-client" \
0 commit comments