[BUG] Re-subscribing the Mono returned by listTools/listResources/listResourceTemplates/listPrompts/listRoots duplicates the results
Les mainteneurs répondent en général sous 2 jours
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 75/100
Piste de recherche
Repérez les cinq méthodes indiquées : McpAsyncServerExchange#listRoots() et McpAsyncClient#listTools(), listResources(), listResourceTemplates() et listPrompts(). Lisez leurs appels à reduce(seed, accumulator) et le fixture de test existant pour une session simulée qui renvoie deux roots ; vérifiez que chaque abonnement renvoie les mêmes résultats. Le travail est terminé lorsque les cinq méthodes créent un nouvel accumulateur pour chaque abonnement et que les tests couvrent les abonnements répétés.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Bug description
The Mono returned by these methods is not safe to subscribe more than once: each
subscription appends to the same mutable accumulator created when the method was called,
so the results grow on every subscription.
Mono<McpSchema.ListRootsResult> listRoots = exchange.listRoots();
listRoots.block().roots().size(); // 2
listRoots.block().roots().size(); // 4 <- duplicated
listRoots.block().roots().size(); // 6
Affected methods (all use reduce(seed, accumulator) with a seed created at assembly
time):
McpAsyncServerExchange#listRoots()McpAsyncClient#listTools()McpAsyncClient#listResources()McpAsyncClient#listResourceTemplates()McpAsyncClient#listPrompts()
Steps to reproduce
Using the existing test fixture (McpAsyncServerExchange with a mocked session that
returns a single page of 2 roots):
Mono<McpSchema.ListRootsResult> listRoots = exchange.listRoots();
System.out.println(listRoots.block().roots().size()); // 2
System.out.println(listRoots.block().roots().size()); // 4
System.out.println(listRoots.block().roots().size()); // 6
Expected behavior
Every subscription starts from an empty accumulator and returns the same result (2 / 2 /
2). Re-subscribing a Mono is a supported Reactor pattern (retry, repeat, cache, reusing
the Mono in several downstream branches), and concurrent subscriptions currently race on
the shared ArrayList too.
Suggested fix
Flux#reduceWith(Supplier, BiFunction) creates the seed per subscription:
.reduceWith(() -> McpSchema.ListRootsResult.builder(new ArrayList<>()).build(),
(allRootsResult, result) -> { ... })
.reduceWith(ArrayList<McpSchema.Tool>::new, (accumulated, result) -> { ... })
Happy to open a PR with the five call sites updated and tests if you agree with the
approach.
- Langage dominant
- Java
- Étoiles
- 3.7k
- Forks
- 1.2k
- Merge moyen
- 3 h 38 min
- PR mergées (30 j)
- 5
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire 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
-
HttpServletStreamableServerTransportProvider: GET stream sends no status or headers until the first eventPeut-être pris @karthiksenv l’a pris il y a 10 jours. Ouvertearea/server area/transport P3
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
modelcontextprotocol/java-sdk#1155 ·
Les mainteneurs répondent en général sous 2 jours
-
Client request handlers that complete empty send no JSON-RPC responsePeut-être pris @1fanwang l’a pris il y a 39 jours. Ouvertearea/client bug P2
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
modelcontextprotocol/java-sdk#1124 · 5 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
ServerCapabilities.logging is added unconditionally, overriding the caller's explicit capabilitiesPeut-être pris @1yuxiangJ l’a pris il y a 55 jours. Ouvertebug P2 ready for work
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
modelcontextprotocol/java-sdk#1086 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
Reject listRoots if not supported by client, without sending any requestPeut-être pris @nikita-kibitkin l’a pris il y a 78 jours. Ouverteenhancement good first issue P3
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
modelcontextprotocol/java-sdk#1067 · 2 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
StdioClientTransport missing explicit UTF-8 charset in InputStreamReader (same issue as #295, but on client side)Peut-être pris @suryateja-g13 l’a pris il y a 149 jours. Ouvertebug P2 ready for work
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
modelcontextprotocol/java-sdk#898 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
Toutes les issues de modelcontextprotocol/java-sdk
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
devops-thiago/ThrillhouseBot#1093 ·
Les mainteneurs répondent en général sous 1 jour
-
Missing htmx attribute processorOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 67/100
wimdeblauwe/htmx-spring-boot#205 ·
-
[BUG] 增量 SSE 解析器未识别单独 CR 换行,导致事件无法及时交付Peut-être pris @king-wwwhhh l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
langchain4j/langchain4j#6669 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
OpenAPITools/openapi-generator#25237 ·
Les mainteneurs répondent en général sous 1 jour
-
needs-area-label
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour