Skip to main content
Glama
README.md
# 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