mrkeyoor.com_
Sat 19 Sept 18:00 UTC
Self-Hostedevaluationupdated 19 Sept 2026

tunnel-client review

Secure MCP Tunnel client is a Go daemon that lets ChatGPT, Codex, the Responses API, and AgentKit reach an MCP server on your laptop or private network. It keeps that server off the public internet by polling OpenAI over an outbound connection, though tool requests and results still pass through OpenAI's tunnel service.

Verdict

Our npm check finished in 5 seconds with 0 packages and 0 known vulnerabilities, but it skipped both build and tests, so those clean numbers do not validate this Go daemon. Use tunnel-client when an OpenAI-hosted product must reach a private MCP server and outbound HTTPS is acceptable. Do not choose it to keep tool data wholly local, and prove connector creation plus a real tool call before treating green health endpoints as deployment success.

We ran it

Lab card: what happened when we ran tunnel-clientScreenshot of tunnel-client (github.com/openai/tunnel-client)
Install✓ · 5s0 packages · 16 MB
Buildn/ano build script
Testsn/ano test script
Known vulns00 critical · 0 high · 0 moderate · 0 low (npm audit)
Repo671 files~156,259 lines of source · 10.6 MB · 2 CI workflows · Dockerfile

Answers from our run

Does tunnel-client build from source?

Dependencies installed in 5 seconds (0 packages), and the project has no separate build step. We cloned commit 1952115 into a clean Debian container with 3 CPUs and no project-specific setup.

Does tunnel-client have tests you can run?

Not through a standard command: the project exposes no test script or target that our harness could run.

Does tunnel-client have known vulnerabilities in its dependencies?

npm audit found none in the dependency tree at the time of our run.

Who should not use tunnel-client?

Environments where tool payloads or every auth artifact must stay outside OpenAI: the architecture guide says strict-local-auth is unsupported.

What are the alternatives to tunnel-client?

cloudflared, frp, Tailscale. Our npm check finished in 5 seconds with 0 packages and 0 known vulnerabilities, but it skipped both build and tests, so those clean numbers do not validate this Go daemon.

Setup3/5Binary paths are clear; roles, keys, and connector setup add work
Docs5/5Detailed onboarding, trust boundaries, deployment, and diagnosis
Community4/5425 stars and recent issue activity on a narrow project
Maturity3/5v0.0.14 has release evidence, but connector issues remain open

Who it’s for

Organizations that need ChatGPT or Codex to reach an MCP server without opening an inbound firewall port.
Operators who can run a long-lived daemon beside a private HTTP or stdio MCP server.
Platform teams that need health, readiness, metrics, and local diagnostic views for the connection.
Go developers who want to embed the tunnel client beside an in-process MCP server.

Who it’s NOT for

Environments where tool payloads or every auth artifact must stay outside OpenAI: the architecture guide says strict-local-auth is unsupported.
Networks that cannot allow outbound HTTPS to api.openai.com on port 443.
Teams without OpenAI tunnel access, a provisioned tunnel ID, and a runtime API key carrying Tunnels Read and Use permissions.
Active-active stdio deployments sharing one tunnel ID: the README supports only one running client for an MCP_COMMAND binding, including during restarts.
Buyers who need connector setup to work whenever local health is green: open issue 71 reports a healthy v0.0.14 client and official stub while ChatGPT connector creation still failed.

Setup reality

Our npm sandbox install completed in 5 seconds, added 0 packages, and occupied 16 MB. It found no build script and no test script, so both steps were skipped. Npm audit reported 0 known vulnerabilities. The checkout contained 671 files, about 156,259 source lines, and 10.6 MB.

That npm result does not build the Go client. The README directs source users to Go and Make, while most operators should use a release binary, Homebrew, container image, or runtime archive. A working deployment also needs a tunnel ID, a restricted runtime API key, Tunnels Read and Use permissions, and either an HTTP MCP URL or a stdio command.

The daemon needs outbound HTTPS to api.openai.com:443 and continuous uptime. The default health UI binds to loopback. Stdio allows only one active client per tunnel ID, while Docker, Kubernetes, and VM deployments have separate guides. Our scan found 2 CI workflow files, a Dockerfile, and no directory named tests.

Outbound port 443 replaces an inbound MCP listener, not the data path

tunnel-client maintains outbound HTTPS to api.openai.com on port 443 and polls for work addressed to one tunnel ID. When ChatGPT, Codex, the Responses API, or AgentKit calls a tool, OpenAI queues the JSON-RPC request. The daemon retrieves it, forwards it to a private Streamable HTTP, stdio, or in-memory MCP server, then posts the response back. Your MCP listener needs no public URL or inbound firewall rule.

That network design does not make the request local. The architecture guide says tool arguments, responses, stream events, and applicable authentication artifacts cross the OpenAI product runtime and tunnel service. Only the final client-to-MCP hop stays inside your network. Static extra headers and MCP-side mutual TLS can protect that last HTTP hop, but strict-local-auth is explicitly unsupported. Use direct local MCP configuration when every bearer token or auth artifact must avoid OpenAI.

The 5-second npm result never compiled the Go client

Our lab ran the repository's npm surface because a root package.json is present. Installation finished in 5 seconds, added 0 packages, and left 16 MB on disk. That manifest pins Node and pnpm versions but defines no scripts or dependencies. The harness therefore found no build target and no test target. Npm audit reported 0 known vulnerabilities in the empty npm dependency tree.

The application itself is written primarily in Go. Its README tells contributors to use go build ./... and go test ./..., or Make targets that also prepare the embedded admin interface and stamp version metadata. We did not run those commands, so this review makes no claim that the Go code builds or that its tests pass. A release binary is a more honest first-use path than treating the npm result as source validation.

What happened when we ran it

Our sandbox checkout at commit 1952115 held 671 files, roughly 156,259 source lines, and 10.6 MB before installation. The npm install succeeded in 5 seconds with 0 packages added. Build and tests were skipped because neither npm target existed. The audit found 0 critical, high, moderate, or low known vulnerabilities in that npm scope.

The scan found 2 CI workflow files and a Dockerfile, but no directory named tests. Go commonly keeps _test.go files beside production code, and this repository has that layout, so the directory signal does not mean there are no Go tests. It means our Node-oriented harness did not exercise them. We also did not create a tunnel, send MCP traffic, or test ChatGPT connector behavior in the supplied run.

Two keys and three permissions separate runtime use from administration

A basic deployment needs a provisioned tunnel ID, one runtime API key, and an MCP target. The runtime principal needs Tunnels Read plus Use. Tunnel managers add Manage, while list, create, update, and delete commands use a separate OpenAI admin key. The documentation repeatedly warns against putting that admin key into the long-lived daemon, which is the right separation for a service sitting beside internal tools.

Configuration still has enough edges to reward a dry run. tunnel-client init writes a profile, and doctor --explain checks it before startup. The process exposes /healthz, /readyz, /metrics, and /ui, bound to loopback by default. Those endpoints tell you about the local process, MCP reachability, and polling state. They cannot prove that a particular ChatGPT workspace has the correct organization context or will accept connector discovery.

One tunnel ID cannot safely front two stdio clients

The README supports only 1 active tunnel-client per tunnel ID when the MCP binding uses a stdio command. Each client would launch its own child process, so initialization and later calls could land on different children. That rules out overlapping restarts and ordinary active-active replicas for this transport. Stop the old process first, use distinct tunnel IDs, or choose a deployment whose MCP state can handle the documented multi-replica behavior.

Operational options are otherwise thoughtful. The repository documents a foreground process, Codex-managed runtimes, Docker, Kubernetes sidecars or dedicated pods, and VM services. Health and metrics make the daemon observable, and v0.0.14 adds a privacy-safe startup catalog digest for comparing equivalent replicas. The release notes also say that matching digests do not prove health, polling, routing, shared-state safety, or later convergence. That is a useful limit, not fine print.

Version 0.0.14 still has hosted connector failures to diagnose

Release v0.0.14 was published on September 1, 2026 with multi-replica OAuth work, redirect restrictions, secret redaction changes, and support evidence. Yet issue 71's connector-creation report uses the official v0.0.14 embedded stub on Windows and records green local health and readiness while ChatGPT rejects both no-auth and OAuth setup at different hosted steps. The local tunnel forwarded responses, but the connector was never created.

Issue 60 describes another boundary: a ChatGPT Pro workspace saw every real tool call rejected with 401 tunnel_active_organization_required before the private MCP server received anything. Neither report proves a universal failure. Both show why /readyz is necessary but insufficient. Your acceptance test should create the connector in the intended workspace, list tools, invoke one harmless tool, and confirm that the private server received it.

The September 19 push shows maintenance, not finished compatibility

GitHub showed 425 stars and 11 combined open issues and pull requests on September 19, 2026. The latest push was that same day, while the latest tagged release remained v0.0.14 from September 1. Recent reports and closures cover managed Cloudflare credentials, connector discovery, OAuth, antivirus warnings, Gatekeeper, Windows signing, stdio recovery, and support-archive redaction. This is an actively changing integration surface.

For the exact OpenAI tunnel path, tunnel-client is the obvious project to trial because it owns the product-specific control plane, permissions, diagnostics, and release artifacts. It is less attractive as a general tunneling tool or a privacy boundary. Pin the release, follow the matching documentation, keep the runtime key narrow, and test the hosted product end to end. A green daemon without a successful tool call is only half a deployment.

Alternatives

ProjectWhat it isPick it when
cloudflared gh↗Cloudflare's connector for exposing private services through Cloudflare Tunnel.pick this instead when you need a general private-service tunnel and will handle MCP authentication and OpenAI integration yourself.
frp gh↗A self-hosted reverse proxy for publishing services behind NAT or firewalls.pick this instead when you control both tunnel ends and want a vendor-neutral network tunnel rather than an OpenAI product connector.
Tailscale gh↗A private mesh network that connects approved devices and services.pick this instead when every caller can join your private network and no OpenAI-hosted product needs direct MCP access.

What people are saying

  1. [github-trending] openai/tunnel-client

Sources

  1. Secure MCP Tunnel client repository and README
  2. Secure MCP Tunnel architecture guide
  3. tunnel-client v0.0.14 release
  4. Connector creation issue 71
  5. Organization context issue 60

More self-hosted reviews

karmada · OpenStock · alertmanager · go-music-dl · fleet · Memoh · the whole board →