Transports

Streamable HTTP, SSE, and how to connect servers that only speak stdio.

MCP servers talk over one of three transports. sremcp is a remote client, so it uses the two network ones.

TransportIn sremcpUse it for
Streamable HTTPStreamable HTTPEvery current server. One endpoint, usually …/mcp.
SSESSE (legacy)Older servers that only offer Server-Sent Events, usually at …/sse.
stdioThrough a bridgeServers meant to run as a local process (npx …, uvx …, docker run -i …).

Which one does my server use?

Look at how its README says to start it:

  • A URL, or a flag like --transport streamable-http, -t streamable-http or PROMETHEUS_MCP_SERVER_TRANSPORT=http: Streamable HTTP.
  • --transport sse, or a URL ending in /sse: SSE (legacy). Use Streamable HTTP instead if the server offers it.
  • Only a command (npx some-mcp-server), with nothing about ports: stdio. Bridge it as below.

Bridge a stdio server

Supergateway runs a stdio server and serves it over Streamable HTTP. It can also require an API key, so it doubles as the server's front door:

# The key sremcp will send. Keep it: it's the Secret you enter in sremcp.
MCP_API_KEY=$(openssl rand -hex 32); echo "$MCP_API_KEY"

docker run -d --name my-mcp -p 8000:8000 \
  -e SUPERGATEWAY_API_KEY="$MCP_API_KEY" \
  supercorp/supergateway \
  --stdio "npx -y some-mcp-server" \
  --outputTransport streamableHttp --port 8000

The server is now at http://<host>:8000/mcp, and answers 401 without the key. Put it behind https (see Expose a self-hosted server), then onboard it with Transport Streamable HTTP, Authentication Bearer token, and the key as the Secret.

For Python servers started with uvx, use the supercorp/supergateway:uvx image, which includes uv.

Run one bridge per server and environment, so each has its own key and its own credentials for the system behind it.

On this page