Token-aware response paging for MCP servers — chunks large tool responses and delivers them page by page with agent-readable metadata
mcp-pager is a pagination middleware library, not a primary MCP server. The 44 tools are spread across demo/edge-case/real-API servers used for testing the pagination layer. Tool definitions are present with schemas and descriptions, but quality is inconsistent. Many tools have generic or minimal descriptions (e.g., 'EC-1: Returns a small response'). Duplicate tool names (list_records, fetch_logs appear 3x; list_files, ec_json_array, ec_nested_object, ec_log_lines, ec_stress_test, ec_empty, ec_session_a/b, ec_mixed_content, list_photos, list_comments, list_todos, list_pokemon, get_pokemon_detail appear 2x) indicate test/demo servers rather than production tooling. Parameter descriptions are present but often terse. No error handling guidance visible. Output schemas are not documented. This is a utility library, not a polished agent tool suite.
EC-2: Returns a response right at the token limit. Should pass through without pagination.
EC-7: Returns an empty array. Should pass through with no pagination envelope.
EC-6: Returns an empty array. Should pass through with no pagination envelope.
EC-2: Large JSON array. Each page should be valid JSON with complete records.
EC-3: Returns a large JSON array. Each page should be valid JSON with complete records.
EC-4: Log lines. Each page should contain complete log entries (no split mid-line).
EC-5: Returns log lines. Each page should contain complete log entries (no split mid-line).
Duplicate tool names across demo/edge-case/real-API servers (list_records, fetch_logs, list_files, list_photos, list_comments, list_todos, list_pokemon, get_pokemon_detail, ec_* variants appear 2-3x). This indicates test fixtures, not production tooling. Agents cannot distinguish between duplicates.
Edge-case tools (ec_*) have minimal, test-focused descriptions ('EC-1: Returns a small response', 'EC-2: Returns a response right at the token limit'). These are not user-facing and do not guide LLM selection. Descriptions under 20 chars score 0-20.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 39 | 2025-06-18+ | v2 |
EC-8: Mixed markdown + JSON + plain text in one response.
EC-10: Returns mixed markdown + JSON + plain text in one response.
EC-4: Returns a large nested object (not an array). Tests nested array splitting.
EC-3: Large nested object (not a bare array). Tests nested array splitting.
EC-7a: Call this AND ec_session_b simultaneously to test session isolation.
EC-9a: Call this AND ec_session_b simultaneously to test session isolation.
EC-9b: Call this AND ec_session_a simultaneously to test session isolation.
EC-7b: Call this AND ec_session_a simultaneously to test session isolation.
EC-8: Returns paginated data. The cursor expires in 10 seconds — test expiry by waiting before get_next_page.
EC-1: Returns a small response (under token limit). Should NOT paginate.
EC-1: Returns a small response (under token limit). Should NOT paginate.
EC-6: Returns a very large response creating 50+ pages. Tests memory and loop stability.
EC-5: Very large response creating 50+ pages. Tests memory and loop stability.
Fetch demo log lines — returns large log output to demonstrate pagination
Fetch recent application logs for a service
Fetch recent application logs for a service
Generate a report mixing markdown text and JSON data (mixed content edge case)
Retrieve the next page of a paginated tool response
Get full detail for a single Pokémon including all moves (large response)
Get detailed info for a single Pokémon including all moves (large response)
Get COMPLETE detail for a Pokémon — all moves, abilities, sprites, stats (single large object edge case)
Fetch all comments from JSONPlaceholder (500 items)
Fetch all comments from JSONPlaceholder (500 items)
Returns an empty array — tests that mcp-pager passes through small/empty responses unchanged
Recursively list files under a path
Recursively list files under a path
Fetch all photos from JSONPlaceholder (5000 items — large response)
Fetch all photos from JSONPlaceholder (5000 items — large response)
Fetch Pokémon from PokéAPI — returns name, URL, and basic stats
Fetch Pokémon list from PokéAPI (up to 1500 Pokémon)
Fetch all posts with their comments embedded — nested array per record (edge case)
List employee records from the HR database
List employee records from the HR database
List employee records from the HR database
Fetch all todos from JSONPlaceholder (200 items)
Fetch all todos from JSONPlaceholder (200 items)
Search JSONPlaceholder users — returns wrapped object { total, results } (not a bare array)
No output schemas documented. Tools return JSON but LLMs cannot infer field names, types, or structure. Agents must guess what fields are available for downstream tool calls.
No error handling guidance. Tools do not document what errors can occur, whether they are retryable, or what the LLM should do next. Agents cannot recover from failures.
Parameter naming inconsistency: some tools use camelCase (albumId, postId, userId), others use snake_case (album_id, post_id, user_id). This forces LLMs to reason about naming conventions and risks parameter mismatches.