Generate from MCP Tool Schemas¶
Generate Python models from Model Context Protocol (MCP) tool schema profiles.
Experimental
MCP tool schema profile input support is experimental. The MCP specification and real-world tool schema shapes may evolve, so generated behavior may change as compatibility is expanded.
Quick Start¶
datamodel-codegen \
--input tools-list.json \
--input-file-type mcp-tools \
--output-model-type pydantic_v2.BaseModel \
--output model.py
Supported Input Shapes¶
The mcp-tools input type accepts:
- a
tools/listJSON-RPC response containingresult.tools; - an MCP server definition containing a top-level
toolsarray; - a single tool definition or an array of tool definitions;
- JSON Schema documents whose
$defsordefinitionsvalues are tool definitions.
Each tool must define name and inputSchema. If outputSchema is present, it is generated too.
Example¶
tools-list.json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"name": "search",
"inputSchema": {
"type": "object",
"properties": {
"query": { "type": "string" }
},
"required": ["query"]
},
"outputSchema": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": { "type": "string" }
}
},
"required": ["results"]
}
}
]
}
}
Generated model.py
from __future__ import annotations
from pydantic import BaseModel
class SearchInput(BaseModel):
query: str
class SearchOutput(BaseModel):
results: list[str]
Naming¶
Tool names are converted to PascalCase and suffixed with Input or Output.
For example:
| Tool name | Generated input model | Generated output model |
|---|---|---|
search |
SearchInput |
SearchOutput |
create_issue |
CreateIssueInput |
CreateIssueOutput |
Notes¶
MCP inputSchema and outputSchema entries are converted into JSON Schema definitions before generation. Local
$defs and definitions entries inside a tool schema are hoisted and prefixed to avoid collisions between tools.