I was able to solve this problem, so here’s a solution for posterity.
I hit the same generic error when calling tools through ChatGPT:
ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
The MCP server itself was healthy, the Secure MCP Tunnel was connected, and ChatGPT could discover the connector and its tools. However, every tool call failed. ChatGPT sometimes presented this as an expired connection, which made it initially look like an authentication or tunnel problem.
The issue was MCP resource discovery. ChatGPT calls resources/list while initializing or using a connector. My server registered tools but did not register any resources. Adding one valid, readable resource fixed every tool call immediately:
server.registerResource(
"campaign-tracker-about",
"campaign://tracker/about",
{
title: "Campaign tracker information",
description: "Identifies this MCP server and its purpose.",
mimeType: "text/plain",
},
async (uri) => ({
contents: [{
uri: uri.href,
mimeType: "text/plain",
text: "Live campaign tracker.",
}],
}),
);
The important details were:
- The resource had a valid URI:
campaign://tracker/about.
- The URI returned by the read callback matched the registered URI.
- The advertised and returned MIME types matched.
- Both
resources/list and resources/read were tested directly afterward.
I also added this regression test:
const resources = await client.listResources();
assert.deepEqual(
resources.resources.map((resource) => resource.uri),
["campaign://tracker/about"],
);
const about = await client.readResource({
uri: "campaign://tracker/about",
});
assert.match(about.contents[0].text, /Live campaign tracker/);
After restarting the MCP server and refreshing the ChatGPT connector, get_current_location and the other tools began working through the same tunnel and authentication configuration.
Environment:
Node.js v25.8.0
@modelcontextprotocol/server 2.0.0
@modelcontextprotocol/node 2.0.0
@modelcontextprotocol/client 2.0.0
OpenAI Secure MCP Tunnel
I cannot see the nested exception that ChatGPT swallowed, so I cannot prove the precise internal cause. However, adding a valid resource catalog was the only material server-side change, and it changed the connector from consistently failing to consistently working. A more specific error mentioning resources/list or resource registration would have made this substantially easier to diagnose.