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