chore(deps): upgrade ModelContextProtocol to 2.2.0 (MCP 2026-07-28) - #76
Draft
jernejk wants to merge 3 commits into
Draft
chore(deps): upgrade ModelContextProtocol to 2.2.0 (MCP 2026-07-28)#76jernejk wants to merge 3 commits into
jernejk wants to merge 3 commits into
Conversation
Dependency-only upgrade from 1.4.0. No feature adoption: structured output, tool
annotations and elicitation are separate follow-ups.
Microsoft.Extensions.{DependencyInjection,Hosting,Http} move 10.0.9 -> 10.0.10,
the minimum 2.2.0's abstractions require. Microsoft.Extensions.AI.Abstractions
resolves 10.5.2 -> 10.8.3 transitively.
No source change was needed: [McpServerToolType], [McpServerTool], AddMcpServer(),
WithStdioServerTransport(), WithTools<T>() and the WithRequestFilters/AddCallToolFilter
based McpInvocationFilter all survive 2.x unchanged. Build is clean with no
obsoletion warnings because Roots, Sampling, Logging, Tasks and HTTP transport are
unused here.
One SDK-forced golden change, in both tools/list snapshots: 2.x removed the
experimental Tasks implementation from Core, so tools no longer advertise
"execution": { "taskSupport": "optional" }
It disappears from 17 of 18 default tools and 46 of 47 accounting tools -- the one
exception each way is get_location_and_mapping, the only synchronous tool, which
never carried the block under 1.4.0. Tool counts (18/47), names, descriptions and
input schemas are unchanged, and all 130+ per-tool result goldens, the six
tools/call goldens and the CLI/MCP parity table are byte-identical.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
get_leave_balance_status and import_leave_balances already carry annotations, so the checklist now names them as the exceptions and has the tester check their badges against what tools/list advertises. get_timesheets has never matched tp ts get --json -- MCP returns a flat array and skips weekends, the CLI returns a day-grouped envelope including weekends -- so the read check now compares against the MCP golden or the installed release instead. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
jernejk
force-pushed
the
feat/mcp-sdk-2
branch
from
September 12, 2026 23:24
78d5465 to
a404ff2
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR must not be merged until JK has tested it against the four real MCP clients from the
worktree. The harness proves the wire; it cannot prove a client. Follow
docs/mcp-sdk-2-testing.mdand fill in the results table first.Worktree, already built in Release and left on this branch:
.timepro-worktrees/mcp-v2.Summary
Upgrades
ModelContextProtocol1.4.0 → 2.2.0 (the MCP 2026-07-28 revision). Dependency-only.No feature adoption: no structured output, no elicitation, no annotation changes — each is its own
follow-up, as scoped in the issue.
Closes #39 only after the manual client pass is recorded.
What changed
Directory.Packages.props:ModelContextProtocol1.4.0 → 2.2.0, and the three pinnedMicrosoft.Extensions.*packages 10.0.9 → 10.0.10.tools/listgoldens regenerated (one SDK-forced change, below).docs/mcp-sdk-2-testing.md: the manual client checklist and results table.AGENTS.md: package version, "no API renames", and the follow-up note.No C# source change was required.
[McpServerToolType],[McpServerTool]withReadOnly/Destructive/Idempotent,AddMcpServer(),WithStdioServerTransport(),WithTools<T>()and theWithRequestFilters(... AddCallToolFilter ...)-basedMcpInvocationFilterall survive 2.x unchanged.dotnet build --no-incrementalis clean with0 warnings — the
MCP9005Roots/Sampling/Logging obsoletions, the Tasks move, and everyOAuth/HTTP/SSE breaking change in the 2.0.0 notes land on surfaces this repo does not use.
Dependency delta
Direct:
ModelContextProtocolMicrosoft.Extensions.DependencyInjectionMicrosoft.Extensions.HostingMicrosoft.Extensions.Http2.2.0 requires
Microsoft.Extensions.Caching.Abstractions/Hosting.Abstractions/Logging.Abstractions10.0.10andMicrosoft.Extensions.AI.Abstractions10.8.3. Bumping thethree direct pins to the minimum 10.0.10 resolves it; no downgrade warning, no floating version.
Transitive, from
dotnet list package --include-transitivebefore and after:ModelContextProtocol.CoreMicrosoft.Extensions.AI.AbstractionsMicrosoft.Extensions.Caching.AbstractionsMicrosoft.Extensions.*+System.Diagnostics.EventLog(24 packages)No package was added or removed.
Spectre.Console0.57.0 /Spectre.Console.Cli0.55.0 unchanged.scripts/security/nuget-audit.sh→ok - no vulnerable NuGet packages reported by current sources.SDK-forced golden changes
Exactly one, affecting only the two
tools/listsnapshots. 2.x extracted the experimental Tasksimplementation out of Core into
ModelContextProtocol.Extensions.Tasks(2.0.0 breaking change #3),which is not referenced here, so tools stop advertising task support:
{ "description": "Create a new timesheet entry. ...", - "execution": { - "taskSupport": "optional" - }, "inputSchema": {Discovery/tools-list.default.json: −51 lines, the block removed from 17 of 18 tools.Discovery/tools-list.accounting.json: −138 lines, removed from 46 of 47 tools.get_location_and_mapping, the onlysynchronous (
string, notTask<string>) tool — 1.4.0 never emittedexecutionfor it.Nothing else moved: tool counts stay 18 / 47, and every name, description and input schema is
byte-identical. Verified mechanically — the full staged diff of both goldens contains no removed or
added line other than
"execution": {,"taskSupport": "optional", and the closing},.Not regenerated, and byte-identical on 2.2.0: all 130+ per-tool result goldens, the six real
tools/callgoldens, and the CLI/MCP parity table. 2.0.0's new result fields (resultType,ttlMs,cacheScope,_meta.io.modelcontextprotocol/serverInfo) are gated on the negotiatedprotocol version (SDK #1753), so down-level payloads are unchanged; they appear only on the
2026-07-28 discovery path, which no golden covers.
How verified
Executed, from the worktree:
The harness did its job first: before regeneration the integration run was
Failed: 2, Passed: 285withMCP golden mismatch: Discovery/tools-list.default.jsonand...accounting.json, and nothing else. That is the forced failure for this change — the twogoldens that were supposed to move are the only two that moved.
Protocol versions verified over stdio
Driven directly against
dotnet .../SSW.TimePro.Cli.dll mcpwith a throwaway JSON-RPC script:initialize2025-11-252025-11-25,tools/list→ 18 toolsinitialize2025-06-182025-06-18,tools/list→ 18 toolsinitialize2024-11-052024-11-05,tools/list→ 18 tools (this is what the harness uses)initialize2026-07-28-32022+supported: [2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25]— correct, that revision removed the handshakeserver/discoversupportedVersions: ["2026-07-28"],capabilities.tools.listChanged: true,ttlMs: 0,cacheScope: "private"tools/list+tools/call_metaenvelope; 18 tools, noexecutionkey. The server correctly rejects a request whose_metaomitsio.modelcontextprotocol/clientCapabilities2025-03-26is advertised but was not exercised. Cancellation and shutdown were checked on boththe legacy and discovery paths: a
notifications/cancelledfor an in-flighttools/callgets noresponse (per spec), the server stays responsive and still serves 18 tools afterwards, and it
exits
0on stdin close.Staging smoke
Risks and what is not verified
the whole reason this is a draft. Approval prompts, annotation rendering, description truncation
and each client's own discovery-vs-initialize choice are invisible to the harness.
2025-03-26. Advertised by the server, not exercised.executionblock removal is visible to down-level clients too, since Tasks left Coreentirely. A client that was reading
execution.taskSupportwould see it disappear; no client inscope is known to.
staging.
🤖 Generated with Claude Code