Skip to content

Commit 004a3fb

Browse files
committed
move Prompt instantiation from server to prompt manager
1 parent ed25167 commit 004a3fb

File tree

2 files changed

+39
-13
lines changed

2 files changed

+39
-13
lines changed

src/mcp/server/fastmcp/prompts/manager.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Prompt management functionality."""
22

3-
from typing import Any
3+
from typing import Any, Callable
44

55
from mcp.server.fastmcp.prompts.base import Message, Prompt
66
from mcp.server.fastmcp.utilities.logging import get_logger
@@ -25,9 +25,24 @@ def list_prompts(self) -> list[Prompt]:
2525

2626
def add_prompt(
2727
self,
28-
prompt: Prompt,
28+
prompt_or_fn: Prompt | Callable[..., Any],
29+
name: str | None = None,
30+
description: str | None = None,
2931
) -> Prompt:
30-
"""Add a prompt to the manager."""
32+
"""Add a prompt to the manager.
33+
34+
Args:
35+
prompt_or_fn: Either a Prompt object or a function to create a prompt from
36+
name: Optional name for the prompt (only used if prompt_or_fn is a function)
37+
description: Optional description of the prompt (only used if prompt_or_fn is a function)
38+
"""
39+
# If a function was provided, create a Prompt object from it
40+
if callable(prompt_or_fn) and not isinstance(prompt_or_fn, Prompt):
41+
prompt = Prompt.from_function(
42+
prompt_or_fn, name=name, description=description
43+
)
44+
else:
45+
prompt = prompt_or_fn
3146

3247
# Check for duplicates
3348
existing = self._prompts.get(prompt.name)

src/mcp/server/fastmcp/server.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,9 @@ def __init__(
138138
self,
139139
name: str | None = None,
140140
instructions: str | None = None,
141-
auth_server_provider: OAuthAuthorizationServerProvider[Any, Any, Any]
142-
| None = None,
141+
auth_server_provider: (
142+
OAuthAuthorizationServerProvider[Any, Any, Any] | None
143+
) = None,
143144
event_store: EventStore | None = None,
144145
**settings: Any,
145146
):
@@ -148,9 +149,11 @@ def __init__(
148149
self._mcp_server = MCPServer(
149150
name=name or "FastMCP",
150151
instructions=instructions,
151-
lifespan=lifespan_wrapper(self, self.settings.lifespan)
152-
if self.settings.lifespan
153-
else default_lifespan,
152+
lifespan=(
153+
lifespan_wrapper(self, self.settings.lifespan)
154+
if self.settings.lifespan
155+
else default_lifespan
156+
),
154157
)
155158
self._tool_manager = ToolManager(
156159
warn_on_duplicate_tools=self.settings.warn_on_duplicate_tools
@@ -481,13 +484,22 @@ def decorator(fn: AnyFunction) -> AnyFunction:
481484

482485
return decorator
483486

484-
def add_prompt(self, prompt: Prompt) -> None:
487+
def add_prompt(
488+
self,
489+
prompt_or_fn: Prompt | Callable[..., Any],
490+
name: str | None = None,
491+
description: str | None = None,
492+
) -> None:
485493
"""Add a prompt to the server.
486494
487495
Args:
488-
prompt: A Prompt instance to add
496+
prompt_or_fn: Either a Prompt object or a function to create a prompt from
497+
name: Optional name for the prompt (only used if prompt_or_fn is a function)
498+
description: Optional description of the prompt (only used if prompt_or_fn is a function)
489499
"""
490-
self._prompt_manager.add_prompt(prompt)
500+
self._prompt_manager.add_prompt(
501+
prompt_or_fn, name=name, description=description
502+
)
491503

492504
def prompt(
493505
self, name: str | None = None, description: str | None = None
@@ -533,8 +545,7 @@ async def analyze_file(path: str) -> list[Message]:
533545
)
534546

535547
def decorator(func: AnyFunction) -> AnyFunction:
536-
prompt = Prompt.from_function(func, name=name, description=description)
537-
self.add_prompt(prompt)
548+
self.add_prompt(func, name=name, description=description)
538549
return func
539550

540551
return decorator

0 commit comments

Comments
 (0)