From 676e43a93997ce4a8be174d5e8009540f98bc2f3 Mon Sep 17 00:00:00 2001 From: Jeremiah Lowin <153965+jlowin@users.noreply.github.com> Date: Sat, 17 Jan 2026 14:41:40 -0500 Subject: [PATCH] refactor: reverse visibility for get_resource_template/_get_resource_template methods --- src/fastmcp/server/middleware/authorization.py | 2 +- src/fastmcp/server/providers/aggregate.py | 4 ++-- src/fastmcp/server/providers/base.py | 6 +++--- src/fastmcp/server/providers/fastmcp_provider.py | 6 +++--- src/fastmcp/server/providers/filesystem.py | 4 ++-- src/fastmcp/server/providers/local_provider.py | 2 +- src/fastmcp/server/providers/openapi/provider.py | 2 +- src/fastmcp/server/server.py | 6 +++--- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/fastmcp/server/middleware/authorization.py b/src/fastmcp/server/middleware/authorization.py index 8fb149f78..1ff33c4a3 100644 --- a/src/fastmcp/server/middleware/authorization.py +++ b/src/fastmcp/server/middleware/authorization.py @@ -204,7 +204,7 @@ class AuthMiddleware(Middleware): # Get resource/template (component auth is checked in get_*, raises if unauthorized) component = await fastmcp.fastmcp.get_resource(str(uri)) if component is None: - component = await fastmcp.fastmcp._get_resource_template(str(uri)) + component = await fastmcp.fastmcp.get_resource_template(str(uri)) if component is None: raise AuthorizationError( f"Authorization failed for resource '{uri}': resource not found" diff --git a/src/fastmcp/server/providers/aggregate.py b/src/fastmcp/server/providers/aggregate.py index 2d84cba9a..585affaf1 100644 --- a/src/fastmcp/server/providers/aggregate.py +++ b/src/fastmcp/server/providers/aggregate.py @@ -187,7 +187,7 @@ class AggregateProvider(Provider): ) return self._collect_list_results(results, "list_resource_templates") - async def get_resource_template( + async def _get_resource_template( self, uri: str, version: VersionSpec | None = None ) -> ResourceTemplate | None: """Get resource template by URI. @@ -198,7 +198,7 @@ class AggregateProvider(Provider): If specified, returns highest version matching the spec from any provider. """ results = await gather( - *[p._get_resource_template(uri, version) for p in self._providers], + *[p.get_resource_template(uri, version) for p in self._providers], return_exceptions=True, ) return self._get_highest_version_result( diff --git a/src/fastmcp/server/providers/base.py b/src/fastmcp/server/providers/base.py index e8fae24f2..fb5240b32 100644 --- a/src/fastmcp/server/providers/base.py +++ b/src/fastmcp/server/providers/base.py @@ -184,7 +184,7 @@ class Provider: return await chain() - async def _get_resource_template( + async def get_resource_template( self, uri: str, version: VersionSpec | None = None ) -> ResourceTemplate | None: """Get resource template by transformed URI with all transforms applied. @@ -197,7 +197,7 @@ class Provider: async def base( u: str, version: VersionSpec | None = None ) -> ResourceTemplate | None: - return await self.get_resource_template(u, version) + return await self._get_resource_template(u, version) chain = base for transform in self.transforms: @@ -311,7 +311,7 @@ class Provider: """ return [] - async def get_resource_template( + async def _get_resource_template( self, uri: str, version: VersionSpec | None = None ) -> ResourceTemplate | None: """Get a resource template that matches the given URI. diff --git a/src/fastmcp/server/providers/fastmcp_provider.py b/src/fastmcp/server/providers/fastmcp_provider.py index 5c3679bc5..94854b065 100644 --- a/src/fastmcp/server/providers/fastmcp_provider.py +++ b/src/fastmcp/server/providers/fastmcp_provider.py @@ -550,16 +550,16 @@ class FastMCPProvider(Provider): FastMCPProviderResourceTemplate.wrap(self.server, t) for t in raw_templates ] - async def get_resource_template( + async def _get_resource_template( self, uri: str, version: VersionSpec | None = None ) -> ResourceTemplate | None: """Get a resource template that matches the given URI. Passes the full VersionSpec to the nested server, which handles both - exact version matching and range filtering. Uses _get_resource_template + exact version matching and range filtering. Uses get_resource_template to ensure the nested server's transforms are applied. """ - raw_template = await self.server._get_resource_template(uri, version) + raw_template = await self.server.get_resource_template(uri, version) if raw_template is None: return None return FastMCPProviderResourceTemplate.wrap(self.server, raw_template) diff --git a/src/fastmcp/server/providers/filesystem.py b/src/fastmcp/server/providers/filesystem.py index 971b53abd..ffecc17c7 100644 --- a/src/fastmcp/server/providers/filesystem.py +++ b/src/fastmcp/server/providers/filesystem.py @@ -203,12 +203,12 @@ class FileSystemProvider(LocalProvider): await self._ensure_loaded() return await super()._list_resource_templates() - async def get_resource_template( + async def _get_resource_template( self, uri: str, version: VersionSpec | None = None ) -> ResourceTemplate | None: """Get a resource template, reloading if in reload mode.""" await self._ensure_loaded() - return await super().get_resource_template(uri, version) + return await super()._get_resource_template(uri, version) async def list_prompts(self) -> Sequence[Prompt]: """Return all prompts, reloading if in reload mode.""" diff --git a/src/fastmcp/server/providers/local_provider.py b/src/fastmcp/server/providers/local_provider.py index 91e587e3d..ed96f26a6 100644 --- a/src/fastmcp/server/providers/local_provider.py +++ b/src/fastmcp/server/providers/local_provider.py @@ -558,7 +558,7 @@ class LocalProvider(Provider): if isinstance(v, ResourceTemplate) and self._is_component_enabled(v) ] - async def get_resource_template( + async def _get_resource_template( self, uri: str, version: VersionSpec | None = None ) -> ResourceTemplate | None: """Get a resource template that matches the given URI. diff --git a/src/fastmcp/server/providers/openapi/provider.py b/src/fastmcp/server/providers/openapi/provider.py index eb3b6b645..7be979bf1 100644 --- a/src/fastmcp/server/providers/openapi/provider.py +++ b/src/fastmcp/server/providers/openapi/provider.py @@ -383,7 +383,7 @@ class OpenAPIProvider(Provider): """Return all resource templates created from the OpenAPI spec.""" return list(self._templates.values()) - async def get_resource_template( + async def _get_resource_template( self, uri: str, version: VersionSpec | None = None ) -> ResourceTemplate | None: """Get a resource template that matches the given URI.""" diff --git a/src/fastmcp/server/server.py b/src/fastmcp/server/server.py index 491b48f15..259244d80 100644 --- a/src/fastmcp/server/server.py +++ b/src/fastmcp/server/server.py @@ -1324,12 +1324,12 @@ class FastMCP(Provider, Generic[LifespanResultT]): return _dedupe_with_versions(authorized, lambda t: t.uri_template) - async def get_resource_template( + async def _get_resource_template( self, uri: str, version: VersionSpec | None = None ) -> ResourceTemplate | None: """Get a resource template by URI via aggregation from providers. - This is the raw lookup that Provider._get_resource_template() wraps with transforms. + This is the raw lookup that Provider.get_resource_template() wraps with transforms. Aggregates from all sub-providers and applies component-level auth. Args: @@ -1341,7 +1341,7 @@ class FastMCP(Provider, Generic[LifespanResultT]): """ # Aggregate from all sub-providers (each applies their own transforms) results = await gather( - *[p._get_resource_template(uri, version) for p in self._providers], + *[p.get_resource_template(uri, version) for p in self._providers], return_exceptions=True, )