Commit 7f4a34d
MCP stdio: negotiate initialize protocol version, default to 2025-11-25, return description in serverInfo, and add initialize wire-shape tests (#3622)
## Why make this change?
DAB MCP stdio always returned `2025-06-18` in `initialize`, even when
clients requested newer protocol versions, causing modern MCP clients
(e.g., Claude Code 2.x) to disconnect.
This update aligns initialize negotiation behavior with MCP version
selection expectations, updates the default supported version to
`2025-11-25`, aligns initialize metadata shape for newer protocol
versions, and adds focused wiring tests to lock down the initialize
response wire format end-to-end.
## What is this change?
- **Protocol default**
- Bumped MCP default protocol from `2025-06-18` to `2025-11-25` in
`McpProtocolDefaults`.
- **Initialize version negotiation**
- `initialize` now reads `params.protocolVersion` from the client
request.
- Server responds with the greatest supported version `<=` client
requested (never higher than the client).
- **Initialize metadata field shape by negotiated protocol**
- For negotiated protocol versions `>= 2025-11-25`, runtime MCP
description is returned as `serverInfo.description`.
- For older negotiated protocol versions, description remains top-level
`instructions` for backward compatibility.
- **Negotiation utility + parsing behavior**
- Added centralized negotiation helper in `McpProtocolDefaults`.
- Compares date-formatted versions (`yyyy-MM-dd`) with ordinal string
fallback for non-date values.
- Added protocol-threshold helper for choosing `serverInfo.description`
vs `instructions`.
- **Focused test coverage**
- Added helper unit tests for:
- new default protocol value,
- client newer than server (server version returned),
- client older than server (client version returned),
- missing client version,
- non-date fallback comparison path,
- protocol threshold behavior for `serverInfo.description`.
- Added focused initialize wiring tests for `HandleInitialize` that
validate:
- JSON-RPC envelope shape (`jsonrpc`, `id`),
- negotiated `result.protocolVersion`,
- capabilities shape,
- field placement across protocol/description scenarios
(`serverInfo.description` vs `instructions` vs neither).
```csharp
string negotiatedProtocolVersion =
McpProtocolDefaults.ResolveInitializeResponseProtocolVersion(
_protocolVersion,
clientRequestedProtocolVersion);
```
## How was this tested?
- [ ] Integration Tests
- [x] Unit Tests
## Sample Request(s)
- Example CLI usage:
- `dab start --mcp-stdio`
- Example initialize request:
```json
{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"claude-code","version":"2.1.98"}},"id":1}
```
- Example initialize response behavior for negotiated `2025-11-25`:
```json
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-11-25","capabilities":{"tools":{"listChanged":true},"logging":{}},"serverInfo":{"name":"SQL MCP Server","version":"<dab-version>","description":"<mcp-runtime-description>"}}}
```
- Example initialize response behavior for negotiated older versions:
```json
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{"listChanged":true},"logging":{}},"serverInfo":{"name":"SQL MCP Server","version":"<dab-version>"},"instructions":"<mcp-runtime-description>"}}
```
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Aniruddh25 <3513779+Aniruddh25@users.noreply.github.com>
Co-authored-by: Aniruddh Munde <anmunde@microsoft.com>
Co-authored-by: aaronburtle <93220300+aaronburtle@users.noreply.github.com>1 parent e386dad commit 7f4a34d
4 files changed
Lines changed: 353 additions & 14 deletions
File tree
- src
- Azure.DataApiBuilder.Mcp/Core
- Service.Tests/UnitTests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
1 | 2 | | |
2 | 3 | | |
3 | 4 | | |
| |||
19 | 20 | | |
20 | 21 | | |
21 | 22 | | |
22 | | - | |
| 23 | + | |
23 | 24 | | |
24 | 25 | | |
25 | 26 | | |
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
29 | 35 | | |
30 | 36 | | |
31 | 37 | | |
| |||
34 | 40 | | |
35 | 41 | | |
36 | 42 | | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
37 | 82 | | |
38 | 83 | | |
39 | | - | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
122 | 122 | | |
123 | 123 | | |
124 | 124 | | |
125 | | - | |
| 125 | + | |
126 | 126 | | |
127 | 127 | | |
128 | 128 | | |
| |||
167 | 167 | | |
168 | 168 | | |
169 | 169 | | |
| 170 | + | |
170 | 171 | | |
171 | | - | |
172 | | - | |
173 | | - | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
174 | 175 | | |
175 | | - | |
| 176 | + | |
176 | 177 | | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
177 | 182 | | |
178 | | - | |
| 183 | + | |
179 | 184 | | |
180 | 185 | | |
181 | 186 | | |
182 | 187 | | |
183 | 188 | | |
184 | 189 | | |
185 | | - | |
| 190 | + | |
186 | 191 | | |
187 | 192 | | |
188 | 193 | | |
| |||
191 | 196 | | |
192 | 197 | | |
193 | 198 | | |
194 | | - | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
195 | 202 | | |
196 | | - | |
| 203 | + | |
197 | 204 | | |
198 | 205 | | |
199 | 206 | | |
200 | | - | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
201 | 226 | | |
202 | 227 | | |
203 | 228 | | |
| |||
208 | 233 | | |
209 | 234 | | |
210 | 235 | | |
211 | | - | |
| 236 | + | |
212 | 237 | | |
213 | 238 | | |
214 | 239 | | |
215 | 240 | | |
216 | 241 | | |
217 | 242 | | |
218 | | - | |
| 243 | + | |
219 | 244 | | |
220 | 245 | | |
221 | 246 | | |
| |||
232 | 257 | | |
233 | 258 | | |
234 | 259 | | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
235 | 276 | | |
236 | 277 | | |
237 | 278 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
0 commit comments