diff --git a/src/fastmcp/server/providers/aggregate.py b/src/fastmcp/server/providers/aggregate.py index e2b53ffa6..2d84cba9a 100644 --- a/src/fastmcp/server/providers/aggregate.py +++ b/src/fastmcp/server/providers/aggregate.py @@ -179,10 +179,10 @@ class AggregateProvider(Provider): # Resource Templates # ------------------------------------------------------------------------- - async def list_resource_templates(self) -> Sequence[ResourceTemplate]: + async def _list_resource_templates(self) -> Sequence[ResourceTemplate]: """List all resource templates from all providers (with transforms applied).""" results = await gather( - *[p._list_resource_templates() for p in self._providers], + *[p.list_resource_templates() for p in self._providers], return_exceptions=True, ) return self._collect_list_results(results, "list_resource_templates") diff --git a/src/fastmcp/server/providers/base.py b/src/fastmcp/server/providers/base.py index 2ebe7941e..e8fae24f2 100644 --- a/src/fastmcp/server/providers/base.py +++ b/src/fastmcp/server/providers/base.py @@ -172,11 +172,11 @@ class Provider: return await chain(uri, version=version) - async def _list_resource_templates(self) -> Sequence[ResourceTemplate]: + async def list_resource_templates(self) -> Sequence[ResourceTemplate]: """List resource templates with all transforms applied.""" async def base() -> Sequence[ResourceTemplate]: - return await self.list_resource_templates() + return await self._list_resource_templates() chain = base for transform in self.transforms: @@ -303,7 +303,7 @@ class Provider: return None return max(matching, key=version_sort_key) # type: ignore[type-var] - async def list_resource_templates(self) -> Sequence[ResourceTemplate]: + async def _list_resource_templates(self) -> Sequence[ResourceTemplate]: """Return all available resource templates. Override to provide resource templates dynamically. Returns ALL versions. @@ -326,7 +326,7 @@ class Provider: Returns: The ResourceTemplate if a matching one is found, or None to continue searching. """ - templates = await self.list_resource_templates() + templates = await self._list_resource_templates() matching = [t for t in templates if t.matches(uri) is not None] if version: matching = [t for t in matching if version.matches(t.version)] @@ -382,7 +382,7 @@ class Provider: results = await gather( self._list_tools(), self._list_resources(), - self.list_resource_templates(), + self._list_resource_templates(), self.list_prompts(), ) tools = cast(Sequence[Tool], results[0]) diff --git a/src/fastmcp/server/providers/fastmcp_provider.py b/src/fastmcp/server/providers/fastmcp_provider.py index 0054e4638..5c3679bc5 100644 --- a/src/fastmcp/server/providers/fastmcp_provider.py +++ b/src/fastmcp/server/providers/fastmcp_provider.py @@ -538,7 +538,7 @@ class FastMCPProvider(Provider): # Resource template methods # ------------------------------------------------------------------------- - async def list_resource_templates(self) -> Sequence[ResourceTemplate]: + async def _list_resource_templates(self) -> Sequence[ResourceTemplate]: """List all resource templates from the mounted server. Runs the mounted server's middleware so filtering/transformation applies. diff --git a/src/fastmcp/server/providers/filesystem.py b/src/fastmcp/server/providers/filesystem.py index 9092d37ab..971b53abd 100644 --- a/src/fastmcp/server/providers/filesystem.py +++ b/src/fastmcp/server/providers/filesystem.py @@ -198,10 +198,10 @@ class FileSystemProvider(LocalProvider): await self._ensure_loaded() return await super()._get_resource(uri, version) - async def list_resource_templates(self) -> Sequence[ResourceTemplate]: + async def _list_resource_templates(self) -> Sequence[ResourceTemplate]: """Return all resource templates, reloading if in reload mode.""" await self._ensure_loaded() - return await super().list_resource_templates() + return await super()._list_resource_templates() async def get_resource_template( self, uri: str, version: VersionSpec | None = None diff --git a/src/fastmcp/server/providers/local_provider.py b/src/fastmcp/server/providers/local_provider.py index 3a8bb1289..91e587e3d 100644 --- a/src/fastmcp/server/providers/local_provider.py +++ b/src/fastmcp/server/providers/local_provider.py @@ -550,7 +550,7 @@ class LocalProvider(Provider): return None return max(matching, key=version_sort_key) # type: ignore[type-var] - async def list_resource_templates(self) -> Sequence[ResourceTemplate]: + async def _list_resource_templates(self) -> Sequence[ResourceTemplate]: """Return all visible resource templates.""" return [ v diff --git a/src/fastmcp/server/providers/openapi/provider.py b/src/fastmcp/server/providers/openapi/provider.py index 263948b27..eb3b6b645 100644 --- a/src/fastmcp/server/providers/openapi/provider.py +++ b/src/fastmcp/server/providers/openapi/provider.py @@ -379,7 +379,7 @@ class OpenAPIProvider(Provider): return None return resource - async def list_resource_templates(self) -> Sequence[ResourceTemplate]: + async def _list_resource_templates(self) -> Sequence[ResourceTemplate]: """Return all resource templates created from the OpenAPI spec.""" return list(self._templates.values()) diff --git a/src/fastmcp/server/providers/proxy.py b/src/fastmcp/server/providers/proxy.py index e504764b6..7f1feff56 100644 --- a/src/fastmcp/server/providers/proxy.py +++ b/src/fastmcp/server/providers/proxy.py @@ -554,7 +554,7 @@ class ProxyProvider(Provider): # Resource template methods # ------------------------------------------------------------------------- - async def list_resource_templates(self) -> Sequence[ResourceTemplate]: + async def _list_resource_templates(self) -> Sequence[ResourceTemplate]: """List all resource templates from the remote server.""" try: client = await self._get_client() diff --git a/src/fastmcp/server/server.py b/src/fastmcp/server/server.py index 77521ecfc..491b48f15 100644 --- a/src/fastmcp/server/server.py +++ b/src/fastmcp/server/server.py @@ -887,10 +887,10 @@ class FastMCP(Provider, Generic[LifespanResultT]): ) return self._collect_list_results(results, "list_resources") - async def list_resource_templates(self) -> Sequence[ResourceTemplate]: + async def _list_resource_templates(self) -> Sequence[ResourceTemplate]: """Aggregate resource templates from all sub-providers.""" results = await gather( - *[p._list_resource_templates() for p in self._providers], + *[p.list_resource_templates() for p in self._providers], return_exceptions=True, ) return self._collect_list_results(results, "list_resource_templates") @@ -1305,7 +1305,7 @@ class FastMCP(Provider, Generic[LifespanResultT]): ) # Query through full transform chain (provider transforms + server transforms + visibility) - templates = await self._list_resource_templates() + templates = await self.list_resource_templates() # Get auth context (skip_auth=True for STDIO which has no auth concept) skip_auth, token = _get_auth_context() @@ -1686,8 +1686,8 @@ class FastMCP(Provider, Generic[LifespanResultT]): f"Error reading resource {uri!r}: {e}" ) from e - # Try templates (transforms + auth via _get_resource_template) - template = await self._get_resource_template(uri, version=version) + # Try templates (transforms + auth via get_resource_template) + template = await self.get_resource_template(uri, version=version) if template is None: if version is None: raise NotFoundError(f"Unknown resource: {uri!r}") diff --git a/tests/server/test_providers.py b/tests/server/test_providers.py index cfcca05e7..9751642f0 100644 --- a/tests/server/test_providers.py +++ b/tests/server/test_providers.py @@ -406,7 +406,7 @@ class TestProviderExecutionMethods: """Test that read_resource_template handles template-based resources.""" class TemplateProvider(Provider): - async def list_resource_templates(self) -> Sequence[ResourceTemplate]: + async def _list_resource_templates(self) -> Sequence[ResourceTemplate]: return [ FunctionResourceTemplate.from_function( fn=lambda name: f"content of {name}",