[BUG] Re-subscribing the Mono returned by listTools/listResources/listResourceTemplates/listPrompts/listRoots duplicates the results
Maintainer antworten meist innerhalb von 2 Tagen
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 75/100
Rechercherichtung
Finde die fünf aufgeführten Methoden: McpAsyncServerExchange#listRoots() sowie McpAsyncClient#listTools(), listResources(), listResourceTemplates() und listPrompts(). Lies ihre Aufrufe von reduce(seed, accumulator) und das bestehende Test-Fixture für eine gemockte Session, die zwei Roots zurückgibt; überprüfe, dass jedes Abonnement dieselben Ergebnisse zurückgibt. Fertig ist die Arbeit, wenn alle fünf Methoden pro Abonnement einen neuen Akkumulator erstellen und Tests wiederholte Abonnements abdecken.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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.
- Vorherrschende Sprache
- Java
- Sterne
- 3.7k
- Forks
- 1.2k
- Ø Merge
- 3 Std. 38 Min.
- Gemergte PRs (30 T.)
- 5
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus modelcontextprotocol/java-sdk
-
HttpServletStreamableServerTransportProvider: GET stream sends no status or headers until the first eventEvtl. vergeben @karthiksenv hat das vor 10 Tagen übernommen. Offenarea/server area/transport P3
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 86/100
modelcontextprotocol/java-sdk#1155 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
Client request handlers that complete empty send no JSON-RPC responseEvtl. vergeben @1fanwang hat das vor 39 Tagen übernommen. Offenarea/client bug P2
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
modelcontextprotocol/java-sdk#1124 · 5 Kommentare ·
Maintainer antworten meist innerhalb von 2 Tagen
-
ServerCapabilities.logging is added unconditionally, overriding the caller's explicit capabilitiesEvtl. vergeben @1yuxiangJ hat das vor 55 Tagen übernommen. Offenbug P2 ready for work
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
modelcontextprotocol/java-sdk#1086 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 2 Tagen
-
Reject listRoots if not supported by client, without sending any requestEvtl. vergeben @nikita-kibitkin hat das vor 78 Tagen übernommen. Offenenhancement good first issue P3
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
modelcontextprotocol/java-sdk#1067 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 2 Tagen
-
StdioClientTransport missing explicit UTF-8 charset in InputStreamReader (same issue as #295, but on client side)Evtl. vergeben @suryateja-g13 hat das vor 149 Tagen übernommen. Offenbug P2 ready for work
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
modelcontextprotocol/java-sdk#898 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 2 Tagen
Alle Issues in modelcontextprotocol/java-sdk
Ähnliche Issues
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
devops-thiago/ThrillhouseBot#1093 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 67/100
wimdeblauwe/htmx-spring-boot#205 ·
-
[BUG] 增量 SSE 解析器未识别单独 CR 换行,导致事件无法及时交付Evtl. vergeben @king-wwwhhh hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
langchain4j/langchain4j#6669 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
OpenAPITools/openapi-generator#25237 ·
Maintainer antworten meist innerhalb von 1 Tag
-
needs-area-label
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
Maintainer antworten meist innerhalb von 1 Tag