[BUG] Re-subscribing the Mono returned by listTools/listResources/listResourceTemplates/listPrompts/listRoots duplicates the results
Mantenedores costumam responder em até 2 dias
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 75/100
Direção de pesquisa
Encontre os cinco métodos listados: McpAsyncServerExchange#listRoots() e McpAsyncClient#listTools(), listResources(), listResourceTemplates() e listPrompts(). Leia as chamadas a reduce(seed, accumulator) e o fixture de teste existente para uma sessão simulada que retorna duas roots; verifique se cada inscrição retorna os mesmos resultados. O trabalho estará concluído quando os cinco métodos criarem um novo acumulador por inscrição e os testes cobrirem inscrições repetidas.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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.
- Linguagem predominante
- Java
- Estrelas
- 3.7k
- Forks
- 1.2k
- Merge médio
- 3h 38min
- PRs com merge (30d)
- 5
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de modelcontextprotocol/java-sdk
-
HttpServletStreamableServerTransportProvider: GET stream sends no status or headers until the first eventTalvez já em andamento @karthiksenv assumiu há 10 dias. Abertaarea/server area/transport P3
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 86/100
modelcontextprotocol/java-sdk#1155 ·
Mantenedores costumam responder em até 2 dias
-
Client request handlers that complete empty send no JSON-RPC responseTalvez já em andamento @1fanwang assumiu há 39 dias. Abertaarea/client bug P2
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
modelcontextprotocol/java-sdk#1124 · 5 comentários ·
Mantenedores costumam responder em até 2 dias
-
ServerCapabilities.logging is added unconditionally, overriding the caller's explicit capabilitiesTalvez já em andamento @1yuxiangJ assumiu há 54 dias. Abertabug P2 ready for work
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
modelcontextprotocol/java-sdk#1086 · 1 comentário ·
Mantenedores costumam responder em até 2 dias
-
Reject listRoots if not supported by client, without sending any requestTalvez já em andamento @nikita-kibitkin assumiu há 78 dias. Abertaenhancement good first issue P3
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
modelcontextprotocol/java-sdk#1067 · 2 comentários ·
Mantenedores costumam responder em até 2 dias
-
StdioClientTransport missing explicit UTF-8 charset in InputStreamReader (same issue as #295, but on client side)Talvez já em andamento @suryateja-g13 assumiu há 149 dias. Abertabug P2 ready for work
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
modelcontextprotocol/java-sdk#898 · 1 comentário ·
Mantenedores costumam responder em até 2 dias
Todas as issues de modelcontextprotocol/java-sdk
Issues semelhantes
-
[BUG] 增量 SSE 解析器未识别单独 CR 换行,导致事件无法及时交付Talvez já em andamento @king-wwwhhh assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
langchain4j/langchain4j#6669 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
OpenAPITools/openapi-generator#25237 ·
Mantenedores costumam responder em até 1 dia
-
needs-area-label
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
quelea-projection/Quelea#711 ·
-
bug pdd
Dificuldade 2/5 Menos de uma hora Facilidade para iniciantes 67/100
objectionary/eo#9450 ·
Mantenedores costumam responder em até 1 dia