49b9bb6724
Deploy Docs / deploy-docs (push) Failing after 1s
Conformance Tests / client-conformance (push) Failing after 3s
Conformance Tests / server-conformance (push) Failing after 1s
GitHub Actions Security Analysis / zizmor (push) Failing after 1s
CI / checks (push) Failing after 59m20s
CI / all-green (push) Waiting to run
pagination
Walk a paginated resources/list by hand: feed each result's next_cursor
back into list_resources(cursor=...) until it is None. The cursor is an
opaque server-chosen string — never parse it, and never terminate on a falsy
check (an empty string is a valid cursor under the spec).
Run it
# stdio (default — the client spawns the server as a subprocess)
uv run python -m stories.pagination.client --server server_lowlevel
# HTTP — the client self-hosts the server on a free port, runs, then tears it down
uv run python -m stories.pagination.client --http --server server_lowlevel
Drop --server server_lowlevel (on either transport) to run against the
MCPServer variant (single page).
What to look at
client.pymain—async with Client(target, mode=mode) as client:is the whole connection. The story owns the construction;targetis whateverClient()accepts (an in-process server, a transport, or an HTTP URL) and the entry point picks it.client.py—if page.next_cursor is None: break. Termination is key-absent, not falsy;while cursor:would be a spec bug.server_lowlevel.py— the handler owns the cursor encoding (here: an integer offset as a string) and rejects an unrecognised cursor with-32602 Invalid params, the spec-recommended response.server.py—MCPServer's decorator-registered resources are returned in a single page; the inboundcursoris accepted but ignored. The same client loop still terminates correctly after one request.
Caveats
- No
iter_*()helper —Clienthas noiter_resources()/iter_tools()async-iterator yet; the manualwhile Trueloop shown here is the supported pattern. - MCPServer is single-page —
MCPServerignorescursorand never setsnext_cursor. Whether it grows apage_size=knob or stays single-page by design is open; use the lowlevel server when you need to emit pages today.
Spec
See also
resources/, tools/, prompts/ — every */list method paginates the same
way. Reference test: tests/interaction/lowlevel/test_pagination.py.