Skip to content

feat: add --host flag and QMD_HOST env for configurable bind address#583

Open
ductiletoaster wants to merge 2 commits intotobi:mainfrom
ductiletoaster:feat/configurable-host
Open

feat: add --host flag and QMD_HOST env for configurable bind address#583
ductiletoaster wants to merge 2 commits intotobi:mainfrom
ductiletoaster:feat/configurable-host

Conversation

@ductiletoaster
Copy link
Copy Markdown

Problem

The MCP HTTP server hardcodes localhost as the bind address in startMcpHttpServer():

httpServer.listen(port, "localhost", () => resolve());

This prevents cross-container access in Kubernetes deployments where QMD runs as a ClusterIP service and other pods need to connect to it.

Solution

Add a configurable bind address with three levels of control:

  1. --host CLI flag: qmd mcp --http --host 0.0.0.0
  2. QMD_HOST environment variable: QMD_HOST=0.0.0.0 qmd mcp --http
  3. API parameter: startMcpHttpServer(8181, { host: "0.0.0.0" })

Priority: options.host > QMD_HOST > "localhost" (default)

Changes

  • src/mcp/server.ts: Add host to options, read QMD_HOST env, use in listen() and log message
  • src/cli/qmd.ts: Add --host CLI flag, pass through to startMcpHttpServer and daemon spawn args

Backward Compatible

Defaults to localhost — no behavior change for existing users.

Use Case

Running QMD as a Kubernetes service behind an AI gateway (Bifrost) that aggregates multiple MCP servers. The gateway runs in a different namespace and needs TCP access to QMD's HTTP port.

# Kubernetes deployment
containers:
  - name: qmd
    image: node:22-slim
    command: ["qmd", "mcp", "--http", "--host", "0.0.0.0", "--port", "8181"]

Or via environment variable:

env:
  - name: QMD_HOST
    value: "0.0.0.0"

The MCP HTTP server hardcodes `localhost` as the bind address, making
it inaccessible from other containers in Kubernetes deployments where
QMD runs as a ClusterIP service.

Add `--host` CLI flag and `QMD_HOST` environment variable to configure
the bind address. Defaults to `localhost` for backward compatibility.

Usage:
  qmd mcp --http --host 0.0.0.0        # CLI flag
  QMD_HOST=0.0.0.0 qmd mcp --http      # Environment variable

The `host` option is also available via the `startMcpHttpServer` API:
  startMcpHttpServer(8181, { host: "0.0.0.0" })

Priority: options.host > QMD_HOST > "localhost"
The custom Database interface in db.ts was missing the transaction()
method, causing TypeScript compilation to fail on store.ts line 2142.
Both better-sqlite3 and bun:sqlite support transaction(), so this
was simply an omission in the interface definition.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant