Skip to content

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.