{"apiVersion":"v1","directorySlug":"nullchat-mcp-1b0a77ad54","title":"NULL","description":"NULL is a sealed, unlinkable, post-quantum messenger. Broadcast into the void. Understood by one. Remembered by none.","pageUrl":"https://www.mcpbundles.com/skills/nullchat-mcp-1b0a77ad54","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://nullchat.me/mcp","hostedMcpUrl":null,"toolCount":72,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"me.nullchat/nullchat-mcp-1b0a77ad54","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"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"]}},"additionalProperties":false},"title":"What is private, what is public — before you act","logicalName":"robyn_privacy_posture","displayName":"What is private, what is public — before you act","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"pass":{},"receipt":{}},"additionalProperties":false},"title":"Deliver a settlement receipt to a counterparty, sealed","logicalName":"robyn_receipt_deliver","displayName":"Deliver a settlement receipt to a counterparty, sealed","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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":{}},"additionalProperties":false},"title":"Verify a settlement receipt","logicalName":"robyn_receipt_verify","displayName":"Verify a settlement receipt","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_mesh","description":"List the Robyn gasless chains and the cross-chain route graph (22 EVM nodes + Stellar), plus the relayer/Permit2 addresses. No credentials needed.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"title":"Robyn mesh","logicalName":"robyn_mesh","displayName":"Robyn mesh","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_quote","description":"Best gasless route to move a token from one Robyn chain to another. Returns estimated output, the bridge used, duration, and the Robyn fee. Read-only — moves nothing. IMPORTANT: check `quoteOnly` on the response. If it is true the corridor can be PRICED but NOT settled — execute will refuse it with UNSUPPORTED_DIRECTION — so present that quote as a price comparison only and do not tell the user it can be sent. `quoteOnlyReason` says why. Absent/false means executable.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["fromChain","fromToken","toChain","toToken","amount"],"properties":{"amount":{"type":"string"},"toChain":{"type":["number","string"]},"toToken":{"type":"string"},"fromChain":{"type":["number","string"]},"fromToken":{"type":"string"},"toAddress":{"type":"string"},"fromAddress":{"type":"string"}},"additionalProperties":false},"title":"Quote a gasless cross-chain route","logicalName":"robyn_quote","displayName":"Quote a gasless cross-chain route","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_attestation","description":"Returns a relayer-SIGNED attestation that, as of a signed timestamp, every component was up (router, signing daemons, MCP, privacy relay) AND the privacy invariants held — the adversary probes could not distinguish cover traffic from real (classifier = chance) and the k-anonymity floor is enforced. Verify the signature yourself (recover the signer over the digest). Use this to programmatically decide whether to trust this router before routing value through it.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"title":"Signed proof the router is live AND private, right now","logicalName":"robyn_attestation","displayName":"Signed proof the router is live AND private, right now","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"toChain":{"type":["number","string"]},"toToken":{"type":"string"},"fromChain":{"type":["number","string"]},"fromToken":{"type":"string"},"toAddress":{"type":"string"},"fromAddress":{"type":"string"}},"additionalProperties":false},"title":"Check a transfer will succeed BEFORE spending anything","logicalName":"robyn_preflight","displayName":"Check a transfer will succeed BEFORE spending anything","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"}},"additionalProperties":false},"title":"Check membership / VIP benefits for an address","logicalName":"robyn_vip_status","displayName":"Check membership / VIP benefits for an address","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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},"title":"Track a cross-chain route","logicalName":"robyn_route_status","displayName":"Track a cross-chain route","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"toChain":{"type":["number","string"]},"toToken":{"type":"string"},"fromChain":{"type":["number","string"]},"fromToken":{"type":"string"},"toAddress":{"type":"string"}},"additionalProperties":false},"title":"Move value cross-chain, gasless","logicalName":"robyn_cross_chain","displayName":"Move value cross-chain, gasless","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_prepare","description":"Turn a plain-language or structured intent into a concrete plan plus the EXACT payload to sign. Costs nothing, moves nothing, needs no key. Returns status:\"sign\" with signRequest, or status:\"quoted\" if something is still missing.","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},"title":"Prepare a gasless action (returns what to sign)","logicalName":"robyn_prepare","displayName":"Prepare a gasless action (returns what to sign)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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},"title":"Dry-run the whole flow with no funds","logicalName":"robyn_sandbox_do","displayName":"Dry-run the whole flow with no funds","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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":{}},"title":"What netting accounts are (opt-in, custodial)","logicalName":"robyn_netting_info","displayName":"What netting accounts are (opt-in, custodial)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_netting_account","description":"Whether an address is enrolled (and therefore custodied), its internal balance, recent history, and `nextNonce` — which you MUST use when signing the next transfer or withdrawal. An address that never enrolled is reported as not custodied. Read-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["address"],"properties":{"address":{"type":"string"}},"additionalProperties":false},"title":"Netting balance, enrolment state and next nonce","logicalName":"robyn_netting_account","displayName":"Netting balance, enrolment state and next nonce","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"toChain":{"type":["number","string"]}},"additionalProperties":false},"title":"What a netting withdrawal would actually deliver","logicalName":"robyn_netting_preview","displayName":"What a netting withdrawal would actually deliver","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"before":{"type":"string"},"address":{"type":"string"}},"additionalProperties":false},"title":"Full, untruncated netting history for an address","logicalName":"robyn_netting_statement","displayName":"Full, untruncated netting history for an address","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_netting_reserves","description":"Publishes what Robyn OWES across all netting accounts against the real relayer float backing it, per chain. Solvency is checkable rather than asserted. Deposits are refused if they would push liabilities above a safe share of the float. Read-only — a user considering a custodial balance should be shown this.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"title":"Proof of reserves for the custodial ledger","logicalName":"robyn_netting_reserves","displayName":"Proof of reserves for the custodial ledger","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"}},"additionalProperties":false},"title":"Get the consent text a user must sign to open a netting account","logicalName":"robyn_netting_enroll_payload","displayName":"Get the consent text a user must sign to open a netting account","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"from":{"type":"string"},"amount":{"type":"string"}},"additionalProperties":false},"title":"Build the message to sign for a FREE internal transfer","logicalName":"robyn_netting_transfer_payload","displayName":"Build the message to sign for a FREE internal transfer","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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},"title":"Have I paid this address before?","logicalName":"robyn_counterparty_check","displayName":"Have I paid this address before?","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"toAddress":{"type":"string"}},"additionalProperties":false},"title":"Everything you should know before you move money","logicalName":"robyn_preflight_full","displayName":"Everything you should know before you move money","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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","additionalProperties":{}},"endpoint":{"type":"string"}},"additionalProperties":false},"title":"Is the request I am about to send safe?","logicalName":"robyn_integration_lint","displayName":"Is the request I am about to send safe?","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"}},"additionalProperties":false},"title":"The right order to call things","logicalName":"robyn_recipes","displayName":"The right order to call things","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_changelog","description":"Machine-readable API history. Pass the version your integration was built against as `since` and you get only what has changed after it, with an explicit `breaking` flag on each entry. CHECK `mustAct` FIRST: if true there are breaking changes and an existing integration may ALREADY be failing — read `entries[].action` for each. `breaking:true` means an existing correct integration could stop working; it is a compatibility claim, not a measure of importance.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"since":{"type":"string"}},"additionalProperties":false},"title":"What changed since I integrated?","logicalName":"robyn_changelog","displayName":"What changed since I integrated?","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_errors","description":"The full error taxonomy: every errorCode, whether it is retryable, and the suggested recovery action. Read this once and branch on errorCode instead of parsing messages.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"title":"Error contract","logicalName":"robyn_errors","displayName":"Error contract","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"minAmount":{"type":"string"},"recipient":{"type":"string"}},"additionalProperties":false},"title":"Verify a transfer against the chain","logicalName":"robyn_verify_outcome","displayName":"Verify a transfer against the chain","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_spend_statement","description":"A statement of every transfer in a window with each fee broken down, SIGNED by Robyn's relayer key (EIP-191). Use this when you must PROVE to a principal what you spent — your own summary is a claim by the party being audited, but this is verifiable against a published address without trusting you or Robyn. Read `limitations` and repeat them: the statement covers the Robyn float lane only and excludes other rails and the custodial netting book, so it may not be a complete picture of activity.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"days":{"type":"number"},"address":{"type":"string"}},"additionalProperties":false},"title":"Signed proof of what was spent","logicalName":"robyn_spend_statement","displayName":"Signed proof of what was spent","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_fee_forensics","description":"Reconstruct a settled transfer unit by unit: destination payout gas, Robyn margin, or a Robyn SUBSIDY where Robyn absorbed a loss. Each line names who was paid and how the figure was derived. Anything that cannot be attributed is returned as `unattributed` rather than folded into another line — if you see that field, report it rather than presenting the breakdown as complete.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"title":"Where every unit of a fee went","logicalName":"robyn_fee_forensics","displayName":"Where every unit of a fee went","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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":{}},"title":"Measured delivery times","logicalName":"robyn_delivery_stats","displayName":"Measured delivery times","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_mandate_events","description":"Poll for spend, nearly-exhausted, exhausted, approval-required and revoked events on a principal's mandates. Pass the returned `cursor` back as `since` for only what is new. Use this to tell a principal their budget is running low or that a large payment is waiting on their approval, instead of making them check each mandate by hand.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"limit":{"type":"number"},"since":{"type":"string"},"principal":{"type":"string"}},"additionalProperties":false},"title":"What has happened to my budgets","logicalName":"robyn_mandate_events","displayName":"What has happened to my budgets","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"}},"additionalProperties":false},"title":"Every budget a principal has granted","logicalName":"robyn_mandate_list","displayName":"Every budget a principal has granted","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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},"title":"Does this spend need the principal to approve it?","logicalName":"robyn_mandate_cosign_request","displayName":"Does this spend need the principal to approve it?","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_mandate_certificate","description":"A signed certificate listing every spend counted against a mandate, the budget, the total spent, and whether it stayed inside. Hand it to the principal at the end of a period. Every spend listed was VERIFIED ON-CHAIN before counting, and the amount is what the chain showed arrived — not what the agent reported. IMPORTANT WHEN PRESENTING IT: this certifies adherence to a ROBYN budget. It does NOT certify that the agent spent nothing elsewhere, because Robyn can only account for money that moved t","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["mandateId"],"properties":{"mandateId":{"type":"string"}},"additionalProperties":false},"title":"Signed proof the agent stayed within its budget","logicalName":"robyn_mandate_certificate","displayName":"Signed proof the agent stayed within its budget","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"mandateId":{"type":"string"}},"additionalProperties":false},"title":"Does this spend fit the budget my principal set?","logicalName":"robyn_mandate_check","displayName":"Does this spend fit the budget my principal set?","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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},"title":"How much of my budget is left?","logicalName":"robyn_mandate_status","displayName":"How much of my budget is left?","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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},"title":"What would make this transfer cheaper?","logicalName":"robyn_improve_cost","displayName":"What would make this transfer cheaper?","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_why_this_route","description":"Returns the full routing decision: every rail that quoted, what each would deliver, the margin the winner won by, and which rails stayed SILENT and why. Signed, so you can archive the rationale. CHECK `wasCompetitive` BEFORE TELLING A USER THE PRICE IS GOOD. If it is false, exactly one rail answered and \"best\" means \"only\" — it did not beat anything. Rails in `silentRails` did NOT lose; they failed to answer (down, rate-limited, missing credentials). Never describe them as more expensive.","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},"title":"Why this route won — and what it beat","logicalName":"robyn_why_this_route","displayName":"Why this route won — and what it beat","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_capability_snapshot","description":"A signed, timestamped record of current capability: which chains can actually be PAID OUT ON right now, which are merely policy-eligible, which rails are execute-ready, and whether delivery figures are measured or estimated. USE `serviceableNow`, NOT `policyEligible`, when deciding where to send funds — a chain can be eligible by policy while holding no inventory, in which case the instant lane is unavailable and the transfer falls through to a bridge rail. `notServiceable` lists the difference.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"title":"What Robyn can actually do right now (signed)","logicalName":"robyn_capability_snapshot","displayName":"What Robyn can actually do right now (signed)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"minAmount":{"type":"string"},"recipient":{"type":"string"}},"additionalProperties":false},"title":"One signed bundle of all evidence about a transfer","logicalName":"robyn_evidence_bundle","displayName":"One signed bundle of all evidence about a transfer","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"]},"payee":{"type":"string"},"token":{"type":"string"},"amount":{"type":"string"},"expiresInSec":{"type":"number"}},"additionalProperties":false},"title":"Prepare a payment request for the payee to sign","logicalName":"robyn_payment_request_prepare","displayName":"Prepare a payment request for the payee to sign","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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","additionalProperties":{}},"signature":{"type":"string"}},"additionalProperties":false},"title":"Verify a payment request before paying it","logicalName":"robyn_payment_request_verify","displayName":"Verify a payment request before paying it","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"}},"additionalProperties":false},"title":"Prove a payment request was satisfied on-chain","logicalName":"robyn_payment_request_settlement","displayName":"Prove a payment request was satisfied on-chain","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_refusal_verify","description":"Check a signed refusal receipt. Send header `x-anygas-receipt: 1` on any request and, IF Robyn refuses it, the error response carries a signed `refusalReceipt` recording what was asked, when, and why. This matters because when a provider says no, the AGENT gets the blame — a receipt lets you prove to your principal that you were blocked externally rather than simply failing. It proves the refusal HAPPENED; it does not claim the refusal was correct.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["receipt"],"properties":{"receipt":{"type":"object","additionalProperties":{}}},"additionalProperties":false},"title":"Verify a refusal receipt","logicalName":"robyn_refusal_verify","displayName":"Verify a refusal receipt","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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":{}},"title":"EIP-7702 delegate + rail info","logicalName":"robyn_7702_delegate","displayName":"EIP-7702 delegate + rail info","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"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},"title":"Verify an EIP-7702 authorization","logicalName":"robyn_7702_check","displayName":"Verify an EIP-7702 authorization","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_yield_account","description":"An agent's own Aave v3 / Moonwell position (aUSDC/mUSDC) per chain + the capped allowance it granted the relayer + live APY (best-yield auto-selected). Non-custodial: funds stay in the agent's wallet, Robyn holds no key and no pool.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["agent"],"properties":{"agent":{"type":"string"}},"additionalProperties":false},"title":"Non-custodial yield account","logicalName":"robyn_yield_account","displayName":"Non-custodial yield account","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_yield_quote","description":"Read-only JIT quote: how a spend would be fulfilled from an agent's Aave yield venue (draw <= your allowance -> Aave/Moonwell withdraw -> gasless deliver). Moves nothing.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["agent","srcChain","amount"],"properties":{"agent":{"type":"string"},"amount":{"type":"string"},"toChain":{"type":["number","string"]},"srcChain":{"type":["number","string"]},"toAddress":{"type":"string"}},"additionalProperties":false},"title":"Quote a spend from yield","logicalName":"robyn_yield_quote","displayName":"Quote a spend from yield","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_yield_spend","description":"Spend from your yield (Aave v3 or Moonwell) with ONE EIP-712 signature: Robyn pulls only up to your on-chain aUSDC/mUSDC allowance, unwinds exactly what is needed, and delivers gaslessly; the remainder keeps earning. This HOSTED endpoint is READ-ONLY: it returns the exact EIP-712 intent to sign + a live quote. To execute, sign it and POST {intent,signature,live:true} to /svc/api/ncaccount/spend, or run `npx anygas-mcp` locally with ROBYN_SIGNER_KEY. One-time setup: supply USDC to Aave v3 or Moon","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["agent","srcChain","amount"],"properties":{"agent":{"type":"string"},"amount":{"type":"string"},"toChain":{"type":["number","string"]},"srcChain":{"type":["number","string"]},"toAddress":{"type":"string"}},"additionalProperties":false},"title":"Spend from yield (one signature)","logicalName":"robyn_yield_spend","displayName":"Spend from yield (one signature)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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":{}},"title":"Sonar (private messenger) — status, suite and parameters","logicalName":"robyn_message_info","displayName":"Sonar (private messenger) — status, suite and parameters","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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":{}},"title":"Messaging v2 — all mailboxes (oblivious lookup)","logicalName":"robyn_message_directory","displayName":"Messaging v2 — all mailboxes (oblivious lookup)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"}},"additionalProperties":false},"title":"Messaging v2 — resolve a Robyn name to its mailbox","logicalName":"robyn_message_mailbox_of","displayName":"Messaging v2 — resolve a Robyn name to its mailbox","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"viewTag":{"type":"string"},"ephemeralPubKey":{"type":"string"}},"additionalProperties":false},"title":"Messaging v2 — deliver an ALREADY-sealed message","logicalName":"robyn_message_send","displayName":"Messaging v2 — deliver an ALREADY-sealed message","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"limit":{"type":"number"},"since":{"type":"number"}},"additionalProperties":false},"title":"Messaging v2 — public feed to scan with your viewing key","logicalName":"robyn_message_feed","displayName":"Messaging v2 — public feed to scan with your viewing key","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"sig":{"type":"string"},"handle":{"type":"string"},"kemPub":{"type":"string"},"public":{"type":"boolean"},"address":{"type":"string"},"metaAddress":{"type":"string"}},"additionalProperties":false},"title":"Messaging v2 — publish a PRE-SIGNED mailbox","logicalName":"robyn_message_publish_mailbox","displayName":"Messaging v2 — publish a PRE-SIGNED mailbox","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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":{}},"title":"Plus — what is sold, prices, mint key","logicalName":"robyn_plus_info","displayName":"Plus — what is sold, prices, mint key","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"}},"additionalProperties":false},"title":"Plus — create an invoice","logicalName":"robyn_plus_invoice","displayName":"Plus — create an invoice","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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},"title":"Plus — invoice status","logicalName":"robyn_plus_invoice_status","displayName":"Plus — invoice status","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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 unlinkable passes to paid ones. 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},"title":"Plus — 20 FREE passes per day (no payment)","logicalName":"robyn_plus_trial","displayName":"Plus — 20 FREE passes per day (no payment)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"blinded":{"type":"array","items":{"type":"string"},"maxItems":500,"minItems":1},"invoiceId":{"type":"string"}},"additionalProperties":false},"title":"Plus — claim blind signatures after paying","logicalName":"robyn_plus_claim","displayName":"Plus — claim blind signatures after paying","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_message_anchor_proof","description":"Merkle inclusion proof for an anchored row id: leaf, path, root, the signer’s EIP-191 signature over the batch statement and the on-chain tx when enabled. Verify locally with plus-sdk verifyAnchorProof(). Read-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"title":"Messaging v2 — anchoring proof for a feed row","logicalName":"robyn_message_anchor_proof","displayName":"Messaging v2 — anchoring proof for a feed row","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"robyn_message_erasure","description":"The last purge statement (expired count, cumulative, root of purged ids) signed by the operator. Read-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"title":"Messaging v2 — signed proof of erasure","logicalName":"robyn_message_erasure","displayName":"Messaging v2 — signed proof of erasure","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"null_ecosystem","description":"The live NULL manifest: every product (messenger, Pay, Vault, Drop, Legacy, Agent Wire, forward secrecy), its status, its page, the wired/proposed integrations between them, the security spine, and the concept pipeline. This is the same single source of truth the owner console and the human Suite read — a new product that ships appears here automatically. Pair it with null_agent_guide for the how-to. Read-only.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"title":"NULL — discover the whole ecosystem in one call","logicalName":"null_ecosystem","displayName":"NULL — discover the whole ecosystem in one call","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"null_names_quote","description":"Quotes a handle: 3ch $512/yr, 4ch $128/yr, 5-6ch $4/yr (deliberately under ENS), 7+ characters FREE forever. Includes live state (available/registered/grace/premium with the 21-day Dutch decay) and the exact register->pay->claim steps. Names are public by definition - quoting one reveals nothing.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["name"],"properties":{"name":{"type":"string"}},"additionalProperties":false},"title":"NULL Names - price any handle (ENS-seeded, 7+ chars free forever)","logicalName":"null_names_quote","displayName":"NULL Names - price any handle (ENS-seeded, 7+ chars free forever)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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":{}},"title":"NULL Names - the secondary market (signed listings + how to buy/sell/transfer)","logicalName":"null_names_market","displayName":"NULL Names - the secondary market (signed listings + how to buy/sell/transfer)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"},"recipient":{"type":"string"}},"additionalProperties":false},"title":"NULL forward secrecy — fetch a peer prekey bundle (consumes one one-time key)","logicalName":"null_prekeys_fetch","displayName":"NULL forward secrecy — fetch a peer prekey bundle (consumes one one-time key)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"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"}},"additionalProperties":false},"title":"NULL Pay — IP-blind balance read","logicalName":"null_balance","displayName":"NULL Pay — IP-blind balance read","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"null_agent_guide","description":"One read that teaches an agent to use every NULL capability with the right privacy posture: create an identity, seal + send + scan, start forward-secret sessions, drop an anonymous tip, check a Legacy heartbeat, make/detect stealth payments, and what each action reveals to whom. All crypto is local (SDK at /svc/msg2-sdk.mjs; browser bundle /svc/anygas-web.js); this MCP only relays sealed/signed material. Read-only, static knowledge.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"title":"NULL — the complete agent handbook (do everything, correctly)","logicalName":"null_agent_guide","displayName":"NULL — the complete agent handbook (do everything, correctly)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=NULL&config=eyJ1cmwiOiAiaHR0cHM6Ly9udWxsY2hhdC5tZS9tY3AifQ%3D%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22NULL%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fnullchat.me%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22NULL%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fnullchat.me%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=NULL&connectorUrl=https%3A%2F%2Fnullchat.me%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"NULL\" --url \"https://nullchat.me/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/nullchat-mcp-1b0a77ad54","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/nullchat-mcp-1b0a77ad54/tools/{tool}","mcpServerUrl":"https://nullchat.me/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/nullchat-mcp-1b0a77ad54?live=1"}