openapi-mcp-generator 0.1.1
Generate MCP servers from OpenAPI specifications
License: MIT
Requires Python: >=3.10

# OpenAPI to MCP Server Generator

A Python tool that automatically converts OpenAPI specifications into fully functional Model Context Protocol (MCP) servers. Generates Docker-ready implementations with support for SSE/IO communication protocols, authentication, and comprehensive error handling.

## Key features:

- 🔄 OpenAPI to MCP tools/resources conversion
- 🐳 Docker-ready with multi-stage builds
- 🔐 Multiple authentication methods
- ⚡ Async operations & rate limiting
- 📡 SSE/IO communication protocols
- 📦 Modular code structure with package support

## Modular Code Structure

The generator has been refactored into a proper Python package while maintaining backward compatibility:

1. **Original Entry Point**: The `generator.py` script still works exactly as before
2. **Modular Organization**: Code is now split into focused modules
3. **Package Installation**: Can be installed as a proper Python package
4. **Same Templates**: Uses the exact same templates in the `/templates` directory
5. **Docker Support**: Preserves all Docker functionality

You can use the tool in whatever way you prefer:
1. Run `generator.py` directly (original approach)
2. Install as a package and use `mcp-generator` command
3. Use the module programmatically in your own Python code

For more details on the modular code structure, see [MODULAR_REFACTORING.md](MODULAR_REFACTORING.md).

## Features

- Convert OpenAPI specifications to MCP servers
- Docker-ready implementation with multi-stage builds
- Support for multiple authentication methods
- Choice of SSE or IO communication protocols
- Comprehensive error handling and logging
- Built-in rate limiting and security features
- Async operations for optimal performance
- Extensive test suite with coverage reporting

## Prerequisites

- Python 3.10+
- Docker (for running the generated server)
- pip or uv (Python package manager)

## Installation

### From Source

```bash
# Clone the repository
git clone https://github.com/abutbul/openapi-mcp-generator.git
cd openapi-mcp-generator

# Install as a package (development mode)
pip install -e .

# Or using uv
uv venv
source .venv/bin/activate
uv pip install -e .
```

### Using pip (once published)

```bash
pip install openapi-mcp-generator
```

## Usage

```bash
# Using the original script (still works the same way)
python generator.py openapi.yaml --output-dir ./output --api-url https://api.example.com

# Using the new modular CLI tool after installation
mcp-generator openapi.yaml --output-dir ./output --api-url https://api.example.com

# Using the python module directly
python -m openapi_mcp_generator.cli openapi.yaml --output-dir ./output
```

### Command Line Options

- `openapi_file`: Path to the OpenAPI YAML file (required)
- `--output-dir`: Output directory for the generated project (default: '.')
- `--api-url`: Base URL for the API
- `--auth-type`: Authentication type (bearer, token, basic)
- `--api-token`: API token for authentication
- `--api-username`: Username for basic authentication
- `--api-password`: Password for basic authentication

## Running the Generated Server

After generating the server, you can build and run it using Docker:

```bash
cd output/openapi-mcp-*
./docker.sh build
./docker.sh start --transport=sse --port=8000
```

### Docker Script Options

The generated `docker.sh` script supports the following commands:

- `build`: Build the Docker image
- `start`: Start the container
  - `--port=PORT`: Set the port (default: 8000)
  - `--transport=TYPE`: Set transport type: 'sse' or 'io' (default: sse)
  - `--log-level=LEVEL`: Set logging level (default: info)
- `stop`: Stop the container
- `clean`: Remove the container and image
- `logs`: View container logs

## Project Structure

The modular generator has the following structure:

```
openapi-mcp-generator/
├── generator.py              # Original entry point (maintained for backward compatibility)
├── mcp_generator.py          # New entry point (uses the modular structure)
├── openapi_mcp_generator/    # Main package (new modular structure)
│   ├── __init__.py           # Package initialization
│   ├── cli.py                # Command-line interface
│   ├── generator.py          # Main generator module
│   ├── generators.py         # Code generators for tools/resources
│   ├── http.py               # HTTP client utilities
│   ├── parser.py             # OpenAPI parser
│   └── project.py            # Project builder
├── templates/                # Original templates directory (used by the modular code)
│   ├── config/
│   ├── docker/
│   ├── server/
│   ├── pyproject.toml
│   └── requirements.txt
├── samples/                  # Sample implementations
├── tests/                    # Test cases
├── LICENSE                   # License file
├── README.md                 # This file
├── pyproject.toml            # Project metadata
└── setup.py                  # Package setup
```

The modular structure preserves all the existing functionality while making the code more maintainable:

1. The original entry point (`generator.py`) can still be used as before
2. The existing templates in `/templates` are used by the new modular code
3. All Docker-related functionality is preserved exactly as it was
4. The project can now be installed as a proper Python package

## Sample Implementations

Check out our sample implementations to see the generator in action:

- [Trilium Notes ETAPI Server](./samples/TriliumNext/README.md) - An MCP server for the Trilium Notes knowledge management system's ETAPI

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Run the test suite
5. Submit a pull request

## License

This project is licensed under the MIT License - see the LICENSE file for details.

## Usage Examples

### 1. Using the library without installing (direct from source)

To generate an MCP server from the Elasticsearch 6.1 spec folder:

```bash
# Run the original script directly
python generator.py samples/elasticsearch_6.1/api

# Or use the modular entry point
python mcp_generator.py samples/elasticsearch_6.1/api
```

### 2. Using the library after installing with pip

First, install the package (from the project root):

```bash
pip install .
```

Then use the CLI tool to convert the Trilium ETAPI spec:

```bash
mcp-generator samples/TriliumNext/etapi.openapi.yaml
```

Or use it programmatically in your own Python code:

```python
from openapi_mcp_generator import generator

generator.generate('samples/TriliumNext/etapi.openapi.yaml')
```