4242 SubscribeRequest ,
4343 Tool ,
4444 UnsubscribeRequest ,
45+ TextContent ,
46+ EmbeddedResource ,
47+ PromptMessage ,
4548)
4649
4750logger = 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
0 commit comments