Deployment
Don't want to deploy? Use the hosted instance at
https://rfc-mcp.connorw600.dev/— free to use, no registration required.
Environment variables
| Variable | Default | Description |
|---|---|---|
RFC_MCP_HOST |
0.0.0.0 |
Bind address |
RFC_MCP_PORT |
8000 |
Port |
RFC_DATA_DIR |
data |
Path to rfc-json/rfc-text/rfc-html directories |
RFC_DB_PATH |
db/rfc_index.db |
SQLite database path |
RFC_SYNC_INTERVAL |
86400 |
Seconds between rsync+reindex cycles |
Docker Compose
services:
rfc-mcp:
image: gitea.connorw600.dev/connorw600/rfc-mcp-server:latest
ports:
- "8000:8000"
volumes:
- rfc-data:/app/data
environment:
- RFC_SYNC_INTERVAL=86400
volumes:
rfc-data:
No data is baked into the image. On first boot, the entrypoint background-syncs the corpus from rfc-editor.org and builds the index while the server starts immediately (health endpoint reports "starting" until the index is ready).
Standalone Docker
docker run -d \
--name rfc-mcp \
-p 8000:8000 \
-v rfc-data:/app/data \
gitea.connorw600.dev/connorw600/rfc-mcp-server:latest
Reverse proxy
Caddy
rfc-mcp.example.com {
handle /sse {
reverse_proxy 127.0.0.1:8000
}
handle /messages {
reverse_proxy 127.0.0.1:8000
}
handle /mcp {
reverse_proxy 127.0.0.1:8000
}
handle /health {
reverse_proxy 127.0.0.1:8000
}
handle /api/* {
reverse_proxy 127.0.0.1:8000
}
handle {
root * /var/www/rfc-mcp-docs
file_server
}
}
See examples/Caddyfile, examples/nginx.conf, and examples/apache.conf in the repository for full configs.
CI/CD
The .gitea/workflows/docker.yml workflow builds and pushes the image on every push to main. It uses a manually-created PAT (PACKAGES_TOKEN) with write:package scope. The image is tagged with latest and the commit SHA.