Add icons support for ResourceTemplate by pja-ant · Pull Request #1412 · modelcontextprotocol/python-sdk · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/mcp/server/fastmcp/resources/resource_manager.py
6 changes: 5 additions & 1 deletion src/mcp/server/fastmcp/resources/templates.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from mcp.server.fastmcp.resources.types import FunctionResource, Resource
from mcp.server.fastmcp.utilities.context_injection import find_context_parameter, inject_context
from mcp.server.fastmcp.utilities.func_metadata import func_metadata
from mcp.types import Icon

if TYPE_CHECKING:
from mcp.server.fastmcp.server import Context
Expand All @@ -27,6 +28,7 @@ class ResourceTemplate(BaseModel):
title: str | None = Field(description="Human-readable title of the resource", default=None)
description: str | None = Field(description="Description of what the resource does")
mime_type: str = Field(default="text/plain", description="MIME type of the resource content")
icons: list[Icon] | None = Field(default=None, description="Optional list of icons for the resource template")
fn: Callable[..., Any] = Field(exclude=True)
parameters: dict[str, Any] = Field(description="JSON schema for function parameters")
context_kwarg: str | None = Field(None, description="Name of the kwarg that should receive context")
Expand All @@ -40,6 +42,7 @@ def from_function(
title: str | None = None,
description: str | None = None,
mime_type: str | None = None,
icons: list[Icon] | None = None,
context_kwarg: str | None = None,
) -> ResourceTemplate:
"""Create a template from a function."""
Expand Down Expand Up @@ -67,6 +70,7 @@ def from_function(
title=title,
description=description or fn.__doc__ or "",
mime_type=mime_type or "text/plain",
icons=icons,
fn=fn,
parameters=parameters,
context_kwarg=context_kwarg,
Expand Down Expand Up @@ -103,7 +107,7 @@ async def create_resource(
title=self.title,
description=self.description,
mime_type=self.mime_type,
icons=None, # Resource templates don't support icons
icons=self.icons,
fn=lambda: result, # Capture result in closure
)
except Exception as e:
Expand Down
3 changes: 2 additions & 1 deletion src/mcp/server/fastmcp/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,7 @@ async def list_resource_templates(self) -> list[MCPResourceTemplate]:
title=template.title,
description=template.description,
mimeType=template.mime_type,
icons=template.icons,
)
for template in templates
]
Expand Down Expand Up @@ -559,7 +560,7 @@ def decorator(fn: AnyFunction) -> AnyFunction:
title=title,
description=description,
mime_type=mime_type,
# Note: Resource templates don't support icons
icons=icons,
)
else:
# Register as regular resource
Expand Down
2 changes: 2 additions & 0 deletions src/mcp/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,8 @@ class ResourceTemplate(BaseMetadata):
The MIME type for all resources that match this template. This should only be
included if all resources matching this template have the same type.
"""
icons: list[Icon] | None = None
"""An optional list of icons for this resource template."""
annotations: Annotations | None = None
meta: dict[str, Any] | None = Field(alias="_meta", default=None)
"""
Expand Down
16 changes: 16 additions & 0 deletions tests/issues/test_1338_icons_and_metadata.py
Loading