Skip to content

Commit ca01b27

Browse files
committed
ci: add discovery conformance coverage
1 parent 2815005 commit ca01b27

1 file changed

Lines changed: 89 additions & 26 deletions

File tree

.github/workflows/conformance.yml

Lines changed: 89 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
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
@@ -47,7 +47,7 @@ jobs:
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 \
@@ -56,7 +56,7 @@ jobs:
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 \
@@ -65,7 +65,7 @@ jobs:
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

Comments
 (0)