You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A ChatGPT Web developer-mode app backed by OpenAI Secure MCP Tunnel can be created successfully with OAuth, but the app does not expose any usable MCP actions and the manual Refresh operation fails.
The reproduction uses the official tunnel-client v0.0.14 Windows binary together with its official --embedded-mcp-stub.
OAuth completes successfully through Google and the app can be created and installed. The tunnel remains live and ready.
During the final targeted debug capture, the ChatGPT-hosted side issued server/discover to the customer MCP main channel three times. Each request reached the official embedded MCP stub, received a successful response, and that final response was successfully delivered back to the OpenAI control plane:
However, no subsequent main/tools/list or main/tools/call was observed in the capture, and the ChatGPT app still exposed no usable actions.
The official v0.0.14 embedded MCP stub defines three tools:
server_info
echo
uppercase
They are registered in:
cmd/client/dev_mcp_stub.go
tag: v0.0.14
This report does not claim that the root cause has been established. The observable failure boundary is after a successful main/server/discover response has been delivered to the OpenAI control plane and before usable tool definitions become available in ChatGPT.
MCP transport behind the tunnel: Streamable HTTP on loopback
Control-plane route: direct HTTPS
--harpoon.allow-plaintext-http enabled only for the trusted loopback development target
Raw HTTP logging: disabled
Tunnel status during reproduction:
Health: live
Ready: ready
Logs: connected
Tunnel ID, client instance ID, command/request IDs, OAuth client ID, OAuth client secret, API keys, bearer tokens, account identifiers, local usernames, and local repository paths are omitted from this public report.
Relevant startup configuration
The official binary was started approximately as follows, with identifiers and local paths redacted:
The runtime log level had been changed to debug before the reproduction.
OAuth control result
OAuth itself can complete successfully:
The ChatGPT developer-mode app can be created.
ChatGPT redirects to Google authorization.
Google login and authorization complete.
The browser returns to ChatGPT.
The app appears in ChatGPT.
The app information page reports OAuth as both supported and used authorization.
This report is therefore focused on the subsequent MCP action/tool discovery path, not on initial OAuth or PKCE setup.
Steps to reproduce
Start the official tunnel-client v0.0.14 binary with --embedded-mcp-stub.
Confirm:
/healthz -> 200 live
/readyz -> 200 ready
Create a ChatGPT developer-mode app using:
Connection: Tunnel
Authentication: OAuth
User-defined OAuth client
Google as the OAuth provider
Complete OAuth successfully.
Confirm that the app is created and visible in ChatGPT.
Open:
Settings
→ Apps
→ the developer-mode app
Use the manual Refresh action.
Observe that the refresh does not produce usable app actions. In reproduced attempts the UI has shown the generic error:
Something went wrong.
Inspect the tunnel-client debug trace for the same operation.
Final targeted reproduction
The final debug capture was taken on:
2026-09-05
UTC+08:00
Target window:
19:49:14 - 19:49:54
Three separate successful main/server/discover responses were observed.
Attempt 1
2026-09-05T19:49:14.786+08:00
dispatcher received response from MCP server
rpc_method="server/discover"
rpc_request_id="openai-mcp-discover"
has_error=false
2026-09-05T19:49:15.001+08:00
dispatcher delivered response to control plane
channel="main"
rpc_method="server/discover"
rpc_request_id="openai-mcp-discover"
status_code=200
has_error=false
finalResponse=true
Attempt 2
2026-09-05T19:49:38.976+08:00
dispatcher received response from MCP server
rpc_method="server/discover"
rpc_request_id="openai-mcp-discover"
has_error=false
2026-09-05T19:49:39.188+08:00
dispatcher delivered response to control plane
channel="main"
rpc_method="server/discover"
rpc_request_id="openai-mcp-discover"
status_code=200
has_error=false
finalResponse=true
Attempt 3
2026-09-05T19:49:53.780+08:00
dispatcher received response from MCP server
rpc_method="server/discover"
rpc_request_id="openai-mcp-discover"
has_error=false
2026-09-05T19:49:53.994+08:00
dispatcher delivered response to control plane
channel="main"
rpc_method="server/discover"
rpc_request_id="openai-mcp-discover"
status_code=200
has_error=false
finalResponse=true
All command IDs, tunnel request IDs, tunnel IDs, and client instance IDs have been intentionally removed from the public excerpts.
Main-channel observation
For the supplied debug capture, the customer MCP main channel shows:
OAuth/Harpoon control traffic also occurred during the wider session and includes MCP-like methods such as tools/list, but those requests use the harpoon control channel and are intentionally not counted here as customer MCP main traffic.
Embedded MCP control
The target is not a custom CAT-RV MCP implementation.
It is the official MCP test server built into tunnel-client v0.0.14.
The official source registers:
server_info
echo
uppercase
Therefore this reproduction does not depend on CAT-RV repository code, a third-party MCP framework, or a custom tool implementation.
ChatGPT-side result
The app is created and visible in ChatGPT, but:
the app page reports no available app actions;
ChatGPT can identify the app/namespace;
the three official embedded tools are not available for invocation;
asking ChatGPT to use server_info, echo, or uppercase does not result in a main/tools/call reaching the tunnel;
manual Refresh does not make the tools available.
Why this does not currently look like a local MCP availability failure
During the reproduction:
the official tunnel-client process remained running;
/healthz returned 200 live;
/readyz returned 200 ready;
the main channel remained enabled;
the main probe remained ok;
control-plane connectivity remained active;
OAuth had successfully allowed the app to be created;
main/server/discover reached the official embedded MCP;
the embedded MCP returned a non-error response;
tunnel-client successfully POSTed that response to the control plane;
the final response was recorded with status_code=200, has_error=false, and finalResponse=true.
The observable boundary is after that successful discovery response and before usable customer MCP actions appear in ChatGPT.
Related reports
This appears related to, but is not the same reproduction as:
In the closing maintainer response, it was stated that ChatGPT uses a frozen tool snapshot and that manual Refresh is the supported tool-catalog update path.
The same response specifically noted that if manual Refresh itself fails to fetch a current tools/list result, that would be a separate actionable bug and should be reported with the workspace plan, exact UI path, tunnel-client version, and a sanitized tunnel trace.
That issue contains real-ChatGPT investigation of hosted lifecycle behavior around server/discover, initialization, tools/list, and later tool invocation.
This reproduction differs because it uses official v0.0.14, OAuth can complete, the app can be created, and server/discover itself succeeds with a final HTTP 200 response.
That report describes an adjacent hosted-client boundary in which ChatGPT stops issuing later MCP commands while the tunnel and local MCP remain healthy.
The present reproduction occurs much earlier, during app action/tool discovery and manual Refresh.
Expected behavior
After a successful Refresh against the official v0.0.14 embedded MCP stub, ChatGPT should expose the demo tools:
server_info
echo
uppercase
If the current hosted protocol does not require a subsequent tools/list after server/discover, then the equivalent discovery path should still result in these tool definitions becoming available to the app.
If the hosted workflow cannot continue after successful discovery, the UI or diagnostics should expose a privacy-safe, machine-readable failure reason instead of only a generic refresh failure.
Questions
After a successful main/server/discover response from the official v0.0.14 embedded stub, what hosted ChatGPT lifecycle is expected to register the app's tools?
Is a subsequent main/tools/list expected, or are the tool schemas obtained through another hosted discovery path?
Why would three successful final server/discover responses be accepted by the control plane while the app still exposes no actions?
Is there a hosted workflow state or terminal reason that can explain why the action Refresh stops at this boundary?
Which command/request/workflow identifiers would be most useful to provide privately through OpenAI Support for correlation?
Is this a known ChatGPT hosted-app issue, or is there an additional tunnel-client diagnostic that would help isolate the boundary further?
Available evidence
I can provide privately through OpenAI Support, if useful:
the complete command request IDs for all three server/discover attempts;
their corresponding tunnel request IDs;
the client instance ID;
the tunnel ID;
exact timestamps and time zone;
the complete redacted debug capture;
the generated tunnel-client support archive;
tunnel metrics and status snapshots;
screenshots of the failed manual Refresh and the app showing no available actions.
I am intentionally not posting those internal identifiers publicly.
No prompt text, CAT-RV source code, repository contents, API key, OAuth client secret, access token, refresh token, bearer token, browser cookie, or other credential is required to reproduce the observable boundary.
2026-09-05T19:49:14.786+08:00
dispatcher received response from MCP server
rpc_method="server/discover"
rpc_request_id="openai-mcp-discover"
has_error=false
2026-09-05T19:49:15.001+08:00
dispatcher delivered response to control plane
channel="main"
rpc_method="server/discover"
rpc_request_id="openai-mcp-discover"
status_code=200
has_error=false
finalResponse=true
第二次
2026-09-05T19:49:38.976+08:00
dispatcher received response from MCP server
rpc_method="server/discover"
rpc_request_id="openai-mcp-discover"
has_error=false
2026-09-05T19:49:39.188+08:00
dispatcher delivered response to control plane
channel="main"
rpc_method="server/discover"
rpc_request_id="openai-mcp-discover"
status_code=200
has_error=false
finalResponse=true
第三次
2026-09-05T19:49:53.780+08:00
dispatcher received response from MCP server
rpc_method="server/discover"
rpc_request_id="openai-mcp-discover"
has_error=false
2026-09-05T19:49:53.994+08:00
dispatcher delivered response to control plane
channel="main"
rpc_method="server/discover"
rpc_request_id="openai-mcp-discover"
status_code=200
has_error=false
finalResponse=true
公開節錄已刻意移除所有命令識別碼、Tunnel request ID、Tunnel ID 與 client instance ID。
English
Summary
A ChatGPT Web developer-mode app backed by OpenAI Secure MCP Tunnel can be created successfully with OAuth, but the app does not expose any usable MCP actions and the manual Refresh operation fails.
The reproduction uses the official
tunnel-client v0.0.14Windows binary together with its official--embedded-mcp-stub.OAuth completes successfully through Google and the app can be created and installed. The tunnel remains live and ready.
During the final targeted debug capture, the ChatGPT-hosted side issued
server/discoverto the customer MCPmainchannel three times. Each request reached the official embedded MCP stub, received a successful response, and that final response was successfully delivered back to the OpenAI control plane:However, no subsequent
main/tools/listormain/tools/callwas observed in the capture, and the ChatGPT app still exposed no usable actions.The official v0.0.14 embedded MCP stub defines three tools:
They are registered in:
This report does not claim that the root cause has been established. The observable failure boundary is after a successful
main/server/discoverresponse has been delivered to the OpenAI control plane and before usable tool definitions become available in ChatGPT.Environment
Client product: ChatGPT Web
Workspace: Personal / Plus
Developer Mode: enabled
Host: Windows 11 x64
Browser: Chrome desktop
tunnel-client:0.0.14+0f870e50a973fa820d4c409000059e181e8d242bOfficial Windows amd64 binary
Binary SHA-256:
ChatGPT app connection: Secure MCP Tunnel
Authentication: OAuth
OAuth client registration: user-defined OAuth client
OAuth provider: Google
MCP target: official
--embedded-mcp-stubMCP transport behind the tunnel: Streamable HTTP on loopback
Control-plane route: direct HTTPS
--harpoon.allow-plaintext-httpenabled only for the trusted loopback development targetRaw HTTP logging: disabled
Tunnel status during reproduction:
Tunnel ID, client instance ID, command/request IDs, OAuth client ID, OAuth client secret, API keys, bearer tokens, account identifiers, local usernames, and local repository paths are omitted from this public report.
Relevant startup configuration
The official binary was started approximately as follows, with identifiers and local paths redacted:
The control-plane API key was supplied through an environment variable and is not included here.
Local health verification
Immediately before the targeted reproduction, the running tunnel-client instance returned:
and:
The support diagnostics also reported:
The runtime log level had been changed to
debugbefore the reproduction.OAuth control result
OAuth itself can complete successfully:
This report is therefore focused on the subsequent MCP action/tool discovery path, not on initial OAuth or PKCE setup.
Steps to reproduce
Start the official
tunnel-client v0.0.14binary with--embedded-mcp-stub.Confirm:
Create a ChatGPT developer-mode app using:
Complete OAuth successfully.
Confirm that the app is created and visible in ChatGPT.
Open:
Use the manual Refresh action.
Observe that the refresh does not produce usable app actions. In reproduced attempts the UI has shown the generic error:
Inspect the tunnel-client debug trace for the same operation.
Final targeted reproduction
The final debug capture was taken on:
Target window:
Three separate successful
main/server/discoverresponses were observed.Attempt 1
Attempt 2
Attempt 3
All command IDs, tunnel request IDs, tunnel IDs, and client instance IDs have been intentionally removed from the public excerpts.
Main-channel observation
For the supplied debug capture, the customer MCP
mainchannel shows:OAuth/Harpoon control traffic also occurred during the wider session and includes MCP-like methods such as
tools/list, but those requests use theharpooncontrol channel and are intentionally not counted here as customer MCPmaintraffic.Embedded MCP control
The target is not a custom CAT-RV MCP implementation.
It is the official MCP test server built into
tunnel-client v0.0.14.The official source registers:
Therefore this reproduction does not depend on CAT-RV repository code, a third-party MCP framework, or a custom tool implementation.
ChatGPT-side result
The app is created and visible in ChatGPT, but:
server_info,echo, oruppercasedoes not result in amain/tools/callreaching the tunnel;Why this does not currently look like a local MCP availability failure
During the reproduction:
/healthzreturned200 live;/readyzreturned200 ready;mainchannel remained enabled;mainprobe remainedok;main/server/discoverreached the official embedded MCP;status_code=200,has_error=false, andfinalResponse=true.The observable boundary is after that successful discovery response and before usable customer MCP actions appear in ChatGPT.
Related reports
This appears related to, but is not the same reproduction as:
Tool definitions may remain stale until manual refresh #42 — Tool definitions may remain stale until manual refresh
In the closing maintainer response, it was stated that ChatGPT uses a frozen tool snapshot and that manual Refresh is the supported tool-catalog update path.
The same response specifically noted that if manual Refresh itself fails to fetch a current
tools/listresult, that would be a separate actionable bug and should be reported with the workspace plan, exact UI path, tunnel-client version, and a sanitized tunnel trace.ChatGPT no-auth tunnel plugin immediately enters reconnect loop #41 — ChatGPT no-auth tunnel plugin immediately enters reconnect loop
That issue contains real-ChatGPT investigation of hosted lifecycle behavior around
server/discover, initialization,tools/list, and later tool invocation.This reproduction differs because it uses official v0.0.14, OAuth can complete, the app can be created, and
server/discoveritself succeeds with a final HTTP 200 response.ChatGPT Web stops issuing Secure MCP Tunnel commands after ~59 minutes while tunnel and MCP remain healthy #55 — ChatGPT Web stops issuing Secure MCP Tunnel commands while tunnel and MCP remain healthy
That report describes an adjacent hosted-client boundary in which ChatGPT stops issuing later MCP commands while the tunnel and local MCP remain healthy.
The present reproduction occurs much earlier, during app action/tool discovery and manual Refresh.
Expected behavior
After a successful Refresh against the official v0.0.14 embedded MCP stub, ChatGPT should expose the demo tools:
If the current hosted protocol does not require a subsequent
tools/listafterserver/discover, then the equivalent discovery path should still result in these tool definitions becoming available to the app.If the hosted workflow cannot continue after successful discovery, the UI or diagnostics should expose a privacy-safe, machine-readable failure reason instead of only a generic refresh failure.
Questions
main/server/discoverresponse from the official v0.0.14 embedded stub, what hosted ChatGPT lifecycle is expected to register the app's tools?main/tools/listexpected, or are the tool schemas obtained through another hosted discovery path?server/discoverresponses be accepted by the control plane while the app still exposes no actions?Available evidence
I can provide privately through OpenAI Support, if useful:
server/discoverattempts;I am intentionally not posting those internal identifiers publicly.
No prompt text, CAT-RV source code, repository contents, API key, OAuth client secret, access token, refresh token, bearer token, browser cookie, or other credential is required to reproduce the observable boundary.
中文版
摘要
透過 OpenAI Secure MCP Tunnel 建立的 ChatGPT Web 開發者模式應用程式,可以成功完成 OAuth 並建立,但是應用程式沒有出現任何可用的 MCP 動作,而且手動執行「重新整理」會失敗。
本次重現使用的是 OpenAI 官方 Windows 版
tunnel-client v0.0.14,以及該執行檔內建的官方--embedded-mcp-stub測試 MCP。Google OAuth 可以成功完成,應用程式也能建立並安裝,Tunnel 全程維持正常。
在最後一次針對性的除錯紀錄中,ChatGPT 託管端總共三次向客戶 MCP 的
main通道送出server/discover。三次請求都成功抵達官方 embedded MCP stub、取得正常回覆,並且成功把最終回覆送回 OpenAI 控制端:但是在這份紀錄中,沒有觀察到後續的
main/tools/list或main/tools/call,而 ChatGPT 中的應用程式仍然沒有任何可用動作。官方 v0.0.14 內建測試 MCP 明確定義了三個工具:
它們註冊於:
這份回報不是宣稱已經確認真正根因。目前能從直接證據確認的故障邊界,是成功的
main/server/discover最終回覆已送到 OpenAI 控制端之後,到 ChatGPT 真正出現可用工具定義之前。環境
使用產品:ChatGPT Web
工作區:個人 / Plus
開發者模式:已啟用
主機:Windows 11 x64
瀏覽器:桌面版 Chrome
tunnel-client:0.0.14+0f870e50a973fa820d4c409000059e181e8d242bOpenAI 官方 Windows amd64 執行檔
執行檔 SHA-256:
ChatGPT 應用程式連線方式:Secure MCP Tunnel
驗證方式:OAuth
OAuth 用戶端註冊方式:使用者自訂 OAuth 用戶端
OAuth 提供者:Google
MCP 目標:官方
--embedded-mcp-stubTunnel 後方 MCP 傳輸方式:本機 loopback Streamable HTTP
控制端路徑:直接 HTTPS
--harpoon.allow-plaintext-http:僅針對受信任的本機 loopback 開發目標啟用原始 HTTP 紀錄:關閉
重現期間 Tunnel 狀態:
公開內容刻意省略 Tunnel ID、client instance ID、命令/請求識別碼、OAuth Client ID、OAuth Client Secret、API key、bearer token、帳號識別資料、本機使用者名稱與本機 repository 路徑。
相關啟動設定
官方執行檔大致以以下方式啟動;所有識別資料與本機路徑均已遮罩:
控制端 API key 透過環境變數提供,沒有包含在本回報中。
本機健康狀態驗證
在最後一次重現前,實際執行中的 tunnel-client 回覆:
以及:
支援診斷資料同時顯示:
重現前已將執行期間紀錄層級切換至
debug。OAuth 對照結果
OAuth 本身可以成功完成:
因此這份回報的焦點是之後的 MCP 動作/工具探索流程,而不是一開始的 OAuth 或 PKCE 設定。
重現步驟
使用官方
tunnel-client v0.0.14並啟用--embedded-mcp-stub。確認:
建立 ChatGPT 開發者模式應用程式:
成功完成 OAuth。
確認應用程式已建立且可在 ChatGPT 中看到。
開啟:
執行一次手動「重新整理」。
觀察重新整理後仍沒有可用的應用程式動作。在已重現的嘗試中,介面會顯示:
查看同一操作對應的 tunnel-client debug 紀錄。
最後一次針對性重現
最後一份 debug capture 時間為:
目標時間窗:
總共觀察到三次成功的
main/server/discover最終回覆。第一次
第二次
第三次
公開節錄已刻意移除所有命令識別碼、Tunnel request ID、Tunnel ID 與 client instance ID。
main通道觀察結果在提供的 debug capture 中,客戶 MCP 的
main通道觀察到:較大的工作階段中,同時存在 OAuth / Harpoon 控制流量,其中也可能出現
tools/list等 MCP 類似方法;但是那些屬於harpoon控制通道,因此本回報刻意不把它們計入客戶 MCP 的main通道結果。Embedded MCP 對照
這次 MCP 目標不是自行撰寫的 CAT-RV MCP。
使用的是
tunnel-client v0.0.14官方內建的 MCP 測試伺服器。官方原始碼明確註冊:
所以這次重現不依賴 CAT-RV repository 程式碼、第三方 MCP framework,也不依賴自行撰寫的工具實作。
ChatGPT 端結果
應用程式能建立並出現在 ChatGPT 中,但是:
server_info、echo或uppercase時,沒有main/tools/call抵達 Tunnel;為什麼目前不像本機 MCP 可用性故障
問題發生時:
/healthz回覆200 live;/readyz回覆200 ready;main通道仍為 enabled;mainprobe 仍為ok;main/server/discover確實抵達官方 embedded MCP;status_code=200、has_error=false、finalResponse=true。目前可以直接確認的故障邊界,是這個成功 discovery 回覆之後,到 ChatGPT 真正出現可用客戶 MCP 動作之前。
可能相關的問題
這個問題可能與以下回報相關,但重現方式並不相同:
Tool definitions may remain stale until manual refresh #42 — Tool definitions may remain stale until manual refresh
OpenAI 維護者在結案留言中表示,ChatGPT 會使用固定的工具快照,而手動 Refresh 是目前重新取得工具目錄的正式方式。
同一則留言也特別指出:如果 Manual Refresh 本身無法取得目前的
tools/list,那會是另一個值得單獨回報的問題,應附上工作區方案、精確介面路徑、tunnel-client 版本,以及遮罩後的 Tunnel trace。ChatGPT no-auth tunnel plugin immediately enters reconnect loop #41 — ChatGPT no-auth tunnel plugin immediately enters reconnect loop
該問題包含真實 ChatGPT 環境中對
server/discover、初始化、tools/list與後續工具呼叫生命週期的調查。本次重現不同之處是使用官方 v0.0.14、OAuth 可以完成、App 可以建立,而且
server/discover本身成功得到最終 HTTP 200 回覆。ChatGPT Web stops issuing Secure MCP Tunnel commands after ~59 minutes while tunnel and MCP remain healthy #55 — ChatGPT Web stops issuing Secure MCP Tunnel commands while tunnel and MCP remain healthy
ChatGPT Web stops issuing Secure MCP Tunnel commands after ~59 minutes while tunnel and MCP remain healthy #55 描述的是相近的 ChatGPT 託管端邊界:Tunnel 與本機 MCP 保持健康,但 ChatGPT 後續停止送出 MCP 命令。
本次問題發生得更早,是在應用程式動作/工具探索以及 Manual Refresh 階段。
預期行為
對官方 v0.0.14 embedded MCP stub 成功執行 Refresh 後,ChatGPT 應該能暴露這三個示範工具:
如果目前託管端使用的協定在
server/discover成功後不需要另外送出tools/list,那麼等效的 discovery 流程仍應該讓這三個工具定義出現在應用程式中。如果託管端在成功 discovery 後無法繼續,介面或診斷資料至少應提供一個不洩漏隱私、可機器判讀的失敗原因,而不是只有一般性的重新整理失敗訊息。
問題
main/server/discover後,ChatGPT 託管端預期應經過什麼流程來註冊應用程式工具?main/tools/list,還是目前工具結構會透過其他託管端 discovery 路徑取得?server/discover最終回覆都被控制端接受,但 App 仍然沒有任何可用動作?可提供的證據
如果有需要,我可以透過 OpenAI Support 私下提供:
server/discover的完整命令 request ID;這些內部識別資料刻意不公開貼在 GitHub。
不需要公開任何 prompt 內容、CAT-RV 原始碼、repository 內容、API key、OAuth Client Secret、access token、refresh token、bearer token、瀏覽器 cookie 或其他登入憑證,就能重現目前可觀察到的故障邊界。