Use Options pattern for openapi and mcp#9598
Conversation
…roduce IMcpProvider and IOpenApiProvider interfaces
…method, refactor OpenApiManager and McpManager to support new transport setup, and introduce tests for MCP setup composition.
…onsistency and update related tests
…me for consistency in GetSetup methods
…amline registration handling
…p-pattern # Conflicts: # src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Extensions/EndpointRouteBuilderExtensions.cs # src/HotChocolate/Adapters/src/Adapters.OpenApi.AspNetCore/Extensions/OpenApiOptionsExtensions.cs
There was a problem hiding this comment.
Pull request overview
This PR refactors the OpenAPI and MCP adapters to use an options-based per-schema setup model (via IOptionsMonitor<T>), replacing prior keyed-service registrations with manager-based lookups.
Changes:
- Introduces
OpenApiSetup/McpSetupoptions andOpenApiManager/McpManagerregistries for per-schema composition and resolution. - Updates OpenAPI/MCP builder and endpoint extensions to resolve per-schema infrastructure through the managers instead of keyed DI services.
- Adds tests to validate setup composition and schema-name discovery for both adapters.
Reviewed changes
Copilot reviewed 23 out of 23 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Extensions/OpenApiSetupTests.cs | Adds tests asserting OpenAPI per-schema setup registration and name discovery. |
| src/HotChocolate/Adapters/test/Adapters.Mcp.Tests/Extensions/McpSetupCompositionTests.cs | Adds tests asserting MCP setup composition across multiple AddMcp calls and name discovery. |
| src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/Extensions/OpenApiFusionGatewayBuilderExtensions.cs | Switches OpenAPI storage registration to options-based setup; warmup uses OpenApiManager. |
| src/HotChocolate/Adapters/src/Fusion.Adapters.Mcp/Extensions/FusionGatewayBuilderExtensions.cs | Switches MCP registration to options-based setup; updates warmup task wiring. |
| src/HotChocolate/Adapters/src/Adapters.OpenApi/Extensions/OpenApiRequestExecutorBuilderExtensions.cs | Switches OpenAPI storage registration to options-based setup; warmup uses OpenApiManager. |
| src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/OpenApiRegistration.cs | Adds internal container for OpenAPI per-schema runtime objects. |
| src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/OpenApiManager.cs | Adds manager responsible for building/caching per-schema OpenAPI runtime objects from options. |
| src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/IOpenApiProvider.cs | Adds internal provider abstraction for schema name inference. |
| src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Extensions/InternalServiceCollectionExtensions.cs | Registers OpenApiManager and options infrastructure (replacing keyed services). |
| src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointMiddleware.cs | Resolves executor proxy through OpenApiManager instead of keyed DI. |
| src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Configuration/OpenApiTransportSetup.cs | Adds internal transport setup options for endpoint/document transformer factories. |
| src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Configuration/OpenApiSetup.cs | Adds public per-schema OpenAPI setup options (storage factory). |
| src/HotChocolate/Adapters/src/Adapters.OpenApi.AspNetCore/Extensions/OpenApiOptionsExtensions.cs | Resolves OpenAPI document transformer via OpenApiManager for ASP.NET OpenAPI generation. |
| src/HotChocolate/Adapters/src/Adapters.OpenApi.AspNetCore/Extensions/InternalServiceCollectionExtensions.cs | Uses PostConfigureAll to supply default OpenAPI transport factories. |
| src/HotChocolate/Adapters/src/Adapters.OpenApi.AspNetCore/Extensions/EndpointRouteBuilderExtensions.cs | Resolves endpoint data source via OpenApiManager for mapping endpoints. |
| src/HotChocolate/Adapters/src/Adapters.Mcp/Extensions/RequestExecutorBuilderExtensions.cs | Switches MCP registration to options-based setup; updates warmup task wiring. |
| src/HotChocolate/Adapters/src/Adapters.Mcp.Core/McpStorageWarmupTask.cs | Adds warmup task wrapper for starting MCP storage observer. |
| src/HotChocolate/Adapters/src/Adapters.Mcp.Core/McpRegistration.cs | Adds internal container for MCP per-schema runtime objects. |
| src/HotChocolate/Adapters/src/Adapters.Mcp.Core/McpManager.cs | Adds manager responsible for caching per-schema MCP runtime objects. |
| src/HotChocolate/Adapters/src/Adapters.Mcp.Core/IMcpProvider.cs | Adds internal provider abstraction for schema name inference. |
| src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Extensions/ServiceCollectionExtensions.cs | Registers McpManager/options and adds per-schema setup composition logic. |
| src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Extensions/EndpointRouteBuilderExtensions.cs | Resolves MCP handler proxy via McpManager for endpoint mapping. |
| src/HotChocolate/Adapters/src/Adapters.Mcp.Core/Configuration/McpSetup.cs | Adds public per-schema MCP setup options (modifier lists). |
Comments suppressed due to low confidence (1)
src/HotChocolate/Adapters/src/Adapters.OpenApi.AspNetCore/Extensions/EndpointRouteBuilderExtensions.cs:22
- MapOpenApiEndpoints downcasts the registration's EndpointDataSource to DynamicEndpointDataSource. If the endpoint data source is ever swapped via transport setup, this will fail at runtime. Consider changing the registration/transport setup to expose an EndpointDataSource (base type) directly, or otherwise avoid relying on this concrete cast here.
var dataSource = (DynamicEndpointDataSource)manager.Get(schemaName).EndpointDataSource;
if (!endpoints.DataSources.Contains(dataSource))
{
endpoints.DataSources.Add(dataSource);
}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…anager for resource management
|
For this to work, we would have to mirror a We should also update the Map* and other methods to produce user-friendly messages like |
# Conflicts: # src/HotChocolate/Adapters/src/Adapters.OpenApi.Abstractions/Storage/OpenApiDefinitionStorageEventArgs.cs # src/HotChocolate/Adapters/src/Adapters.OpenApi.Abstractions/Storage/OpenApiDefinitionStorageEventType.cs # src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/HotChocolate.Adapters.OpenApi.Core.csproj # src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/OpenApiDefinitionRegistry.cs
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #9598 +/- ##
==========================================
- Coverage 74.16% 0 -74.17%
==========================================
Files 2677 0 -2677
Lines 140790 0 -140790
Branches 16371 0 -16371
==========================================
- Hits 104421 0 -104421
+ Misses 30774 0 -30774
+ Partials 5595 0 -5595
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
TODO:
AddNitroOpenApiDefinitionStorageas publicAddNitroOpenApiTransportSetupin favor of direct instantiations in manager