modelcontextprotocol / modelcontextprotocol/python-sdk
find_context_parameter() fails to detect Context parameter in callable class instances
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 24.3k
- Forks
- 4k
- Merge medio
- 1 d 1 h
- PR fusionados (30 d)
- 31
Descripción
Initial Checks
- I confirm that I'm using the latest version of MCP Python SDK
- I confirm that I searched for my issue in https://github.com/modelcontextprotocol/python-sdk/issues before opening this issue
Description
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
from typing import Annotated, Any
from mcp.server.fastmcp import Context, FastMCP
from mcp.server.session import ServerSession
from starlette.requests import Request
import pydantic
class MyTool:
def __init__(self, name: str):
self.__name__ = name
async def __call__(
self,
query: Annotated[str, pydantic.Field(description="Search query")],
ctx: Context[ServerSession, Any, Request],
) -> str:
"""Performs a search."""
return f"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
Python & MCP Python SDK
1.26.0
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza por find_context_parameter(), que se utiliza al registrar herramientas mediante FastMCP.add_tool(). Compara su tratamiento de las funciones normales con el de las instancias de clase invocables y verifica que el ejemplo ya no exponga ctx como parámetro de herramienta cuando se registra la instancia invocable.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- api, backend
- Tipo de issue
- Error
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Estado de actividad
- Estancado
- Claridad
- Bien especificado
- Aptitud para principiantes
- 55/100