Skip to content

Commit 4770bcd

Browse files
committedJan 6, 2025··
fix: #129 resource template handling in FastMCP server
1 parent b66c675 commit 4770bcd

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed
 

‎src/mcp/server/fastmcp/server.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,7 @@ def _setup_handlers(self) -> None:
133133
self._mcp_server.read_resource()(self.read_resource)
134134
self._mcp_server.list_prompts()(self.list_prompts)
135135
self._mcp_server.get_prompt()(self.get_prompt)
136-
# TODO: This has not been added to MCP yet, see https://github.com/jlowin/fastmcp/issues/10
137-
# self._mcp_server.list_resource_templates()(self.list_resource_templates)
136+
self._mcp_server.list_resource_templates()(self.list_resource_templates)
138137

139138
async def list_tools(self) -> list[MCPTool]:
140139
"""List all available tools."""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import pytest
2+
3+
from mcp import types
4+
from mcp.server.fastmcp import FastMCP
5+
6+
7+
@pytest.mark.anyio
8+
async def test_resource_templates():
9+
# Create an MCP server
10+
mcp = FastMCP("Demo")
11+
12+
# Add a dynamic greeting resource
13+
@mcp.resource("greeting://{name}")
14+
def get_greeting(name: str) -> str:
15+
"""Get a personalized greeting"""
16+
return f"Hello, {name}!"
17+
18+
@mcp.resource("users://{user_id}/profile")
19+
def get_user_profile(user_id: str) -> str:
20+
"""Dynamic user data"""
21+
return f"Profile data for user {user_id}"
22+
23+
# Get the list of resource templates using the underlying server
24+
# Note: list_resource_templates() returns a decorator that wraps the handler
25+
# The handler returns a ServerResult with a ListResourceTemplatesResult inside
26+
result = await mcp._mcp_server.request_handlers[types.ListResourceTemplatesRequest](
27+
types.ListResourceTemplatesRequest(
28+
method="resources/templates/list", params=None, cursor=None
29+
)
30+
)
31+
assert isinstance(result.root, types.ListResourceTemplatesResult)
32+
templates = result.root.resourceTemplates
33+
34+
# Verify we get both templates back
35+
assert len(templates) == 2
36+
37+
# Verify template details
38+
greeting_template = next(t for t in templates if t.name == "get_greeting")
39+
assert greeting_template.uriTemplate == "greeting://{name}"
40+
assert greeting_template.description == "Get a personalized greeting"
41+
42+
profile_template = next(t for t in templates if t.name == "get_user_profile")
43+
assert profile_template.uriTemplate == "users://{user_id}/profile"
44+
assert profile_template.description == "Dynamic user data"

0 commit comments

Comments
 (0)
Please sign in to comment.