Skip to content

Commit 9b69a72

Browse files
committed
ci: add discovery conformance coverage
1 parent 5ebe01f commit 9b69a72

1 file changed

Lines changed: 84 additions & 28 deletions

File tree

.github/workflows/conformance.yml

Lines changed: 84 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ jobs:
3737
- name: Test conformance server
3838
run: cargo test -p mcp-conformance --bin conformance-server
3939

40-
- name: Start conformance server
40+
- name: Start 2025-11-25 server
4141
run: |
4242
PORT=8001 ./target/debug/conformance-server &
4343
echo $! > server.pid
@@ -50,7 +50,7 @@ jobs:
5050
echo "conformance server did not become ready" >&2
5151
exit 1
5252
53-
- name: Run server conformance suite
53+
- name: Run 2025-11-25 server suite
5454
run: |
5555
npx -y "@modelcontextprotocol/conformance@${CONFORMANCE_VERSION}" server \
5656
--url http://127.0.0.1:8001/mcp \
@@ -59,7 +59,7 @@ jobs:
5959
6060
# These pass today but are excluded from the default "active" suite;
6161
# run them explicitly so regressions are still caught.
62-
- name: Run pending scenarios
62+
- name: Run 2025-11-25 pending scenarios
6363
run: |
6464
for scenario in json-schema-2020-12 server-sse-polling; do
6565
npx -y "@modelcontextprotocol/conformance@${CONFORMANCE_VERSION}" server \
@@ -68,7 +68,7 @@ jobs:
6868
-o conformance-results
6969
done
7070
71-
- name: Start draft conformance server
71+
- name: Start draft server
7272
run: |
7373
STATELESS=1 PORT=8002 ./target/debug/conformance-server &
7474
echo $! > draft-server.pid
@@ -81,27 +81,85 @@ jobs:
8181
echo "draft conformance server did not become ready" >&2
8282
exit 1
8383
84-
- name: Run draft SEP scenarios
84+
# Run discovery separately until #985 enables the full draft suite.
85+
- name: Run SEP-2575 discovery contract
86+
run: |
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
85157
run: |
86158
for scenario in \
87159
sep-2164-resource-not-found \
88160
caching \
89161
http-header-validation \
90162
http-custom-header-server-validation \
91-
; do
92-
npx -y "@modelcontextprotocol/conformance@${DRAFT_CONFORMANCE_VERSION}" server \
93-
--url http://127.0.0.1:8002/mcp \
94-
--scenario "$scenario" \
95-
--spec-version draft \
96-
-o conformance-results
97-
done
98-
99-
# SEP-2322 MRTR scenarios (spec 2026-07-28). They speak the stateless
100-
# lifecycle (bare JSON-RPC POSTs, no initialize handshake), so they run
101-
# against the stateless draft server.
102-
- name: Run SEP-2322 MRTR scenarios
103-
run: |
104-
for scenario in \
105163
input-required-result-basic-elicitation \
106164
input-required-result-basic-sampling \
107165
input-required-result-basic-list-roots \
@@ -120,17 +178,15 @@ jobs:
120178
npx -y "@modelcontextprotocol/conformance@${DRAFT_CONFORMANCE_VERSION}" server \
121179
--url http://127.0.0.1:8002/mcp \
122180
--scenario "$scenario" \
181+
--spec-version draft \
123182
-o conformance-results
124183
done
125184
126-
- name: Stop draft conformance server
185+
- name: Stop conformance servers
127186
if: always()
128-
run: kill "$(cat draft-server.pid)" 2>/dev/null || true
129-
130-
131-
- name: Stop conformance server
132-
if: always()
133-
run: kill "$(cat server.pid)" 2>/dev/null || true
187+
run: |
188+
kill "$(cat draft-server.pid)" 2>/dev/null || true
189+
kill "$(cat server.pid)" 2>/dev/null || true
134190
135191
- name: Upload results
136192
if: always()
@@ -154,7 +210,7 @@ jobs:
154210
- name: Build conformance binaries
155211
run: cargo build -p mcp-conformance
156212

157-
- name: Run full client conformance suite
213+
- name: Run 2025-11-25 client suite
158214
run: |
159215
npx -y "@modelcontextprotocol/conformance@${CONFORMANCE_VERSION}" client \
160216
--command "$(pwd)/target/debug/conformance-client" \
@@ -163,7 +219,7 @@ jobs:
163219
-o conformance-client-results/full
164220
165221
# SEP-2322 MRTR client scenario (spec 2026-07-28).
166-
- name: Run SEP-2322 MRTR client scenario
222+
- name: Run draft SEP-2322 client scenario
167223
run: |
168224
npx -y "@modelcontextprotocol/conformance@${DRAFT_CONFORMANCE_VERSION}" client \
169225
--command "$(pwd)/target/debug/conformance-client" \

0 commit comments

Comments
 (0)