diff --git a/examples/servers/system_prompt.py b/examples/servers/system_prompt.py new file mode 100644 index 000000000..95da5235c --- /dev/null +++ b/examples/servers/system_prompt.py @@ -0,0 +1,26 @@ +from mcp.server.fastmcp import FastMCP +from mcp.server.fastmcp.prompts import base as mcp_messages + +mcp = FastMCP("weather") + + +@mcp.prompt() +def weather_system_prompt() -> mcp_messages.SystemMessage: + """ + Creates a prompt asking an AI to weather + Args: + None: None + """ + + return mcp_messages.SystemMessage( + "You are a helpful weather agent. You answer questions clearly and simply. " + "If you don’t know something, say you don’t have that information." + ) + + +mcp_app = mcp.streamable_http_app() + +if __name__ == "__main__": + import uvicorn + + uvicorn.run("system_prompt:mcp_app", host="0.0.0.0", port=8002, reload=True) diff --git a/src/mcp/server/fastmcp/prompts/base.py b/src/mcp/server/fastmcp/prompts/base.py index b45cfc917..ba7093347 100644 --- a/src/mcp/server/fastmcp/prompts/base.py +++ b/src/mcp/server/fastmcp/prompts/base.py @@ -13,7 +13,7 @@ class Message(BaseModel): """Base class for all prompt messages.""" - role: Literal["user", "assistant"] + role: Literal["user", "assistant","system"] content: ContentBlock def __init__(self, content: str | ContentBlock, **kwargs: Any): @@ -25,7 +25,7 @@ def __init__(self, content: str | ContentBlock, **kwargs: Any): class UserMessage(Message): """A message from the user.""" - role: Literal["user", "assistant"] = "user" + role: Literal["user", "assistant","system"] = "user" def __init__(self, content: str | ContentBlock, **kwargs: Any): super().__init__(content=content, **kwargs) @@ -34,13 +34,20 @@ def __init__(self, content: str | ContentBlock, **kwargs: Any): class AssistantMessage(Message): """A message from the assistant.""" - role: Literal["user", "assistant"] = "assistant" + role: Literal["user", "assistant","system"] = "assistant" def __init__(self, content: str | ContentBlock, **kwargs: Any): super().__init__(content=content, **kwargs) +class SystemMessage(Message): + """A message from the assistant.""" + + role: Literal["user", "assistant","system"] = "system" + + def __init__(self, content: str | ContentBlock, **kwargs: Any): + super().__init__(content=content, **kwargs) -message_validator = TypeAdapter[UserMessage | AssistantMessage](UserMessage | AssistantMessage) +message_validator = TypeAdapter[UserMessage | AssistantMessage | SystemMessage](UserMessage | AssistantMessage | SystemMessage) SyncPromptResult = str | Message | dict[str, Any] | Sequence[str | Message | dict[str, Any]] PromptResult = SyncPromptResult | Awaitable[SyncPromptResult] diff --git a/src/mcp/types.py b/src/mcp/types.py index 4a9c2bf1a..a0397c32b 100644 --- a/src/mcp/types.py +++ b/src/mcp/types.py @@ -35,7 +35,7 @@ ProgressToken = str | int Cursor = str -Role = Literal["user", "assistant"] +Role = Literal["user", "assistant","system"] RequestId = Annotated[int | str, Field(union_mode="left_to_right")] AnyFunction: TypeAlias = Callable[..., Any]