Repository navigation
Issue Report: Infinite Loop in MCP Client When Handling Empty nextCursor During Tool Listing #628
Description
1. Title
Infinite Loop in MCP Client When Processing Empty nextCursor During listTools() Call
2. Description
The MCP Java SDK client enters an infinite loop when processing the /tools response from Alibaba Cloud DashScope MCP applications. The client incorrectly interprets an empty nextCursor value ("") as a signal to continue pagination, resulting in repeated requests that eventually time out (10s default timeout).
Affected SDK Version: io.modelcontextprotocol.client:client-java:0.14.1 (and likely all prior versions)
3. Steps to Reproduce
- Configure MCP client to connect to Alibaba Cloud DashScope MCP application with
market-cmapi00035184(Global IP Geolocation) - Call
client.listTools() - Observe repeated HTTP requests to
/toolsendpoint
java编辑McpClientConfig config = McpClientConfig.builder() .addHeader("Authorization", "Bearer YOUR_API_KEY") .build();McpSyncClient client = McpClient.connect(
"https://dashscope.aliyuncs.com/api/v1/mcps/market-cmapi00035184/mcp",
config
);
List<Tool> tools = client.listTools(); // Triggers infinite loop
4. Expected Behavior
The client should:
- Receive a single
/toolsresponse - Detect that
nextCursoris empty ("") - Exit pagination loop immediately
- Return the tool list without timeout
5. Actual Behavior
The client:
- Receives valid tool list response with
nextCursor: "" - Incorrectly interprets empty string as needing pagination
- Sends repeated
/toolsrequests (e.g.,2e9e1828-904,2e9e1828-905,2e9e1828-906) - Eventually fails with
TimeoutExceptionafter 10s
Error Log:
log编辑[DEBUG] Sending message for method tools/list (ID: 2e9e1828-904) [DEBUG] Received JSON message: {"jsonrpc":"2.0","id":"2e9e1828-904","result":{"nextCursor":"","tools":[...]}} [DEBUG] Sending message for method tools/list (ID: 2e9e1828-905) [DEBUG] Received JSON message: {"jsonrpc":"2.0","id":"2e9e1828-905","result":{"nextCursor":"","tools":[...]}} [DEBUG] Sending message for method tools/list (ID: 2e9e1828-906) ... [ERROR] TimeoutException: Did not observe any item within 10000ms
6. Key Evidence
| Test Case | Application ID | HTTP Response | SDK Behavior |
|---|---|---|---|
| Working | market-cmapi00035184 (IP Geolocation) | {"nextCursor":"","tools":[...]} | Infinite loop → Timeout |
| Working | market-cmapi00035184 (IP Geolocation) | curl -H "Authorization: Bearer KEY" https://dashscope.aliyuncs.com/api/v1/mcps/market-cmapi00035184/mcp/tools | Returns valid JSON (no loop) |
12. Resolution Plan
- Patch: Implement the fix in
McpClientSession.java(as shown in Section 8) - Test: Add unit tests for empty string handling (see Test Plan)
- Release: New SDK version
1.0.1 - Documentation: Update README with pagination best practices
Note: The fix does not affect applications that return
nextCursor: null
Reported By: moyuyanli
Date: October 20, 2025
SDK Version: io.modelcontextprotocol.client:client-java:0.14.1
Platform: Java 11+
Environment: Alibaba Cloud DashScope MCP (v1.0)
Activity
chemicL commentedon Feb 20, 2026
This looks like a duplicate of #575. Please reopen if I'm mistaken.
io.modelcontextprotocol.client.McpAsyncClient#listTools()never returns if theresult.nextCursor()is an empty string instead of a null #575