-
Notifications
You must be signed in to change notification settings - Fork 3
feat: support protected resource metadata for mcp server #27
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: support protected resource metadata for mcp server #27
Conversation
Codecov ReportAttention: Patch coverage is
📢 Thoughts on this report? Let us know! |
dc1f2e6
to
7ac6d17
Compare
0399400
to
7552e9d
Compare
7552e9d
to
b3a2417
Compare
This looks great! Any update on when you'll be able to merge this? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR refactors the mcp-auth
library to support OAuth 2.0 Protected Resource Metadata (RFC 9728) while preserving backward compatibility with the legacy authorization server mode. It introduces strategy-based handlers, a TokenVerifier
abstraction, and enhanced middleware and routing for protected resource metadata.
- Introduce
AuthorizationServerHandler
(deprecated) andResourceServerHandler
for dual-mode operation - Add
TokenVerifier
to encapsulate validation logic per resource - Enhance
bearer_auth_middleware
with aresource
parameter and addresource_metadata_router()
Reviewed Changes
Copilot reviewed 22 out of 22 changed files in this pull request and generated 1 comment.
Show a summary per file
File | Description |
---|---|
mcpauth/utils/_transpile_resource_metadata.py | Convert MCPAuth config metadata to standard protected-resource metadata |
mcpauth/utils/_create_resource_metadata_endpoint.py | Build RFC 9728 metadata endpoint URLs |
mcpauth/utils/_bearer_www_authenticate_header.py | Implement chained header builder for WWW-Authenticate |
mcpauth/middleware/create_bearer_auth.py | Extend error handling and include resource_metadata header |
mcpauth/types.py | Add ResourceServerMetadata & ResourceServerConfig types |
mcpauth/auth/token_verifier.py | Encapsulate JWT issuer extraction and verification per server |
mcpauth/auth/resource_server_handler.py | Implement protected-resource mode routing & verifier lookup |
mcpauth/auth/authorization_server_handler.py | Maintain legacy auth-server mode with deprecation warning |
mcpauth/init.py | Initialize correct handler based on server vs protected_resources |
tests/* | Add and update tests for new resource metadata, header, and middleware behavior |
samples/server/* | Update example apps to use resource-server configuration |
Comments suppressed due to low confidence (2)
mcpauth/middleware/create_bearer_auth.py:94
- Update the
_handle_error
docstring to note that it now returns three values(status_code, response_body, headers)
instead of two.
"""
mcpauth/middleware/create_bearer_auth.py:44
- [nitpick] The field name
resource
inBearerAuthConfig
can be ambiguous; consider renaming it toresource_id
for consistency with other APIs and to clarify that it’s an identifier rather than the metadata itself.
resource: Optional[str] = None
This pull request introduces a significant architectural enhancement to the
mcp-auth
Python library, refactoring it to support modern OAuth 2.0 Protected Resource Metadata (RFC 9728) while maintaining full backward compatibility with the existing Authorization Server mode. This change enables developers to configure multiple distinct resources, each with its own set of trusted authorization servers, within a singleMCPAuth
instance.Core Architectural Changes
The refactor is centered around a clearer, more scalable internal architecture, leveraging the Strategy design pattern:
MCPAuth
constructor now acts as a factory, instantiating a corresponding handler to manage mode-specific logic based on the provided configuration.AuthorizationServerHandler
, this supports the legacy, single-AS configuration and is now formally deprecated.ResourceServerHandler
, this is the new, recommended approach. It accepts a singleResourceServerConfig
or a list of them, allowing the definition of multiple protected resources and their associated policies.TokenVerifier
: An Authentication Policy Encapsulator: A new core internal class,TokenVerifier
, has been introduced. This class encapsulates the complete authentication policy for a single logical resource.TokenVerifier
instance is bound to the specific list ofAuthServerConfig
objects that its associated resource trusts.jwks_uri
.iss
(issuer) claim is within its list of trusted issuers, providing precise and helpful error messages that list all expected issuers on failure.MCPAuth
class, which now acts as a high-level factory and registry that routes requests to the correctTokenVerifier
.API Enhancements and Usage
The public-facing API has evolved to be more powerful and expressive without introducing breaking changes.
bearer_auth_middleware
: Thebearer_auth_middleware
method is now significantly more powerful.resource
parameter. This property is required whenMCPAuth
is initialized inprotected_resources
mode and signals which resource's authentication policy to apply.MCPAuth
uses the resource identifier to look up the correspondingTokenVerifier
and uses it to validate the token. This makes protecting endpoints for different resources explicit and robust.server
configuration, the behavior ofbearer_auth_middleware
remains unchanged, ensuring zero breaking changes.resource_metadata_router()
: A new method that creates aStarlette
router to automatically serve the Protected Resource Metadata for all configured resources./.well-known/oauth-protected-resource/...
pathing logic as defined in RFC 9728.metadata_route()
method is now marked as@deprecated
.Example Usage
Here is a practical example of how to configure and use the new resource server mode to protect an API endpoint: