From 88a6740b42c28fe457eb72a8ab0cdbc10da2c9f0 Mon Sep 17 00:00:00 2001 From: Bill Date: Thu, 1 Jan 2026 09:42:32 -0500 Subject: [PATCH] fix: use external port in MCP config for Docker deployments The MCP config was using the internal container port (3000) instead of the external mapped port. Added EXTERNAL_PORT env var support so clients get the correct connection URL when running behind Docker port mapping. --- deploy/dev/docker-compose.yml | 1 + deploy/prod/docker-compose.yml | 1 + src/grist_mcp/main.py | 7 ++++--- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/deploy/dev/docker-compose.yml b/deploy/dev/docker-compose.yml index 30830b2..40d04e2 100644 --- a/deploy/dev/docker-compose.yml +++ b/deploy/dev/docker-compose.yml @@ -11,6 +11,7 @@ services: - ./config.yaml:/app/config.yaml:ro environment: - CONFIG_PATH=/app/config.yaml + - EXTERNAL_PORT=${PORT:-3000} healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3000/health')"] interval: 30s diff --git a/deploy/prod/docker-compose.yml b/deploy/prod/docker-compose.yml index 396863f..f64a516 100644 --- a/deploy/prod/docker-compose.yml +++ b/deploy/prod/docker-compose.yml @@ -10,6 +10,7 @@ services: - ./config.yaml:/app/config.yaml:ro environment: - CONFIG_PATH=/app/config.yaml + - EXTERNAL_PORT=${PORT:-3000} restart: unless-stopped deploy: resources: diff --git a/src/grist_mcp/main.py b/src/grist_mcp/main.py index 87f2820..e259819 100644 --- a/src/grist_mcp/main.py +++ b/src/grist_mcp/main.py @@ -161,13 +161,13 @@ def create_app(config: Config): return app -def _print_mcp_config(port: int, tokens: list) -> None: +def _print_mcp_config(external_port: int, tokens: list) -> None: """Print Claude Code MCP configuration.""" print() print("Claude Code MCP configuration (copy-paste to add):") for t in tokens: config = ( - f'{{"type": "sse", "url": "http://localhost:{port}/sse", ' + f'{{"type": "sse", "url": "http://localhost:{external_port}/sse", ' f'"headers": {{"Authorization": "Bearer {t.token}"}}}}' ) print(f" claude mcp add-json grist-{t.name} '{config}'") @@ -177,6 +177,7 @@ def _print_mcp_config(port: int, tokens: list) -> None: def main(): """Run the SSE server.""" port = int(os.environ.get("PORT", "3000")) + external_port = int(os.environ.get("EXTERNAL_PORT", str(port))) config_path = os.environ.get("CONFIG_PATH", "/app/config.yaml") if not _ensure_config(config_path): @@ -188,7 +189,7 @@ def main(): print(f" SSE endpoint: http://0.0.0.0:{port}/sse") print(f" Messages endpoint: http://0.0.0.0:{port}/messages") - _print_mcp_config(port, config.tokens) + _print_mcp_config(external_port, config.tokens) app = create_app(config) uvicorn.run(app, host="0.0.0.0", port=port)