Every tool, and who is shown it
Last updated
An agent's key is shown four tools — read the register, ask permission, hear how a request for approval went, and report what was actually said — and every tool that changes what the company stands behind needs a signed-in person. The table below is generated from reynforce/mcp/server.py's NEEDS, the one mapping of tool to scope, and tests/docs_checks.py reads it: a tool added there without a row here fails the suite, and a row naming a tool that does not exist fails too.
| tool | scope | an agent? | what it answers |
search_claims | register:read | yes | the claims this company stands behind, with each one's status. Capped, because a register with ten thousand entries should not arrive in one reply |
check_action | check | yes | whether an action is permitted, and what to say instead when a claim it cites is not usable. The record is written as a side effect |
report_said | check | yes | after a message went out or a call ended, the words themselves, read by our own detector and set beside what the check declared. Read and not kept: each commitment found is kept as a quotation of at most 1,000 characters, and a difference is a warning, never a block |
approval_status | check | yes | how a request for approval went, by the id check_action handed back: waiting, approved, approved_with_change with the change, declined, or timed_out — never a yes. Reads and changes nothing |
waiting_for_me | register:write | no | the requests agents are waiting on that this person's role may answer, oldest first, each with what the agent wants, which rule asked and how long it has waited |
decide_approval | register:write | no | approves, declines, or approves with a change, with an optional note — one answer per request, recorded under the person's name. An agent can never answer, whatever it holds |
propose_claims | register:write | no | turns a document into proposed claims. Never entries — a proposal nobody has accepted is not something the company stands behind |
assign_owner | register:write | no | sets who stands behind a claim. A claim with no owner is one no agent may use |
accept_claim | register:write | no | accepts one proposed claim, which is the act that makes it citable |
confirm_claim | register:write | no | confirms a claim is still true, which resets its revalidation clock without bumping its version |
raise_contest | register:write | no | says a claim is wrong or contradicted. A contested claim is unusable until the contest is resolved |
start_agent_draft | register:write | no | starts a draft agent for one kind of work, when somebody sets an agent up in their own Claude. A draft is not an agent: it counts towards no plan and lapses 14 days after its last change |
update_agent_draft | register:write | no | sets what the draft does, who it talks to and how, what runs it, and the promise row and contact limits it suggests — checked by the same rules as the screen. The suggestions are saved by a person on the screen |
agent_draft | register:write | no | reads a draft back: its choices, when it lapses, what is left, and the facts it relies on with how many are usable now |
setup_instructions | register:write | no | how to set up an agent from a chat, the same words as this connector's prompt Set up an agent with Reynforce — for a client that shows tools and not prompts |
finish_link | register:write | no | the address of the Reynforce screen with the draft loaded. The agent is made there, and what it connects with is shown there once — never in a chat |
setup_guide | register:write | no | what is left to set up, as the workspace's Ready to go reads it: rules approved, five usable facts, an approver named, an agent connected, its first check — each done or not, with the tool that does it |
read_rules | register:write | no | the rules agents follow, in plain words — six questions with their answers, who answers each Ask first, whether a person has approved them — and the version a change must quote. Reads and changes nothing |
set_rule | register:write | no | answers one of the six questions — may, ask or never — for every agent, recorded under the person's name, through the same save as the settings page |
set_approver | register:write | no | names the directory group asked when an agent must ask first on one topic, recorded under the person's name |
approve_rules | register:write | no | the person stands behind the rules exactly as they read them, recorded under their name against that version |
connect_platform | register:write | no | a platform's steps, in its own field names, and the address of the Reynforce page where its key is made. Never a key: it is shown once, on that page, and never in a chat |
connection_status | register:write | no | whether an agent from a platform has made its first check, and why a recent attempt was refused. Names agents, never keys |
Why the split is where it is
An agent reads and asks; a person decides. Four of them are acts the register records a person taking — reynforce/mcp/tools.py's ACTS names them with the verb each one writes — and an agent key cannot hold the scope they need.
The draft tools are a person's too, and so is the setup prompt, and so is accepting a draft's facts: accept_claim takes one fact at a time, and there is no bulk accept in a chat — accepting every fact at once is a button on the Reynforce screen, where the person can see each one.
check_action is the exception that proves it: it is the agent's first writing tool and it writes no claim. report_said is the second, for the same reason: what it writes is our detector's reading of the words handed over, never a claim and never a change to a check. What it writes is a record of the asking, which is why it needs check rather than register:write.
What a tool never does
| answer around an unusable claim | the three unusable cases all escalate and tell the buyer. Answer anyway is not a setting — it is not expressible |
| hide a refusal | an unusable claim is marked and never filtered out, so you can see the claim you wanted and why you may not cite it |
| write a commitment you send | there is no such tool. See connecting.md |