{"serverId":"mcp-registry/xyz.getava/ava","tools":[{"name":"ava_approve_execute","fixed":{"name":"ava_approve_execute","description":"Human-in-the-loop approve: the one call that actually settles a plan from ava_copilot_turn. It is gated by the bound mandate's status and constraints and by server-side policy limits, and it CAN REFUSE (e.g. mandate paused/cancelled, a policy violation, a stale preview hash); a refusal means no funds moved and no success receipt was written, only a refusal record. Testnet mode settles against simulated balances and returns a receipt + before/after balances, never a real chain. Mainnet mode signs","inputSchema":{"type":"object","required":["executionId","userId","portal"],"properties":{"mode":{"enum":["paper","live"],"type":"string","description":"Default testnet. Live is fail-closed without a submit path."},"portal":{"type":"string","description":"Portal slug matching the pending plan (e.g. sui)"},"userId":{"type":"string","description":"Same userId used on ava_copilot_turn / portfolio"},"executionId":{"type":"string","description":"executionId from actions[].type === approve_execute on the prior copilot turn"},"previewHash":{"type":"string","description":"previewHash from ava_preview_tx. Binds the signature to the artifact the human reviewed; a stale hash fails before signing."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":347,"tokensAfter":347},{"name":"ava_create_agent","fixed":{"name":"ava_create_agent","description":"Register an agent instance under userId, before it has a wallet or a mandate. Mode A (multi-agent): agentId=byo-external + label (e.g. claude-workspace, cursor-arb) for a coding agent that already exists elsewhere. Mode B (hosted): agentId=defi-lend|defi-swap|defi-perp|portfolio hires an Ava-run agent. One userId may own many agent instances; this call alone never touches funds.","inputSchema":{"type":"object","required":["userId","portal","agentId"],"properties":{"label":{"type":"string","description":"Optional label to distinguish agents under one human (e.g. claude-workspace, cursor-home, openclaw-night)."},"portal":{"type":"string"},"userId":{"type":"string"},"agentId":{"type":"string","description":"Catalog id e.g. byo-external, defi-lend, defi-swap, defi-perp, portfolio"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":232,"tokensAfter":232},{"name":"ava_create_mandate","fixed":{"name":"ava_create_mandate","description":"Create a capital mandate: the objective, capital and constraints an agent is allowed to act under, optionally scoped to an agentInstanceId. Example: \"Earn on 500 USDC on Base, max 5% drawdown\". Or pass structured capital {asset,amount,chain}. Creating a mandate moves no money by itself and is not yet signed by an external wallet: it is Ava's own record of what was asked for, not a user-authorised instruction a stranger can rely on. Every later ava_approve_execute run under this mandate is gated ","inputSchema":{"type":"object","required":["portal"],"properties":{"name":{"type":"string"},"portal":{"type":"string"},"userId":{"type":"string"},"capital":{"type":"object"},"message":{"type":"string"},"objective":{"type":"string"},"conditions":{"type":"array"},"constraints":{"type":"object"},"agentInstanceId":{"type":"string","description":"Optional: bind mandate to one agent under the user (BYO or hosted)"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":268,"tokensAfter":268},{"name":"ava_get_receipt","fixed":{"name":"ava_get_receipt","description":"Retrieve the receipt for a prior ava_approve_execute by executionId, the loop's final step. Returns the stored receipt plus its honest proof.standing: none (nothing submitted), unconfirmed (an identifier exists but nothing independent confirmed it), chain-confirmed (the declared chain returned the transaction and it matches what the receipt claims), or chain-contradicted (the chain disagrees with the receipt). A verified receiptHash does not by itself mean chain-confirmed; read proof.standing, n","inputSchema":{"type":"object","required":["executionId"],"properties":{"userId":{"type":"string","description":"Same userId that produced the execution. Required for headerless callers."},"executionId":{"type":"string","description":"executionId returned by ava_copilot_turn / ava_approve_execute."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":235,"tokensAfter":235},{"name":"ava_lend_execute","fixed":{"name":"ava_lend_execute","description":"Execute a REAL lend against one of your mandates. Routes Ava has already settled a mainnet transaction on: Morpho Blue on Base, and Aave v3 on Monad, BNB Chain and Avalanche. Aave v3 on Arbitrum One is wired through the identical pipeline and address-verified, but nothing has ever settled there, so do not describe it as proven. Aave v3 on Optimism and Base, and Compound v3 on Base and Arbitrum, are wired and address-verified but operator-disabled until each settles a real transaction, so calls o","inputSchema":{"type":"object","required":["mandateId","userId"],"properties":{"op":{"enum":["supply","withdraw"],"type":"string","description":"Supply into the venue or withdraw from it. Defaults to supply."},"venue":{"enum":["morpho_blue","aave_v3","compound"],"type":"string","description":"Venue selector for chains carrying more than one wired lend venue. Absent keeps the chain's default: Base -> Morpho, every Aave v3 chain -> Aave v3. On Base, name aave_v3 or compound to reach those routes; naming a venue the chain does not carry refuses rather than rerouting."},"amount":{"type":"string","description":"Human decimal amount of the mandate's asset. Defaults to the mandate's full capital when omitted."},"portal":{"type":"string"},"userId":{"type":"string"},"mandateId":{"type":"string","description":"The mandate authorising this capital. Required: Ava will not choose which of the user's authorisations to spend. From ava_create_mandate or ava_list_mandates."},"previewHash":{"type":"string","description":"The hash returned by the first call, after a human approved that exact artifact. Omit on the first call."},"idempotencyKey":{"type":"string","description":"Your own key for this economic action. Supply the SAME key when retrying: a fresh key per attempt makes every retry look new, which is exactly what defeats single-flight protection. Required for the compound route, whose reservation is durable."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":547,"tokensAfter":547},{"name":"ava_list_mandates","fixed":{"name":"ava_list_mandates","description":"List capital mandates for a userId (optional filter by agentInstanceId).","inputSchema":{"type":"object","required":["userId"],"properties":{"portal":{"type":"string"},"status":{"type":"string"},"userId":{"type":"string"},"agentInstanceId":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":85,"tokensAfter":85},{"name":"ava_preview_tx","fixed":{"name":"ava_preview_tx","description":"Pre-sign preview: build the exact venue artifact (CoW EIP-712 order or unsigned Solana transaction) for a pending plan against the provisioned Turnkey wallet, simulate it where supported, and return it UNSIGNED. Nothing is signed or submitted. Show the artifact to the human, then pass the returned previewHash to ava_approve_execute so the signature covers exactly what was reviewed.","inputSchema":{"type":"object","required":["executionId","userId","portal"],"properties":{"portal":{"type":"string","description":"Portal slug matching the pending plan"},"userId":{"type":"string"},"executionId":{"type":"string","description":"executionId from the prior ava_copilot_turn approve_execute action"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":206,"tokensAfter":206}],"toolsChanged":7,"tokensSaved":0,"todo":[{"tool":"ava_copilot_turn","params":["mode","portal","userId","message"]},{"tool":"ava_create_agent","params":["portal","userId"]},{"tool":"ava_create_mandate","params":["name","portal","userId","capital","message","objective","conditions","constraints"]},{"tool":"ava_eval_mandate","params":["snapshot","mandateId"]},{"tool":"ava_lend_execute","params":["portal","userId"]},{"tool":"ava_list_mandates","params":["portal","status","userId","agentInstanceId"]},{"tool":"ava_plan_standing","params":["userId"]},{"tool":"ava_plan_workflow","params":["userId"]},{"tool":"ava_preview_tx","params":["userId"]},{"tool":"ava_provision_wallet","params":["family","userId"]},{"tool":"ava_session","params":["displayName"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}