How to Securely Connect Your Local MCP Server to ChatGPT Using OpenAI's Official Tunnel Client
A practical, step-by-step guide to installing and configuring OpenAI's tunnel-client to securely expose your local MCP services to ChatGPT without public port exposure. Covers setup, YAML configuration, a FastAPI example, and troubleshooting.

Ever been in that frustrating situation? You've built a finely-tuned local MCP Server capable of handling code, processing data, or even controlling your machine, but bridging it to ChatGPT feels impossible. Exposing ports publicly? Too risky. Relying on third-party tunneling services? High latency and unstable connections.
Stop struggling. OpenAI recently open-sourced tunnel-client, purpose-built for this exact scenario. In this 10-minute tutorial, I'll walk you through the complete workflow from installation to production-ready verification, enabling your local MCP services to interact securely and stably with ChatGPT.
Why Choose tunnel-client?
Traditional approaches usually force a trade-off: sacrifice security (by exposing ports directly) or sacrifice stability (using third-party tunnel proxies). As an official OpenAI implementation, tunnel-client plugs directly into their Secure MCP Tunnel infrastructure. Authentication, encryption, and heartbeat monitoring are fully managed, so you can focus purely on your service logic.
Prerequisites
- Go 1.21+ environment (required for compilation)
- A locally running MCP Server (e.g., on
localhost:3000) - An OpenAI developer account (requires ChatGPT Plus or API access with MCP tunnel permissions)
Step 1: Install and Compile
The project doesn't ship pre-compiled binaries, but Go makes compilation straightforward with a single command. Navigate to your Go workspace and run:
bash
go install github.com/openai/tunnel-client@latest
which tunnel-client
Why this method? Go's install command automatically fetches dependencies and compiles a system-native executable. It's cleaner than cloning the repo and running go build, making version management much easier down the line.
Step 2: Generate and Fill Out the Configuration File
The tunnel client needs three things: your OpenAI credentials, the local MCP server address, and a tunnel identifier. Generate the base config by running:
bash
tunnel-client init
This creates a configuration file at ~/.config/tunnel-client/config.yaml. Open it and fill in the core fields:
yaml
openai:
api_key: "sk-..."
organization_id: "org-..."
mcp_server:
url: "http://localhost:3000"
name: "my-local-agent"
Three critical notes:
- The
api_keymust be a valid token for an organization that has explicitly enabled the Secure MCP Tunnel feature. - The
urlpoints to your local service. Do not append paths like/chator/completion; the client handles routing automatically. - The
nameis what appears as the plugin in ChatGPT. Stick to English to prevent encoding issues.
Step 3: Start the Tunnel and Verify
Once configured, spin up the tunnel with one command:
bash
tunnel-client start --config ~/.config/tunnel-client/config.yaml
You should see output similar to:
2024/09/20 10:15:22 INFO Tunnel established id=mcpt-8f3a2b
2024/09/20 10:15:23 INFO Connected to MCP server at http://localhost:3000
Seeing Tunnel established and Connected means you're good to go. Head to ChatGPT → Settings → Plugins → Manage plugins, and you should see my-local-agent listed with a Connected status.
Practical Example: Connecting a Local Weather MCP Service
Let's validate this with a minimal, realistic scenario. Suppose you've built a simple FastAPI weather endpoint:
python
from fastapi import FastAPI
app = FastAPI()
@app.get("/weather")
def get_weather(city: str):
return {"city": city, "temp": 24}
Exposed on localhost:8000. Update your config from Step 2 to point url: http://localhost:8000, start the tunnel, and then ask ChatGPT directly:
"Check the current weather in Shenzhen for me."
If configured correctly, GPT will recognize the plugin's capability, route the request to your local endpoint, and return the result. The entire process requires zero public deployment, with typical latencies under 50ms.
Common Pitfalls & Troubleshooting
- Authentication Failed: Verify that the organization linked to your
api_keyactually has Secure MCP Tunnel permissions. Early beta access was limited. - Connection Drops: Your local service must stay alive while the tunnel runs. Use
systemd,supervisor, orpm2to daemonize it. - Path Mismatch: If your local service expects a custom base path (e.g.,
/api/v1), include it in theurlfield. The client won't auto-prepend it.
What's Next?
Once your first service is live:
- Containerize your local MCP service with Docker for one-command deployment.
- Use
tunnel-client's verbose logging (--log-level debug) to debug complex multi-step interactions. - Dive into the MCP protocol spec to add multi-modal or streaming response support.
Securely bridging local AI agents to public LLMs is no longer a headache. In the next guide, we'll explore how to leverage the MCP protocol to let GPT directly query your local databases. Successfully set it up? Drop a ✅ in the comments!