using ModelContextProtocol; using ModelContextProtocol.Protocol; using ModelContextProtocol.Server; namespace Microsoft.Extensions.DependencyInjection; /// /// Provides extension methods for configuring request-specific MCP server filters. /// public static class McpRequestFilterBuilderExtensions { /// /// Adds a filter to the list resource templates handler pipeline. /// /// The request filter builder instance. /// The filter function that wraps the handler. /// The builder provided in . public static IMcpRequestFilterBuilder AddListResourceTemplatesFilter(this IMcpRequestFilterBuilder builder, McpRequestFilter filter) { Throw.IfNull(builder); Throw.IfNull(filter); builder.Services.Configure(options => options.Filters.Request.ListResourceTemplatesFilters.Add(filter)); return builder; } /// /// Adds a filter to the list tools handler pipeline. /// /// The request filter builder instance. /// The filter function that wraps the handler. /// The builder provided in . public static IMcpRequestFilterBuilder AddListToolsFilter(this IMcpRequestFilterBuilder builder, McpRequestFilter filter) { Throw.IfNull(builder); Throw.IfNull(filter); builder.Services.Configure(options => options.Filters.Request.ListToolsFilters.Add(filter)); return builder; } /// /// Adds a filter to the call tool handler pipeline. /// /// /// This ordinary call-tool filter runs inside all alternate-result call-tool filters. For a task-backed call, /// it executes in the background after task creation and before the tool. /// /// The request filter builder instance. /// The filter function that wraps the handler. /// The builder provided in . public static IMcpRequestFilterBuilder AddCallToolFilter(this IMcpRequestFilterBuilder builder, McpRequestFilter filter) { Throw.IfNull(builder); Throw.IfNull(filter); builder.Services.Configure(options => options.Filters.Request.CallToolFilters.Add(filter)); return builder; } /// /// Adds a filter to the list prompts handler pipeline. /// /// The request filter builder instance. /// The filter function that wraps the handler. /// The builder provided in . public static IMcpRequestFilterBuilder AddListPromptsFilter(this IMcpRequestFilterBuilder builder, McpRequestFilter filter) { Throw.IfNull(builder); Throw.IfNull(filter); builder.Services.Configure(options => options.Filters.Request.ListPromptsFilters.Add(filter)); return builder; } /// /// Adds a filter to the get prompt handler pipeline. /// /// The request filter builder instance. /// The filter function that wraps the handler. /// The builder provided in . public static IMcpRequestFilterBuilder AddGetPromptFilter(this IMcpRequestFilterBuilder builder, McpRequestFilter filter) { Throw.IfNull(builder); Throw.IfNull(filter); builder.Services.Configure(options => options.Filters.Request.GetPromptFilters.Add(filter)); return builder; } /// /// Adds a filter to the list resources handler pipeline. /// /// The request filter builder instance. /// The filter function that wraps the handler. /// The builder provided in . public static IMcpRequestFilterBuilder AddListResourcesFilter(this IMcpRequestFilterBuilder builder, McpRequestFilter filter) { Throw.IfNull(builder); Throw.IfNull(filter); builder.Services.Configure(options => options.Filters.Request.ListResourcesFilters.Add(filter)); return builder; } /// /// Adds a filter to the read resource handler pipeline. /// /// The request filter builder instance. /// The filter function that wraps the handler. /// The builder provided in . public static IMcpRequestFilterBuilder AddReadResourceFilter(this IMcpRequestFilterBuilder builder, McpRequestFilter filter) { Throw.IfNull(builder); Throw.IfNull(filter); builder.Services.Configure(options => options.Filters.Request.ReadResourceFilters.Add(filter)); return builder; } /// /// Adds a filter to the complete handler pipeline. /// /// The request filter builder instance. /// The filter function that wraps the handler. /// The builder provided in . public static IMcpRequestFilterBuilder AddCompleteFilter(this IMcpRequestFilterBuilder builder, McpRequestFilter filter) { Throw.IfNull(builder); Throw.IfNull(filter); builder.Services.Configure(options => options.Filters.Request.CompleteFilters.Add(filter)); return builder; } /// /// Adds a filter to the subscribe-to-resources handler pipeline. /// /// The request filter builder instance. /// The filter function that wraps the handler. /// The builder provided in . public static IMcpRequestFilterBuilder AddSubscribeToResourcesFilter(this IMcpRequestFilterBuilder builder, McpRequestFilter filter) { Throw.IfNull(builder); Throw.IfNull(filter); builder.Services.Configure(options => options.Filters.Request.SubscribeToResourcesFilters.Add(filter)); return builder; } /// /// Adds a filter to the unsubscribe-from-resources handler pipeline. /// /// The request filter builder instance. /// The filter function that wraps the handler. /// The builder provided in . public static IMcpRequestFilterBuilder AddUnsubscribeFromResourcesFilter(this IMcpRequestFilterBuilder builder, McpRequestFilter filter) { Throw.IfNull(builder); Throw.IfNull(filter); builder.Services.Configure(options => options.Filters.Request.UnsubscribeFromResourcesFilters.Add(filter)); return builder; } /// /// Adds a filter to the set logging level handler pipeline. /// /// The request filter builder instance. /// The filter function that wraps the handler. /// The builder provided in . [Obsolete(Obsoletions.DeprecatedLogging_Message, DiagnosticId = Obsoletions.Deprecated_DiagnosticId, UrlFormat = Obsoletions.Deprecated_Url)] public static IMcpRequestFilterBuilder AddSetLoggingLevelFilter(this IMcpRequestFilterBuilder builder, McpRequestFilter filter) { Throw.IfNull(builder); Throw.IfNull(filter); builder.Services.Configure(options => options.Filters.Request.SetLoggingLevelFilters.Add(filter)); return builder; } }