StdioClientTransport does not propagate unexpected child process exit during initialization
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 55/100
Piste de recherche
Commencez par StdioClientTransport.connect() et le chemin de la requête initialize en attente décrit dans l’issue. Exécutez le reproducteur avec ./mvnw test pour observer le test JUnit en échec, puis vérifiez qu’une sortie inattendue du processus enfant fait échouer rapidement l’initialisation et inclut le code de sortie au lieu d’expirer.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
StdioClientTransport does not propagate unexpected child process exit during initialization
Bug description
When a stdio MCP server process starts successfully and then exits before it can
reply to the initialize request, the client waits for the request timeout and
surfaces a timeout error. The child process exit and exit code are not surfaced
to the caller through the initialize() failure.
This is different from a ProcessBuilder.start() failure: the process is
created successfully, then exits shortly after startup.
This also seems distinct from #937, which is about bounded termination during
shutdown. The failure here happens during initialization, before the client gets
an initialize response.
This also appears to be the lower-level cause behind
spring-projects/spring-ai#5982, where Spring AI waits for its MCP client
initialization timeout instead of reporting the stdio process exit.
Environment
- Java 17+
io.modelcontextprotocol.sdk:mcp:2.0.0-M2- Stdio client transport
Steps to reproduce
I prepared a minimal reproducer:
https://github.com/DragonFSKY/mcp-stdio-exit-reproducer
The reproducer starts a Java child process through StdioClientTransport. The
child process starts successfully and then immediately exits with code 127
before sending an MCP initialize response.
Run:
./mvnw test
The regression test is intentionally written for the expected behavior, so it
fails with the current SDK.
To print the observed behavior directly:
./mvnw -q -DskipTests exec:java
Observed output:
Expected: fail quickly and include child process exit code 127
Actual elapsed millis: 826
Actual exception type: java.lang.RuntimeException
Actual exception message: Client failed to initialize by explicit API call
Stack trace contains TimeoutException: true
Error contains child exit code 127: false
Expected behavior
McpClient.initialize() should fail promptly when the stdio child process exits
unexpectedly during initialization. The failure should include enough context for
the caller to understand that the child process exited, ideally including the
command and exit code.
Actual behavior
McpClient.initialize() waits for the request timeout and reports a timeout. The
exit code is not available in the exception reported to the caller.
Minimal Complete Reproducible example
The reproducer above contains:
- a minimal child process that calls
System.exit(127) - a stdio MCP client using
StdioClientTransport - a failing JUnit test that demonstrates the timeout and missing exit code
From looking at the current implementation, StdioClientTransport.connect()
completes after ProcessBuilder.start() succeeds. If the process exits shortly
afterward, the pending initialize request remains pending until the request
timeout. The exit code is only observed later on close, not propagated to the
pending initialization request.
If this behavior and scope look valid, I would be happy to work on a focused PR.
- Langage dominant
- Java
- Étoiles
- 3.7k
- Forks
- 1.1k
- Merge moyen
- 1 j 15 h
- PR mergées (30 j)
- 9
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de modelcontextprotocol/java-sdk
-
area/transport bug P2
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
modelcontextprotocol/java-sdk#1136 ·
-
area/client bug P2
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
modelcontextprotocol/java-sdk#1124 · 1 commentaire ·
-
ServerCapabilities.logging is added unconditionally, overriding the caller's explicit capabilities Ouvertebug P2 ready for work
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
modelcontextprotocol/java-sdk#1086 · 1 commentaire ·
-
enhancement good first issue P3
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
modelcontextprotocol/java-sdk#1067 ·
-
bug P2 ready for work
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
modelcontextprotocol/java-sdk#898 · 1 commentaire ·
Toutes les issues de modelcontextprotocol/java-sdk
Issues similaires
-
bug
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
apache/cloudstack#14222 ·
-
[BUG]茶杯方块在取茶时会引发崩溃 Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
-
Cannot differ own consent and managed consents in My Consents view and detailed consent view. Ouverte1.0.0-alpha2 Type/Improvement
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
wso2/dpdp-accelerator#272 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
infinispan/infinispan#18150 ·
-
area/frontend
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100