# MCPify
Point it at API docs, get an MCP server.
MCPify scrapes API documentation, uses Gemini to figure out the endpoints/auth/params, and spits out a config file. The runtime reads that config and runs an [MCP](https://modelcontextprotocol.io/) server that Claude (or any MCP client) can use to call the API.
## Installation
```bash
git clone https://github.com/yourusername/mcpify.git
cd mcpify
pip install -e .
```
Needs Python 3.11+ and a [Gemini API key](https://aistudio.google.com/).
## Usage
```bash
export GEMINI_API_KEY="your-api-key"
# Parse docs into a config file
mcpify parse https://api.example.com/docs -o my-api.json
# Run the server
mcpify serve my-api.json --auth "your-api-token"
# Or do both at once
mcpify quickstart https://api.example.com/docs --auth "token"
```
To use with Claude Desktop, add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"my-api": {
"command": "mcpify",
"args": ["serve", "/path/to/my-api.json", "--auth", "your-token"]
}
}
}
```
## CLI
**`mcpify parse <url>`** - Scrape docs and generate config
```bash
mcpify parse https://docs.github.com/en/rest -o github.json --max-pages 15
```
| Option | Description |
|--------|-------------|
| `-o, --output` | Output file (default: `mcpify-config.json`) |
| `-m, --max-pages` | Max pages to scrape (default: 10) |
| `--no-follow` | Don't follow links |
| `-k, --api-key` | Gemini API key (or use env var) |
| `--model` | Gemini model (default: `gemini-2.0-flash`) |
**`mcpify serve <config>`** - Run MCP server
```bash
mcpify serve my-api.json --auth "Bearer token" --transport stdio
```
| Option | Description |
|--------|-------------|
| `-a, --auth` | Auth token for API calls |
| `-t, --transport` | `stdio`, `sse`, or `http` (default: `stdio`) |
**`mcpify show <config>`** - Print config as table
**`mcpify quickstart <url>`** - Parse and serve in one shot
## Config Format
The generated JSON looks like this:
```json
{
"name": "my-api",
"description": "Description of the API",
"base_url": "https://api.example.com/v1",
"version": "1.0.0",
"auth": {
"type": "bearer",
"header_name": "Authorization",
"prefix": "Bearer "
},
"tools": [
{
"name": "get_users",
"description": "Retrieve a list of users",
"method": "GET",
"path": "/users",
"parameters": [
{
"name": "limit",
"type": "integer",
"description": "Max results to return",
"required": false,
"location": "query",
"default": 10
}
],
"response": {
"description": "Array of user objects"
},
"tags": ["users"]
}
]
}
```
Auth types: `none`, `api_key`, `bearer`, `oauth2`
Parameter locations: `query`, `path`, `header`, `body`
## Python API
```python
from mcpify.scraper import scrape_documentation
from mcpify.parser import parse_documentation
from mcpify.runtime import create_mcp_server
# Scrape docs
docs = await scrape_documentation("https://api.example.com/docs")
# Parse with Gemini
config = await parse_documentation(docs)
# Save config
config_path = "my-api.json"
with open(config_path, "w") as f:
f.write(config.to_json())
# Create and run server
server = create_mcp_server(config, auth_token="your-token")
server.run()
```
## Examples
```bash
# GitHub
mcpify parse https://docs.github.com/en/rest/users -o github.json
mcpify serve github.json --auth "ghp_your_token"
# Stripe
mcpify parse https://stripe.com/docs/api -o stripe.json
mcpify serve stripe.json --auth "sk_test_your_key"
```
## License
MIT