Skip to content

Commit 776aaf4

Browse files
feat: Allow ResourceContents objects to be returned directly from read_resource handlers
Updated the low-level server's read_resource decorator to accept TextResourceContents and BlobResourceContents objects directly, in addition to the existing ReadResourceContents. This provides more flexibility for resource handlers to construct and return properly typed ResourceContents objects with full control over all properties. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent ef96a31 commit 776aaf4

1 file changed

Lines changed: 12 additions & 2 deletions

File tree

‎src/mcp/server/lowlevel/server.py‎

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,14 @@ async def handler(_: Any):
331331

332332
def read_resource(self):
333333
def decorator(
334-
func: Callable[[AnyUrl], Awaitable[str | bytes | Iterable[ReadResourceContents]]],
334+
func: Callable[
335+
[AnyUrl],
336+
Awaitable[
337+
str
338+
| bytes
339+
| Iterable[ReadResourceContents | types.TextResourceContents | types.BlobResourceContents]
340+
],
341+
],
335342
):
336343
logger.debug("Registering handler for ReadResourceRequest")
337344

@@ -364,7 +371,10 @@ def create_content(data: str | bytes, mime_type: str | None):
364371
content = create_content(data, None)
365372
case Iterable() as contents:
366373
contents_list = [
367-
create_content(content_item.content, content_item.mime_type) for content_item in contents
374+
content_item
375+
if isinstance(content_item, types.ResourceContents)
376+
else create_content(content_item.content, content_item.mime_type)
377+
for content_item in contents
368378
]
369379
return types.ServerResult(
370380
types.ReadResourceResult(

0 commit comments

Comments
 (0)