Skip to content

Queries and actions

Every VibeKit tool is a query or an action. A query reads and nothing leaves the process. An action drafts a transaction group — a payment, a swap, an app call — and that is all it can do by itself. Between the draft and the chain sit a simulation, a human’s approval, and a wallet’s signature, each recorded, each referencing the one before it. The approval names the simulation it reviewed; the signature wraps the exact drafted bytes; a signature over anything else is refused, not recorded.

This is why the model never sees a key and why “the agent did something on chain” is never true. The agent proposed; the machine walked draft → simulated → inspected → awaiting-approval → approved → signed → confirmed; a person and a wallet did the two steps that matter.

The split is derived, not declared: an action is any tool with requiresSigner or mutatesState. MCP marks them destructive, the agent gates them, REST returns the draft, and the reference lists them apart — all from the same flag.

It also settles what a component is: a renderer for one tool’s output. If a component needs logic the output lacks, the tool should return it, so the next surface gets it too.