skill-to-mcp - Model Context Protocol Server Generator
Pricing
Pay per usage
skill-to-mcp - Model Context Protocol Server Generator
Turn plain-English tool descriptions into complete Model Context Protocol MCP servers. AI infers JSON Schema, generates Pydantic v2 models, handler code, stdio/SSE transport. Works with Claude Desktop, Cursor, MCP hosts. 3 free runs!
Pricing
Pay per usage
Rating
0.0
(0)
Developer
opportunity-biz
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
Share
skill-to-mcp
Turn a plain-English skill description into a working MCP server in seconds.

skill-to-mcp is a CLI code generator that reads a SKILL.md file — a plain-English description of a tool — and scaffolds a complete, runnable MCP (Model Context Protocol) server with:
- ✅ Correct JSON-RPC schema (
tool_name,description,inputSchema,outputSchema) - ✅ Pydantic v2 models for type-safe input/output
- ✅ MCP server boilerplate (stdio or HTTP SSE transport)
- ✅
pyproject.tomlready forpip install - ✅ Auto-generated
README.mdwith usage instructions
📖 README.it.md
Why?
Describing a tool in Markdown is more readable, versionable, and composable than hand-writing JSON-RPC schemas. skill-to-mcp bridges the gap between "I know what my tool does" and "I have a working MCP server."
Read the full motivation: SKILL.md might be a better abstraction than function calling
Apify Actor
Run skill-to-mcp on the Apify platform:
docker build -t skill-to-mcp .docker run -e DEEPSEEK_API_KEY=sk-... skill-to-mcp
The Apify Actor accepts the same inputs as the CLI via a web form: Skill Description (required), LLM Model, MCP Transport, Generate Example Implementation, and API Key.
Output is pushed to the Apify Dataset and a ZIP archive of all generated files is saved to the key-value store.
The Actor builds directly from this git repository via
.actor/actor.json and the root
Dockerfile (entry point: python -m skill_to_mcp.actor).
📖 .actor/input_schema.json
Quick Start
1. Install
$pip install skillmd-to-mcp
2. Set your API key
$export DEEPSEEK_API_KEY="sk-your-key-here"
Get a key at platform.deepseek.com. Cost per generation: < $0.001 with DeepSeek.
OpenAI fallback: If you have an OpenAI key, set
OPENAI_API_KEYinstead. The CLI automatically tries both:DEEPSEEK_API_KEYfirst, thenOPENAI_API_KEY.
3. Create a SKILL.md
# webpage-readerFetches a web page given a URL and returns:- title: the page title- description: the meta description- body_text: visible text stripped of HTML- links: list of the first 10 internal links## Input- url: string, required- max_links: integer, default 10
4. Generate the MCP server
$skill-to-mcp generate SKILL.md
Output:
output/└── webpage-reader/├── server.py # MCP server, runnable immediately├── models.py # Pydantic v2 input/output models├── handler.py # Tool logic (stub — implement here)├── pyproject.toml # Dependencies and metadata└── README.md # Installation and usage guide
5. Implement & Run
cd output/webpage-readerpip install -e .# Edit handler.py to add your business logicpython server.py
CLI Reference
skill-to-mcp generate SKILL.md [OPTIONS]
Arguments
| Argument | Description |
|---|---|
SKILL.md | Path to the skill description file |
Options
| Option | Short | Default | Description |
|---|---|---|---|
--output-dir | -o | ./output | Output directory for generated files |
--model | -m | deepseek-v4-flash | LLM model for schema inference |
--api-key | -k | $DEEPSEEK_API_KEY or $OPENAI_API_KEY | API key for the LLM provider. Falls back to OPENAI_API_KEY if DEEPSEEK_API_KEY is not set |
--transport | -t | stdio | MCP transport: stdio or sse |
--dry-run | false | Show inferred schema without generating files | |
--prompt-file | -p | Custom system prompt for LLM inference | |
--with-example-impl | false | Generate a working handler implementation via LLM | |
--templates-dir | Custom Jinja2 templates directory | ||
--verbose | -v | false | Enable debug logging |
Batch Processing
Process multiple SKILL.md files at once:
skill-to-mcp generate tool1.md tool2.md tool3.md -o ./my-toolsskill-to-mcp generate *.md --with-example-impl
Examples
# Basic usageskill-to-mcp generate SKILL.md# Preview the inferred schema (no files written)skill-to-mcp generate SKILL.md --dry-run# Use SSE transport for HTTP-based MCP hostsskill-to-mcp generate SKILL.md --transport sse# Custom output directoryskill-to-mcp generate SKILL.md -o ./my-mcp-tools# Use a specific modelskill-to-mcp generate SKILL.md -m deepseek-v4-flash# Custom LLM promptskill-to-mcp generate SKILL.md --prompt-file my_prompt.txt# Verbose output for debuggingskill-to-mcp generate SKILL.md -v
Architecture
flowchart LRA[SKILL.md] --> B[parser.py]B --> C[llm.py]C --> D[DeepSeek API]D --> E[validator.py]E -->|valid| F[renderer.py]E -->|invalid + retry| CF --> G[templates/]G --> H[output/]
Pipeline
- skill_to_mcp/parser.py — Reads
SKILL.md, extracts title and sections - skill_to_mcp/llm.py — Calls DeepSeek API (OpenAI-compatible) to infer JSON Schema
- skill_to_mcp/validator.py — Validates schema (types, snake_case, required fields)
- skill_to_mcp/renderer.py — Applies Jinja2 templates to generate Python code
- skill_to_mcp/cli.py — Typer-based CLI with Rich output
LLM Prompt
The system prompt is transparent and overridable. View the default in skill_to_mcp/config.py or customize with --prompt-file.
MCP Host Configuration
Claude Desktop
Add to claude_desktop_config.json:
{"mcpServers": {"my-tool": {"command": "python","args": ["path/to/output/my-tool/server.py"]}}}
Cursor IDE
Add to .cursor/mcp.json:
{"mcpServers": {"my-tool": {"command": "python","args": ["path/to/output/my-tool/server.py"]}}}
SSE Transport
For HTTP-based MCP hosts:
skill-to-mcp generate SKILL.md --transport ssecd output/my-tool && python server.py# MCP endpoint: http://127.0.0.1:8000/sse
Development
Setup
git clone https://github.com/YOUR_USERNAME/skill-to-mcpcd skill-to-mcppip install -e ".[dev]"
Run Tests
# All tests (99 total)pytest tests/ -v# End-to-end onlypytest tests/test_e2e.py -v# With real API (requires DEEPSEEK_API_KEY)DEEPSEEK_API_KEY="sk-..." skill-to-mcp generate tests/fixtures/simple_skill.md --dry-run
Code Quality
$ruff check skill_to_mcp/ tests/
Tech Stack
| Component | Technology |
|---|---|
| CLI Framework | Typer |
| Templates | Jinja2 |
| LLM SDK | OpenAI Python (DeepSeek-compatible) |
| Validation | Pydantic v2 |
| MCP SDK | modelcontextprotocol/python-sdk |
| Output | Rich |
| Testing | pytest + pytest-mock |
| Linting | ruff |
FAQ
Do I need to understand MCP protocol internals?
No. The generated server handles JSON-RPC, tool discovery, and schema validation. You only need to implement handler.py.
What if the LLM produces a wrong schema?
The validator catches type errors, invalid names, and missing fields. Retry is automatic (up to 3 attempts). Use --dry-run to preview before generating.
Can I use OpenAI instead of DeepSeek?
Yes. The CLI automatically falls back to OPENAI_API_KEY if DEEPSEEK_API_KEY is not set.
export OPENAI_API_KEY="sk-..."skill-to-mcp generate SKILL.md --model gpt-4o-mini
Any OpenAI-compatible endpoint works (OpenAI, DeepSeek, OpenRouter, Together AI, etc.).
What Python version do I need?
Python 3.10+ for the CLI. The generated MCP servers also require Python 3.10+.
Is this production-ready?
This is an MVP (v0.1.0). The generated code is correct and runnable, but you should review and test the generated handler before deploying.
How much does each generation cost?
~$0.001 per generation with DeepSeek V4 Flash. The prompt is ~300 tokens and the response is ~200 tokens.
Is the --with-example-impl handler production-ready?
The LLM-generated handler is a starting point. It may contain bugs (e.g., referencing local variables instead of input.field). Always review and test the generated code before deploying. The prompt has been tuned to minimize common LLM mistakes, but human review is recommended.
Roadmap
-
--with-example-implflag for LLM-generated handler implementations - TypeScript/Go output support
- Batch processing (multiple
SKILL.mdfiles) - Hosted registry at
registry.skill-to-mcp.dev -
skill-to-mcp publishcommand - Smithery integration
- Custom template directories (
--templates-dir)
Contributing
Pull requests are welcome! See project_state.md for current status and next steps.
- Fork the repo
- Create a feature branch (
git checkout -b feature/amazing-feature) - Run tests (
pytest tests/ -v) - Commit your changes
- Push and open a PR
License
MIT — see LICENSE.
Built with ❤️ for MCP developers. If this saved you time, ⭐ the repo!