You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
find_context_parameter() fails to detect Context parameter in callable class instances #1974
When registering a callable class instance as an MCP tool via FastMCP.add_tool(), the ctx: Context parameter is incorrectly exposed as an externally visible tool parameter instead of being injected by the framework. This is because find_context_parameter() uses typing.get_type_hints() which doesn't introspect the call method of callable class instances.
Suggested Fix
Update find_context_parameter() to handle callable class instances:
def find_context_parameter(fn: Callable[..., Any]) -> str | None:
from mcp.server.fastmcp.server import Context
# Handle callable class instances by using __call__ method
target = fn
if not (inspect.isfunction(fn) or inspect.ismethod(fn)):
if callable(fn) and hasattr(fn, "__call__"):
target = fn.__call__
try:
hints = typing.get_type_hints(target)
except Exception:
return None
# ... rest of function unchanged
Example Code
fromtypingimportAnnotated, Anyfrommcp.server.fastmcpimportContext, FastMCPfrommcp.server.sessionimportServerSessionfromstarlette.requestsimportRequestimportpydanticclassMyTool:
def__init__(self, name: str):
self.__name__=nameasyncdef__call__(
self,
query: Annotated[str, pydantic.Field(description="Search query")],
ctx: Context[ServerSession, Any, Request],
) ->str:
"""Performs a search."""returnf"Results for: {query}"mcp=FastMCP(name="Test Server")
mcp.add_tool(MyTool(name="my_search"), name="my_search", description="Search tool")
# When listing tools, 'ctx' appears as a required parameter in the schema
Activity
maxisbey commentedon Feb 10, 2026
This is part of the broader context handling refactor planned for V2 — see #1684 for tracking.
AI Disclaimer
fix: handle callable class instances in find_context_parameter()