Skip to main content
By default, Isthmus communicates with AI clients over stdio (standard input/output). This is the simplest setup — the MCP client launches Isthmus as a subprocess and pipes JSON back and forth. HTTP transport is an alternative that serves MCP over a network socket using the Streamable HTTP transport. This enables clients that don’t support stdio, remote access scenarios, and multi-session architectures.

When to use HTTP transport

Most users should stick with stdio. Use HTTP when your client requires it or when you need network access.

Enabling HTTP transport

Set the TRANSPORT environment variable to http:
Or use the --transport CLI flag:
Isthmus will start an HTTP server and log the listen address:

Configuration

Custom listen address

To change the port or bind to a specific interface:

Bearer authentication

When HTTP transport is enabled, Isthmus requires a bearer token. Every request to the /mcp endpoint must include an Authorization header with the token:

Setting the token

Set the bearer token via environment variable or CLI flag:
Isthmus refuses to start in HTTP mode without a bearer token — this prevents accidentally exposing an unauthenticated MCP endpoint on the network.

How it works

  • The token is compared using constant-time comparison (crypto/subtle.ConstantTimeCompare) to prevent timing attacks
  • Requests with a missing, malformed, or incorrect Authorization header receive 401 Unauthorized
  • Only the Bearer scheme is accepted — Basic, Digest, and other schemes are rejected
  • Health check endpoints (/health and /ready) are not behind bearer auth — orchestrators need unauthenticated access to these

Generating a secure token

Use a cryptographically random token:
Store the token securely — treat it like a password. Do not commit it to version control.

Health check endpoints

When running in HTTP mode, Isthmus exposes two unauthenticated health check endpoints for container orchestrators (Kubernetes, ECS, Docker Compose):

Kubernetes example

Server hardening

The HTTP server includes production-grade timeouts and error handling:

MCP client configuration

Clients that support HTTP

For MCP clients that support the Streamable HTTP transport, point them at the Isthmus HTTP endpoint with the bearer token in the headers:

Running Isthmus separately

With HTTP transport, Isthmus runs as a standalone process — not as a subprocess of the MCP client. Start it in a terminal or as a system service:
Then configure your MCP client to connect to the HTTP endpoint.

Streamable HTTP

Isthmus uses the Streamable HTTP transport from the MCP specification. This is a modern HTTP-based transport that supports:
  • Standard HTTP request/response for tool calls
  • Server-Sent Events (SSE) for streaming responses
  • Session management for stateful interactions
This is the transport specified in the MCP 2025-03-26 specification.

Graceful shutdown

The HTTP server shuts down gracefully on SIGTERM or SIGINT:
  1. Stops accepting new connections
  2. Waits up to 5 seconds for in-flight requests to complete
  3. Closes the listener

Feature parity

HTTP and stdio transports have full feature parity. All MCP tools, policy engine, column masking, SQL validation, audit logging, and OpenTelemetry work identically regardless of transport.

Security considerations

When using HTTP transport, keep in mind:
  • Bearer auth is mandatory — Isthmus refuses to start in HTTP mode without a token
  • Bind to localhost (127.0.0.1) in development to prevent external access
  • Use TLS in production — bearer tokens are sent in plaintext over HTTP. Use a reverse proxy (nginx, Caddy, Envoy) for TLS termination, or tunnel through SSH
  • Use a reverse proxy for rate limiting if Isthmus is exposed beyond localhost
  • All other safety layers (SQL validation, read-only transactions, row limits, column masking) still apply regardless of transport
HTTP transport opens a network port. Unlike stdio, where the MCP client launches Isthmus as a subprocess with no network exposure, HTTP makes Isthmus accessible to any process that can reach the listen address. Always bind to 127.0.0.1 unless you specifically need remote access, and always use TLS in production to protect the bearer token in transit.