Align capability key to SEP-2133 extensions format (#25)

Both SDKs now use Capabilities.Extensions with key
"io.modelcontextprotocol/interceptors". Previously C# used the short key
"interceptors" and Go used Capabilities.Experimental. SEP capability
example updated to match.

https://modelcontextprotocol.io/seps/2133-extensions

---------

Signed-off-by: Ukjae Jeong <jeongukjae@gmail.com>
This commit is contained in:
Ukjae Jeong 2026-07-06 10:29:21 +01:00 • committed by GitHub
commit 99bc7c9bb0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 20 additions and 19 deletions

View file

@ -13,7 +13,7 @@ dotnet test # 66 tests across the interceptor test project
**Why message filter, not handlers**: `McpServerHandlers` and `McpServerImpl` are `internal` in the SDK. We can't register handlers for new JSON-RPC methods from outside. Instead we use `McpServerOptions.Filters.Message.IncomingFilters` to intercept `interceptors/list` and `interceptor/invoke`, handle them, send `JsonRpcResponse` via `context.Server.SendMessageAsync()`, and skip calling `next`. See `InterceptorMessageFilter.cs`. Chain execution is no longer a wire method — it's SDK orchestration in `Client/InterceptorChainOrchestrator.cs`.
**Why `ServerCapabilities.Extensions`**: The SDK's intended mechanism for protocol extensions. Requires `#pragma warning disable MCPEXP001`. We advertise `InterceptorsCapability { SupportedEvents }` under `Extensions["interceptors"]`.
**Why `ServerCapabilities.Extensions`**: The SDK's intended mechanism for protocol extensions. Requires `#pragma warning disable MCPEXP001`. We advertise `InterceptorsCapability { SupportedEvents }` under `Extensions["io.modelcontextprotocol/interceptors"]`.
**Client `SendRequestAsync`**: The public overload (`McpSession.Methods.cs:24`) takes `JsonSerializerOptions`. We pass `InterceptorJsonUtilities.DefaultOptions` which chains `McpJsonUtilities.DefaultOptions` + our `InterceptorJsonContext`. The internal overload takes `JsonTypeInfo<T>` — we can't use it.

View file

@ -2,5 +2,5 @@ namespace ModelContextProtocol.Interceptors;
internal static class InterceptorProtocolConstants
{
internal const string ExtensionCapabilityKey = "interceptors";
internal const string ExtensionCapabilityKey = "io.modelcontextprotocol/interceptors";
}

View file

@ -4,7 +4,7 @@ namespace ModelContextProtocol.Interceptors.Protocol;
/// <summary>
/// Represents the interceptors capability advertised by a server during initialization.
/// This is placed in <c>ServerCapabilities.Extensions["interceptors"]</c>.
/// This is placed in <c>ServerCapabilities.Extensions["io.modelcontextprotocol/interceptors"]</c>.
/// </summary>
public sealed class InterceptorsCapability
{

View file

@ -272,7 +272,7 @@ public class McpInterceptorGatewayTests
var caps = fixture.ProxyClient.ServerCapabilities;
Assert.NotNull(caps.Extensions);
Assert.True(caps.Extensions!.ContainsKey("com.example/backend"));
Assert.False(caps.Extensions.ContainsKey("interceptors"));
Assert.False(caps.Extensions.ContainsKey("io.modelcontextprotocol/interceptors"));
#pragma warning restore MCPEXP001
}
@ -292,7 +292,7 @@ public class McpInterceptorGatewayTests
#pragma warning disable MCPEXP001
var caps = fixture.ProxyClient.ServerCapabilities;
Assert.False(caps?.Extensions?.ContainsKey("interceptors") ?? false);
Assert.False(caps?.Extensions?.ContainsKey("io.modelcontextprotocol/interceptors") ?? false);
#pragma warning restore MCPEXP001
}
@ -318,7 +318,7 @@ public class McpInterceptorGatewayTests
#pragma warning disable MCPEXP001
var caps = fixture.ProxyClient.ServerCapabilities;
Assert.NotNull(caps?.Extensions);
Assert.True(caps!.Extensions!.ContainsKey("interceptors"));
Assert.True(caps!.Extensions!.ContainsKey("io.modelcontextprotocol/interceptors"));
Assert.True(caps.Extensions.ContainsKey("com.example/backend"));
#pragma warning restore MCPEXP001
}