Create and deploy MCP server tools from your existing codebase or API endpoints
1.8K
MCP Express helps you create and deploy Model Context Protocol (MCP) servers on your own infrastructure. You don't need to write an MCP server from scratch.
MCP Express is in alpha. Today you can:
http://localhost:3000/weather/mcp.Building MCP tools from your existing code and API endpoints is in development.
docker pull mcpexpress/mcp-express:latest
Each release is also tagged with its version number, for example mcpexpress/mcp-express:0.1.0. Use a version tag to stay on a specific release.
docker run -d \
--name mcp-express \
-p 3000:3000 \
-v mcp-express-data:/app/data \
--restart unless-stopped \
mcpexpress/mcp-express:latest
| Option | Required | Description |
|---|---|---|
-p <host-port>:3000 | Yes | The app listens on port 3000 inside the container. Map it to any free port on your machine, for example -p 8080:3000. |
-v mcp-express-data:/app/data | Recommended | Keeps your data (account, MCP servers and the generated encryption key) when the container is removed or updated. |
-e ENCRYPTION_KEY=... | No | Signs login sessions and protects your servers' API keys and secrets. If you don't set it, one is generated on first start and kept in the data volume. If you set it, keep it the same across updates. |
-e BASE_URL=... | No | The public address of this instance, for example https://mcp.example.com. It's used to build the MCP endpoints shown in the app. If you don't set it, the address is detected from each request. |
ENCRYPTION_KEY must be at least 32 characters. To generate one:
openssl rand -base64 32
services:
mcp-express:
image: mcpexpress/mcp-express:latest
ports:
- '3000:3000' # change the left side to use a different host port
environment:
# - ENCRYPTION_KEY=<your-key> # optional, see the table above
# - BASE_URL=https://mcp.example.com # optional, see the table above
volumes:
- mcp-express-data:/app/data
restart: unless-stopped
volumes:
mcp-express-data:
docker compose up -d
http://localhost:<host-port> in your browser, where <host-port> is the port you mapped with -p. For example, with -p 8080:3000 the address is http://localhost:8080.Each server is reachable at:
http://<your-address>/<name>/mcp
Clients connect over the Streamable HTTP transport. Open a server and go to its Integration tab for settings you can copy for Claude Code, Cursor and VS Code. For example, with Claude Code:
claude mcp add --transport http weather http://localhost:3000/weather/mcp
If the server uses an API key, clients must send it as a bearer token:
Authorization: Bearer <api-key>
Copying a snippet from the Integration tab fills in the full key. When you rotate a key, the old one stops working immediately, so update your clients with the new one.
docker pull mcpexpress/mcp-express:latest
docker rm -f mcp-express
# then run the same `docker run` command as above
If you mounted the /app/data volume (and, if you set it, keep the same ENCRYPTION_KEY), your data and API keys are kept.
Upgrading from a version that used JWT_SECRET: rename it to ENCRYPTION_KEY, keeping the same value. If you leave it out, a new key is generated and existing sessions, API keys and Environment Secrets stop working. Database migrations run automatically when the container starts.
ENCRYPTION_KEY, make sure it is at least 32 characters. Check the logs with docker logs mcp-express.3000, if you changed it./app/data volume, and if you set ENCRYPTION_KEY, use the same value each time. Changing it ends existing sessions and makes existing API keys unreadable. If it has changed, rotate each server's key on its Integration tab and update your clients.BASE_URL to the address your clients use, for example when MCP Express runs behind a reverse proxy.401 means the API key is missing or wrong (or was rotated), 404 means no server uses that name, and 503 means the server is turned off. Turn it back on with the switch at the top of the server's page.1001. If you mount a host folder instead of a named volume, make sure that user can write to it, for example with sudo chown -R 1001 ./data.Content type
Image
Digest
sha256:f9a9c5c9b…
Size
455 MB
Last updated
4 days ago
docker pull mcpexpress/mcp-express