fix: #129 resource template handling in FastMCP server

This commit is contained in:
David Soria Parra
2025-01-06 20:02:03 +00:00
parent b66c6759c3
commit 4770bcd0b1
2 changed files with 45 additions and 2 deletions

View File

@@ -133,8 +133,7 @@ class FastMCP:
self._mcp_server.read_resource()(self.read_resource) self._mcp_server.read_resource()(self.read_resource)
self._mcp_server.list_prompts()(self.list_prompts) self._mcp_server.list_prompts()(self.list_prompts)
self._mcp_server.get_prompt()(self.get_prompt) self._mcp_server.get_prompt()(self.get_prompt)
# TODO: This has not been added to MCP yet, see https://github.com/jlowin/fastmcp/issues/10 self._mcp_server.list_resource_templates()(self.list_resource_templates)
# self._mcp_server.list_resource_templates()(self.list_resource_templates)
async def list_tools(self) -> list[MCPTool]: async def list_tools(self) -> list[MCPTool]:
"""List all available tools.""" """List all available tools."""

View File

@@ -0,0 +1,44 @@
import pytest
from mcp import types
from mcp.server.fastmcp import FastMCP
@pytest.mark.anyio
async def test_resource_templates():
# Create an MCP server
mcp = FastMCP("Demo")
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
@mcp.resource("users://{user_id}/profile")
def get_user_profile(user_id: str) -> str:
"""Dynamic user data"""
return f"Profile data for user {user_id}"
# Get the list of resource templates using the underlying server
# Note: list_resource_templates() returns a decorator that wraps the handler
# The handler returns a ServerResult with a ListResourceTemplatesResult inside
result = await mcp._mcp_server.request_handlers[types.ListResourceTemplatesRequest](
types.ListResourceTemplatesRequest(
method="resources/templates/list", params=None, cursor=None
)
)
assert isinstance(result.root, types.ListResourceTemplatesResult)
templates = result.root.resourceTemplates
# Verify we get both templates back
assert len(templates) == 2
# Verify template details
greeting_template = next(t for t in templates if t.name == "get_greeting")
assert greeting_template.uriTemplate == "greeting://{name}"
assert greeting_template.description == "Get a personalized greeting"
profile_template = next(t for t in templates if t.name == "get_user_profile")
assert profile_template.uriTemplate == "users://{user_id}/profile"
assert profile_template.description == "Dynamic user data"