v3-notes/prompt-internal-types.md
Version: 3.0.0
Impact: Breaking change for prompts returning mcp.types.PromptMessage
Prompts now use FastMCP's Message and PromptResult types internally, following the same pattern as resources (#2734). MCP SDK types are only used at the protocol boundary.
from mcp.types import PromptMessage, TextContent
@mcp.prompt
def my_prompt() -> PromptMessage:
return PromptMessage(
role="user",
content=TextContent(type="text", text="Hello")
)
from fastmcp.prompts import Message
@mcp.prompt
def my_prompt() -> Message:
return Message("Hello") # role defaults to "user"
str | list[Message | str] | PromptResult
Valid:
return "Hello" → wrapped as single user Messagereturn [Message("Hi"), Message("Response", role="assistant")]return ["Hi", "Response"] → strings auto-wrapped as user Messagesreturn PromptResult(messages=[...], meta={...})Invalid (now raises error):
return PromptMessage(...) → Use Message insteadreturn Message(...) as single value → Use PromptResult([Message(...)]) or return a listMessage(
content: Any, # Auto-serializes non-str to JSON
role: Literal["user", "assistant"] = "user"
)
Auto-Serialization:
str → passes through as TextContentdict → JSON-serialized to textlist → JSON-serialized to textBaseModel → JSON-serialized to textTextContent / EmbeddedResource → passes through directlyPromptResult(
messages: str | list[Message], # str wrapped as single Message
description: str | None = None,
meta: dict[str, Any] | None = None
)
Message("Hello") vs PromptMessage(role="user", content=TextContent(type="text", text="Hello"))ResourceContent/ResourceResult# Before
from mcp.types import PromptMessage, TextContent
return PromptMessage(role="user", content=TextContent(type="text", text="Hello"))
# After
from fastmcp.prompts import Message
return Message("Hello")
# Before
return [
PromptMessage(role="user", content=TextContent(type="text", text="Hi")),
PromptMessage(role="assistant", content=TextContent(type="text", text="Hello!")),
]
# After
return [
Message("Hi"),
Message("Hello!", role="assistant"),
]
from fastmcp.prompts import Message, PromptResult
return PromptResult(
messages=[Message("Analyze this")],
meta={"priority": "high"}
)