Tools
RobotMoney's MCP surface exposes 21 tools across seven capability groups. Each tool requires a specific scope, granted to the agent via on-chain registration in BrainMCPAgentRegistry. None of them accept a tenant_id argument -- the tenant comes from the JWT, never from the request body.
At a Glance
ledger.account.get
Ledger read
ledger:read
No
ledger.accounts.list
Ledger read
ledger:read
No
ledger.transactions.list
Ledger read
ledger:read
No
ledger.obligations.list
Ledger read
ledger:read
No
ledger.counterparties.list
Ledger read
ledger:read
No
wiki.question
Wiki read
wiki:read
No
wiki.page.get
Wiki read
wiki:read
No
raw.contribute
Raw
raw:write
Yes (writes Raw artifact)
raw.artifact.get
Raw
raw:read
No
payment_intent.propose
PaymentIntent
payment_intent:propose
Yes (writes PaymentIntent in Ledger)
payment_intent.cancel
PaymentIntent
payment_intent:propose
Yes (cancels own proposal)
payment_intent.list
PaymentIntent
ledger:read
No
authorizations.create
Authorizations
payment_intent:propose
Yes (records an authorization)
authorizations.get
Authorizations
payment_intent:propose
No
authorizations.approve
Authorizations
member authority
Yes (records a review decision)
authorizations.reject
Authorizations
member authority
Yes (records a review decision)
agent.action.propose
Agent action
execution:propose
Yes (writes Proposal)
proposals.list
Proposals read
execution:read
No
proposals.get
Proposals read
execution:read
No
proposals.decide
Proposals read
member authority (see below)
Yes (records a human decision)
evidence.resolve
Proposals read
execution:read
No
Ledger Reads
ledger.account.get
Fetch a single account by id.
Returns the full Ledger account row including current_balance, available_balance, provenance, confidence, and the source_ids and evidence_ids arrays.
ledger.accounts.list
List accounts for the calling tenant.
status
string
Optional: active, closed, frozen, pending
account_type
string
Optional
limit
integer
Optional, 1-500
ledger.transactions.list
Filter Ledger transactions. There is no cursor or amount-range filter on this tool.
account_id
string
Optional, filter to one account
counterparty_id
string
Optional
direction
string
Optional: inflow, outflow, transfer, adjustment
status
string
Optional: pending, posted, cleared, failed, reversed, disputed
since
ISO date-time
Optional lower bound
until
ISO date-time
Optional upper bound
limit
integer
Optional, 1-1000
ledger.obligations.list
List the tenant's outstanding obligations: bills, invoices, subscriptions, loans, rent, payroll, tax, card statements. This tool does not accept a counterparty_id filter.
status
string
Optional: upcoming, due, paid, overdue, cancelled, disputed
type
string
Optional
due_before
ISO date-time
Optional
limit
integer
Optional, 1-500
ledger.counterparties.list
Search counterparties by name or type.
q
string
Optional, fuzzy-matches counterparty name
type
string
Optional: merchant, vendor, customer, employer, bank, wallet, exchange, tax_authority, other
limit
integer
Optional, 1-500
There is no verified_status filter on this tool. The response items include verified_status per counterparty, but it cannot be used to filter the query.
Wiki Reads
wiki.question
Ask the tenant's financial brain a natural-language question. The answer grounds in Ledger rows, not Wiki text. Wiki provides retrieval scaffolding; cited facts come from the Ledger.
question
string
Required, 1-2000 characters
as_of
ISO date-time
Optional
max_evidence_depth
integer
Optional, 1-5
Returns a content array whose first entry's text is the rendered question and answer, plus structuredContent with the typed answer, evidence (an array of { entityId, entityType, excerpt }), model, and token usage.
wiki.page.get
Fetch a Wiki page by slug or id. Eight page types are available: /accounts/{id}, /counterparties/{id}, /obligations/{id}, /invoices/{id}, /agents/{id}, /policies/{id}, /monthly-summaries/{YYYY-MM}, /cash-flow/{period}.
slug_or_id
string
Required
The response includes the markdown body, structured sections (Current Truth, Key Linked Entities, Recent Activity, Open Questions, Risk Notes, Timeline, Evidence Links), and the source_revision checksum at render time.
Raw
raw.contribute
Push a Raw artifact into the tenant's Raw layer. The artifact is content-addressed by SHA-256 and attributed to the agent's on-chain registration record (agent_id, agent_role are written into source_ref automatically). It is ingested with source_type=agent_contributed.
payload
string
Required. Artifact bytes as a string: JSON, plain text, or base64.
mime_type
string
Optional, default application/json
source_ref
object
Optional: additional source-specific identifiers
There is no artifact_type argument and no signature argument. RobotMoney does not accept or verify a caller-supplied signature on this tool; attribution comes from the authenticated agent principal, not from a signed payload.
Confidence on derived Ledger rows is capped at 0.5 for provenance=agent_contributed. Tenant or human review is required to lift the cap.
raw.artifact.get
Read one tenant-scoped raw artifact's provenance metadata and parsed evidence. Does not return blob_uri and does not mint a signed URL for the underlying bytes.
raw_id
string
Required
include_parsed
boolean
Optional, default true: include parser outputs
PaymentIntent Propose
payment_intent.propose
Propose a financial action. RobotMoney creates a PaymentIntent row in the Ledger in proposed status, runs Policy, and returns a decision. No execute path on MCP.
action_type
string
Required: ach_outbound, ach_inbound, wire, onchain_transfer, erp_writeback, card_payment, x402_settle, escrow_release (same enum as the HTTP API). x402_settle additionally requires pay_to; escrow_release requires escrow_id + job_terms_hash.
source_account_id
string
Required
destination_counterparty_id
string
Required
amount
decimal string
Required
currency
string
Required: ISO-4217 (3 letters) for fiat rails, USDC for on-chain settlement types
obligation_id
string
Optional: links the intent to an obligation
invoice_id
string
Optional
evidence_ids
array of strings
Optional
pay_to
string
Required only for x402_settle: 0x EVM address
escrow_id, job_terms_hash
string
Required only for escrow_release: 0x bytes32 each
There is no idempotency_key argument on this or any other MCP tool. Retry deduplication for payment_intent.propose is enforced the same way the underlying PaymentIntentService.create enforces it for the HTTP route, not by a caller-supplied key at the tool layer.
Response includes the payment_intent_id, the PolicyDecision, and the next-step instruction (pending_approval with required approvers, or approved if policy returned auto).
payment_intent.cancel
Cancel a PaymentIntent the calling agent itself proposed, while it is still in proposed or pending_approval state. Only the proposing agent may cancel one of its own intents; the underlying service also enforces that cancel is reachable only from those two states.
intent_id
string
Required
payment_intent.list
List the calling agent's own PaymentIntents. Tenant- and agent-scoped: agent_id is forced server-side to the calling agent, so a caller can never list another agent's intents even if it tries to supply one. This tool requires ledger:read, not payment_intent:propose.
status
string
Optional: proposed, pending_approval, approved, paused, dispatching, rejected, executed, failed, cancelled
limit
integer
Optional, 1-100
Authorization Decisions
These tools mirror the HTTP Authorizations API. They are decision-only: they do not create a PaymentIntent and they do not move money. MCP authorizations.create and authorizations.get are scoped to the calling agent. MCP review tools require a human review context and enforce the same member authority checks as the HTTP review routes.
authorizations.create
Request a policy decision for a customer-owned external rail movement.
idempotency_key
string
Required. Replays return the same decision.
execution
string
Required for headless use: external.
action_type
string
Required: one of the supported authorization action types.
amount
decimal string
Required.
currency
string
Required.
destination_counterparty_id
string
Required.
invoice_id
string
Optional duplicate key.
reference
string
Optional duplicate key.
evidence_ids
array of strings
Optional.
simulate
boolean
Optional. When true, writes no authorization or audit decision row.
authorizations.get
Read one authorization that belongs to the calling MCP agent.
authorization_id
string
Required
authorizations.approve
Approve a needs-review authorization. This is a human review tool, not an agent tool. The underlying service resolves the member actor, checks member authority, and records the review decision.
authorization_id
string
Required
authorizations.reject
Reject a needs-review authorization.
authorization_id
string
Required
reason
string
Optional comment
Agent Action Propose
agent.action.propose
Propose a non-financial action. Used by reconciliation, anomaly, or any agent action that does not move money. Unlike the HTTP surface, this tool takes a single free-form action object rather than separate action_type/payload/linked_entities fields.
action
object
Required. Free-form JSON object validated against the policy DSL on evaluation. Must include a string kind field.
There is no top-level action_type, payload, linked_entities, or idempotency_key argument -- those all live (or do not exist at all) inside the action object itself, at the policy DSL's discretion.
The proposal goes through Policy and lands as a proposals row. Approval and dispatch follow the standard flow.
Proposals and Evidence
These four tools mirror the HTTP Proposals API exactly. They share its read model and decision service, so tenant scoping, actor resolution, member authority, and the money-path approval gates behave identically over MCP.
proposals.list
List customer-facing agent proposals across payment intents and non-money findings. Tenant-scoped and cursor-paginated.
type
string
Optional: one of the public proposal types.
status
string
Optional: lifecycle status filter.
risk_band
string
Optional: low, standard, elevated, high.
min_confidence
number
Optional: float in [0, 1].
limit
integer
Optional: 1 to 100.
cursor
string
Optional: pagination cursor.
Public proposal types are vendor_risk, payment, collections, treasury, cash_forecast, dispute, compliance, revenue_intel, reconciliation, subscription, fraud_anomaly, personal_budget, financial_health, purchase_advisor, tax_prep, travel_finance, bill_management, debt_optimization, and savings.
Each returned proposal mirrors the HTTP read model, including the compact fields plus stored_action_type, details, policy, presentation, and available_decisions. Stored action names are mapped to public proposal types by RobotMoney Core before they are returned. For example, flag_transaction returns as fraud_anomaly, block_payment as vendor_risk, and propose_match as reconciliation; ambiguous names such as notify resolve through the agent role.
proposals.get
Read one tenant-scoped proposal by id.
proposal_id
string
Required
proposals.decide
Record a human decision on a proposal. Delegates to the same decision service as the HTTP route, including user-principal actor resolution, active-member checks, approval-role checks, money-path approval gates, and audit.
proposal_id
string
Required
decision
string
Required: approve, reject, acknowledge, undo
evidence.resolve
Resolve typed proposal evidence refs into tenant-scoped summaries and deep links where the ref kind is supported.
refs
array
Required: up to 50 { kind, ref } pairs.
Resolution fails closed: a supported ref that does not exist returns not_found, and an unsupported kind or malformed ref returns resolvable: false with a reason, never an error. Resolvable kinds: account, counterparty, invoice, obligation, transaction, wiki_entity.
Per-Call Scope Enforcement
Even with the right top-level scope, each tool call is scope-checked at invocation. A token with ledger:read cannot call wiki.question. A token with wiki:read cannot call raw.contribute. The MCP layer rejects scope mismatches with JSON-RPC error -32002 (scope insufficient / tenant mismatch). -32004 is reserved for pre-execution gate failures; the not-found family of errors (a valid-looking id that does not resolve to anything, e.g. ledger_row_not_found, payment_intent_not_found) is -32602. See the error reference.
What's Next
Last updated
