Environment
tunnel-client: 0.0.14+0f870e50a973fa820d4c409000059e181e8d242b
OS: Amazon Linux 2023
Architecture: ARM64 / aarch64
MCP target: Java 21 stdio server using the MCP Java SDK
Startup command:
tunnel-client run --profile pmpmc-src --mcp.stdio-send-initialized-notification
Observed behavior
The tunnel appears healthy:
tunnel-client doctor: PASS
/healthz: HTTP 200, live
/readyz: HTTP 200, ready
The Java MCP child process remains active.
Commands are successfully enqueued and polled.
However, every real tool call from ChatGPT—including one made from a new chat—fails with:
HTTP 504: MCP request timed out
The tunnel log records:
command response deadline reached; dropping without posting a response
Diagnostic evidence
A sanitized strace capture of the Java child during the first tool call after a controlled service restart shows:
Java reads the complete JSON-RPC tools/call request from stdin.
Example request properties:
id: 0
method: tools/call
tool: code_read
Java does not write a response to stdout.
No processing exception is written to stderr.
No initialize request or notifications/initialized notification was observed before the tools/call.
Standalone target tests
The same Java JAR was tested directly over stdio:
initialize + notifications/initialized + tools/list: works.
Numeric and string JSON-RPC IDs: both work.
initialize + notifications/initialized + the same tools/call: works.
notifications/initialized + the same tools/call: also works.
tools/call without initialization: ignored and no response is produced.
This indicates that the MCP server and the tool implementation are functional. The timeout appears to occur because the live stdio target receives tools/call while its MCP session has not been initialized.
Expected behavior
Before forwarding tools/call to a newly started or restarted stdio target, tunnel-client should establish the target's initialized state.
When --mcp.stdio-send-initialized-notification is enabled, the required initialization exchange or notification should reach the stdio target before normal tool requests are dispatched.
Restarting the local target should not leave the tunnel reporting ready while all subsequent MCP requests time out.
Reproduction notes
Reproduced after a controlled restart of tunnel-client.
Reproduced from a completely new ChatGPT conversation.
The production service remained healthy according to its health endpoints.
Tunnel IDs, request IDs, session metadata, organization identifiers, and other sensitive values have been redacted.
Sanitized logs and strace excerpts can be provided if needed.
Environment
tunnel-client: 0.0.14+0f870e50a973fa820d4c409000059e181e8d242b
OS: Amazon Linux 2023
Architecture: ARM64 / aarch64
MCP target: Java 21 stdio server using the MCP Java SDK
Startup command:
tunnel-client run --profile pmpmc-src --mcp.stdio-send-initialized-notification
Observed behavior
The tunnel appears healthy:
tunnel-client doctor: PASS
/healthz: HTTP 200, live
/readyz: HTTP 200, ready
The Java MCP child process remains active.
Commands are successfully enqueued and polled.
However, every real tool call from ChatGPT—including one made from a new chat—fails with:
HTTP 504: MCP request timed out
The tunnel log records:
command response deadline reached; dropping without posting a response
Diagnostic evidence
A sanitized strace capture of the Java child during the first tool call after a controlled service restart shows:
Java reads the complete JSON-RPC tools/call request from stdin.
Example request properties:
id: 0
method: tools/call
tool: code_read
Java does not write a response to stdout.
No processing exception is written to stderr.
No initialize request or notifications/initialized notification was observed before the tools/call.
Standalone target tests
The same Java JAR was tested directly over stdio:
initialize + notifications/initialized + tools/list: works.
Numeric and string JSON-RPC IDs: both work.
initialize + notifications/initialized + the same tools/call: works.
notifications/initialized + the same tools/call: also works.
tools/call without initialization: ignored and no response is produced.
This indicates that the MCP server and the tool implementation are functional. The timeout appears to occur because the live stdio target receives tools/call while its MCP session has not been initialized.
Expected behavior
Before forwarding tools/call to a newly started or restarted stdio target, tunnel-client should establish the target's initialized state.
When --mcp.stdio-send-initialized-notification is enabled, the required initialization exchange or notification should reach the stdio target before normal tool requests are dispatched.
Restarting the local target should not leave the tunnel reporting ready while all subsequent MCP requests time out.
Reproduction notes
Reproduced after a controlled restart of tunnel-client.
Reproduced from a completely new ChatGPT conversation.
The production service remained healthy according to its health endpoints.
Tunnel IDs, request IDs, session metadata, organization identifiers, and other sensitive values have been redacted.
Sanitized logs and strace excerpts can be provided if needed.