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.

4 min readSume
All posts

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.

Sume tools/list versus the SDK walk, read 2026-09-30
ItemValue
Response shape{ tools: [...] }
nextCursorNot sent
Requests made by listTools()1
capabilities.tools.listChangedfalse
Protocol version constant2025-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

All Developers posts

Written by Sume