Merge pull request #2603 from jlowin/fix-prompt-task-to-mcp

fix: prompt tasks returning mcp.types.PromptMessage now work
This commit is contained in:
Chris Guidry 2025-12-12 14:11:28 -05:00 committed by GitHub
commit be726d743f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 59 additions and 1 deletions

View file

@ -123,7 +123,8 @@ async def convert_prompt_result(
messages: list[mcp.types.PromptMessage] = []
for msg in raw_value:
if isinstance(msg, PromptMessage):
messages.append(msg.to_mcp())
# PromptMessage is imported from mcp.types - use directly
messages.append(msg)
elif isinstance(msg, str):
messages.append(
mcp.types.PromptMessage(

View file

@ -0,0 +1,57 @@
"""Test prompt task with mcp.types.PromptMessage return values.
Regression test for: PromptMessage object has no attribute 'to_mcp'
"""
import mcp.types
from fastmcp import FastMCP
from fastmcp.client import Client
async def test_prompt_task_with_mcp_prompt_message():
"""Prompt task returning mcp.types.PromptMessage should serialize correctly."""
mcp_server = FastMCP("test")
@mcp_server.prompt(task=True)
async def greeting(name: str) -> list[mcp.types.PromptMessage]:
return [
mcp.types.PromptMessage(
role="user",
content=mcp.types.TextContent(type="text", text=f"Hello {name}"),
)
]
async with Client(mcp_server) as client:
task = await client.get_prompt("greeting", {"name": "World"}, task=True)
result = await task.result()
assert "Hello World" in result.messages[0].content.text # type: ignore[attr-defined]
async def test_prompt_task_with_multiple_mcp_prompt_messages():
"""Prompt task returning multiple mcp.types.PromptMessage objects."""
mcp_server = FastMCP("test")
@mcp_server.prompt(task=True)
async def conversation(topic: str) -> list[mcp.types.PromptMessage]:
return [
mcp.types.PromptMessage(
role="user",
content=mcp.types.TextContent(
type="text", text=f"Tell me about {topic}"
),
),
mcp.types.PromptMessage(
role="assistant",
content=mcp.types.TextContent(
type="text", text=f"{topic} is fascinating!"
),
),
]
async with Client(mcp_server) as client:
task = await client.get_prompt("conversation", {"topic": "space"}, task=True)
result = await task.result()
assert len(result.messages) == 2
assert "Tell me about space" in result.messages[0].content.text # type: ignore[attr-defined]
assert "space is fascinating" in result.messages[1].content.text # type: ignore[attr-defined]