
OpenAPI
OpenAPI-MCP server for AI agents to access APIs using swagger/OpenAPI specifications
OpenAPI-MCP server for AI agents to access APIs using swagger/OpenAPI specifications
Generate MCP tool definitions directly from a Swagger/OpenAPI specification file.
OpenAPI-MCP is a dockerized MCP server that reads a swagger.json
or openapi.yaml
file and generates a corresponding Model Context Protocol (MCP) toolset. This allows MCP-compatible clients like Cursor to interact with APIs described by standard OpenAPI specifications. Now you can enable your AI agent to access any API by simply providing its OpenAPI/Swagger specification - no additional coding required.
Run the demo yourself: Running the Weatherbit Example (Step-by-Step)
header
, query
, path
, cookie
) based on command-line configuration.
--api-key
), environment variables (--api-key-env
), or .env
files located alongside local specs.--include-tag
, --exclude-tag
, --include-op
, --exclude-op
).REQUEST_HEADERS
environment variable.The recommended way to run this tool is via Docker.
Alternatively, you can use the pre-built image available on Docker Hub.
docker pull ckanthony/openapi-mcp:latest
docker run
examples above, but replace openapi-mcp:latest
with ckanthony/openapi-mcp:latest
.Build the Docker Image Locally:
# Navigate to the repository root cd openapi-mcp # Build the Docker image (tag it as you like, e.g., openapi-mcp:latest) docker build -t openapi-mcp:latest .
Run the Container: You need to provide the OpenAPI specification and any necessary API key configuration when running the container.
Example 1: Using a local spec file and .env
file:
./my-api
) containing your openapi.json
or swagger.yaml
..env
file in the same directory (e.g., ./my-api/.env
) with API_KEY=your_actual_key
(replace API_KEY
if your --api-key-env
flag is different).docker run -p 8080:8080 --rm \\ -v $(pwd)/my-api:/app/spec \\ --env-file $(pwd)/my-api/.env \\ openapi-mcp:latest \\ --spec /app/spec/openapi.json \\ --api-key-env API_KEY \\ --api-key-name X-API-Key \\ --api-key-loc header
(Adjust --spec
, --api-key-env
, --api-key-name
, --api-key-loc
, and -p
as needed.)
Example 2: Using a remote spec URL and direct environment variable:
docker run -p 8080:8080 --rm \\ -e SOME_API_KEY="your_actual_key" \\ openapi-mcp:latest \\ --spec https://petstore.swagger.io/v2/swagger.json \\ --api-key-env SOME_API_KEY \\ --api-key-name api_key \\ --api-key-loc header
Key Docker Run Options:
-p <host_port>:8080
: Map a port on your host to the container's default port 8080.--rm
: Automatically remove the container when it exits.-v <host_path>:<container_path>
: Mount a local directory containing your spec into the container. Use absolute paths or $(pwd)/...
. Common container path: /app/spec
.--env-file <path_to_host_env_file>
: Load environment variables from a local file (for API keys, etc.). Path is on the host.-e <VAR_NAME>="<value>"
: Pass a single environment variable directly.openapi-mcp:latest
: The name of the image you built locally.--spec ...
: Required. Path to the spec file inside the container (e.g., /app/spec/openapi.json
) or a public URL.--port 8080
: (Optional) Change the internal port the server listens on (must match the container port in -p
).--api-key-env
, --api-key-name
, --api-key-loc
: Required if the target API needs an API key.--help
for all command-line options by running docker run --rm openapi-mcp:latest --help
)This repository includes an example using the Weatherbit API. Here's how to run it using the public Docker image:
Find OpenAPI Specs (Optional Knowledge):
Many public APIs have their OpenAPI/Swagger specifications available online. A great resource for discovering them is APIs.guru. The Weatherbit specification used in this example (weatherbitio-swagger.json
) was sourced from there.
Get a Weatherbit API Key:
Clone this Repository: You need the example files from this repository.
git clone https://github.com/ckanthony/openapi-mcp.git cd openapi-mcp
Prepare Environment File:
cd example/weather
cp .env.example .env
.env
file and replace YOUR_WEATHERBIT_API_KEY_HERE
with the actual API key you obtained from Weatherbit.Run the Docker Container:
From the openapi-mcp
root directory (the one containing the example
folder), run the following command:
docker run -p 8080:8080 --rm \\ -v $(pwd)/example/weather:/app/spec \\ --env-file $(pwd)/example/weather/.env \\ ckanthony/openapi-mcp:latest \\ --spec /app/spec/weatherbitio-swagger.json \\ --api-key-env API_KEY \\ --api-key-name key \\ --api-key-loc query
-v $(pwd)/example/weather:/app/spec
: Mounts the local example/weather
directory (containing the spec and .env
file) to /app/spec
inside the container.--env-file $(pwd)/example/weather/.env
: Tells Docker to load environment variables (specifically API_KEY
) from your .env
file.ckanthony/openapi-mcp:latest
: Uses the public Docker image.--spec /app/spec/weatherbitio-swagger.json
: Points to the spec file inside the container.--api-key-*
flags configure how the tool should inject the API key (read from the API_KEY
env var, named key
, placed in the query
string).Access the MCP Server:
The MCP server should now be running and accessible at http://localhost:8080
for compatible clients.
Using Docker Compose (Example):
A docker-compose.yml
file is provided in the example/
directory to demonstrate running the Weatherbit API example using the locally built image.
Prepare Environment File: Copy example/weather/.env.example
to example/weather/.env
and add your actual Weatherbit API key:
# example/weather/.env API_KEY=YOUR_ACTUAL_WEATHERBIT_KEY
Run with Docker Compose: Navigate to the example
directory and run:
cd example # This builds the image locally based on ../Dockerfile # It does NOT use the public Docker Hub image docker-compose up --build
--build
: Forces Docker Compose to build the image using the Dockerfile
in the project root before starting the service.example/docker-compose.yml
, build the image, mount ./weather
, read ./weather/.env
, and start the openapi-mcp
container with the specified command-line arguments.http://localhost:8080
.Stop the service: Press Ctrl+C
in the terminal where Compose is running, or run docker-compose down
from the example
directory in another terminal.
The openapi-mcp
command accepts the following flags:
Flag | Description | Type | Default |
---|---|---|---|
--spec | Required. Path or URL to the OpenAPI specification file. | string | (none) |
--port | Port to run the MCP server on. | int | 8080 |
--api-key | Direct API key value (use --api-key-env or .env file instead for security). | string | (none) |
--api-key-env | Environment variable name containing the API key. If spec is local, also checks .env file in the spec's directory. | string | (none) |
--api-key-name | Required if key used. Name of the API key parameter (header, query, path, or cookie name). | string | (none) |
--api-key-loc | Required if key used. Location of API key: header , query , path , or cookie . | string | (none) |
--include-tag | Tag to include (can be repeated). If include flags are used, only included items are exposed. | string slice | (none) |
--exclude-tag | Tag to exclude (can be repeated). Exclusions apply after inclusions. | string slice | (none) |
--include-op | Operation ID to include (can be repeated). | string slice | (none) |
--exclude-op | Operation ID to exclude (can be repeated). | string slice | (none) |
--base-url | Manually override the target API server base URL detected from the spec. | string | (none) |
--name | Default name for the generated MCP toolset (used if spec has no title). | string | "OpenAPI-MCP Tools" |
--desc | Default description for the generated MCP toolset (used if spec has no description). | string | "Tools generated from OpenAPI spec" |
Note: You can get this list by running the tool with the --help
flag (e.g., docker run --rm ckanthony/openapi-mcp:latest --help
).
REQUEST_HEADERS
: Set this environment variable to a JSON string (e.g., '{"X-Custom": "Value"}'
) to add custom headers to all outgoing requests to the target API.