Skip to content

Commit c78d1ac

Browse files
committed
fix: add type params to generic Context
1 parent f8c68af commit c78d1ac

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

Diff for: src/mcp/server/fastmcp/resources/resource_manager.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
if TYPE_CHECKING:
1313
from mcp.server.fastmcp.server import Context
14+
from mcp.server.session import ServerSessionT
15+
from mcp.shared.context import LifespanContextT
1416

1517
logger = get_logger(__name__)
1618

@@ -69,7 +71,9 @@ def add_template(
6971
return template
7072

7173
async def get_resource(
72-
self, uri: AnyUrl | str, context: "Context | None" = None
74+
self,
75+
uri: AnyUrl | str,
76+
context: "Context[ServerSessionT, LifespanContextT] | None" = None,
7377
) -> Resource | None:
7478
"""Get resource by URI, checking concrete resources first, then templates."""
7579
uri_str = str(uri)

Diff for: src/mcp/server/fastmcp/resources/templates.py

+15-11
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
if TYPE_CHECKING:
1616
from mcp.server.fastmcp.server import Context
17+
from mcp.server.session import ServerSessionT
18+
from mcp.shared.context import LifespanContextT
1719

1820

1921
class ResourceTemplate(BaseModel):
@@ -43,23 +45,22 @@ def from_function(
4345
name: str | None = None,
4446
description: str | None = None,
4547
mime_type: str | None = None,
48+
context_kwarg: str | None = None,
4649
) -> ResourceTemplate:
4750
"""Create a template from a function."""
4851
func_name = name or fn.__name__
4952
if func_name == "<lambda>":
5053
raise ValueError("You must provide a name for lambda functions")
5154

5255
# Find context parameter if it exists
53-
context_kwarg = None
54-
sig = inspect.signature(fn)
55-
for param_name, param in sig.parameters.items():
56-
if (
57-
param.annotation.__name__ == "Context"
58-
if hasattr(param.annotation, "__name__")
59-
else False
60-
):
61-
context_kwarg = param_name
62-
break
56+
if context_kwarg is None:
57+
from mcp.server.fastmcp.server import Context
58+
59+
sig = inspect.signature(fn)
60+
for param_name, param in sig.parameters.items():
61+
if param.annotation is Context:
62+
context_kwarg = param_name
63+
break
6364

6465
# Get schema from func_metadata, excluding context parameter
6566
func_arg_metadata = func_metadata(
@@ -91,7 +92,10 @@ def matches(self, uri: str) -> dict[str, Any] | None:
9192
return None
9293

9394
async def create_resource(
94-
self, uri: str, params: dict[str, Any], context: Context | None = None
95+
self,
96+
uri: str,
97+
params: dict[str, Any],
98+
context: Context[ServerSessionT, LifespanContextT] | None = None,
9599
) -> Resource:
96100
"""Create a resource from the template with the given parameters."""
97101
try:

0 commit comments

Comments
 (0)