MCP listTools nextCursor: Sume returns a single page
TypeScript SDK 2.2.0 follows nextCursor in listTools(). Sume's tools/list returns a tools array with no cursor, so the walk ends after one request.

Sume's tools/list returns one page: the response is an object with a tools array and no nextCursor. The TypeScript SDK's cursor-following listTools() therefore stops after one request, and the array it returns is the full list for your credential.
The SDK change is from its GitHub release notes, read 2026-09-30. The server behavior is from packages/mcp-server/src/mcp.ts and the MCP tools and gates page.
What changed in the SDK?
The 2.2.0 notes say list calls return the whole list: listTools(), listPrompts(), listResources() and listResourceTemplates(), called without a cursor, now follow nextCursor until the server stops sending one. A listMaxPages option still caps the walk.
What does Sume send back?
The handler for tools/list returns { tools: listRemoteMcpTools(request) }. There is no cursor field, so the SDK sees no nextCursor and ends its loop. The list is filtered for the credential, so two keys can see different arrays; see what tools/list shows.
| Item | Value |
|---|---|
| Response shape | { tools: [...] } |
nextCursor | Not sent |
Requests made by listTools() | 1 |
capabilities.tools.listChanged | false |
| Protocol version constant | 2025-11-25 |
Do I need listMaxPages?
Not for Sume: one request is made either way. Keep it if the same client also talks to other servers that do paginate, since the release notes say it caps the walk.
Will the list change during a session?
The server declares listChanged: false for tools, so it does not promise change notifications. Call listTools() again when you reconnect or rotate credentials, instead of waiting for an event. Related: list changed and reconnect in Claude Code.
import { Client } from "@modelcontextprotocol/client";
declare const client: Client; // already connected to https://mcp.sume.com/mcp
const { tools } = await client.listTools();
console.log(tools.length, tools.slice(0, 5).map((t) => t.name));Sources
Related posts
More in Developers
- MCP OAuth token expires: Sume's one-hour token, no refresh
Sume's hosted MCP OAuth access tokens last one hour and the server advertises only the authorization_code grant, so re-login or use an API key for long runs.
- MCP traceparent in _meta: tracing a Sume tool call end to end
MCP 2026-07-28 documents traceparent in _meta. Sume's docs don't describe reading it, so correlate with the job id and x-sume-request-id instead.
- OAuthFlowError issuer mismatch in the MCP Python SDK 2.2
Python SDK 2.2 rejects authorization server metadata whose issuer is not the server's origin. Sume's metadata sets issuer to the MCP origin.
- MCP Python SDK idle session 404: what it means for Sume jobs
Python SDK 2.2 closes stateful sessions idle for 30 minutes, then 404s. Sume's hosted MCP is POST-only; re-poll jobs_wait with the same ids, never resubmit.
Written by Sume