Skip to main content

Middleware Migration Guide

FsMcp 1.x exposed a parallel McpMiddleware pipeline, but the official SDK transport bridge never invoked it. FsMcp 2.0 therefore marks the legacy middleware surface obsolete and rejects non-empty legacy middleware configuration. This is a breaking, fail-closed correction: middleware that does not run must not appear to protect or observe requests.

Protocol request interception

Register FsMcp into a caller-owned service collection and use the official ModelContextProtocol SDK request-filter APIs. Filters run inside the actual SDK request path and receive its request context and cancellation token.

Use request filters for protocol-aware concerns such as request logging, validation, metrics, or access checks that need MCP method information. Keep secret values and full request bodies out of logs.

Streamable HTTP

For HTTP servers, compose standard ASP.NET Core middleware before mapping the MCP endpoint. Configure authentication and authorization in the host, then require authorization on the mapped MCP endpoint. Enterprise-managed authorization on the client does not protect the resource server by itself.

Use ASP.NET Core for transport concerns such as forwarded headers, request-size limits, rate limiting, authentication, authorization, and endpoint policy.

Stdio

Stdio has no ASP.NET Core request pipeline. Use SDK request filters and caller-owned dependency injection. Start it with Server.run; there is no transport selector in the mcpServer { } computation expression.

Legacy helpers

Middleware.compose, Middleware.pipeline, ValidationMiddleware, and the legacy telemetry middleware remain only as obsolete compatibility surfaces. Do not rely on them for runtime behavior in 2.0. Migrate to the official SDK filter/DI path or ASP.NET Core middleware as appropriate.