# The MCP relay on stein2 (#429), a compose project of its own beside the web stack: # # docker compose -f tools/mcp/compose.yml up -d # # nginx passes /feuerwerk/mcp on to it (the location in /_stacks/web/nginx.conf). It listens on the # docker bridge's gateway alone, where nginx's container reaches it and nothing from outside does, # and asks the API through the web stack's published port. Its network of its own separates # nothing on stein2: the docker daemon runs with `iptables: false` there, so every container # reaches every other (measured 2026-10-17, the PHP container's FastCGI port included). # # It reads its own code, the tool list and the key it shares with the API, nothing else of the # checkout. A change to tools/mcp/ needs a restart; the tool list is read on every use. name: feuerwerk-mcp services: feuerwerk-mcp: container_name: feuerwerk-mcp image: node:22-alpine restart: unless-stopped user: '33:33' working_dir: /srv/feuerwerk volumes: - ../../tools/mcp:/srv/feuerwerk/tools/mcp:ro - ../../src/editor/agent:/srv/feuerwerk/src/editor/agent:ro - ../../data/mcp-relay.key:/run/feuerwerk/mcp-relay.key:ro environment: FEUERWERK_MCP_API: http://172.16.0.1:8080/feuerwerk/api/index.php FEUERWERK_MCP_KEY_FILE: /run/feuerwerk/mcp-relay.key FEUERWERK_MCP_ORIGINS: https://nockal.com,https://feuerwerk.nockal.com FEUERWERK_MCP_TRUST_PROXY: '1' FEUERWERK_MCP_PORT: '8090' ports: - 172.16.0.1:8091:8090 read_only: true cap_drop: [ALL] security_opt: ['no-new-privileges:true'] command: ['node', 'tools/mcp/serve.mjs'] cpus: 1 mem_limit: 256m pids_limit: 64