{"name":"ifso","endpoint":"https://api.ifso.tech/mcp","transport":"streamable-http","protocolVersions":["2025-06-18","2025-03-26","2024-11-05"],"keyless":true,"tools":[{"name":"ifso_version","title":"IFSO build and contracts","description":"Which IFSO build is running, the chain id (Robinhood Chain mainnet is 4663), the address of every contract it uses (payments, conditions, outcome resolver, USDG) and the fee constants in base units and USDG. The same answer as GET /v1/version. Check these addresses before approving anything in a wallet.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"title":"IFSO build and contracts","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"ifso_get_payment","title":"IFSO payment status","description":"The current state of one if-so payment, read from the chain: status (OPEN, MET, RELEASED, RETURNED, VOIDED, CANCELLED), amount in USDG, sender, recipient or claim link key, expiry and the condition that unlocks it. Payment ids are large whole numbers (up to 78 digits); pass them as a string.","inputSchema":{"type":"object","properties":{"id":{"type":"string","pattern":"^#?\\d{1,78}$","description":"The payment id as a decimal string, e.g. \"12\" or a 78-digit id."}},"required":["id"],"additionalProperties":false},"annotations":{"title":"IFSO payment status","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"ifso_list_conditions","title":"IFSO condition types and limits","description":"The kinds of condition an if-so payment can wait for (a date, a price at or by a deadline, a football league result, a Polymarket question, both people tapping OK, or a named referee), with example commands, the price tickers, the timing rules and the amount limits read from the contract. Use the example command format with ifso_prepare_payment.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"title":"IFSO condition types and limits","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"ifso_prepare_payment","title":"Prepare an IFSO payment (unsigned)","description":"Turns a command like \"/ifso 0x... 20 on 2026-12-01\" into a plain preview and the UNSIGNED data to create that if-so payment from the sender's own wallet: two transactions (USDG approve, then create) or one gasless authorization to sign. This server never signs, never holds a key and never sends anything; the sender reviews and signs in their own wallet. Same checks as the site's build step.","inputSchema":{"type":"object","properties":{"text":{"type":"string","minLength":3,"maxLength":300,"description":"The command, e.g. \"/ifso 0x... 20 on 2026-12-01\" or \"/challenge 0x... 10 if nvda closes above 200 by friday\". See ifso_list_conditions."},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The wallet that sends the USDG and signs."},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Recipient, when the command says link and you want a fixed recipient instead."},"linkKey":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"For a claim link: the address derived from the link secret. Keep the secret yourself; never send it."},"referee":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Referee wallet for a referee condition, when not typed in the command."},"altRefundTo":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Second refund address, used if the sender cannot receive USDG."},"cancellable":{"type":"boolean","description":"Let the sender cancel before anything happens (default false)."},"tzOffsetMin":{"type":"integer","minimum":-720,"maximum":840,"description":"The person's UTC offset in minutes for dates (e.g. 240 for UTC+4). Stock deadlines always use New York time."}},"required":["text","sender"],"additionalProperties":false},"annotations":{"title":"Prepare an IFSO payment (unsigned)","readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"ifso_list_payments","title":"IFSO payments for an address","description":"The if-so payments where an address is the sender or the recipient, newest first, 20 at a time (the same list as the web dashboard, from the IFSO index of the chain, up to the newest 100). Each item has the id, status, amount, the other side and the expiry. Pass nextCursor back as cursor for the next page. For the live chain state of one payment use ifso_get_payment.","inputSchema":{"type":"object","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The wallet address to look up (sender or recipient)."},"limit":{"type":"integer","minimum":1,"maximum":20,"description":"How many payments to return (default and most 20)."},"cursor":{"type":"string","pattern":"^#?\\d{1,78}$","description":"The nextCursor of the previous answer: the list continues after that payment."}},"required":["address"],"additionalProperties":false},"annotations":{"title":"IFSO payments for an address","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"ifso_quote_fees","title":"IFSO fees for a payment","description":"The fee for an if-so payment of one condition kind (TIME, PRICE, SPORTS, MARKET, APPROVE_PARTIES or APPROVE_REFEREE): the flat creation fee, plus the flat result fee for SPORTS and MARKET, read from the contract (the same numbers as ifso_version). With an amount, also the total the sender approves and whether the amount is inside the contract's limits. Fees are flat and never a share of the amount.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["TIME","PRICE","SPORTS","MARKET","APPROVE_PARTIES","APPROVE_REFEREE"],"description":"The condition kind, as in ifso_list_conditions."},"amount":{"type":"string","pattern":"^\\d+(\\.\\d{1,6})?$","description":"Optional amount in USDG, e.g. \"20\" or \"20.5\"."}},"required":["kind"],"additionalProperties":false},"annotations":{"title":"IFSO fees for a payment","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"ifso_explain_payment","title":"Explain an IFSO payment","description":"One if-so payment in plain words, from the same chain read as ifso_get_payment: what it waits for, the deadline, who can do what next (claim, accept, tap OK, decide, settle, send back, cancel) and when and where it comes back if nothing happens. Payment ids are large whole numbers; pass them as a string.","inputSchema":{"type":"object","properties":{"id":{"type":"string","pattern":"^#?\\d{1,78}$","description":"The payment id as a decimal string, e.g. \"12\" or a 78-digit id."}},"required":["id"],"additionalProperties":false},"annotations":{"title":"Explain an IFSO payment","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"ifso_prepare_v2_payment","title":"Prepare an IFSO v2 payment (unsigned)","description":"Builds a v2 if-so payment in USDG, USDe or ETH and returns its own payment address, known before any money moves, so it can be funded from anywhere on Robinhood Chain (any wallet, or the Robinhood app, which can send ETH and USDG to any address). Also returns the UNSIGNED data the sender may sign instead: an EIP-3009 authorization for USDG, a Permit2 signature for USDe, or one fundETH transaction for ETH. The money moves when the condition is met, or comes back to the sender after the expiry. This server never signs and never sends.","inputSchema":{"type":"object","properties":{"asset":{"type":"string","enum":["USDG","USDe","ETH"],"description":"The asset: USDG, USDe or ETH on Robinhood Chain."},"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$","description":"Amount in whole units of the asset, e.g. \"20\" or \"0.015\"."},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The wallet that funds the payment and gets it back if it comes back."},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Named recipient. Give this or linkKey."},"linkKey":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"For a claim link: the address derived from the link secret. Keep the secret yourself; never send it."},"refundTo":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Where the money comes back to (default: the sender)."},"altRefundTo":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Second refund address, used if the first cannot receive."},"cancellable":{"type":"boolean","description":"Let the sender cancel before the condition decides (default false)."},"condition":{"type":"object","description":"What unlocks the payment. One of: {\"kind\":\"TIME\",\"at\":<unix seconds>}, {\"kind\":\"PRICE\",\"ticker\":\"ETH\",\"op\":\"GTE\"|\"LTE\",\"price\":\"4000\",\"deadline\":<unix seconds>} (checked at the deadline), {\"kind\":\"APPROVE_PARTIES\"} (both of you tap OK; needs a named recipient), {\"kind\":\"APPROVE_REFEREE\",\"referee\":\"0x...\"}.","properties":{"kind":{"type":"string","enum":["TIME","PRICE","APPROVE_PARTIES","APPROVE_REFEREE"]},"at":{"type":"integer"},"ticker":{"type":"string"},"op":{"type":"string","enum":["GTE","LTE"]},"price":{"type":"string"},"deadline":{"type":"integer"},"referee":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Referee wallet (APPROVE_REFEREE)."}},"required":["kind"],"additionalProperties":false},"expiry":{"type":"integer","description":"Unix seconds after which anyone can send the money back (default: from the condition)."},"requestId":{"type":"string","description":"The id of a payment request this pays (see ifso_create_request)."}},"required":["asset","amount","sender","condition"],"additionalProperties":false},"annotations":{"title":"Prepare an IFSO v2 payment (unsigned)","readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"ifso_get_v2_payment","title":"IFSO v2 payment status","description":"One v2 if-so payment by its payment address: the terms, the asset and amount, whether the money has arrived, and the live state on the chain (not opened yet, OPEN, MET, RELEASED, RETURNED or CANCELLED).","inputSchema":{"type":"object","properties":{"vault":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The payment address (from ifso_prepare_v2_payment)."}},"required":["vault"],"additionalProperties":false},"annotations":{"title":"IFSO v2 payment status","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"ifso_create_request","title":"Ask to be paid (IFSO request link)","description":"Creates a payment request: someone asks to be paid an amount of USDG, USDe or ETH, and gets a link to share. The payer opens the link and funds an if-so payment to them. An optional note (at most 140 characters) and how many days the link stays open (1 to 30, default 7). Nothing moves until the payer funds it.","inputSchema":{"type":"object","properties":{"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The wallet that asks to be paid."},"asset":{"type":"string","enum":["USDG","USDe","ETH"],"description":"The asset: USDG, USDe or ETH on Robinhood Chain."},"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$","description":"Amount in whole units of the asset, e.g. \"20\" or \"0.015\"."},"note":{"type":"string","maxLength":140,"description":"What it is for, in plain text."},"days":{"type":"integer","minimum":1,"maximum":30,"description":"How long the link stays open."}},"required":["recipient","asset","amount"],"additionalProperties":false},"annotations":{"title":"Ask to be paid (IFSO request link)","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}}],"limits":{"bodyBytes":65536,"batch":20,"callsPerMinute":60}}