OpenAPI-MCP: Dockerized MCP Server to allow your AI agent to access any API with existing api docs.

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/weathercp .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.