The problem
Every time I build an MCP server I write the same scaffolding: JSON-RPC schema, Pydantic models, transport wiring, pyproject.toml. None of that is the actual tool — it's just the protocol layer you have to get through before writing any logic.
What I built
skill-to-mcp reads a SKILL.md file — a plain-English description of what your tool does, its inputs and outputs — and scaffolds a complete MCP server from it.
Example SKILL.md:
# invoice-parser
Extracts structured fields from a PDF invoice.
## Input
- file_url: string — URL of the PDF to parse
## Output
- vendor: string
- amount: float
- date: string (ISO 8601)
Running skillmd-to-mcp generate on that produces:
- JSON-RPC schema (
tool_name,description,inputSchema,outputSchema) - Pydantic v2 models for type-safe I/O
- MCP server boilerplate (stdio or HTTP SSE transport)
-
pyproject.tomlready topip install - Auto-generated README
Why SKILL.md
A plain-English description is more readable, versionable, and composable than a hand-written JSON-RPC schema. If you can describe what your tool does in a few sentences, you have enough to generate the server.
Install & run
pip install skillmd-to-mcp
skillmd-to-mcp generate
Or use the Apify Actor if you want to run it without a local setup — takes the same inputs via a web form.
Feedback welcome
Curious whether anyone else has been hitting the boilerplate problem and how you've been handling it. Happy to hear what edge cases the generator misses.


Top comments (0)