|
9 | 9 |
|
10 | 10 | from pydantic import BaseModel, Field, validate_call |
11 | 11 |
|
| 12 | +from mcp.server.fastmcp.server import Context |
12 | 13 | from mcp.server.fastmcp.resources.types import FunctionResource, Resource |
13 | 14 | from mcp.server.fastmcp.utilities.func_metadata import func_metadata |
14 | 15 |
|
15 | 16 | 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 |
17 | 19 |
|
18 | 20 |
|
19 | 21 | class ResourceTemplate(BaseModel): |
@@ -43,23 +45,20 @@ def from_function( |
43 | 45 | name: str | None = None, |
44 | 46 | description: str | None = None, |
45 | 47 | mime_type: str | None = None, |
| 48 | + context_kwarg: str | None = None, |
46 | 49 | ) -> ResourceTemplate: |
47 | 50 | """Create a template from a function.""" |
48 | 51 | func_name = name or fn.__name__ |
49 | 52 | if func_name == "<lambda>": |
50 | 53 | raise ValueError("You must provide a name for lambda functions") |
51 | 54 |
|
52 | 55 | # 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 |
63 | 62 |
|
64 | 63 | # Get schema from func_metadata, excluding context parameter |
65 | 64 | func_arg_metadata = func_metadata( |
@@ -91,7 +90,10 @@ def matches(self, uri: str) -> dict[str, Any] | None: |
91 | 90 | return None |
92 | 91 |
|
93 | 92 | 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, |
95 | 97 | ) -> Resource: |
96 | 98 | """Create a resource from the template with the given parameters.""" |
97 | 99 | try: |
|
0 commit comments