Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
213 commits
Select commit Hold shift + click to select a range
ef62e6e
Bump actions/setup-node from 6.0.0 to 6.1.0 (#1074)
dependabot[bot] Dec 8, 2025
9f6fc36
Bump danielpalme/ReportGenerator-GitHub-Action from 5.5.0 to 5.5.1 (#…
dependabot[bot] Dec 8, 2025
66ba342
Bump actions/checkout from 5.0.1 to 6.0.0 (#1005)
dependabot[bot] Dec 9, 2025
20d726b
Remove s_additionalProperties from McpClientTool (#1080)
Copilot Dec 10, 2025
f9239b0
Migrate from Anthropic.SDK to official Anthropic package (#1083)
Copilot Dec 10, 2025
cd1052b
Update Microsoft.Extensions.AI dependencies to 10.1.0 (#1082)
Copilot Dec 10, 2025
80e1882
Bump version to 0.5.0-preview.2. Update NuGet Project URL. (#1078)
jeffhandley Dec 10, 2025
828d51e
Improve caching in XmlToDescriptionGenerator (#1010)
stephentoub Dec 11, 2025
31f8d20
Support incremental scope consent (SEP-835) (#1084)
halter73 Dec 12, 2025
9bbae84
Resource subscribe should be true if handler provided (#676)
PederHP Dec 12, 2025
3aedd3c
Fix Icon.Theme documentation to match MCP specification (#1090)
Copilot Dec 12, 2025
c3910e9
Update Microsoft.Extensions.AI* packages to latest versions (#1093)
Copilot Dec 13, 2025
5b74ee2
Document HttpRequestException thrown by McpClient.CreateAsync (#1095)
Copilot Dec 15, 2025
ff5e8b0
Bump actions/checkout from 6.0.0 to 6.0.1 (#1100)
dependabot[bot] Dec 15, 2025
ebda856
Bump becheran/mlc from 1.0.0 to 1.2.0 (#1098)
dependabot[bot] Dec 15, 2025
8a7d132
Bump actions/upload-artifact from 5.0.0 to 6.0.0 (#1099)
dependabot[bot] Dec 15, 2025
a78008c
Bump actions/download-artifact from 6.0.0 to 7.0.0 (#1097)
dependabot[bot] Dec 15, 2025
d0ee6a0
Bump the other-testing group with 1 update (#1101)
dependabot[bot] Dec 15, 2025
31fcc1e
Add request duration to LogRequestHandlerCompleted and LogRequestHand…
Copilot Dec 15, 2025
1b846cb
Add missing exception documentation to public API surface (#1103)
Copilot Dec 15, 2025
aaffd71
Fix session timeout due to timestamp frequency mismatch and activity …
Copilot Dec 15, 2025
8b73a42
Remove private reflection from tests (#1107)
Copilot Dec 16, 2025
8316aa0
Add CS1066 suppressor for MCP server methods with optional parameters…
Copilot Dec 19, 2025
aa2f8f4
Improve docs landing page (#1114)
gewarren Dec 19, 2025
0897ca1
Bump Anthropic from 11.0.0 to 12.0.1 (#1118)
dependabot[bot] Dec 22, 2025
db0beeb
Add CONTRIBUTING.md (#1125)
mikekistler Dec 29, 2025
bafbb0a
Fix CreateSamplingHandler to use ChatRole.Tool for tool result messag…
Copilot Jan 6, 2026
6ff2712
Bump the other-testing group with 1 update (#1124)
dependabot[bot] Jan 8, 2026
f3fb617
Install mono in dev container (#1133)
mikekistler Jan 9, 2026
14f9735
Add client conformance tests (#1102)
mikekistler Jan 9, 2026
50e29c5
Add examples of icons on tools, resources, prompts, and server implem…
mikekistler Jan 9, 2026
b2afc2f
Bump Anthropic from 12.0.1 to 12.1.0 (#1137)
dependabot[bot] Jan 12, 2026
4a2c36c
Use fully-qualified type names in generated partial method signatures…
Copilot Jan 12, 2026
2bc105b
Optimize JsonRpcMessage deserialization with single-pass parsing (#1138)
Copilot Jan 13, 2026
89b67b0
Bump version to 0.6.0-preview.1 (#1141)
jeffhandley Jan 13, 2026
d52a7b1
Align telemetry with OpenTelemetry MCP semantic conventions (#1139)
Copilot Jan 14, 2026
ae98882
chore: update licensing to Apache 2.0 for new contributions (#1140)
domdomegg Jan 14, 2026
dada237
Add comprehensive edge case tests for JSON-RPC payload shapes (#1143)
Copilot Jan 14, 2026
4cb2fd4
Bump version to 0.7.0-preview.1 (#1144)
jeffhandley Jan 14, 2026
b831175
Streamable HTTP resumability + redelivery + SSE polling via server-si…
MackinnonBuck Jan 15, 2026
774411b
Add 2025-11-25 as supported version (#1130)
Copilot Jan 15, 2026
92db4ab
Bump actions/setup-dotnet from 5.0.1 to 5.1.0 (#1157)
dependabot[bot] Jan 19, 2026
c61f0fa
Bump actions/setup-node from 6.1.0 to 6.2.0 (#1158)
dependabot[bot] Jan 19, 2026
3eef74b
Bump the testing-frameworks group with 1 update (#1159)
dependabot[bot] Jan 19, 2026
fcf70c7
Bump the other-testing group with 1 update (#1160)
dependabot[bot] Jan 19, 2026
4a3a17d
Fix source generator diagnostic locations for incremental caching (#1…
Copilot Jan 19, 2026
c9eddc9
Update Microsoft.Extensions.AI to 10.2.0 (#1165)
Copilot Jan 19, 2026
eca882e
Update Anthropic SDK to 12.2.0 (#1164)
Copilot Jan 19, 2026
0585c27
Fix form mode elicitation schema check to apply for all form requests…
Copilot Jan 20, 2026
46d3044
Fix ToJsonObject serialization failure with anonymous types and add s…
Copilot Jan 20, 2026
a1e9e41
Pin the MCP conformance tester package (#1176)
eiriktsarpalis Jan 26, 2026
86bc96d
Fix flaky test: `Client_CanResumePostResponseStream_AfterDisconnectio…
MackinnonBuck Jan 27, 2026
6ca7cde
Document MCP Server project template in README (#1148)
leslierichardson95 Jan 27, 2026
81664c3
Fix reserved expansion (e.g. "{+var}") when matching resources (#1142)
halter73 Jan 27, 2026
10e4f5b
Implement MCP task support (SEP-1686) (#1170)
eiriktsarpalis Jan 28, 2026
0093341
Bump version to 0.8.0-preview.1 (#1181)
Copilot Jan 28, 2026
201d8d4
Fix typo in elicitation.md (#1186)
ruyut Jan 28, 2026
727d507
Fix typo in progress.md (#1189)
ruyut Jan 28, 2026
269f39f
Bump actions/checkout from 6.0.1 to 6.0.2 (#1173)
dependabot[bot] Jan 29, 2026
84dcfbc
Bump the opentelemetry-testing group with 6 updates (#1174)
dependabot[bot] Jan 29, 2026
e4692fa
Remove 10 second wait from docker tests (#1188)
stephentoub Jan 29, 2026
5b189af
Fix Session_TracksActivities test (#1200)
stephentoub Jan 29, 2026
ee8c485
Add Trace-level logging for JSON-RPC payloads in transports (#1191)
Copilot Jan 29, 2026
aaf2246
Use Process.Kill(entireProcessTree: true) on .NET for faster process …
stephentoub Jan 29, 2026
482e311
Fix StdioServerTransportTests to use Debug logging level instead of T…
Copilot Jan 29, 2026
7c85ac6
Include response body in HttpRequestException for transport client er…
Copilot Jan 29, 2026
8e57ac6
Centralize test timeout constants to fix sporadic CI failures (#1210)
Copilot Jan 30, 2026
f9dec13
Fix race condition in SSE GET request initialization (#1212)
stephentoub Jan 30, 2026
283caf9
Fix race condition in AutomaticInputRequiredStatusTests polling logic…
Copilot Jan 30, 2026
a83d619
Centralize test timeout constants to fix CI flakiness (#1224)
Copilot Jan 30, 2026
82bd980
Add test coverage for AdditionalHeaders in Streamable HTTP transport …
Copilot Jan 30, 2026
e47f884
Fix keyset pagination with monotonic UUIDv7-like task IDs (#1215)
Copilot Jan 30, 2026
5084a79
Add ILoggerFactory to StreamableHttpServerTransport (#1213)
Copilot Jan 30, 2026
50d6d0b
Fix XunitLoggerProvider crash when background work logs after test di…
Copilot Jan 30, 2026
6a4e4d2
Skip .NET Framework tests on non-Windows platforms (#1226)
Copilot Jan 30, 2026
6224f30
Suppress TimeProvider.Testing net472 warning (#1227)
Copilot Jan 30, 2026
7d48d39
Add support for message-level filters to McpServer (#1207)
halter73 Jan 30, 2026
b2057d8
Bump Anthropic from 12.2.0 to 12.3.0 (#1234)
dependabot[bot] Feb 2, 2026
0c35f8f
Bump the other-testing group with 1 update (#1233)
dependabot[bot] Feb 2, 2026
712068b
Seal public Protocol reference types to prevent external inheritance …
Copilot Feb 2, 2026
d5c6b0d
Add `DistributedCacheEventStreamStore` (#1136)
MackinnonBuck Feb 3, 2026
cfa89a3
Clarify McpMetaAttribute documentation scope (#1242)
Copilot Feb 3, 2026
e55ae7b
Use package-lock.json to pin conformance test dependencies (#1247)
halter73 Feb 6, 2026
0114de7
Update to MCP conformance tests version 0.1.13 (#1249)
stephentoub Feb 6, 2026
bfd01b9
Bump version to 0.9.0-preview.1 (#1245)
jeffhandley Feb 6, 2026
9c1538f
Add AOT compatibility publish test (#1246)
Copilot Feb 9, 2026
27b5eb8
Bring up to 0.1.13 conformance (#1254)
stephentoub Feb 10, 2026
b4c7ded
Add tests to verify McpClient.DisposeAsync doesn't hang (#1252)
halter73 Feb 13, 2026
dbf91bc
Change ProtectedResourceMetadata URI properties to strings and build …
Copilot Feb 13, 2026
53e9ed8
Log tool call name on success, not just failure (#1256)
Copilot Feb 13, 2026
b8ae4fe
Add auth regression test for missing resource in PRM (#1265)
Copilot Feb 13, 2026
ec2983b
Fix test for CannotAuthenticate when metadata is missing (#1266)
Copilot Feb 13, 2026
fb2daf2
Fix HttpClient timeout for long-running tools without event stream st…
Copilot Feb 14, 2026
f76f6f6
Bump qs from 6.14.1 to 6.14.2 in the npm_and_yarn group across 1 dire…
dependabot[bot] Feb 15, 2026
3caac28
Fix flaky stderr test: call WaitForExit() after WaitForExitAsync() to…
Copilot Feb 15, 2026
1dd06e7
Fix stderr event loss due to missing WaitForExit in DisposeProcess (#…
Copilot Feb 15, 2026
5cec467
Bump the other-testing group with 2 updates (#1283)
dependabot[bot] Feb 16, 2026
da91b64
Unskip GetRequest_Receives_UnsolicitedNotifications test (#1286)
mikekistler Feb 16, 2026
2c7eefa
Bump Anthropic from 12.3.0 to 12.5.0 (#1284)
dependabot[bot] Feb 16, 2026
d7ca79b
Bump Microsoft.Extensions.AI from 10.2.0 to 10.3.0 (#1285)
dependabot[bot] Feb 16, 2026
392e47e
Document https:// direct-fetch provision in ReadResourceRequestParams…
Copilot Feb 17, 2026
4cef394
Add serialization roundtrip tests for all Protocol namespace types (#…
Copilot Feb 17, 2026
49fbc51
Align `InitializeResult.instructions` XML docs with latest MCP spec g…
Copilot Feb 17, 2026
43a302f
Align sampling specification XML docs with spec revision d165cd6 (#1293)
Copilot Feb 17, 2026
2e17550
Add X-Accel-Buffering header to SSE responses (#1294)
Copilot Feb 17, 2026
6a38242
Clarify request-scoped tool semantics in CreateMessageRequestParams (…
Copilot Feb 17, 2026
6fa8b50
Fix flaky sse-retry conformance test caused by CI timing sensitivity …
Copilot Feb 17, 2026
5651e9e
Bump the serilog-testing group with 1 update (#1282)
dependabot[bot] Feb 17, 2026
186cb93
Update McpErrorCode XML docs and fix error code usage to align with M…
Copilot Feb 17, 2026
841e810
Fix StdioServerTransport.DisposeAsync() hang: CancellableStdinStream …
Copilot Feb 18, 2026
ec4c732
Add validation and error signaling guidance to MCP tool XML docs (#1275)
Copilot Feb 18, 2026
a502efb
Update tests for @modelcontextprotocol/server-everything 2026.1.26 (#…
Copilot Feb 18, 2026
92cbbca
Bump the testing-frameworks group with 1 update (#1281)
dependabot[bot] Feb 18, 2026
c3bb9c1
Bump ajv from 8.17.1 to 8.18.0 in the npm_and_yarn group across 1 dir…
dependabot[bot] Feb 18, 2026
f3da472
Avoid intermediate strings in MCP transport serialization (#1274)
Copilot Feb 18, 2026
703d842
Update SECURITY.md to use GitHub Security Advisories (#1306)
localden Feb 18, 2026
5da0fe5
Validate MCP-Protocol-Version header in Streamable HTTP handler (#1277)
Copilot Feb 19, 2026
b967835
Use TimeProvider in InMemoryMcpTaskStore for deterministic testing (#…
Copilot Feb 19, 2026
231e013
Reduce flakiness in long-running stateless HTTP tool timeout test (#1…
Copilot Feb 19, 2026
cc6ef5b
Hide experimental types from external source generators using interna…
MackinnonBuck Feb 19, 2026
a3ce9e9
Add docs for working with experimental APIs (#1307)
MackinnonBuck Feb 19, 2026
80b1ad2
Use ReadOnlyMemory<byte> for binary data to eliminate UTF-16 transcod…
Copilot Feb 19, 2026
411cef6
Don't treat McpServerHandlers as an independent options type (#1313)
halter73 Feb 19, 2026
27a3196
Add `ISessionMigrationHandler` (#1270)
MackinnonBuck Feb 19, 2026
d21aa9e
Split configuration of request and message filters (#1308)
halter73 Feb 20, 2026
bd758ff
Remove dead code: `options ??= new()` in McpServerImpl constructor (#…
Copilot Feb 20, 2026
49141a3
Remove unnecessary `_connectCts` field from `McpClientImpl` (#1323)
Copilot Feb 20, 2026
d9ae6bc
Fix flaky DiagnosticTests on net10.0 by waiting for specific activiti…
Copilot Feb 20, 2026
54283a8
Add missing Title and Icons properties to ResourceLinkBlock (#1320)
Copilot Feb 20, 2026
3727dc4
Omit null mimeType from ResourceContents JSON serialization (#1325)
Copilot Feb 20, 2026
539481f
Validate mimeType in ImageContentBlock.FromBytes and AudioContentBloc…
Copilot Feb 20, 2026
5c35ea9
Replace concrete collection types with interfaces in public API surfa…
Copilot Feb 20, 2026
2846430
Bump version to 1.0.0-rc.1 (#1327)
jeffhandley Feb 20, 2026
604dcaa
Add release-notes, breaking-changes, and bump-version Copilot skills …
jeffhandley Feb 20, 2026
026bf1d
Fix incorrect XML doc comments in McpClient.Methods.cs (#1333)
Copilot Feb 21, 2026
451da4d
Bump hono from 4.11.7 to 4.12.0 in the npm_and_yarn group across 1 di…
dependabot[bot] Feb 21, 2026
4648d3e
Make UrlElicitationRequiredErrorData.Elicitations consistent with oth…
Copilot Feb 21, 2026
34d4cd7
Add missing exception documentation for public APIs (#1339)
Copilot Feb 21, 2026
79b2dbe
Fix Metadata delegation in DelegatingMcpServerTool/Prompt/Resource (#…
Copilot Feb 21, 2026
c2aa6a5
Add Extensions support to ClientCapabilities and ServerCapabilities (…
Copilot Feb 21, 2026
d429b0b
Fix _meta properties to use JsonObject (#1341)
Copilot Feb 21, 2026
2960f61
Fix flaky sse-retry conformance test due to CI timing overhead (#1336)
Copilot Feb 21, 2026
1a6c0dd
Bump version down to 0.9.0-preview.2 since we are still changing APIs…
jeffhandley Feb 21, 2026
139745d
Bump version to 0.9.0-preview.3 (#1352)
jeffhandley Feb 22, 2026
741eab7
Fix malformed XML doc on `McpServerPrimitiveCollection.Contains` (#1348)
Copilot Feb 23, 2026
f241b4a
Clarify null semantics in ToolAnnotations hint property docs (#1346)
Copilot Feb 23, 2026
fa56de9
Bump the other-testing group with 1 update (#1358)
dependabot[bot] Feb 23, 2026
9b5d0fe
Make Tool.Name required to match other protocol types (#1351)
Copilot Feb 23, 2026
571e4dc
Make LoggingMessageNotificationParams.Data required per MCP spec (#1353)
Copilot Feb 23, 2026
5c68dec
Bump Anthropic from 12.5.0 to 12.8.0 (#1359)
dependabot[bot] Feb 23, 2026
2c9bb5d
Fix off-by-one error in reconnection attempts (#1356)
Copilot Feb 23, 2026
74622d0
Remove server back-references from protocol DTO types (#1345)
Copilot Feb 23, 2026
774a1db
Fix base64 deserialization when JSON encoder escapes forward slashes …
Copilot Feb 23, 2026
e7b779a
Add CloneResourceMetadataClonesAllProperties test using public reflec…
Copilot Feb 23, 2026
374f719
Increase MaxReconnectionAttempts default from 2 to 5 (#1355)
Copilot Feb 23, 2026
4f70954
Prevent cancellation of initialize request per MCP spec (#1350)
Copilot Feb 23, 2026
a2ee0c8
Address asymmetry in McpServerHandlers/McpClientHandlers and make all…
Copilot Feb 23, 2026
0a0a575
Normalize CallToolResult.StructuredContent to JsonElement? (#1357)
Copilot Feb 23, 2026
ce2a5e4
Fix CreateMessageRequestParams.Metadata type to JsonObject (#1354)
Copilot Feb 23, 2026
9b2aaed
Remove MCP9002 obsolete APIs and document obsolete diagnostics (#1366)
Copilot Feb 24, 2026
124b43b
Add explicit [Experimental] protected constructors to McpClient and M…
Copilot Feb 24, 2026
b052892
Bump version to 1.0.0 (stable) (#1364)
jeffhandley Feb 24, 2026
1446cd7
Fix compilation errors in README code samples (#1369)
jeffhandley Feb 24, 2026
8c46411
Fix McpClientPrompt/Resource types to use RequestOptions like McpClie…
Copilot Feb 24, 2026
0e23854
Add README code sample validation step to release-notes skill (#1371)
jeffhandley Feb 24, 2026
3cc4863
Fix XML documentation spelling, grammar, and correctness issues acros…
Copilot Feb 24, 2026
3877560
Add Roadmap document and navigation link (#1373)
jeffhandley Feb 24, 2026
669c36b
Unify service configuration for `ISseEventStreamStore`, `IMcpTaskStor…
MackinnonBuck Feb 24, 2026
2ec082b
Bump version to 1.0.0-rc.1 (#1376)
jeffhandley Feb 24, 2026
c57f917
Fix a few bugs in the docs (#1379)
stephentoub Feb 24, 2026
4e68a4e
Add 2025-03-26 OAuth backward compatibility for client conformance (#…
jeffhandley Feb 24, 2026
84cd691
Mark RunSessionHandler experimental (MCPEXP002) (#1383)
Copilot Feb 24, 2026
46668f1
Add and augment conceptual docs (#1375)
jeffhandley Feb 25, 2026
551db0d
Bump to version 1.0.0 (stable) (#1384)
jeffhandley Feb 25, 2026
80044da
Add SSE server code example to transports documentation (#1385)
jeffhandley Feb 25, 2026
831cf4b
Simplify and update README for stable release (#1387)
stephentoub Feb 25, 2026
a7df425
Enable `EnablePackageValidation` for all src packages with `1.0.0` ba…
Copilot Feb 25, 2026
1108117
Simplify and update package README.md files for stable release (#1388)
Copilot Feb 26, 2026
919e838
Register ping handler in McpSessionHandler to support server-initiate…
Copilot Feb 26, 2026
de387bf
Bump hono from 4.12.0 to 4.12.2 in the npm_and_yarn group across 1 di…
dependabot[bot] Feb 27, 2026
1578e94
Remove outdated README reference from transports.md (#1394)
halter73 Feb 27, 2026
94aa695
Fix Extensions not being copied to ServerCapabilities during initiali…
Copilot Feb 28, 2026
06563e2
Clean up markdown-link-check warnings (#1395)
jeffhandley Feb 28, 2026
4af2596
Auto-populate completion handlers from AllowedValuesAttribute on prom…
Copilot Mar 1, 2026
b965a7e
Add client completion notification and details (#1368)
stephentoub Mar 2, 2026
50ba8c2
Bump docfx from 2.78.4 to 2.78.5 (#1408)
dependabot[bot] Mar 2, 2026
60e988b
Bump actions/download-artifact from 7.0.0 to 8.0.0 (#1406)
dependabot[bot] Mar 2, 2026
750fc3e
Bump actions/upload-artifact from 6.0.0 to 7.0.0 (#1405)
dependabot[bot] Mar 2, 2026
b76df12
Bump danielpalme/ReportGenerator-GitHub-Action from 5.5.1 to 5.5.2 (#…
dependabot[bot] Mar 2, 2026
2894c0d
Bump the testing-frameworks group with 1 update (#1407)
dependabot[bot] Mar 2, 2026
89fcf3f
Wait for in-flight message handlers before ProcessMessagesCoreAsync r…
Copilot Mar 2, 2026
123f972
Add issue-triage Copilot skill (#1412)
jeffhandley Mar 6, 2026
ca040d7
Release v1.1.0 (#1411)
jeffhandley Mar 6, 2026
aae77b1
Update documentation URLs to new vanity domain (#1414)
Copilot Mar 8, 2026
8970b0a
[release-notes skill] Harvest Co-authored-by trailers from all commit…
jeffhandley Mar 18, 2026
4140c6d
Update System10Version to 10.0.4 and MicrosoftExtensionsVersion to 10…
Copilot Mar 19, 2026
2958a75
Support specifying OutputSchema independently of return type for tool…
Copilot Mar 23, 2026
af2d40b
Bump the other-testing group with 2 updates (#1440)
dependabot[bot] Mar 23, 2026
57abd20
Bump danielpalme/ReportGenerator-GitHub-Action from 5.5.2 to 5.5.4 (#…
dependabot[bot] Mar 23, 2026
83aee9c
Update Microsoft.Extensions.AI.OpenAI version reference (#1456)
stephentoub Mar 23, 2026
fd7f2c0
Bump Microsoft.Extensions.AI from 10.4.0 to 10.4.1 (#1461)
dependabot[bot] Mar 23, 2026
51a4fde
Bump Anthropic from 12.8.0 to 12.9.0 (#1460)
dependabot[bot] Mar 23, 2026
e700951
docs: align roots terminology with MCP spec clarification (#1469)
Copilot Mar 27, 2026
afc40d1
Route SendRequestAsync logic through outgoing message filters (#1465)
halter73 Mar 27, 2026
7dcdbaf
Add 3-arg RequestContext constructor and obsolete 2-arg to eliminate …
Copilot Mar 27, 2026
cf63f0e
Fix: create per-task DI scope in ExecuteToolAsTaskAsync to prevent Ob…
Copilot Mar 27, 2026
49bf170
Fix WithMeta + WithProgress causing tool invocation failure (#1464)
Copilot Mar 27, 2026
8eb4023
Add stateless doc, prefer stateless mode and disable legacy SSE by de…
halter73 Mar 27, 2026
498de08
Release v1.2.0 (#1472)
jeffhandley Mar 27, 2026
7662ce6
Make ClientTransportClosedException public and unify transport except…
Copilot Mar 30, 2026
ed87d4b
feat: Add Enterprise Managed Authorization (SEP-990) support
aniket-okta Feb 18, 2026
e8b87db
test: add OAuthTestBase integration tests
aniket-okta Apr 6, 2026
dc12435
refactor: split public types into separate files, remove SEP-990 refs…
aniket-okta Apr 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .config/dotnet-tools.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
"isRoot": true,
"tools": {
"docfx": {
"version": "2.78.4",
"version": "2.78.5",
"commands": [
"docfx"
],
"rollForward": false
}
}
}
}
6 changes: 5 additions & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,9 @@
}
}
},
"postCreateCommand": "dotnet dev-certs https --trust && dotnet --list-sdks && echo 'Available .NET SDKs installed successfully!'"
"postCreateCommand": {
"dev certs": "dotnet dev-certs https --trust",
"mono": "sudo apt-get update && sudo apt-get install -y mono-devel",
"list sdks": "dotnet --list-sdks && echo 'Available .NET SDKs installed successfully!'"
}
}
71 changes: 71 additions & 0 deletions .github/skills/breaking-changes/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
name: breaking-changes
description: Audit pull requests for breaking changes in the C# MCP SDK. Examines PR descriptions, review comments, and diffs to identify API and behavioral breaking changes, then reconciles labels with user confirmation. Use when asked to audit breaking changes, check for breaking changes, or review a set of PRs for breaking impact.
compatibility: Requires gh CLI with repo access and GitHub API access for PR details, review history, and labels.
---

# Breaking Change Audit

Audit pull requests in the `modelcontextprotocol/csharp-sdk` repository for breaking changes. This skill examines a range of commits, identifies API and behavioral breaking changes, assesses their impact, reconciles `breaking-change` labels, and returns structured results.

## Input

The user provides a commit range in any of these forms:
- `tag..HEAD` (e.g. `v0.8.0-preview.1..HEAD`)
- `tag..tag` (e.g. `v0.8.0-preview.1..v0.9.0-preview.1`)
- `sha..sha`
- `tag..sha` or `sha..HEAD`

If no range is provided, ask the user to specify one.

Use the GitHub API to get the full list of PRs merged within the specified range.

## Process

### Step 1: Examine Every PR

For each PR in the range, study:
- PR description and linked issues
- Full review and comment history
- Complete code diff

Look for both categories of breaking changes:
- **API (compile-time)** — changes to public type signatures, parameter types, return types, removed members, sealed types, new obsoletion attributes, etc.
- **Behavioral (runtime)** — new/changed exceptions, altered return values, changed defaults, modified event ordering, serialization changes, etc.

See [references/classification.md](references/classification.md) for the full classification guide, including SDK-specific versioning policies (experimental APIs, obsoletion lifecycle, and spec-driven changes) that influence how breaks are assessed.

### Step 2: Assess Impact

For each identified breaking change, assess:
- **Breadth** — how many consumers are likely affected (widely-used type vs. obscure API)
- **Severity** — compile-time break (immediate build failure) vs. behavioral (subtle runtime difference)
- **Migration** — straightforward fix vs. significant code changes required

This assessment informs how breaking changes are ordered when presented (most impactful first).

### Step 3: Reconcile Labels

Compare findings against existing `breaking-change` labels on PRs.

Present mismatches to the user interactively:

- **Unlabeled but appears breaking** → explain why the PR appears breaking, ask user to confirm. If confirmed: apply the `breaking-change` label and ask the user whether to comment on the PR explaining the addition.
- **Labeled but does not appear breaking** → explain why, ask user to confirm removal. If confirmed: remove the label and ask the user whether to comment on the PR explaining the removal.

### Step 4: Present Results

Present the final list of confirmed breaking changes, sorted from most impactful to least, with:
- PR number and title
- Classification (API or behavioral)
- Impact assessment summary
- 1-2 bullet description of what breaks and migration guidance

## Output

The audit produces a structured list of breaking changes that can be consumed by other skills (e.g. the **prepare-release** and **publish-release** skills) or presented directly to the user.

Each entry contains:
- PR number and description
- Impact ranking (most → least impactful)
- Detail bullets describing the break and migration path
148 changes: 148 additions & 0 deletions .github/skills/breaking-changes/references/classification.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
# Breaking Change Classification Guide

This guide defines how to identify and classify breaking changes in the C# MCP SDK. It is derived from the [dotnet/runtime breaking change guidelines](https://github.com/dotnet/runtime/blob/main/docs/coding-guidelines/breaking-changes.md).

## Two Categories of Breaking Changes

### API Breaking Changes (Compile-Time)
Changes that alter the public API surface in ways that break existing code at compile time:

- **Renaming or removing** a public type, member, or parameter
- **Changing the return type** of a method or property
- **Changing parameter types, order, or count** on a public method
- **Sealing** a type that was previously unsealed (when it has accessible constructors)
- **Making a virtual member abstract**
- **Adding `abstract` to a member** when the type has accessible constructors and is not sealed
- **Removing an interface** from a type's implementation
- **Changing the value** of a public constant or enum member
- **Changing the underlying type** of an enum
- **Adding `readonly` to a field**
- **Removing `params` from a parameter**
- **Adding/removing `in`, `out`, or `ref`** parameter modifiers
- **Renaming a parameter** (breaks named arguments and late-binding)
- **Adding the `[Obsolete]` attribute** or changing its diagnostic ID
- **Adding the `[Experimental]` attribute** or changing its diagnostic ID
- **Removing accessibility** (making a public/protected member less visible)

### Behavioral Breaking Changes (Runtime)
Changes that don't break compilation but alter observable behavior:

- **Throwing a new/different exception type** in an existing scenario (unless it's a more derived type)
- **No longer throwing an exception** that was previously thrown
- **Changing return values** for existing inputs
- **Decreasing the range of accepted values** for a parameter
- **Changing default values** for properties, fields, or parameters
- **Changing the order of events** being fired
- **Removing the raising of an event**
- **Changing timing/order** of operations
- **Changing parsing behavior** and throwing new errors
- **Changing serialization format** or adding new fields to serialized types

## Classification Buckets

### Bucket 1: Clear Public Contract Violation
Obvious breaking changes to the public API shape. **Always flag these.**

### Bucket 2: Reasonable Grey Area
Behavioral changes that customers would have reasonably depended on. **Flag and discuss with user.**

### Bucket 3: Unlikely Grey Area
Behavioral changes that customers could have depended on but probably wouldn't (e.g., corner case corrections). **Flag with lower confidence.**

### Bug Fixes (Exclude)
Changes that correct incorrect behavior, fix spec compliance, or address security issues are **not breaking changes** even if they alter observable behavior. Examples:
- Fixing encoding to match a specification requirement
- Correcting a logger category or metric name that was wrong
- Fixing exception message leaks that were a security concern
- Moving data to the correct location per protocol spec evolution
- Setting a flag that should have been set automatically (e.g., `IsError` for error content)
- Returning a more specific/informative exception for better diagnostics

If a change is primarily a bug fix or spec compliance correction, exclude it from the breaking changes list even though the observable behavior changes.

### Bucket 4: Clearly Non-Public
Changes to internal surface or behavior (e.g., internal APIs, private reflection). **Generally not flagged** unless they could affect ecosystem tools.

## SDK Versioning Policy

The classification rules above are derived from the dotnet/runtime breaking change guidelines, but the MCP SDK has its own versioning policy (see `docs/versioning.md`) that provides additional context for classification decisions.

### Experimental APIs

APIs annotated with `[Experimental]` (using `MCP`-prefixed diagnostic codes) can change at any time, including within PATCH or MINOR updates. Changes to experimental APIs should still be **noted** in the audit, but classified as **Bucket 3 (Unlikely Grey Area)** or lower unless the API has been widely adopted despite its experimental status.

#### APIs exclusively reachable through `[Experimental]` gates

A change to a non-experimental public API is **not considered breaking** if it only affects consumers who have already opted into an `[Experimental]` code path. The key question is: *can a consumer reach the breaking impact without suppressing an experimental diagnostic?*

For example, adding an abstract member to a public abstract class is normally a Bucket 1 break (anyone deriving from the class must implement the new member). However, if the class's only accessible constructor is marked `[Experimental]`, then deriving from it already requires suppressing the experimental diagnostic — meaning the consumer has explicitly accepted that the API is subject to change.

**How to identify this pattern:**
1. A change would normally be classified as a breaking change (e.g., CP0005 — adding abstract member to abstract type)
2. Trace the code path a consumer must follow to be affected by the break
3. If **every** such path requires the consumer to use an `[Experimental]`-annotated API (constructor, method, type, etc.), the break is dismissed

### Obsoletion Lifecycle

The SDK follows a three-step obsoletion process:

1. **MINOR update**: API marked `[Obsolete]` producing _build warnings_ with migration guidance
2. **MAJOR update**: API marked `[Obsolete]` producing _build errors_ (API throws at runtime)
3. **MAJOR update**: API removed entirely (expected to be rare)

When auditing, classify each step appropriately:
- Step 1 (adding `[Obsolete]` warning) → API breaking change (new build warning)
- Step 2 (escalating to error) → API breaking change (previously working code now fails)
- Step 3 (removal) → API breaking change; migration guidance should note prior deprecation

In exceptional circumstances, the obsoletion lifecycle may be compressed (e.g., marking obsolete and removing in the same MINOR release). This should still be flagged as a breaking change but the migration guidance should explain the rationale.

### Spec-Driven Changes

Breaking changes necessitated by MCP specification evolution should be flagged and documented normally, but the migration guidance should reference the spec change. If a spec change forces an incompatible API change, preference is given to supporting the most recent spec version.

## Compatibility Switches

When a breaking change includes an `AppContext` switch or other opt-in/opt-out mechanism, always note it in the migration guidance. Search for `AppContext.TryGetSwitch`, `DOTNET_` environment variables, and similar compat patterns in the diff. Include the switch name and the value that alters the behavior:

```
* Compat switch: `ModelContextProtocol.AspNetCore.AllowNewSessionForNonInitializeRequests` = `true` restores previous behavior
```

## Dismissing Potential Breaking Changes

When a change appears to be breaking but is dismissed (e.g., as a bug fix, clearly non-public, or exclusively gated by `[Experimental]` APIs), the audit must present the full rationale to the user for verification.

### Gathering Supporting Evidence

Before dismissing a potential break, review the PR description and all PR comments (both review comments and general comments) for discussion about the breaking change. Authors and reviewers often explain *why* a change is acceptable — for example, noting that the affected type is gated by an experimental constructor, that the previous behavior was incorrect per the spec, that no external consumers exist yet, or that compatibility suppressions were added intentionally. This discussion serves as supporting evidence for the dismissal and should be cited in the audit findings.

### Presenting Dismissals

Every dismissed potential break must be reported to the user with enough detail for them to verify the conclusion. The audit must:

1. **Identify what would normally be breaking and why** (e.g., "CP0005 — adding abstract member `Completion` to abstract class `McpClient`")
2. **Explain the specific reason for dismissal** (e.g., "Bug fix correcting incorrect behavior per the MCP spec" or "`McpClient`'s only accessible constructor is `protected` and marked `[Experimental(MCPEXP002)]` with message 'Subclassing McpClient and McpServer is experimental and subject to change.'")
3. **Cite any supporting discussion** from the PR description or comments (e.g., "Reviewers discussed the addition and did not flag it as a breaking concern; compatibility suppressions were added for CP0005")
4. **Conclude with the dismissal and its category** (e.g., "Dismissed — bug fix correcting spec-non-compliant behavior" or "Dismissed — exclusively gated by `[Experimental]` API. Do not apply the `breaking-change` label.")

This transparency allows the user to verify each dismissal rationale and override it if the justification is insufficient.

## What to Study for Each PR

For every PR in the range, examine:

1. **PR description** — Authors often describe breaking changes here, or explain why a potentially breaking change is acceptable
2. **Linked issues** — May contain discussion about breaking impact
3. **Review comments** — Reviewers may have flagged breaking concerns or discussed why a change is acceptable despite appearing breaking (e.g., experimental gates, no external consumers, compatibility suppressions). These discussions are critical evidence when dismissing potential breaks.
4. **General comments** — Authors and reviewers sometimes discuss breaking change justification in the PR conversation thread rather than in review comments
5. **Code diff** — Look at changes to:
- Public type/member signatures
- Exception throwing patterns
- Default values and constants
- Return value changes
- Parameter validation changes
- Attribute changes (`[Obsolete]`, `[Experimental]`, etc.)
- `AppContext.TryGetSwitch` or environment variable compat switches
- Compatibility suppressions (e.g., `CompatibilitySuppressions.xml` for ApiCompat CP0005 etc.)
6. **Labels** — Check if `breaking-change` is already applied
66 changes: 66 additions & 0 deletions .github/skills/bump-version/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
---
name: bump-version
description: Assess and bump the SDK version using Semantic Versioning 2.0.0. Evaluates queued changes to recommend PATCH/MINOR/MAJOR, updates src/Directory.Build.props, and creates a pull request. Owns the SemVer assessment logic shared by prepare-release and publish-release. Use when asked to bump the version, assess the version, or determine what the next version should be.
compatibility: Requires gh CLI with repo access for creating branches and pull requests. GitHub API access for PR details when performing SemVer-informed assessment.
---

# Bump Version

Assess and bump the SDK version in `src/Directory.Build.props` to prepare for the next release. This skill owns the [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html) assessment logic — the [SemVer assessment guide](references/semver-assessment.md) is the single source of truth for version assessment criteria used across the release workflow by both the **prepare-release** and **publish-release** skills.

> **Note**: For comprehensive release preparation — including ApiCompat/ApiDiff, documentation review, and release notes — use the **prepare-release** skill, which incorporates version assessment as part of its broader workflow.

## Process

### Step 1: Read Current Version and Previous Release

Read `src/Directory.Build.props` on the default branch and extract:
- `<VersionPrefix>` — the `MAJOR.MINOR.PATCH` version

Display the current version to the user.

Determine the previous release tag from `gh release list` (most recent **published** release). Draft releases must be ignored — they represent a pending release that has not yet shipped. Use `--exclude-drafts` or filter to only published releases when querying.

### Step 2: Assess and Determine Next Version

If the user provided a target version in their prompt, use it directly. Otherwise, determine the next version using one of two approaches:

#### SemVer-Informed Assessment (Preferred)

When context about queued changes is available or can be gathered, assess the version following the [SemVer assessment guide](references/semver-assessment.md):

1. Get the list of PRs merged between the previous release tag and the target commit (typically HEAD).
2. Classify the release level:
- **MAJOR** — if any confirmed breaking changes (API or behavioral), excluding `[Experimental]` APIs
- **MINOR** — if new public APIs, features, or obsoletion warnings are present
- **PATCH** — otherwise
3. Compute the recommended version from the previous release tag (see the assessment guide for increment rules).
4. Compare against the current version in `Directory.Build.props` and flag any discrepancy.
5. Present the assessment with a summary table and rationale, then get user confirmation.

#### Default Suggestion (Fallback)

When a quick bump is needed without full change analysis, suggest the next **minor** version:

- Current `1.0.0` → suggest `1.1.0`
- Current `1.2.3` → suggest `1.3.0`

Present the suggestion and let the user confirm or provide an alternative.

Parse the confirmed version into its `VersionPrefix` component.

### Step 3: Create Pull Request

1. Create a new branch named `bump-version-to-{version}` (e.g. `bump-version-to-1.1.0`) from the default branch
2. Update `src/Directory.Build.props`:
- Set `<VersionPrefix>` to the new version
- Update `<PackageValidationBaselineVersion>` if the MAJOR version has changed
3. Commit with message: `Bump version to {version}`
4. Push the branch and create a pull request:
- **Title**: `Bump version to {version}`
- **Label**: `infrastructure`
- **Base**: default branch

### Step 4: Confirm

Display the pull request URL to the user.
Loading