Skip to content

Commit 7a3ea56

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

File tree

2 files changed

+19
-13
lines changed

2 files changed

+19
-13
lines changed

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

Lines changed: 5 additions & 1 deletion
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)

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

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
from pydantic import BaseModel, Field, validate_call
1111

1212
from mcp.server.fastmcp.resources.types import FunctionResource, Resource
13+
from mcp.server.fastmcp.server import Context
1314
from mcp.server.fastmcp.utilities.func_metadata import func_metadata
1415

1516
if TYPE_CHECKING:
16-
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,20 @@ 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+
sig = inspect.signature(fn)
58+
for param_name, param in sig.parameters.items():
59+
if param.annotation is Context:
60+
context_kwarg = param_name
61+
break
6362

6463
# Get schema from func_metadata, excluding context parameter
6564
func_arg_metadata = func_metadata(
@@ -91,7 +90,10 @@ def matches(self, uri: str) -> dict[str, Any] | None:
9190
return None
9291

9392
async def create_resource(
94-
self, uri: str, params: dict[str, Any], context: Context | None = None
93+
self,
94+
uri: str,
95+
params: dict[str, Any],
96+
context: Context[ServerSessionT, LifespanContextT] | None = None,
9597
) -> Resource:
9698
"""Create a resource from the template with the given parameters."""
9799
try:

0 commit comments

Comments
 (0)