{"serverId":"mcp-registry/io.github.ox31461/robyn","tools":[{"name":"null_balance","fixed":{"name":"null_balance","description":"Reads an address balance through the NULL server-side RPC proxy, so YOUR IP never reaches any public RPC provider (this host queries upstream from its own address). BE HONEST ABOUT THE TRADE: querying a stealth address you derived LINKS that address, your session, and the time of interest AT THIS RELAY — exactly the linkage stealth addressing hides from everyone else. Nothing reaches the RPC about you, but if relay-side unlinkability matters, batch several addresses (including decoys) in one sit","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["address"],"properties":{"address":{"type":"string","description":"0x address (e.g. a derived stealth payment address)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"NULL Pay — IP-blind balance read"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":219,"tokensAfter":219},{"name":"null_calls_info","fixed":{"name":"null_calls_info","description":"What the blind call relay offers (1:1 and conference, codecs, join-token model). Media keys are sealed through the feed and never reach the relay. Calls themselves need a media-capable client (browser); agents can read the posture and hand a human the join flow.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true},"title":"NULL Calls - capabilities of the IP-blind voice/video relay"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":113,"tokensAfter":113},{"name":"null_capsule_cancel","fixed":{"name":"null_capsule_cancel","description":"Destroys a future-dated capsule you sent with {holdMs, cancellable:true}, using its one-time cancel token. Already-released rows are untouchable. The token proves nothing about who you are. Private-lane-only: use the stdio door.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["token"],"properties":{"token":{"type":"string","description":"the one-time cancel token returned when the capsule was sent (20-64 url-safe chars)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"title":"NULL Lifeline - cancel an UNRELEASED time capsule (\"I am safe\") (lane)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":153,"tokensAfter":153},{"name":"null_market_delist","fixed":{"name":"null_market_delist","description":"Relays a fresh (<10 min) self-issued card whose claim is {purpose:\"delist\"} - a public listing card can never be replayed to delist someone. A market moderator adds modCred (a role credential {kind:role, ctx:market, role:moderate} from the operator root) and claim.target to remove another listing.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["card"],"properties":{"card":{"type":"string"},"modCred":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"title":"NULL Agent Market - remove a listing (relay of a FRESH delist card)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":152,"tokensAfter":152},{"name":"null_market_list","fixed":{"name":"null_market_list","description":"Relays a NULLCRED1 card the agent issued ABOUT ITSELF (subject = issuer = its own meta; SDK credentialIssue, or the stdio door null_market_list_me which mints it for you). One listing per identity, 30 days, re-post to refresh. Past half-full a NEW listing needs one Plus pass (pass). Note: this door sees your IP next to a public card that names you - the stdio door (npx anygas-mcp) submits over the relay, IP-blind.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["card"],"properties":{"card":{"type":"string","description":"NULLCRED1.<...> self-issued card"},"pass":{"description":"a Plus pass, only when the market is over half full","type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"NULL Agent Market - list an agent (relay of a card you SIGNED locally)"},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: pass. Change to number/boolean/array where that's what you accept.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":212,"tokensAfter":216},{"name":"null_market_listings","fixed":{"name":"null_market_listings","description":"Every current listing {card, at}; identical for every reader. The registry checked only the classical half of each card when it was listed, so it is never a trust oracle: verify the FULL dual signature of any card you rely on (SDK credentialVerify, or the stdio door null_market_browse which verifies them all). Listings age out after 30 days.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"title":"NULL Agent Market - the public listing set (verify each card yourself)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":137,"tokensAfter":137},{"name":"null_names_market","fixed":{"name":"null_names_market","description":"Live listings of premium handles for sale, plus the full deal protocol: agree peer-to-peer in a sealed chat, pay stealth or via NULL Escrow 2-of-3, then finalize with the dual-signed (secp + ML-DSA) witness-chained transfer and a 2% ($1 min) fee receipt. Listing your own handle: sign null-name-list/v1|name|priceUsd|ts with your identity spend key and POST /api/nullnames/list.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"NULL Names - the secondary market (signed listings + how to buy/sell/transfer)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":146,"tokensAfter":146},{"name":"null_prekeys_fetch","fixed":{"name":"null_prekeys_fetch","description":"Fetches {spk, sigSpk, otk, otksLeft} for a recipient so you can start an X3DH-PQ forward-secret session (SDK: fs.startOutbound). ALWAYS fetch by META-ADDRESS: the sigSpk check verifies against the meta-address spendPub (sha256(\"null-fs-spk/v1:\"+spk), secp256k1) and CANNOT run on a handle fetch (the SDK tags those fsUnverified — treat as unauthenticated keys). The nonce is MANDATORY and idempotent: a retry with the SAME nonce returns the SAME one-time key instead of draining the pool; use a fresh","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["recipient","nonce"],"properties":{"nonce":{"type":"string","description":"12-64 url-safe chars; SAME nonce on retry = same key returned, no drain"},"recipient":{"type":"string","description":"st:eth:0x… meta-address (REQUIRED for the SPK signature check; a handle fetch returns unverifiable keys)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"NULL forward secrecy — fetch a peer prekey bundle (consumes one one-time key)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":271,"tokensAfter":271},{"name":"null_prekeys_publish","fixed":{"name":"null_prekeys_publish","description":"Makes you reachable with forward secrecy: publishes your signed prekey bundle (medium-term spk + one-time otks) so peers can start X3DH-PQ sessions TO you. Generate and sign locally with the SDK (fs.genBundle + publishPrekeys — sigSpk is secp256k1 over sha256(\"null-fs-spk/v1:\"+spk) by your spend key; sig is EIP-191 over the bundle statement). The server VERIFIES sigSpk against the meta-address’s own spend key and binds the slot to that identity — no other wallet can occupy or squat your slot, an","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["address","metaAddress","spk","sigSpk","otks","ts","sig"],"properties":{"ts":{"type":"number","description":"unix seconds, ±10 min"},"sig":{"type":"string","description":"EIP-191 signature over the prekey statement by address"},"spk":{"type":"string","description":"base64 hybrid ML-KEM-768+X25519 pubkey"},"otks":{"type":"array","items":{"type":"string"},"maxItems":50,"minItems":1,"description":"base64 one-time pubkeys"},"handle":{"type":"string"},"sigSpk":{"type":"string","description":"compact secp256k1 hex over sha256(\"null-fs-spk/v1:\"+spk) by the identity spend key"},"address":{"type":"string"},"metaAddress":{"type":"string","description":"st:eth:0x…"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"NULL forward secrecy — publish a PRE-SIGNED prekey bundle"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":373,"tokensAfter":373},{"name":"null_prov_mint","fixed":{"name":"null_prov_mint","description":"Relays a provenance request you signed LOCALLY (SDK mintProvenance builds it): {meta, claim, ts, sig, bind, sig2}. A post-quantum identity MUST include sig2 (ML-DSA) or the issuer refuses. The issuer checks your signature + identity binding and countersigns - the claim is REGISTERED, not endorsed. ts must be current epoch-ms (+-10 min); claim values <=200 chars. Private-lane-only: use the stdio door.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["meta","claim","ts","sig","bind"],"properties":{"ts":{"type":"number","description":"epoch ms, fresh"},"sig":{"type":"string","description":"secp256k1 compact signature over the mint hash, by your spend key (SDK)"},"bind":{"type":"string","description":"spend-key signature binding the issuer key (SDK)"},"meta":{"type":"string","description":"your st:eth:0x... meta-address"},"sig2":{"type":"string","description":"base64 ML-DSA-65 over null-prov-mint/v2|<meta>|<claimCanon>|<ts> - REQUIRED when your identity publishes a post-quantum key"},"claim":{"type":"object","description":"flat string claim, e.g. {model, purpose}","additionalProperties":{"type":"string"}}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"NULL Agent Wire - issuer-countersigned provenance for a claim YOU signed (lane)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":344,"tokensAfter":344},{"name":"null_void_descriptor","fixed":{"name":"null_void_descriptor","description":"Returns a pseudonymous channel descriptor {descriptor, witness:{ts}}; the 3.3 KB ML-DSA signature and the handle-ownership proof come as separate parts (part=sig | part=proof) because they cannot share one 8 KiB lane reply. Verify all three locally (SDK voidVerifyDescriptor) before following. Private-lane-only (a direct lookup would tell the gateway which channel your IP wants): use the stdio door.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["handle"],"properties":{"part":{"enum":["sig","proof"],"type":"string","description":"omit for the descriptor, or sig / proof"},"handle":{"type":"string","description":"the channel owner handle"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"NULL VOID - fetch a channel descriptor by handle (lane)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":215,"tokensAfter":215},{"name":"null_void_publish","fixed":{"name":"null_void_publish","description":"Relays {descriptor, proof:{ts, sig}} built and signed LOCALLY (SDK voidCreate + voidSignDescriptor + the handle-ownership proof). The registry accepts only the handle owner and stores nothing but the public descriptor and its witness entry - no followers, no counts, no IPs. Private-lane-only: use the stdio door.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["descriptor","proof"],"properties":{"proof":{"type":"object","required":["ts","sig"],"properties":{"ts":{"type":"number"},"sig":{"type":"string"}},"description":"handle-ownership proof from the SDK","additionalProperties":false},"descriptor":{"type":"object","description":"the signed descriptor object from the SDK","additionalProperties":{}}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"NULL VOID - publish a channel descriptor YOU signed (lane)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":230,"tokensAfter":230},{"name":"robyn_7702_check","fixed":{"name":"robyn_7702_check","description":"Check that a signed EIP-7702 authorization tuple recovers the expected account, and whether its nonce matches the live account nonce. Free, read-only, moves nothing.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["chainId","authorization"],"properties":{"chainId":{"type":"number","description":"chain the authorization targets"},"authorization":{"type":"object","required":["address","nonce","yParity","r","s"],"properties":{"r":{"type":"string"},"s":{"type":"string"},"nonce":{"type":["number","string"]},"address":{"type":"string","description":"the delegate contract"},"chainId":{"type":["number","string"]},"yParity":{"type":["number","string"]}},"description":"the signed 7702 authorization tuple","additionalProperties":false}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Verify an EIP-7702 authorization"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":238,"tokensAfter":238},{"name":"robyn_7702_delegate","fixed":{"name":"robyn_7702_delegate","description":"The canonical Robyn EIP-7702 batch-executor delegate: its address on each of the 22 EVM chains, the ABI, and the EIP-712 scheme for executeSigned. Delegate to this and the relayer can sponsor your transactions. Read-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true},"title":"EIP-7702 delegate + rail info"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":103,"tokensAfter":103},{"name":"robyn_counterparty_check","fixed":{"name":"robyn_counterparty_check","description":"Your OWN payment history with a recipient address: how many times, how recently, and whether this amount is typical. Call it before paying an address you have not confirmed. THIS IS NOT A REPUTATION SCORE and says nothing about whether the address is honest. A familiar address is NOT a safe address — keys get compromised. Never tell a user an address is \"trusted\" or \"safe\" on the basis of this. A `first-time-recipient` result is NOT a warning about the recipient — every legitimate relationship h","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["toAddress"],"properties":{"amount":{"type":"string"},"toAddress":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Have I paid this address before?"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":213,"tokensAfter":213},{"name":"robyn_cross_chain","fixed":{"name":"robyn_cross_chain","description":"Plan a gasless cross-chain move and get the exact payload to sign. This hosted server never holds your key: call this, sign what it returns with your own wallet, then call robyn_submit to have the relayer broadcast it and pay the gas.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["fromChain","fromToken","amount","toChain","toToken"],"properties":{"amount":{"type":"string","description":"amount in fromToken base units"},"toChain":{"type":["number","string"]},"toToken":{"type":"string","description":"token address / symbol on the destination"},"fromChain":{"type":["number","string"]},"fromToken":{"type":"string","description":"token address on the source chain"},"toAddress":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Move value cross-chain, gasless"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":229,"tokensAfter":229},{"name":"robyn_delivery_stats","fixed":{"name":"robyn_delivery_stats","description":"How long settlements ACTUALLY take, per rail and per corridor — not a single advertised constant. CHECK `basis`/`status`: below the sample threshold this returns `insufficient-data` and the figure is a static ESTIMATE, not a measurement. Say which you are quoting when you tell a user how long something will take.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true},"title":"Measured delivery times"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":129,"tokensAfter":129},{"name":"robyn_evidence_bundle","fixed":{"name":"robyn_evidence_bundle","description":"Assembles EVERYTHING about a settled transfer in one call: the on-chain verification, the unit-by-unit fee breakdown, what the alternative route would have cost, and whether the delivery time is measured or estimated — signed as a whole. This is the artefact to hand to a principal who was not there; swapping any component invalidates the signature. READ `verdict` BEFORE PRESENTING IT: the bundle verdict is the WEAKEST of its parts. A complete fee breakdown does not mean the transfer was confirme","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string","description":"settled transfer id"},"minAmount":{"type":"string","description":"assert the minimum that should have arrived"},"recipient":{"type":"string","description":"assert who should have been paid"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"One signed bundle of all evidence about a transfer"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":257,"tokensAfter":257},{"name":"robyn_improve_cost","fixed":{"name":"robyn_improve_cost","description":"Turns a price into a decision. Returns concrete, QUANTIFIED changes — a cheaper destination chain with the exact saving, the size at which a fixed payout cost stops dominating, whether the instant float lane applies, and whether rails that would have competed were unavailable. CRITICAL: suggestions with `changesOutcome: true` move WHERE THE MONEY LANDS. Never apply those silently as cost savings — confirm with the user that the alternative destination is acceptable first, or you will have saved ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["fromChain","toChain","amount"],"properties":{"amount":{"type":"string"},"toChain":{"type":["number","string"]},"toToken":{"type":"string"},"fromChain":{"type":["number","string"]},"fromToken":{"type":"string"},"toAddress":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"What would make this transfer cheaper?"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":254,"tokensAfter":254},{"name":"robyn_integration_lint","fixed":{"name":"robyn_integration_lint","description":"Post the request you INTEND to make and get back what is missing or unsafe, with the concrete consequence. Run this before your first live execute. Findings marked `unsafe` can lose money or make you report something untrue — fix them, do not proceed. IMPORTANT: it lints the REQUEST only. A clean lint does NOT mean your integration is correct — it cannot see whether you branch on all three verification verdicts or treat `undetermined` as success.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["endpoint","payload"],"properties":{"payload":{"type":"object","description":"the body you intend to send","additionalProperties":{}},"endpoint":{"type":"string","description":"the endpoint you intend to call"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Is the request I am about to send safe?"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":233,"tokensAfter":233},{"name":"robyn_mandate_check","fixed":{"name":"robyn_mandate_check","description":"Check a proposed spend against a signed spending mandate BEFORE making it. Returns WITHIN_MANDATE, EXCEEDS_MANDATE or EXPIRED plus the remaining budget. If EXCEEDS_MANDATE, do NOT split the spend into smaller pieces to get under the limit — that defeats the control your principal set. Ask them to raise the budget. NOTE THE SCOPE: a mandate covers spending THROUGH ROBYN only. It is not custody and does not stop spending elsewhere with the same key.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["mandateId","amount"],"properties":{"amount":{"type":"string","description":"proposed spend in base units"},"mandateId":{"type":"string","description":"the mandate digest"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"title":"Does this spend fit the budget my principal set?"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":222,"tokensAfter":222},{"name":"robyn_mandate_cosign_request","fixed":{"name":"robyn_mandate_cosign_request","description":"For mandates with a co-sign threshold, check whether a specific spend needs the principal to approve it and get the exact digest they must sign. The digest binds the mandate, the transfer AND the amount, so an approval cannot be reused for a different payment — do not attempt to reuse one. If a large spend is refused for want of a countersignature, present the digest to the principal rather than splitting the spend to slip under the threshold.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["mandateId","transferId","amount"],"properties":{"amount":{"type":"string"},"mandateId":{"type":"string"},"transferId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Does this spend need the principal to approve it?"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":213,"tokensAfter":213},{"name":"robyn_mandate_list","fixed":{"name":"robyn_mandate_list","description":"List all mandates granted by a principal address, with remaining budget, co-sign threshold, expiry and revocation state. Use this before telling a user they are safe: live mandates can still be drawn against WITHOUT further approval, and a forgotten grant is the one that hurts. Anything they no longer intend to honour should be revoked.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["principal"],"properties":{"principal":{"type":"string","description":"the principal address"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Every budget a principal has granted"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":169,"tokensAfter":169},{"name":"robyn_mandate_status","fixed":{"name":"robyn_mandate_status","description":"Remaining and consumed budget for a signed mandate. Consumption counts ONLY transfers verified on-chain, so the figure cannot be inflated by claiming spends that did not happen.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["mandateId"],"properties":{"mandateId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"How much of my budget is left?"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":114,"tokensAfter":114},{"name":"robyn_message_directory","fixed":{"name":"robyn_message_directory","description":"Every published v2 mailbox. PUBLIC rows carry {address, metaAddress, kemPub}; PRIVATE rows (the default since 2026-08-28) carry {handle, metaAddress, kemPub} and deliberately NO address. Identical for every reader, so fetching it reveals nothing about whom you intend to message — pick the recipient locally. Seal with the SDK: seal({metaAddress, kemPub}, {text, ts, from?, sig?}). Read-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true},"title":"Messaging v2 — all mailboxes (oblivious lookup)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":151,"tokensAfter":151},{"name":"robyn_message_feed","fixed":{"name":"robyn_message_feed","description":"Returns released rows {id, ephemeralPubKey, viewTag, ct, releaseAt, nextAfter}, identical for every reader. Scan locally with the SDK (inbox(identity)) — checkStealthAddress with your viewPriv, then open ct with your KEM secret. Page with after=<nextAfter> (exact compound cursor — never skips same-tick rows); since=<releaseAt ms> also works but is best-effort at page boundaries. Read-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"after":{"type":"string","description":"exact compound cursor from a prior page’s nextAfter (preferred for paging)"},"limit":{"type":"number","description":"1–200, default 100"},"since":{"type":"number","description":"releaseAt cursor in ms (default 0)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Messaging v2 — public feed to scan with your viewing key"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":229,"tokensAfter":229},{"name":"robyn_message_info","fixed":{"name":"robyn_message_info","description":"Sonar — PRIVATE · SEALED · POST-QUANTUM MESSENGER (broadcast to everyone, understood by one, remembered by none). Hybrid ML-KEM-768+X25519 encryption, a one-time stealth handle per message, fixed-size ciphertexts, 60 s release grid. The server stores only (ephemeralPubKey, viewTag, ct) — no sender, no recipient, no IP. Returns mode, ciphertext sizes, release grid, cover-row rate and the honest anonymity accounting (kContribution is 0: rotating handles give unlinkability, not extra participants).","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true},"title":"Sonar (private messenger) — status, suite and parameters"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":180,"tokensAfter":180},{"name":"robyn_message_mailbox_of","fixed":{"name":"robyn_message_mailbox_of","description":"For a Robyn name or NULL handle the server must resolve it, so this reveals your intended recipient to the server — prefer robyn_message_directory when you have an address. Returns {address|handle, metaAddress, kemPub} (private-handle rows carry no address by design). Read-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["addressOrName"],"properties":{"addressOrName":{"type":"string","description":"0x address, a NULL handle (e.g. alice.null), or label.robyn.id / .robynchain.eth / .rhood.eth"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Messaging v2 — resolve a Robyn name to its mailbox"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":176,"tokensAfter":176},{"name":"robyn_message_publish_mailbox","fixed":{"name":"robyn_message_publish_mailbox","description":"Registers a mailbox so others can seal to you. PRIVATE BY DEFAULT: the server stores only a salted hash of your signing address — pass `handle` to be reachable by name (agents get the same handle claim browsers have), or `public:true` to bind your bare 0x address in the open directory instead. Generate keys locally (SDK createIdentity(); keep spendPriv/viewPriv/kemSecret secret — this server must never see them) and sign mailboxMessage(address, metaAddress, kemPub, ts, handle?) with the wallet o","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["address","metaAddress","kemPub","ts","sig"],"properties":{"ts":{"type":"number","description":"unix seconds used in the signed message (±10 min)"},"sig":{"type":"string","description":"EIP-191 signature by address"},"handle":{"type":"string","description":"claim a reachable-by-name handle (3-32 chars a-z 0-9 . _ -); must be in the signed statement"},"kemPub":{"type":"string","description":"base64 hybrid ML-KEM-768+X25519 public key"},"public":{"type":"boolean","description":"true = legacy public mode: your 0x address appears in the directory"},"address":{"type":"string"},"metaAddress":{"type":"string","description":"st:eth:0x<spendPub><viewPub>"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Messaging v2 — publish a PRE-SIGNED mailbox"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":372,"tokensAfter":372},{"name":"robyn_message_send","fixed":{"name":"robyn_message_send","description":"Relays a message you sealed locally with /svc/msg2-sdk.mjs (seal(mailbox, inner) → {ephemeralPubKey, viewTag, ct}). This tool cannot encrypt for you: sending plaintext here would expose it to the relay, so it only accepts the sealed triple. Replay-idempotent (a resend returns duplicate:true). The message appears in the public feed at releaseAt. If you cannot run the SDK, use v1 (POST /api/messages/send) and know that v1 is plaintext.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["ephemeralPubKey","viewTag","ct"],"properties":{"ct":{"type":"string","description":"base64 ciphertext from seal(); must be one of the fixed bucket sizes"},"viewTag":{"type":"string","description":"0x + 1 byte from seal()"},"ephemeralPubKey":{"type":"string","description":"0x + 33-byte compressed secp256k1 point from seal()"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Messaging v2 — deliver an ALREADY-sealed message"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":261,"tokensAfter":261},{"name":"robyn_netting_enroll_payload","fixed":{"name":"robyn_netting_enroll_payload","description":"Returns the EXACT message the account must sign with its OWN key to open a custodial balance. This endpoint holds no key and enrols nobody — it returns the text; the user signs it, then POST {address, signature} to /api/netting/enroll. CUSTODIAL — this is the ONE part of Robyn that holds your balance; every other tool here moves funds without Robyn ever holding them. Tell the user that plainly before they enrol. Show the user the full consent text before they sign it: it states that the balance ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["address"],"properties":{"address":{"type":"string","description":"the address that will own the netting account"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Get the consent text a user must sign to open a netting account"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":222,"tokensAfter":222},{"name":"robyn_netting_info","fixed":{"name":"robyn_netting_info","description":"Explains the opt-in netting ledger: transfers between two ENROLLED accounts settle as a book entry — no chain, no gas, no fee, instant, at ANY size including amounts below every per-chain cost floor. CUSTODIAL — this is the ONE part of Robyn that holds your balance; every other tool here moves funds without Robyn ever holding them. Tell the user that plainly before they enrol. Read-only. Returns the caps, the published limits and the fee model.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true},"title":"What netting accounts are (opt-in, custodial)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":165,"tokensAfter":165},{"name":"robyn_netting_preview","fixed":{"name":"robyn_netting_preview","description":"Free and read-only. Given an amount, ranks EVERY exit chain by what actually arrives after the destination payout cost is deducted. Those costs differ by more than 1000x (Avalanche delivers ~$0.99994 of a dollar; Linea ~$0.927), so which chain you leave on is a real decision. Pass toChain to price one chain and learn whether it would succeed at all. Internal transfers between netting accounts remain free at any size — this cost applies only to leaving for a real on-chain balance.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["amount"],"properties":{"amount":{"type":"string","description":"amount in USDC base units (6dp), e.g. \"1000000\" = $1.00"},"toChain":{"type":["number","string"],"description":"price a single chain instead of ranking all"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"What a netting withdrawal would actually deliver"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":246,"tokensAfter":246},{"name":"robyn_netting_statement","fixed":{"name":"robyn_netting_statement","description":"Internal transfers produce NO transaction hash because no transaction occurs — this append-only journal is their only record. Never truncated; page with `before` (a seq number). Use this when a user asks to verify or dispute an internal payment, since there is no chain to check.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["address"],"properties":{"limit":{"type":"number","description":"max entries (default 200)"},"before":{"type":"string","description":"return entries with seq below this, for paging"},"address":{"type":"string","description":"EVM address (0x…)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Full, untruncated netting history for an address"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":195,"tokensAfter":195},{"name":"robyn_netting_transfer_payload","fixed":{"name":"robyn_netting_transfer_payload","description":"Returns the exact string to sign, with the correct next nonce, for a free instant transfer between two ENROLLED accounts. Signs nothing and moves nothing — the sender signs the returned message, then POSTs {from,to,amount,nonce,signature} to /api/netting/transfer. BOTH parties must already be enrolled: Robyn will not hold a balance for a recipient who never consented, so to pay an unenrolled address use the ordinary non-custodial route instead.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["from","to","amount"],"properties":{"to":{"type":"string","description":"recipient (must ALSO be enrolled)"},"from":{"type":"string","description":"sender (must be enrolled)"},"amount":{"type":"string","description":"USDC base units (6dp)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Build the message to sign for a FREE internal transfer"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":243,"tokensAfter":243},{"name":"robyn_payment_request_prepare","fixed":{"name":"robyn_payment_request_prepare","description":"Build a canonical payment request (payee, chain, token, amount, memo, expiry) and return the digest for THE PAYEE to sign with their own wallet. Robyn does not sign these and holds no payee keys — a request signed by Robyn would prove nothing about the payee. Use this when an agent needs to ASK another agent for money in a way the payer can actually check.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["payee","chain","amount"],"properties":{"memo":{"type":"string"},"chain":{"type":["number","string"],"description":"destination chain id or name"},"payee":{"type":"string","description":"address that should be paid"},"token":{"type":"string"},"amount":{"type":"string","description":"base units"},"expiresInSec":{"type":"number"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Prepare a payment request for the payee to sign"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":242,"tokensAfter":242},{"name":"robyn_payment_request_settlement","fixed":{"name":"robyn_payment_request_settlement","description":"After paying, prove it: re-checks the transfer against the DESTINATION CHAIN and confirms the payee was paid at least the amount requested. Returns paid=true only on a verified on-chain result; paid=null means undetermined, which is NOT evidence you satisfied the request.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["request","signature","transferId"],"properties":{"request":{"type":"object","additionalProperties":{}},"signature":{"type":"string"},"transferId":{"type":"string","description":"the transfer that paid it"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"title":"Prove a payment request was satisfied on-chain"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":185,"tokensAfter":185},{"name":"robyn_payment_request_verify","fixed":{"name":"robyn_payment_request_verify","description":"ALWAYS run this before paying a request you received. It confirms the payee address, chain, token and amount were signed by whoever controls the payee address, and that the request has not expired. If `signedByPayee` is false, DO NOT PAY — that is what an altered payee address looks like, and address substitution is the most common theft in this space. A valid signature proves AUTHENTICITY, not that the payment is owed and not that the payee is trustworthy.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["request","signature"],"properties":{"request":{"type":"object","description":"the canonical request object","additionalProperties":{}},"signature":{"type":"string","description":"the payee signature"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Verify a payment request before paying it"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":235,"tokensAfter":235},{"name":"robyn_plan","fixed":{"name":"robyn_plan","description":"Validate a WHOLE multi-step workflow up front instead of one hop at a time. Fees and durations accumulate across steps. Evaluation stops at the first unroutable step rather than reporting speculative results behind it. If the plan cannot work, the response names the BINDING CONSTRAINT and the value that would work (`bindingConstraint`, `whatWouldMakeThisWork`) — use that to adjust rather than retrying blindly. READ-ONLY: nothing is signed, reserved or moved. Use this before spending on step one.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["steps"],"properties":{"steps":{"type":"array","items":{"type":"object","required":["fromChain","toChain","amount"],"properties":{"amount":{"type":"string"},"toChain":{"type":["number","string"]},"toToken":{"type":"string"},"fromChain":{"type":["number","string"]},"fromToken":{"type":"string"},"toAddress":{"type":"string"}},"additionalProperties":false},"description":"the hops, in order"},"constraints":{"type":"object","properties":{"maxStepSeconds":{"type":"number"},"maxTotalFeeBps":{"type":"number"},"maxTotalSeconds":{"type":"number"},"requireNonCustodial":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Validate a multi-step plan before executing any of it"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":356,"tokensAfter":356},{"name":"robyn_plus_claim","fixed":{"name":"robyn_plus_claim","description":"Submit BLINDED tokens (base64, from plus-sdk blindTokens()) with the payment txHash. Payment is verified on-chain (recipient, amount, confirmation; one tx pays one invoice), then each blinded token is signed blind. Unblind locally (plus-sdk claim() does all of this). This tool never sees an unblinded pass.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["invoiceId","blinded"],"properties":{"txHash":{"type":"string","description":"EVM payment tx; omit for btc"},"blinded":{"type":"array","items":{"type":"string"},"maxItems":500,"minItems":1},"invoiceId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Plus — claim blind signatures after paying"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":194,"tokensAfter":194},{"name":"robyn_plus_info","fixed":{"name":"robyn_plus_info","description":"Plus sells capacity (rate-limit-exempt sends), funded cover rows and signed/anchored Merkle proofs — never a \"more private lane\" (that would be a smaller crowd). Paid in ETH (Robinhood Chain, Ethereum, Arbitrum, Base), USDC (Base, Arbitrum) or BTC (Chainflip). Redeemed with RFC 9474 blind passes the server cannot link to any payment. Returns products, assets, the mint public key (JWK) and honest what-we-learn / what-we-do-not. Read-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true},"title":"Plus — what is sold, prices, mint key"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":163,"tokensAfter":163},{"name":"robyn_plus_invoice","fixed":{"name":"robyn_plus_invoice","description":"Creates an invoice for one bundle (500 passes, $3 quoted in the chosen asset). Returns {invoiceId, payTo, amount (base units), human, chainId, expires}. Pay from any wallet; then blind tokens locally with the SDK and call robyn_plus_claim. For btc pass refundAddress (your BTC address) — the invoice returns a Chainflip deposit address.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["asset"],"properties":{"asset":{"enum":["eth-4663","eth-1","eth-42161","eth-8453","usdc-8453","usdc-42161","btc"],"type":"string"},"refundAddress":{"type":"string","description":"btc only"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Plus — create an invoice"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":194,"tokensAfter":194},{"name":"robyn_plus_invoice_status","fixed":{"name":"robyn_plus_invoice_status","description":"Status, remaining passes and payment details for an invoice. Read-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["invoiceId"],"properties":{"invoiceId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Plus — invoice status"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":86,"tokensAfter":86},{"name":"robyn_plus_trial","fixed":{"name":"robyn_plus_trial","description":"Try Plus before paying: submit up to 20 BLINDED tokens (base64, from plus-sdk blindTokens()) and receive blind signatures — identical BLINDED passes to paid ones (the server never sees a pass; unlinkable to the claim only once the Plus mint key is pinned in the witness-chained head, K3, and only to the IP if the claim rides Tor — claims use the direct lane). One trial per day per caller. Unblind locally (plus-sdk trial() does all of this). This tool never sees an unblinded pass.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["blinded"],"properties":{"blinded":{"type":"array","items":{"type":"string"},"maxItems":20,"minItems":1}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Plus — 20 FREE passes per day (no payment)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":211,"tokensAfter":211},{"name":"robyn_preflight","fixed":{"name":"robyn_preflight","description":"Run this before robyn_prepare/robyn_submit. Returns decision GO or NO_GO plus typed `blockers` (each with a `fix`) and `warnings`. It catches, for free, the failures that otherwise cost gas: a fixed corridor fee that would consume the whole amount so nothing arrives, a recipient in the wrong address family, a corridor that can price but not settle, and a transfer above the instant lane's capacity that would silently pay a dearer bridge. Read-only — signs nothing, moves nothing. Pass fromAddress ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["fromChain","toChain","amount"],"properties":{"amount":{"type":"string","description":"amount in fromToken base units (e.g. \"5000000\" = 5 USDC)"},"toChain":{"type":["number","string"],"description":"destination chain id or non-EVM name"},"toToken":{"type":"string"},"fromChain":{"type":["number","string"],"description":"source chain id, or \"solana\"/\"stellar\"/\"tron\"/\"bitcoin\""},"fromToken":{"type":"string","description":"symbol or address; omit for the chain default"},"toAddress":{"type":"string","description":"recipient — validated against the destination chain family"},"fromAddress":{"type":"string","description":"sender — determines membership and therefore fee tier"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Check a transfer will succeed BEFORE spending anything"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":377,"tokensAfter":377},{"name":"robyn_preflight_full","fixed":{"name":"robyn_preflight_full","description":"ONE call combining serviceability, routing competitiveness, cheaper alternatives, delivery basis and mandate budget into a single go/no-go. Call this before executing rather than making five separate checks. BLOCKERS AND WARNINGS ARE DIFFERENT. `blockers` WILL fail — do not attempt the transfer. `warnings` are things to tell the user or act on first; they do not prevent execution. Never present a warning as a failure or a blocker as advice. Anything in `unavailable` means a check could NOT run: ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["fromChain","toChain","amount"],"properties":{"amount":{"type":"string"},"toChain":{"type":["number","string"]},"toToken":{"type":"string"},"fromChain":{"type":["number","string"]},"fromToken":{"type":"string"},"mandateId":{"type":"string","description":"check the spend against this budget too"},"toAddress":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Everything you should know before you move money"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":279,"tokensAfter":279},{"name":"robyn_privacy_posture","fixed":{"name":"robyn_privacy_posture","description":"ONE read that tells you, for a chain and for the lane you reached Robyn on, exactly what stays private (relay lane, PQ transport, private mempool / sequencer) and what is still public (on-chain settlement, stealth is not PQ), the live mode of every privacy feature (messaging v2, Plus, netting-set shadow/live, cover rows), and how to raise your quota WITHOUT an identity (a blind Plus pass instead of an API key). Call it first when planning; it reads live flags, never a brochure.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"chainId":{"type":["number","string"],"description":"chain to assess (e.g. 1, 8453, 42161)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"What is private, what is public — before you act"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":209,"tokensAfter":209},{"name":"robyn_receipt_deliver","fixed":{"name":"robyn_receipt_deliver","description":"Hands a relayer-signed settlement receipt (from robyn_settle / a completed route) to the counterparty's sealed messaging-v2 mailbox, so they get verifiable proof (terms honored, authorized, clean provenance) WITHOUT ever contacting Robyn. Same wire shape as any message; content-hash idempotent. Only receipts signed by this relayer are accepted.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["to"],"properties":{"to":{"type":"string","description":"counterparty address or Robyn name with a v2 mailbox"},"pass":{"description":"optional Plus pass {preparedMsg,sig} to skip the lane rate limit","type":"string"},"receipt":{"description":"the signed receipt object","type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"title":"Deliver a settlement receipt to a counterparty, sealed"},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: pass, receipt. Change to number/boolean/array where that's what you accept.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":216,"tokensAfter":225},{"name":"robyn_receipt_verify","fixed":{"name":"robyn_receipt_verify","description":"Checks digest + relayer signature + signed terms of a receipt you received (e.g. opened from your v2 mailbox). Read-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"receipt":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"title":"Verify a settlement receipt"},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: receipt. Change to number/boolean/array where that's what you accept.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":87,"tokensAfter":91},{"name":"robyn_recipes","fixed":{"name":"robyn_recipes","description":"Ordered playbooks for real goals: pay-someone-safely, prove-what-i-spent, spend-within-a-budget, handle-failures-well, stay-current. CALL THIS BEFORE IMPROVISING A SEQUENCE. Each step says what it answers, what to do with the answer, whether it is optional, and what skipping it costs. Steps marked optional:false should not be skipped — `skippingCosts` explains the concrete harm, not a style preference.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"name":{"type":"string","description":"a specific recipe, or omit for all"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"The right order to call things"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":181,"tokensAfter":181},{"name":"robyn_route_status","fixed":{"name":"robyn_route_status","description":"Status of an in-flight route by id (BRIDGING → DONE), with the destination tx once delivered.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Track a cross-chain route"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":86,"tokensAfter":86},{"name":"robyn_sandbox_do","fixed":{"name":"robyn_sandbox_do","description":"Runs the identical path end to end against the sandbox: no key, no funds, no broadcast. Use this to prove an integration works before touching real money.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"token":{"type":"string"},"amount":{"type":"string"},"intent":{"type":"string"},"toChain":{"type":["number","string"]},"fromChain":{"type":["number","string"]},"toAddress":{"type":"string"},"amountHuman":{"type":"number"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Dry-run the whole flow with no funds"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":153,"tokensAfter":153},{"name":"robyn_settle","fixed":{"name":"robyn_settle","description":"The one-verb primitive. Say where value should go; Robyn returns the best route (all rails compared), the gasless method (no native token needed), the privacy posture that will apply (API-relay + private mempool where available + uniform shape), and what the settlement receipt will prove — in a SINGLE call. It collapses quote + preflight + prepare. Planning only: it never broadcasts — sign + submit via robyn_submit. Add private:true to request private-mempool execution where an endpoint exists.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["amount","fromChain","toChain","toAddress"],"properties":{"amount":{"type":"string","description":"value in source-token base units (e.g. \"25000000\" = 25 USDC)"},"private":{"type":"boolean","description":"request private-mempool execution (default: auto where an endpoint exists)"},"toChain":{"type":["number","string"],"description":"destination chain id or non-EVM name"},"toToken":{"type":"string"},"fromChain":{"type":["number","string"],"description":"source chain id or \"stellar\"/\"solana\"/\"tron\"/\"bitcoin\""},"fromToken":{"type":"string","description":"symbol or address; omit for the chain default (USDC)"},"toAddress":{"type":"string","description":"recipient on the destination"},"fromAddress":{"type":"string","description":"sender — sets fee tier and free-netting eligibility"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"title":"Settle value privately, gasless, best-route — one call"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":407,"tokensAfter":407},{"name":"robyn_sponsor_7702","fixed":{"name":"robyn_sponsor_7702","description":"Price or request an EIP-7702 sponsored transaction: Robyn submits your signed authorization as a type-4 transaction and PAYS THE GAS, so your account needs no native token. Over this HOSTED endpoint the call is a DRY price-check (returns estGas, priceUsd and the exact envelope) — paying the x402 invoice to broadcast requires calling POST /api/7702/sponsor directly with an X-PAYMENT header.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["chainId","authorization"],"properties":{"to":{"type":"string","description":"call target (defaults to the delegated account itself)"},"data":{"type":"string","description":"calldata hex"},"chainId":{"type":"number"},"authorization":{"type":"object","required":["address","nonce","yParity","r","s"],"properties":{"r":{"type":"string"},"s":{"type":"string"},"nonce":{"type":["number","string"]},"address":{"type":"string"},"chainId":{"type":["number","string"]},"yParity":{"type":["number","string"]}},"additionalProperties":false}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Sponsor a transaction (relayer pays the gas)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":305,"tokensAfter":305},{"name":"robyn_submit","fixed":{"name":"robyn_submit","description":"Relay an intent you already signed. The relayer broadcasts it and fronts all network gas; your account needs no native token. Build `permit2` from robyn_prepare: sign its signRequest.eip712 payload (canonical Permit2 domain + PermitTransferFrom/TokenPermissions types) and pass the OBJECT below - not a bare signature string. The signed spender must be the relayer from signRequest.spender, otherwise the permit cannot be redeemed. Supply idempotencyKey so a retry after a timeout cannot double-spend","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["fromChain","toChain","fromToken","toToken","amount","toAddress","permit2"],"properties":{"amount":{"type":"string"},"dryRun":{"type":"boolean","description":"true = rehearse only: returns {status:\"DRY\", broadcast:false, wouldSend} and broadcasts NOTHING, on every corridor. Use this to preview before committing."},"permit2":{"type":"object","required":["owner","permitted","nonce","deadline","signature"],"properties":{"nonce":{"type":"string","description":"the nonce from signRequest.eip712.value.nonce"},"owner":{"type":"string","description":"address that signed the permit"},"deadline":{"type":"string","description":"the deadline from signRequest.eip712.value.deadline"},"permitted":{"type":"object","required":["token","amount"],"properties":{"token":{"type":"string","description":"ERC-20 being permitted (signRequest.tokenAddress)"},"amount":{"type":"string","description":"exact base-unit amount (signRequest.amount)"}},"additionalProperties":false},"signature":{"type":"string","description":"0x… signature over signRequest.eip712"}},"description":"Permit2 SignatureTransfer object - NOT a bare signature string","additionalProperties":false},"toChain":{"type":["number","string"]},"toToken":{"type":"string"},"fromChain":{"type":["number","string"]},"fromToken":{"type":"string"},"toAddress":{"type":"string"},"idempotencyKey":{"type":"string","description":"any unique string; makes retries safe"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Submit your signed intent (relayer pays the gas)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":579,"tokensAfter":579},{"name":"robyn_verify_outcome","fixed":{"name":"robyn_verify_outcome","description":"Check what ACTUALLY happened to a settled transfer, against the destination chain rather than Robyn's own database. Optionally assert who should have been paid (`recipient`) and the minimum that should have arrived (`minAmount`); we decode the payout transaction's ERC-20 Transfer logs and report whether reality matches. Also cross-checks Robyn's own receipt against the chain and says so if the books disagree. THE VERDICT IS THREE-VALUED: `verified`, `failed`, or `undetermined`. Treat `undetermin","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string","description":"transfer id, or the source/destination tx hash"},"minAmount":{"type":"string","description":"minimum base units that must have arrived"},"recipient":{"type":"string","description":"address that must have been credited"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Verify a transfer against the chain"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":265,"tokensAfter":265},{"name":"robyn_vip_status","fixed":{"name":"robyn_vip_status","description":"Check whether an address holds a recognised member NFT and what it gets. Members pay ZERO on cross-chain transfers of $0.10-$25 to low-cost chains, 15bps instead of 25bps routing, and 10% instead of 25% gas markup. Read-only. Call this before quoting for a user so you can tell them accurately what a transfer will cost — and, if they are not a member, what holding a recognised NFT would save them.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["address"],"properties":{"address":{"type":"string","description":"EVM address (0x…) to check"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Check membership / VIP benefits for an address"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":185,"tokensAfter":185}],"toolsChanged":57,"tokensSaved":0,"todo":[{"tool":"null_market_delist","params":["card","modCred"]},{"tool":"null_prekeys_publish","params":["handle","address"]},{"tool":"null_void_directory","params":["limit"]},{"tool":"robyn_counterparty_check","params":["amount","toAddress"]},{"tool":"robyn_cross_chain","params":["toChain","fromChain","toAddress"]},{"tool":"robyn_improve_cost","params":["amount","toChain","toToken","fromChain","fromToken","toAddress"]},{"tool":"robyn_mandate_certificate","params":["mandateId"]},{"tool":"robyn_mandate_cosign_request","params":["amount","mandateId","transferId"]},{"tool":"robyn_mandate_events","params":["limit","since","principal"]},{"tool":"robyn_mandate_status","params":["mandateId"]},{"tool":"robyn_message_publish_mailbox","params":["address"]},{"tool":"robyn_payment_request_prepare","params":["memo","token","expiresInSec"]},{"tool":"robyn_payment_request_settlement","params":["request","signature"]},{"tool":"robyn_plan","params":["constraints"]},{"tool":"robyn_plus_claim","params":["blinded","invoiceId"]},{"tool":"robyn_plus_invoice","params":["asset"]},{"tool":"robyn_plus_invoice_status","params":["invoiceId"]},{"tool":"robyn_plus_trial","params":["blinded"]},{"tool":"robyn_preflight","params":["toToken"]},{"tool":"robyn_preflight_full","params":["amount","toChain","toToken","fromChain","fromToken","toAddress"]},{"tool":"robyn_prepare","params":["toChain","fromChain","toAddress"]},{"tool":"robyn_receipt_verify","params":["receipt"]},{"tool":"robyn_route_status","params":["id"]},{"tool":"robyn_sandbox_do","params":["token","amount","intent","toChain","fromChain","toAddress","amountHuman"]},{"tool":"robyn_settle","params":["toToken"]},{"tool":"robyn_sponsor_7702","params":["chainId","authorization"]},{"tool":"robyn_submit","params":["amount","toChain","toToken","fromChain","fromToken","toAddress"]},{"tool":"robyn_why_this_route","params":["amount","toChain","toToken","fromChain","fromToken","toAddress"]},{"tool":"robyn_yield_quote","params":["agent","toChain","srcChain","toAddress"]},{"tool":"robyn_yield_spend","params":["agent","amount","toChain","srcChain","toAddress"]}],"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."}