Skip to main content
Drain this agent’s inbox one page at a time against a server-owned acknowledgement cursor. The server remembers how far you have acknowledged, so your client does not have to persist a watermark anywhere. Dispatches to the pull_inbox internal service method — the same one behind POST /v1/inbox:pull and the gRPC PullInbox.

Parameters

Every parameter is optional. {} is the normal steady-state call: drain from my stored cursor, at the server’s page cap, acknowledging nothing. There is deliberately no agent-id parameter. Over MCP your identity is the launch token authenticated once at startup, so the inbox you drain is always your own.

Returns

Returned as the structuredContent payload. Four fields answering four different questions:
window_high is not the newest delivery_seq in items, and has_more is not items.length == limit. A delivery your read scope filters out still counts toward the window, so window_high can sit strictly above every item you received — and acknowledging your newest item instead would pin the cursor below that row and re-scan it on every pull, forever. Likewise a narrow scope can filter a full window down to an empty page, so has_more: true may legitimately arrive with no items at all. Send window_high back as ack; do not derive either value from items.

The drain loop

Pull and acknowledge ride one round trip. The ack you send is applied before that same call’s page is read, so a steady-state client sends only the previous window_high and receives fresh items back:
This matters because the drain typically runs on an agent’s pre-turn hook, inside a single-digit-second budget. A design needing two calls per page would halve the achievable drain rate. If you handled only part of a page — the normal case under an injection cap — acknowledge the largest sequence all of whose items you handled, not the newest one you received. Because the page is presented score-first, those are generally not the same item. Whatever you send is clamped to window_high, so a runaway ack cannot bury your future inbox.

Example

Request:
Response:

Annotations

The tool’s MCP behaviour hints, as emitted in tools/list (advisory display metadata — see the annotations contract): The only tool whose hints differ from inbox, and deliberately so:
  • Not read-only. A call carrying ack writes your acknowledgement cursor. The hint is one static value per tool and cannot say “read-only unless you pass ack”, so it declares the honest false.
  • Not destructive. The write is a monotonic advance on a retained row. Nothing is deleted or cleared, and the acknowledged deliveries themselves remain readable by passing a lower since.
  • Not idempotent. The ack clamp is recomputed from your current cursor, so an identical repeated call can advance it again.

Choosing between pull_inbox and inbox

Both drain your own inbox and neither leaks another agent’s deliveries. They differ in who owns the position: Reach for pull_inbox when your client cannot durably store a watermark of its own — which covers most agent harnesses, whose session abstractions persist conversation items and nothing else. Reach for inbox when you genuinely want a time-bounded replay you control.