modelcontextprotocol / modelcontextprotocol/python-sdk

Refactor func_metadata() into smaller components for schema & metadata generation

Abierto
#1,700 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

enhancement needs decision P3
Lenguaje dominante
Python
Estrellas
24.3k
Forks
4k
Merge medio
1 d 1 h
PR fusionados (30 d)
31

Descripción

Description

Summary

func_metadata() in src/mcp/server/fastmcp/utilities/func_metadata.py is a large function that handles:

  • signature introspection,
  • parameter/return type analysis,
  • JSON schema generation,
  • special handling for various container and model types.

This centralizes important logic, but its size and responsibility make it difficult to understand, test, and extend.

Problems

  • Complexity: Many branching code paths for different types (Pydantic, dataclasses, TypedDict, primitives, etc.).
  • Maintenance: Adding new type handling or fixing edge cases requires navigating a large function.
  • Testing: Hard to write targeted tests for individual behaviors without exercising the entire function.

Proposal

  1. Decompose into smaller functions

    For example:

    • extract_parameters(fn) -> list[Parameter]
    • build_arg_model(params) -> PydanticModel | None
    • build_output_model(return_type) -> PydanticModel | None
    • create_converters(...) -> Callable
  2. Use a strategy/registry for type handling

    • Allow registering handlers for specific type families (Pydantic, TypedDict, dataclasses, etc.).
    • This reduces the need for a long series of if isinstance(...) checks in one place.
  3. Add targeted unit tests

    • Test each helper independently, covering edge cases.
    • Keep some higher-level tests that ensure the overall metadata behavior remains consistent.

Why this matters

  • Extensibility: Easier to support new type patterns without making func_metadata() even larger.
  • Reliability: Smaller, well-tested pieces reduce the risk of regressions when making changes.
  • Readability: Contributors can understand and modify the code more easily.

Acceptance criteria

  • func_metadata() is decomposed into smaller, focused helpers.
  • There is a clear extension mechanism for adding support for new types.
  • Unit tests cover individual behaviors; existing integration tests still pass.
References

No response

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza en src/mcp/server/fastmcp/utilities/func_metadata.py siguiendo func_metadata() y su introspección de firmas, análisis de tipos, generación de esquemas y rutas de conversión. Usa las pruebas unitarias y de integración existentes como línea base; después, añade cobertura específica para los helpers propuestos y conserva el comportamiento existente de los metadatos, proporcionando al mismo tiempo un mecanismo claro de extensión para nuevas familias de tipos.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
backend
Tipo de issue
Refactorización
Dificultad
5/5
Tiempo estimado
Más de una semana
Estado de actividad
Tranquilo
Claridad
Bastante claro
Aptitud para principiantes
42/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.