Skip to content

Commit 18e8fbe

Browse files
authored
Document ChatGPT Desktop configuration via ngrok tunnel (#882)
* Document ChatGPT Desktop configuration via ngrok tunnel * Scope ChatGPT Desktop tunnel to personal use only Add a warning admonition spelling out the three security concerns raised in review: unauthenticated tunnel, credential exposure for auth-backed servers, and shared-tunnel risk in workspace connectors. Point readers to vMCP for shared or credentialed setups.
1 parent 8a6a3f8 commit 18e8fbe

1 file changed

Lines changed: 83 additions & 23 deletions

File tree

docs/toolhive/reference/client-compatibility.mdx

Lines changed: 83 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,14 @@ We've tested ToolHive with these clients:
4040
| Windsurf IDE |||| |
4141
| Windsurf (JetBrains) |||| |
4242
| Zed |||| v0.214.5+ |
43-
| ChatGPT Desktop |||| See [STDIO-only client configuration][4] |
43+
| ChatGPT Desktop |||| See [ChatGPT Desktop configuration][5] |
4444
| Claude Desktop |||| See [STDIO-only client configuration][4] |
4545
| GitHub Copilot (JetBrains) |||| v1.5.47+ |
4646
| PydanticAI |||| v0.2.18+ |
4747

4848
[3]: #vs-code-with-copilot
4949
[4]: #stdio-only-client-configuration
50+
[5]: #chatgpt-desktop-configuration
5051

5152
The minimum versions listed are the earliest versions that support the
5253
Streamable HTTP transport protocol.
@@ -322,31 +323,17 @@ Copilot for JetBrains supports SSE (`"type": "sse"`) and Streamable HTTP
322323
### STDIO-only client configuration
323324

324325
Some MCP clients, like Claude Desktop, only support MCP servers that communicate
325-
via STDIO transport. However, many popular MCP servers use Server-Sent Events
326-
(SSE) or Streamable HTTP transport protocols.
326+
via STDIO transport. ToolHive's `thv proxy stdio` command wraps any running
327+
ToolHive workload as a STDIO process so these clients can connect to it.
327328

328-
ToolHive's `thv proxy stdio` command transforms servers using SSE or Streamable
329-
HTTP into STDIO-compatible processes, enabling these clients to work with any
330-
MCP server.
331-
332-
**How it works:**
333-
334-
1. ToolHive runs the MCP server in its container with its default transport
335-
(SSE, HTTP, or other)
336-
2. The `thv proxy stdio` command sets up a STDIO-level wrapper pointing to that
337-
existing server
338-
3. Your client interacts with this wrapper just like any other STDIO MCP server
339-
340-
**Example:**
341-
342-
First, run an MCP server with SSE transport:
329+
Run an MCP server with ToolHive as usual, for example:
343330

344331
```bash
345-
thv run osv --transport sse --name osv
332+
thv run osv
346333
```
347334

348-
Then configure your client to use the proxy stdio command. For Claude Desktop,
349-
update your configuration file (typically located at
335+
Then configure your client to launch `thv proxy stdio <WORKLOAD_NAME>`. For
336+
Claude Desktop, edit your configuration file (typically located at
350337
`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
351338

352339
```json
@@ -367,12 +354,85 @@ the name you used when running the server with `thv run`.
367354

368355
:::
369356

370-
After restarting your client, the MCP server's tools will be available for use,
371-
even though it uses SSE transport.
357+
After restarting your client, the MCP server's tools are available for use.
372358

373359
For more details, see the
374360
[`thv proxy stdio` CLI reference](../reference/cli/thv_proxy_stdio.md).
375361

362+
### ChatGPT Desktop configuration
363+
364+
ChatGPT Desktop only accepts MCP servers over HTTPS, with no equivalent of
365+
Claude Desktop's command-based configuration. For personal experimentation with
366+
public, unauthenticated MCP servers, you can use `thv proxy tunnel` to expose
367+
your local ToolHive workload through an [ngrok](https://ngrok.com) HTTPS tunnel.
368+
369+
:::warning[Scope: personal local use only]
370+
371+
This workaround creates a public ngrok URL pointing at a workload running on
372+
your machine. Before using it, consider:
373+
374+
- **The tunnel is unauthenticated by default.** Anyone who guesses or learns the
375+
ngrok URL can reach your MCP server.
376+
- **The workload runs with your credentials.** Tunneling an auth-backed server
377+
(GitHub, Notion, Slack, and similar) means anyone who reaches the URL acts
378+
with your access.
379+
- **Workspace connectors share one tunnel.** On Business, Enterprise, or Edu
380+
workspaces, every member who uses the connector hits your tunnel and acts as
381+
you, not as themselves.
382+
383+
For shared, multi-user, or credentialed setups, use a
384+
[Virtual MCP Server (vMCP)](../guides-vmcp/intro.mdx), which fronts MCP servers
385+
with proper authentication, per-user OAuth, and policy enforcement.
386+
387+
:::
388+
389+
You'll need:
390+
391+
- An ngrok account and auth token
392+
- A static ngrok domain (recommended, so the connector URL stays stable across
393+
restarts)
394+
395+
Run an MCP server with ToolHive as usual, for example:
396+
397+
```bash
398+
thv run osv
399+
```
400+
401+
Then start the ngrok tunnel, using the workload name as the target:
402+
403+
```bash
404+
thv proxy tunnel osv osv-tunnel \
405+
--tunnel-provider ngrok \
406+
--provider-args '{"auth-token": "<YOUR_NGROK_TOKEN>", "url": "https://<YOUR_NGROK_DOMAIN>", "pooling": true}'
407+
```
408+
409+
Then create a custom connector in ChatGPT. The setup happens on the web; the
410+
connector then works in both ChatGPT on the web and ChatGPT Desktop.
411+
412+
1. Open [ChatGPT](https://chatgpt.com/) on the web and navigate to **Settings →
413+
Apps**.
414+
2. Turn on **Developer mode** (this may require an admin to enable on Business,
415+
Enterprise, or Edu workspaces).
416+
3. Click **Create** and fill in the app details, including the **URL**: your
417+
ngrok domain plus the MCP endpoint path, typically `/mcp` for Streamable HTTP
418+
servers (for example, `https://<YOUR_NGROK_DOMAIN>/mcp`).
419+
4. Check the **I trust this application** box and click **Save**.
420+
421+
After saving, ChatGPT lists the tools your MCP server exposes. You can add them
422+
to a conversation by clicking **+** near the message composer and selecting your
423+
app.
424+
425+
:::tip
426+
427+
The `url` field in `--provider-args` sets a static ngrok domain. If you omit it,
428+
ngrok assigns a temporary random URL each time, which means updating the
429+
connector in ChatGPT on every restart.
430+
431+
:::
432+
433+
For more details, see the
434+
[`thv proxy tunnel` CLI reference](../reference/cli/thv_proxy_tunnel.md).
435+
376436
## Related information
377437

378438
- [Client configuration](../guides-cli/client-configuration.mdx)

0 commit comments

Comments
 (0)