diff --git a/Directory.Packages.props b/Directory.Packages.props
index 238ecfb13..bad6e5702 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -20,10 +20,6 @@
-
-
diff --git a/src/Cluckwork.Api/Hosting/McpToolErrors.cs b/src/Cluckwork.Api/Hosting/McpToolErrors.cs
index 84783051f..c9a5603eb 100644
--- a/src/Cluckwork.Api/Hosting/McpToolErrors.cs
+++ b/src/Cluckwork.Api/Hosting/McpToolErrors.cs
@@ -9,7 +9,7 @@
namespace Cluckwork.Api.Hosting;
-// #1227 — the SDK (2.2.0, McpServerImpl) logs every exception a tool call throws at Error
+// #1227 — the SDK (2.3.0, McpServerImpl) logs every exception a tool call throws at Error
// with its stack trace, and passes the model only an McpException's message. Two failures
// are normal, and this filter answers both with the error result the SDK would write, so
// neither reaches the Error log. An argument that does not bind is found before the tool
@@ -51,7 +51,7 @@ private static CallToolResult Refuse(RequestContext conte
private sealed record Refusal(string Message, string Argument);
- // AIFunctionFactory's binding (Microsoft.Extensions.AI 10.8.3): a parameter the input
+ // AIFunctionFactory's binding (Microsoft.Extensions.AI 10.11.0): a parameter the input
// schema lists is read from the argument of that name with the tool's serializer, and
// a missing one takes its default or fails. The SDK puts the method first in Metadata.
private static Refusal? BadArgument(McpServerTool tool, IDictionary? arguments)
diff --git a/src/Cluckwork.Api/Program.cs b/src/Cluckwork.Api/Program.cs
index abfb453ae..427ee1e44 100644
--- a/src/Cluckwork.Api/Program.cs
+++ b/src/Cluckwork.Api/Program.cs
@@ -252,7 +252,7 @@
: exception is OperationCanceledException canceled
&& httpContext.RequestAborted.IsCancellationRequested
&& (canceled.CancellationToken == httpContext.RequestAborted
- // MCP SDK 2.2.0 links RequestAborted with its transport-disposed
+ // MCP SDK 2.3.0 links RequestAborted with its transport-disposed
// token (StreamableHttpServerTransport.cs:243), and a linked
// token cannot be traced back to its source.
|| CluckworkMcp.IsPath(httpContext.Request.Path))
diff --git a/src/Cluckwork.AppHost/Cluckwork.AppHost.csproj b/src/Cluckwork.AppHost/Cluckwork.AppHost.csproj
index 417c093b1..83ce411fc 100644
--- a/src/Cluckwork.AppHost/Cluckwork.AppHost.csproj
+++ b/src/Cluckwork.AppHost/Cluckwork.AppHost.csproj
@@ -14,8 +14,6 @@
-
-
diff --git a/src/Cluckwork.AppHost/packages.lock.json b/src/Cluckwork.AppHost/packages.lock.json
index bd6826801..b26b06041 100644
--- a/src/Cluckwork.AppHost/packages.lock.json
+++ b/src/Cluckwork.AppHost/packages.lock.json
@@ -173,16 +173,6 @@
"YamlDotNet": "18.1.0"
}
},
- "MessagePack": {
- "type": "Direct",
- "requested": "[2.5.307, )",
- "resolved": "2.5.307",
- "contentHash": "P9LNJ2bz/wx8J5W0EQW4Bh7G5BiEikXiiDqGvw/WOMRyRI0QcxVvRM4XkqhidGJG6uzMT7iF89o0uYGLwmGifQ==",
- "dependencies": {
- "MessagePack.Annotations": "2.5.307",
- "Microsoft.NET.StringTools": "17.6.3"
- }
- },
"Aspire.Hosting": {
"type": "Transitive",
"resolved": "13.6.3",
@@ -360,6 +350,15 @@
"YamlDotNet": "16.3.0"
}
},
+ "MessagePack": {
+ "type": "Transitive",
+ "resolved": "2.5.307",
+ "contentHash": "P9LNJ2bz/wx8J5W0EQW4Bh7G5BiEikXiiDqGvw/WOMRyRI0QcxVvRM4XkqhidGJG6uzMT7iF89o0uYGLwmGifQ==",
+ "dependencies": {
+ "MessagePack.Annotations": "2.5.307",
+ "Microsoft.NET.StringTools": "17.6.3"
+ }
+ },
"MessagePack.Annotations": {
"type": "Transitive",
"resolved": "2.5.307",
diff --git a/tests/Cluckwork.AppHost.Tests/packages.lock.json b/tests/Cluckwork.AppHost.Tests/packages.lock.json
index 899299cd6..c20166edd 100644
--- a/tests/Cluckwork.AppHost.Tests/packages.lock.json
+++ b/tests/Cluckwork.AppHost.Tests/packages.lock.json
@@ -276,6 +276,15 @@
"YamlDotNet": "16.3.0"
}
},
+ "MessagePack": {
+ "type": "Transitive",
+ "resolved": "2.5.307",
+ "contentHash": "P9LNJ2bz/wx8J5W0EQW4Bh7G5BiEikXiiDqGvw/WOMRyRI0QcxVvRM4XkqhidGJG6uzMT7iF89o0uYGLwmGifQ==",
+ "dependencies": {
+ "MessagePack.Annotations": "2.5.307",
+ "Microsoft.NET.StringTools": "17.6.3"
+ }
+ },
"MessagePack.Annotations": {
"type": "Transitive",
"resolved": "2.5.307",
@@ -945,8 +954,7 @@
"Aspire.Hosting.JavaScript": "[13.6.3, )",
"Aspire.Hosting.Orchestration.linux-x64": "[13.5.0, )",
"Aspire.Hosting.PostgreSQL": "[13.6.3, )",
- "Aspire.Hosting.Redis": "[13.6.3, )",
- "MessagePack": "[2.5.307, )"
+ "Aspire.Hosting.Redis": "[13.6.3, )"
}
},
"Aspire.Hosting.JavaScript": {
@@ -1075,16 +1083,6 @@
"resolved": "3.36.1",
"contentHash": "77AqPEoaY1ODE+syYBHti0jXiwQq0J/fUr/fRyYhNlc9oKtH5dZZEr/OLKtdKNVG83PRnCYB2r8B80ZrObzOGQ=="
},
- "MessagePack": {
- "type": "CentralTransitive",
- "requested": "[2.5.307, )",
- "resolved": "2.5.307",
- "contentHash": "P9LNJ2bz/wx8J5W0EQW4Bh7G5BiEikXiiDqGvw/WOMRyRI0QcxVvRM4XkqhidGJG6uzMT7iF89o0uYGLwmGifQ==",
- "dependencies": {
- "MessagePack.Annotations": "2.5.307",
- "Microsoft.NET.StringTools": "17.6.3"
- }
- },
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[10.*, )",
diff --git a/tools/verify/mcp/README.md b/tools/verify/mcp/README.md
index 12af8b975..f3b7cd7f1 100644
--- a/tools/verify/mcp/README.md
+++ b/tools/verify/mcp/README.md
@@ -7,7 +7,7 @@ what each proves are in [`../features/mcp.md`](../features/mcp.md).
| --- | --- |
| `tls-proxy.mjs` | Terminates TLS for the http sim stack, keeps `Host`, sets `X-Forwarded-Proto`. |
| `client.ts` | The official TypeScript MCP SDK client. `connect` runs discovery, dynamic registration, PKCE and `resource`, and drives the consent screen with Playwright; `tools`, `call` and `disconnect` use a saved token. Speaks MCP 2025-11-25. |
-| `probe.cs` | The C# `ModelContextProtocol` 2.2.0 client (the server's SDK), as a file-based app, for MCP 2026-07-28. |
+| `probe.cs` | The C# `ModelContextProtocol` 2.2.0 client, as a file-based app, for MCP 2026-07-28. It is older than the server's SDK, so it checks that an older client still works. |
```sh
npm ci # Node 22.18+ runs client.ts directly