What it is
Open a research page you can edit and the assistant sits under the comment
rail. Ask it a question about the page (“what was the realised bonus on the
largest liquidation in this range?”) and it answers from three things: the
page itself, the pages in your space that search finds for the question, and
the platform’s own tools. Those are the same tools an agent gets over
MCP: the liquidation and health-factor datasets, price bars, the
event registry, your research pages. When it needs a figure it calls a tool
and reads the result; it is told never to type a number a tool did not
return, and the tools never estimate.
Every tool it runs is on the transcript, with the arguments it passed, in
the same line it appears in the MCP log. If an answer surprises you, the
receipt shows where it came from.
Proposals: it never writes
Three of the tools record something: append_research_block (a block on a
page), cite_query (an aggregate over a dataset, cited by hash) and
get_canonical_series (a price series, cited by hash). From the panel none
of them writes. Each call becomes a card with one button:
- Insert this block puts the proposed prose or block into the editor at
your cursor (or at the end, if you have not placed it yet). Your next
autosave writes the row, as it does for anything you type. - Cite this value computes the aggregate as you, records the derived
citation in the page’s space, and inserts its{{derived:N}}token. The
chip shows the value with its label; the citation carries its query and a
public hash, so a reader can check it at/citations/<hash>. - Cite this series records the canonical series and inserts a citation
card with its hash.
Nothing happens until the click. Close the panel with a proposal unapplied
and nothing has changed on the page or in the citation index. Over MCP the
same three tools do write, under the research:write scope a key has to be
minted with; the assistant on a page acts as you, through the same save the
editor uses, so it needs no key and no scope.
Sources
Under the answer, “Drew on” lists the pages in your space whose text
matched the question, from the same search the workspace bar runs. The
assistant sees those pages’ matching passages and the whole of the page you
are on: the prose, and for a block that names something on chain (a
transaction, a price series, a query) the spec, never the snapshot. A very
long page is cut to a budget and the assistant is told how many blocks it
did not see.
The budget
The meter under the box is the month’s spend against your plan’s
ai_tokens_per_month limit, counted on your billing organization: a
ten-seat team shares one budget. Tokens are what the API reports for each
request (input, output, and cache reads), summed over the turn and recorded
after it; a turn the assistant refused costs nothing. When the month’s
budget is spent the box closes and the panel says so, with the date it
resets. The transcript lives in your browser for the life of the page;
nothing of the conversation is stored.
When it says no
The panel states its own state rather than answering around it:
- No key. The deployment has no
ANTHROPIC_API_KEY, so there is no
model to ask. The rest of the page works as before. - Not on your plan. The
ai_assistantfeature is a plan feature; see
plans. - Budget spent. The month’s tokens are used; the meter shows the figure.
- The tool could not answer. A null in a result is a value the platform
could not derive (an oracle it has not replicated, a token whose decimals
are still being looked up), and the assistant is told to say so rather
than fill it in.
The space-wide question page at /research/assistant is still there for
“which of our pages touch this?”; it answers from your pages alone and needs
no tools.
For developers
The model is a setting: ASSISTANT_MODEL in the environment, defaulting to
claude-sonnet-5. One class speaks to the API (ResearchAssistant::Client,
over the official anthropic gem); one registry defines the tools
(McpTools), and McpTools::Adapter is how both the MCP endpoint and the
panel see it. The panel streams over Server-Sent Events from
POST /research/pages/:id/assistant; a proposal is applied with
POST /research/pages/:id/assistant/apply, which returns the block for the
editor to insert. The design and its reasons are in
docs/RESEARCH_WORKSPACE.md, “The assistant”.