# MCP oversized list-limit proof

Linux, Node 26.13.1. Each side runs the real source server and web app with `T3CODE_DEV_SEED=0 vp run dev`, in a separate checkout with fresh `.t3` state. No live database or provider account is used.

Base: 47e24f6cc2fc9a45a44f71ce0fc5bfd5abb01ceb
Head: 6130c440adc5c600f08806fad4153ee8eca1e95e

The replay provider emits recorded results rather than making MCP calls, so this proof uses an external deterministic ACP driver. The server launches it in a real thread and supplies the thread's normal MCP endpoint and credential. The driver calls the real HTTP `/mcp` endpoint; it does not import schemas, mock handlers, or predict responses. It records all actual JSON-RPC responses. The assistant table displayed in the app is a compact presentation of those responses: project rows retain only their titles, and errors retain their code and first message line. The attached JSON preserves the complete responses except for redacted local filesystem prefixes.

For each fresh checkout:

1. Run `vp i`.
2. Put `setup.py` and `probe-agent.mjs` beside each other in a temporary directory.
3. Run `python3 setup.py <checkout> <response-file.json>` before starting the app. This registers the local ACP driver, disables real model providers and creates a synthetic git workspace. Start with a new output filename on each run.
4. Run `T3CODE_DEV_SEED=0 vp run dev` in that checkout and wait for startup.
5. Run `node apps/server/src/bin.ts project add .t3/limit-demo --title 'MCP limit demo' --base-dir .t3`.
6. Run `node apps/server/src/bin.ts thread start .t3/limit-demo 'Prove MCP list limits: oversized, cap, zero and negative; one call each, no retries.' --title 'MCP limit results' --provider proof --model probe --wait --json --base-dir .t3`.
7. Pair the web client and open the returned thread. Captures use the same Chromium preview browser, light theme, CSS viewport 1600x1500, device scale 2. Both captures are identically cropped to the central app pane (physical pixels 520,0 through 2600,2020) to omit the machine label and surrounding panels. The crop is unchanged across screenshots taken more than 500 ms apart.

Every run sends one initialize, then exactly twelve tools/call requests, with no retries:

- Oversized: t3_project_list {limit:200}; t3_queue {action:'list',limit:200}; t3_preview_list {limit:100}.
- Cap-sized controls: limits 100, 100 and 50.
- Invalid controls: each tool with 0, then each with -1.

Both sides contain the synthetic project plus the dev server's automatically created 'server' project. Queue and preview sessions are empty; agent browser access remains disabled. The preview browser used for these captures is separate from the isolated server and was opened after the MCP calls completed.

Observed: base returns -32602 for every oversized request. Head returns the two available projects, empty queue items and empty preview sessions, each with nextCursor:null. Cap-sized calls succeed on both sides. Zero and negative limits return -32602 on both sides.

Not demonstrated: a populated page reaching its cap, or following a non-null pagination cursor; this reproduction uses the available small page.
