Skip to content

Commit f425cc4

Browse files
committed
fix merge conflicts
1 parent eccb6fc commit f425cc4

File tree

5 files changed

+37
-31
lines changed

5 files changed

+37
-31
lines changed

src/mcp/server/fastmcp/authorizer.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from pydantic import AnyUrl
77
from starlette.requests import Request
88

9+
from mcp.server.lowlevel.server import LifespanResultT
910
from mcp.server.session import ServerSession
1011

1112
if TYPE_CHECKING:
@@ -16,15 +17,15 @@ class Authorizer:
1617
__metaclass__ = abc.ABCMeta
1718

1819
@abc.abstractmethod
19-
def permit_get_tool(self, name: str, context: Context[ServerSession, object, Request] | None = None) -> bool:
20+
def permit_get_tool(self, name: str, context: Context[ServerSession, LifespanResultT, Request] | None = None) -> bool:
2021
"""Check if the specified tool can be retrieved from the associated mcp server"""
2122
return False
2223

2324
@abc.abstractmethod
2425
def permit_list_tool(
2526
self,
2627
name: str,
27-
context: Context[ServerSession, object, Request] | None = None,
28+
context: Context[ServerSession, LifespanResultT, Request] | None = None,
2829
) -> bool:
2930
"""Check if the specified tool can be listed from the associated mcp server"""
3031
return False
@@ -34,46 +35,46 @@ def permit_call_tool(
3435
self,
3536
name: str,
3637
arguments: dict[str, Any],
37-
context: Context[ServerSession, object, Request] | None = None,
38+
context: Context[ServerSession, LifespanResultT, Request] | None = None,
3839
) -> bool:
3940
"""Check if the specified tool can be called from the associated mcp server"""
4041
return False
4142

4243
@abc.abstractmethod
4344
def permit_get_resource(
44-
self, resource: AnyUrl | str, context: Context[ServerSession, object, Request] | None = None
45+
self, resource: AnyUrl | str, context: Context[ServerSession, LifespanResultT, Request] | None = None
4546
) -> bool:
4647
"""Check if the specified resource can be retrieved from the associated mcp server"""
4748
return False
4849

4950
@abc.abstractmethod
5051
def permit_create_resource(
51-
self, uri: str, params: dict[str, Any], context: Context[ServerSession, object, Request] | None = None
52+
self, uri: str, params: dict[str, Any], context: Context[ServerSession, LifespanResultT, Request] | None = None
5253
) -> bool:
5354
"""Check if the specified resource can be created on the associated mcp server"""
5455
return False
5556

5657
@abc.abstractmethod
5758
def permit_list_resource(
58-
self, resource: AnyUrl | str, context: Context[ServerSession, object, Request] | None = None
59+
self, resource: AnyUrl | str, context: Context[ServerSession, LifespanResultT, Request] | None = None
5960
) -> bool:
6061
"""Check if the specified resource can be listed from the associated mcp server"""
6162
return False
6263

6364
@abc.abstractmethod
6465
def permit_list_template(
65-
self, resource: AnyUrl | str, context: Context[ServerSession, object, Request] | None = None
66+
self, resource: AnyUrl | str, context: Context[ServerSession, LifespanResultT, Request] | None = None
6667
) -> bool:
6768
"""Check if the specified template can be listed from the associated mcp server"""
6869
return False
6970

7071
@abc.abstractmethod
71-
def permit_get_prompt(self, name: str, context: Context[ServerSession, object, Request] | None = None) -> bool:
72+
def permit_get_prompt(self, name: str, context: Context[ServerSession, LifespanResultT, Request] | None = None) -> bool:
7273
"""Check if the specified prompt can be retrieved from the associated mcp server"""
7374
return False
7475

7576
@abc.abstractmethod
76-
def permit_list_prompt(self, name: str, context: Context[ServerSession, object, Request] | None = None) -> bool:
77+
def permit_list_prompt(self, name: str, context: Context[ServerSession, LifespanResultT, Request] | None = None) -> bool:
7778
"""Check if the specified prompt can be listed from the associated mcp server"""
7879
return False
7980

@@ -89,44 +90,44 @@ def permit_render_prompt(
8990

9091

9192
class AllowAllAuthorizer(Authorizer):
92-
def permit_get_tool(self, name: str, context: Context[ServerSession, object, Request] | None = None) -> bool:
93+
def permit_get_tool(self, name: str, context: Context[ServerSession, LifespanResultT, Request] | None = None) -> bool:
9394
return True
9495

95-
def permit_list_tool(self, name: str, context: Context[ServerSession, object, Request] | None = None) -> bool:
96+
def permit_list_tool(self, name: str, context: Context[ServerSession, LifespanResultT, Request] | None = None) -> bool:
9697
return True
9798

9899
def permit_call_tool(
99100
self,
100101
name: str,
101102
arguments: dict[str, Any],
102-
context: Context[ServerSession, object, Request] | None = None,
103+
context: Context[ServerSession, LifespanResultT, Request] | None = None,
103104
) -> bool:
104105
return True
105106

106107
def permit_get_resource(
107-
self, resource: AnyUrl | str, context: Context[ServerSession, object, Request] | None = None
108+
self, resource: AnyUrl | str, context: Context[ServerSession, LifespanResultT, Request] | None = None
108109
) -> bool:
109110
return True
110111

111112
def permit_create_resource(
112-
self, uri: str, params: dict[str, Any], context: Context[ServerSession, object, Request] | None = None
113+
self, uri: str, params: dict[str, Any], context: Context[ServerSession, LifespanResultT, Request] | None = None
113114
) -> bool:
114115
return True
115116

116117
def permit_list_resource(
117-
self, resource: AnyUrl | str, context: Context[ServerSession, object, Request] | None = None
118+
self, resource: AnyUrl | str, context: Context[ServerSession, LifespanResultT, Request] | None = None
118119
) -> bool:
119120
return True
120121

121122
def permit_list_template(
122-
self, resource: AnyUrl | str, context: Context[ServerSession, object, Request] | None = None
123+
self, resource: AnyUrl | str, context: Context[ServerSession, LifespanResultT, Request] | None = None
123124
) -> bool:
124125
return True
125126

126-
def permit_get_prompt(self, name: str, context: Context[ServerSession, object, Request] | None = None) -> bool:
127+
def permit_get_prompt(self, name: str, context: Context[ServerSession, LifespanResultT, Request] | None = None) -> bool:
127128
return True
128129

129-
def permit_list_prompt(self, name: str, context: Context[ServerSession, object, Request] | None = None) -> bool:
130+
def permit_list_prompt(self, name: str, context: Context[ServerSession, LifespanResultT, Request] | None = None) -> bool:
130131
return True
131132

132133
def permit_render_prompt(

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from starlette.requests import Request
88

99
from mcp.server.fastmcp.authorizer import AllowAllAuthorizer, Authorizer
10-
from mcp.server.fastmcp.prompts.base import Message, Prompt
10+
from mcp.server.fastmcp.prompts.base import Prompt
1111
from mcp.server.fastmcp.utilities.logging import get_logger
1212
from mcp.server.session import ServerSession
1313

@@ -29,7 +29,7 @@ def __init__(
2929
self._authorizer = authorizer
3030
self.warn_on_duplicate_prompts = warn_on_duplicate_prompts
3131

32-
def get_prompt(self, name: str, context: Context[ServerSession, object, Request] | None = None) -> Prompt | None:
32+
def get_prompt(self, name: str, arguments: dict[str, Any] | None = None,context: Context[ServerSession, object, Request] | None = None) -> Prompt | None:
3333
"""Get prompt by name."""
3434
if self._authorizer.permit_get_prompt(name, context):
3535
return self._prompts.get(name)
@@ -61,12 +61,12 @@ async def render_prompt(
6161
name: str,
6262
arguments: dict[str, Any] | None = None,
6363
context: Context[ServerSession, object, Request] | None = None,
64-
) -> list[Message]:
64+
) -> Prompt:
6565
"""Render a prompt by name with arguments."""
6666
prompt = self.get_prompt(name)
6767
if not prompt:
6868
raise ValueError(f"Unknown prompt: {name}")
6969
if self._authorizer.permit_render_prompt(name, arguments, context):
70-
return await prompt.render(arguments)
70+
return prompt
7171
else:
7272
raise ValueError(f"Unknown prompt: {name}")

src/mcp/server/fastmcp/resources/resource_manager.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from pydantic import AnyUrl
99
from starlette.requests import Request
1010

11+
from mcp.server.lowlevel.server import LifespanResultT
1112
from mcp.server.fastmcp.authorizer import AllowAllAuthorizer, Authorizer
1213
from mcp.server.fastmcp.resources.base import Resource
1314
from mcp.server.fastmcp.resources.templates import ResourceTemplate
@@ -81,7 +82,7 @@ def add_template(
8182
return template
8283

8384
async def get_resource(
84-
self, uri: AnyUrl | str, context: Context[ServerSession, object, Request] | None = None
85+
self, uri: AnyUrl | str, context: Context[ServerSession, LifespanResultT, Request] | None = None
8586
) -> Resource | None:
8687
"""Get resource by URI, checking concrete resources first, then templates."""
8788
uri_str = str(uri)
@@ -107,14 +108,14 @@ async def get_resource(
107108

108109
raise ValueError(f"Unknown resource: {uri}")
109110

110-
def list_resources(self, context: Context[ServerSession, object, Request] | None = None) -> list[Resource]:
111+
def list_resources(self, context: Context[ServerSession, LifespanResultT, Request] | None = None) -> list[Resource]:
111112
"""List all registered resources."""
112113
logger.debug("Listing resources", extra={"count": len(self._resources)})
113114
return [
114115
resource for uri, resource in self._resources.items() if self._authorizer.permit_list_resource(uri, context)
115116
]
116117

117-
def list_templates(self, context: Context[ServerSession, object, Request] | None = None) -> list[ResourceTemplate]:
118+
def list_templates(self, context: Context[ServerSession, LifespanResultT, Request] | None = None) -> list[ResourceTemplate]:
118119
"""List all registered templates."""
119120
logger.debug("Listing templates", extra={"count": len(self._templates)})
120121
return [

src/mcp/server/fastmcp/tools/tool_manager.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from starlette.requests import Request
77

8+
from mcp.server.lowlevel.server import LifespanResultT
89
from mcp.server.fastmcp.authorizer import AllowAllAuthorizer, Authorizer
910
from mcp.server.fastmcp.exceptions import ToolError
1011
from mcp.server.fastmcp.tools.base import Tool
@@ -38,14 +39,14 @@ def __init__(
3839
self.warn_on_duplicate_tools = (warn_on_duplicate_tools,)
3940
self._authorizer = authorizer
4041

41-
def get_tool(self, name: str, context: Context[ServerSession, object, Request] | None = None) -> Tool | None:
42+
def get_tool(self, name: str, context: Context[ServerSession, LifespanResultT, Request] | None = None) -> Tool | None:
4243
"""Get tool by name."""
4344
if self._authorizer.permit_get_tool(name, context):
4445
return self._tools.get(name)
4546
else:
4647
return None
4748

48-
def list_tools(self, context: Context[ServerSession, object, Request] | None = None) -> list[Tool]:
49+
def list_tools(self, context: Context[ServerSession, LifespanResultT, Request] | None = None) -> list[Tool]:
4950
"""List all registered tools."""
5051
return [tool for name, tool in self._tools.items() if self._authorizer.permit_list_tool(name, context)]
5152

@@ -79,7 +80,7 @@ async def call_tool(
7980
self,
8081
name: str,
8182
arguments: dict[str, Any],
82-
context: Context[ServerSession, object, Request] | None = None,
83+
context: Context[ServerSession, LifespanResultT, Request] | None = None,
8384
convert_result: bool = False,
8485
) -> Any:
8586
"""Call a tool by name with arguments."""

tests/server/fastmcp/prompts/test_manager.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ def fn() -> str:
7171
manager = PromptManager()
7272
prompt = Prompt.from_function(fn)
7373
manager.add_prompt(prompt)
74-
messages = await manager.render_prompt("fn")
74+
prompt = await manager.render_prompt("fn")
75+
messages = await prompt.render({})
7576
assert messages == [UserMessage(content=TextContent(type="text", text="Hello, world!"))]
7677

7778
@pytest.mark.anyio
@@ -84,7 +85,8 @@ def fn(name: str) -> str:
8485
manager = PromptManager()
8586
prompt = Prompt.from_function(fn)
8687
manager.add_prompt(prompt)
87-
messages = await manager.render_prompt("fn", arguments={"name": "World"})
88+
prompt = await manager.render_prompt("fn", arguments={"name": "World"})
89+
messages = await prompt.render({"name": "World"})
8890
assert messages == [UserMessage(content=TextContent(type="text", text="Hello, World!"))]
8991

9092
@pytest.mark.anyio
@@ -105,4 +107,5 @@ def fn(name: str) -> str:
105107
prompt = Prompt.from_function(fn)
106108
manager.add_prompt(prompt)
107109
with pytest.raises(ValueError, match="Missing required arguments"):
108-
await manager.render_prompt("fn")
110+
prompt = await manager.render_prompt("fn")
111+
await prompt.render({})

0 commit comments

Comments
 (0)