modelcontextprotocol / modelcontextprotocol/python-sdk
Expose `schema_generator` on `FastMCP` for tool params schema generation
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
Description
Context
Tool.from_function (in src/mcp/server/fastmcp/tools/base.py) generates the
tool parameters JSON schema via:
parameters = func_arg_metadata.arg_model.model_json_schema(by_alias=True)
This is hardcoded — no way for users to customize the generation. Pydantic 2.11+
supports union_format='primitive_type_array' which produces compact
LLM-friendly schemas like {"type": ["integer", "string"]} instead of
{"anyOf": [...]}. There's no path to enable it without monkey-patching or
post-processing.
Proposal
Add schema_generator: type[GenerateJsonSchema] | None = None to FastMCP.__init__.
When provided, plumb it to both model_json_schema calls:
# tools/base.py
parameters = func_arg_metadata.arg_model.model_json_schema(
by_alias=True,
schema_generator=self.schema_generator or GenerateJsonSchema,
)
# utilities/func_metadata.py
schema = model.model_json_schema(
schema_generator=self.schema_generator or StrictJsonSchema,
)
Use case
from pydantic.json_schema import GenerateJsonSchema
class CompactUnionGen(GenerateJsonSchema):
def __init__(self, by_alias=True, ref_template='#/$defs/{model}'):
super().__init__(
by_alias=by_alias,
ref_template=ref_template,
union_format='primitive_type_array',
)
mcp = FastMCP("srv", schema_generator=CompactUnionGen)
Tradeoff to discuss
func_metadata.py currently uses StrictJsonSchema (warnings → errors). With a
user-supplied generator, strict semantics are lost unless the user extends
StrictJsonSchema themselves. Proposed resolution: document that custom
generators should extend StrictJsonSchema if strict output validation is
desired.
Backward compat
Default None preserves current behavior exactly.
References
No response
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
Empieza por src/mcp/server/fastmcp/tools/base.py y utilities/func_metadata.py; después, sigue cómo los valores de FastMCP.init llegan a las dos llamadas a model_json_schema. El cambio estará hecho cuando un schema_generator opcional llegue a ambos caminos, los valores predeterminados conserven el comportamiento actual y el compromiso de strict-schema quede documentado o cubierto como se propone.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- backend-api-design
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Tranquilo
- Claridad
- Bastante claro
- Aptitud para principiantes
- 55/100