Skip to content

Commit a891ad4

Browse files
committed
Update tool calls to use structured results
1 parent 185a186 commit a891ad4

File tree

2 files changed

+55
-12
lines changed

2 files changed

+55
-12
lines changed

mcp_python/server/__init__.py

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@
4242
SubscribeRequest,
4343
Tool,
4444
UnsubscribeRequest,
45+
TextContent,
46+
EmbeddedResource,
47+
PromptMessage,
4548
)
4649

4750
logger = logging.getLogger(__name__)
@@ -117,8 +120,6 @@ def get_prompt(self):
117120
GetPromptRequest,
118121
GetPromptResult,
119122
ImageContent,
120-
SamplingMessage,
121-
TextContent,
122123
)
123124
from mcp_python.types import (
124125
Role as Role,
@@ -133,7 +134,7 @@ def decorator(
133134

134135
async def handler(req: GetPromptRequest):
135136
prompt_get = await func(req.params.name, req.params.arguments)
136-
messages: list[SamplingMessage] = []
137+
messages: list[PromptMessage] = []
137138
for message in prompt_get.messages:
138139
match message.content:
139140
case str() as text_content:
@@ -144,15 +145,20 @@ async def handler(req: GetPromptRequest):
144145
data=img_content.data,
145146
mimeType=img_content.mime_type,
146147
)
148+
case types.EmbeddedResource() as resource:
149+
content = EmbeddedResource(
150+
type="resource",
151+
resource=resource.resource
152+
)
147153
case _:
148154
raise ValueError(
149155
f"Unexpected content type: {type(message.content)}"
150156
)
151157

152-
sampling_message = SamplingMessage(
158+
prompt_message = PromptMessage(
153159
role=message.role, content=content
154160
)
155-
messages.append(sampling_message)
161+
messages.append(prompt_message)
156162

157163
return ServerResult(
158164
GetPromptResult(description=prompt_get.desc, messages=messages)
@@ -276,14 +282,46 @@ async def handler(_: Any):
276282
return decorator
277283

278284
def call_tool(self):
279-
from mcp_python.types import CallToolResult
285+
from mcp_python.types import CallToolResult, TextContent, ImageContent, EmbeddedResource
280286

281-
def decorator(func: Callable[..., Awaitable[Any]]):
287+
def decorator(
288+
func: Callable[..., Awaitable[list[str | types.ImageContent | types.EmbeddedResource]]]
289+
):
282290
logger.debug("Registering handler for CallToolRequest")
283291

284292
async def handler(req: CallToolRequest):
285-
result = await func(req.params.name, (req.params.arguments or {}))
286-
return ServerResult(CallToolResult(toolResult=result))
293+
try:
294+
results = await func(req.params.name, (req.params.arguments or {}))
295+
content = []
296+
for result in results:
297+
match result:
298+
case str() as text:
299+
content.append(TextContent(type="text", text=text))
300+
case types.ImageContent() as img:
301+
content.append(ImageContent(
302+
type="image",
303+
data=img.data,
304+
mimeType=img.mime_type
305+
))
306+
case types.EmbeddedResource() as resource:
307+
content.append(EmbeddedResource(
308+
type="resource",
309+
resource=resource.resource
310+
))
311+
312+
return ServerResult(
313+
CallToolResult(
314+
content=content,
315+
isError=False
316+
)
317+
)
318+
except Exception as e:
319+
return ServerResult(
320+
CallToolResult(
321+
content=[TextContent(type="text", text=str(e))],
322+
isError=True
323+
)
324+
)
287325

288326
self.request_handlers[CallToolRequest] = handler
289327
return func

mcp_python/server/types.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
"""
2-
This module provides simpler types to use with the server for managing prompts.
2+
This module provides simpler types to use with the server for managing prompts and tools.
33
"""
44

55
from dataclasses import dataclass
66
from typing import Literal
77

88
from pydantic import BaseModel
99

10-
from mcp_python.types import Role, ServerCapabilities
10+
from mcp_python.types import Role, ServerCapabilities, TextResourceContents, BlobResourceContents
1111

1212

1313
@dataclass
@@ -17,10 +17,15 @@ class ImageContent:
1717
mime_type: str
1818

1919

20+
@dataclass
21+
class EmbeddedResource:
22+
resource: TextResourceContents | BlobResourceContents
23+
24+
2025
@dataclass
2126
class Message:
2227
role: Role
23-
content: str | ImageContent
28+
content: str | ImageContent | EmbeddedResource
2429

2530

2631
@dataclass

0 commit comments

Comments
 (0)