modelcontextprotocol / modelcontextprotocol/python-sdk
Expose `schema_generator` on `FastMCP` for tool params schema generation
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 24.3k
- フォーク
- 4k
- 平均マージ
- 1日 1時間
- マージ済み PR(30日)
- 31
説明
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
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず src/mcp/server/fastmcp/tools/base.py と utilities/func_metadata.py から始め、FastMCP.init の値が 2 つの model_json_schema 呼び出しに到達するまでの経路を追跡します。任意の schema_generator が両方の経路に到達し、デフォルト値によって現在の動作が維持され、strict-schema のトレードオフが提案どおり文書化またはカバーされた時点で、変更は完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- backend-api-design
- issue の種類
- 機能追加
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 活発さ
- 静か
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 55/100