{"tools":[{"name":"chain_info","title":"Chain info","description":"Describes a supported chain: CAIP-2 id, display name, native currency, block explorers, and exactly which operations it supports. Omit `chain` to list every supported chain.","inputSchema":{"type":"object","properties":{"chain":{"description":"CAIP-2 chain id such as eip155:8453 (Base) or aptos:1; a bare EVM chain id number also works. Chain names like \"base\" are refused.","type":["string","number"]}},"additionalProperties":false},"price":"free","example":{"chain":"eip155:8453"}},{"name":"gas_estimate","title":"Gas / fee estimate","description":"Current fee tiers for a chain as decimal strings with explicit units. EVM: confidence levels (default 99/95/90/80/70) in gwei with base fee, priority fee and max fee. Aptos: deprioritized/regular/prioritized gas unit prices in octas per gas unit. Data older than its freshness budget is an error, never a stale answer.","inputSchema":{"type":"object","properties":{"chain":{"description":"CAIP-2 chain id such as eip155:8453 (Base) or aptos:1; a bare EVM chain id number also works. Chain names like \"base\" are refused.","type":["string","number"]},"confidenceLevels":{"description":"EVM only","minItems":1,"maxItems":12,"type":"array","items":{"type":"integer","minimum":1,"maximum":99}}},"required":["chain"],"additionalProperties":false},"price":"$0.001","example":{"chain":"eip155:8453"}},{"name":"address_validate","title":"Validate an address","description":"Validates an address for a chain and returns its canonical form. EVM: EIP-55 (a wrong checksum is refused, never corrected). Aptos: AIP-40 strict form. Says only what can be known offline; it never guesses what kind of account an address is.","inputSchema":{"type":"object","properties":{"chain":{"description":"CAIP-2 chain id such as eip155:8453 (Base) or aptos:1; a bare EVM chain id number also works. Chain names like \"base\" are refused.","type":["string","number"]},"address":{"type":"string"}},"required":["chain","address"],"additionalProperties":false},"price":"free","example":{"chain":"eip155:1","address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}},{"name":"token_amount_convert","title":"Convert token amounts","description":"Converts between a human decimal amount and integer base units without ever rounding: too many decimals is an error. Decimals are never assumed: pass `decimals`, or an `asset` whose decimals are read from the chain (EVM: \"native\" or an ERC-20 token address, whose decimals() is read live from the chain; Aptos: any asset, with live decimals; an ambiguous symbol such as USDC returns AMBIGUOUS_INPUT with every option).","inputSchema":{"type":"object","properties":{"chain":{"description":"CAIP-2 chain id such as eip155:8453 (Base) or aptos:1; a bare EVM chain id number also works. Chain names like \"base\" are refused.","type":["string","number"]},"amount":{"type":"string"},"direction":{"type":"string","enum":["toBase","toHuman"]},"decimals":{"type":"integer","minimum":0,"maximum":77},"asset":{"type":"string"}},"required":["chain","amount","direction"],"additionalProperties":false},"price":"free","example":{"chain":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","amount":"2.5","direction":"toBase"}},{"name":"tx_status","title":"Transaction status","description":"Whether a transaction is committed, failed, pending or not found, with a plain-English explanation. 'Not found' is reported as such and is not proof the transaction never existed.","inputSchema":{"type":"object","properties":{"chain":{"description":"CAIP-2 chain id such as eip155:8453 (Base) or aptos:1; a bare EVM chain id number also works. Chain names like \"base\" are refused.","type":["string","number"]},"hash":{"type":"string"}},"required":["chain","hash"],"additionalProperties":false},"price":"$0.001","example":{"chain":"eip155:8453","hash":"0x600accdbbdaca7bcabef7f9e6a0777d0d22b5fd8188585db0c0d77ee2e7d34d9"}},{"name":"aptos_address_validate","title":"Validate an Aptos address","description":"Validates an address against the Aptos address standard (AIP-40) and returns its canonical form: special addresses (0x0-0xf) as short form, all others as 0x + 64 digits. Strict by default; mode=relaxed also accepts a missing 0x or a few dropped leading zeros, and says which spelling you used (a truncated-looking address is always refused). With lookup=true it checks the chain to say whether the address is an account, an object, or neither, at one ledger version.","inputSchema":{"type":"object","properties":{"address":{"type":"string"},"chain":{"description":"Aptos CAIP-2 id: aptos:1 (mainnet, default) or aptos:2 (testnet)","type":"string"},"mode":{"type":"string","enum":["strict","relaxed"]},"lookup":{"type":"boolean"}},"required":["address"],"additionalProperties":false},"price":"free","example":{"address":"0x1"}},{"name":"aptos_name_resolve","title":"Resolve an Aptos name (.apt)","description":"name -> address, or address -> primary name (give exactly one). A name resolves to its TARGET address, which can differ from its owner; a registered name with no target resolves to nothing (NOT_FOUND) and its owner is never substituted. An address's primary name is returned only if that name resolves forward to the same address, so a spoofed reverse record is never trusted.","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"},"chain":{"description":"Aptos CAIP-2 id: aptos:1 (mainnet, default) or aptos:2 (testnet)","type":"string"}},"additionalProperties":false},"price":"$0.001","example":{"name":"petra.apt"}},{"name":"aptos_asset_resolve","title":"Resolve an Aptos asset","description":"Turns a symbol, registry id, fungible-asset address or coin type into one asset, with its on-chain symbol/name/decimals read live. Several different assets share the symbols USDC and USDT (Circle/Tether native vs LayerZero-bridged); those return AMBIGUOUS_INPUT with every candidate, its issuer and how to select it. Assets outside the registry are returned with verified:false, never silently trusted.","inputSchema":{"type":"object","properties":{"query":{"type":"string"},"chain":{"description":"Aptos CAIP-2 id: aptos:1 (mainnet, default) or aptos:2 (testnet)","type":"string"},"caseSensitive":{"type":"boolean"}},"required":["query"],"additionalProperties":false},"price":"$0.001","example":{"query":"APT"}},{"name":"aptos_amount_convert","title":"Convert an Aptos amount","description":"Converts between a human decimal amount and integer base units, using the asset's decimals read LIVE from the chain (never assumed from a symbol). Refuses to round: more decimal places than the asset has is an error. An ambiguous symbol returns AMBIGUOUS_INPUT.","inputSchema":{"type":"object","properties":{"amount":{"type":"string"},"direction":{"type":"string","enum":["toBase","toHuman"]},"asset":{"type":"string"},"chain":{"description":"Aptos CAIP-2 id: aptos:1 (mainnet, default) or aptos:2 (testnet)","type":"string"}},"required":["amount","direction","asset"],"additionalProperties":false},"price":"free","example":{"amount":"1.5","direction":"toBase","asset":"0x1::aptos_coin::AptosCoin"}},{"name":"aptos_balance_get","title":"Aptos balances at a ledger version","description":"Balances of an address for APT and fungible assets, all read at ONE ledger version (stated, or the current one pinned). Amounts are exact integer strings plus decimal strings. Default assets: APT and every verified asset; pass `assets` (symbols, ids, addresses, coin types) to choose. An ambiguous symbol fails the whole call. An address with no account and all-zero balances is reported honestly, not as an empty account.","inputSchema":{"type":"object","properties":{"address":{"type":"string"},"assets":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string"}},"ledgerVersion":{"description":"read the chain exactly as of this ledger version (default: the current one, pinned for consistency)","anyOf":[{"type":"string"},{"type":"integer","minimum":0,"maximum":9007199254740991}]},"chain":{"description":"Aptos CAIP-2 id: aptos:1 (mainnet, default) or aptos:2 (testnet)","type":"string"}},"required":["address"],"additionalProperties":false},"price":"$0.002","example":{"address":"0x1","assets":["0x1::aptos_coin::AptosCoin"]}},{"name":"aptos_fee_estimate","title":"Aptos fee estimate","description":"Gas unit price tiers (deprioritized/regular/prioritized) plus the cost of common transactions in octas, APT and USD. Gas units are MEASURED by simulating real transfers now, not taken from a table. USD comes only from two independent exchanges that agree; otherwise USD is explicitly unavailable. Transaction types: apt_transfer, apt_transfer_new_account; for anything else use aptos_tx_simulate.","inputSchema":{"type":"object","properties":{"txTypes":{"type":"array","items":{"type":"string"}},"chain":{"description":"Aptos CAIP-2 id: aptos:1 (mainnet, default) or aptos:2 (testnet)","type":"string"}},"additionalProperties":false},"price":"$0.005","example":{}},{"name":"aptos_tx_simulate","title":"Simulate an Aptos transaction","description":"Runs an UNSIGNED entry-function transaction through the node's own simulator (no key needed, nothing is submitted) and returns success or the abort decoded in plain English, exact gas and fee, balance changes, and events. Arguments are type-checked against the module ABI first. Balance changes count only the framework's Withdraw/Deposit events, so assets that re-emit them (like USDC) are never double-counted. A simulation runs against the node's current state and cannot be pinned to an older ledger version.","inputSchema":{"type":"object","properties":{"sender":{"type":"string"},"function":{"type":"string"},"typeArguments":{"type":"array","items":{"type":"string"}},"arguments":{"type":"array","items":{}},"maxGasAmount":{"anyOf":[{"type":"string"},{"type":"integer","minimum":0,"maximum":9007199254740991}]},"gasUnitPrice":{"anyOf":[{"type":"string"},{"type":"integer","minimum":0,"maximum":9007199254740991}]},"sequenceNumber":{"anyOf":[{"type":"string"},{"type":"integer","minimum":0,"maximum":9007199254740991}]},"chain":{"description":"Aptos CAIP-2 id: aptos:1 (mainnet, default) or aptos:2 (testnet)","type":"string"}},"required":["sender","function"],"additionalProperties":false},"price":"$0.005","example":{"sender":"0x1","function":"0x1::aptos_account::transfer","arguments":["0x2","1"]}},{"name":"aptos_tx_decode","title":"Decode an Aptos entry-function call","description":"Explains what an entry-function payload would do, in plain English, with every argument type-checked against the module ABI and amounts shown using the asset's live decimals. Known patterns (transfers, batch transfers, key rotation, code publishing) carry a risk flag from a fixed table; no flag means 'not recognised', never 'safe'.","inputSchema":{"type":"object","properties":{"function":{"type":"string"},"typeArguments":{"type":"array","items":{"type":"string"}},"arguments":{"type":"array","items":{}},"chain":{"description":"Aptos CAIP-2 id: aptos:1 (mainnet, default) or aptos:2 (testnet)","type":"string"}},"required":["function"],"additionalProperties":false},"price":"$0.002","example":{"function":"0x1::aptos_account::transfer","arguments":["0x1","100000000"]}},{"name":"aptos_tx_status","title":"Aptos transaction status","description":"Committed, failed, pending or not found for a transaction hash, with the VM status explained in plain English (Move aborts decoded to module, error name, code and category; the raw status is always included). Fee is computed from the VM's own fee statement.","inputSchema":{"type":"object","properties":{"hash":{"type":"string"},"chain":{"description":"Aptos CAIP-2 id: aptos:1 (mainnet, default) or aptos:2 (testnet)","type":"string"}},"required":["hash"],"additionalProperties":false},"price":"$0.001","example":{"hash":"0x0000000000000000000000000000000000000000000000000000000000000000"}},{"name":"aptos_view","title":"Call an Aptos view function","description":"Calls a Move #[view] function read-only, after checking every type argument and argument against the module's ABI: u64/u128/u256 must be decimal strings, vector<u8> a 0x hex string, Option<T> written {\"vec\":[]} or {\"vec\":[value]}, addresses in AIP-40 form. A wrong argument is a specific error from us, never an opaque node error. Optionally reads at a stated ledger version.","inputSchema":{"type":"object","properties":{"function":{"type":"string"},"typeArguments":{"type":"array","items":{"type":"string"}},"arguments":{"type":"array","items":{}},"ledgerVersion":{"description":"read the chain exactly as of this ledger version (default: the current one, pinned for consistency)","anyOf":[{"type":"string"},{"type":"integer","minimum":0,"maximum":9007199254740991}]},"chain":{"description":"Aptos CAIP-2 id: aptos:1 (mainnet, default) or aptos:2 (testnet)","type":"string"}},"required":["function"],"additionalProperties":false},"price":"$0.002","example":{"function":"0x1::coin::name","typeArguments":["0x1::aptos_coin::AptosCoin"],"arguments":[]}},{"name":"decimal_calc","title":"Exact decimal arithmetic","description":"Add, subtract, multiply, divide, raise to an integer power, compare, or take a percentage, on decimal STRINGS with exact arithmetic (no floating point). The result is rounded only to the scale and rule you choose, and the response says whether rounding changed the value. JSON numbers are refused because they lose precision. Division by zero is an error.","inputSchema":{"type":"object","properties":{"op":{"type":"string","enum":["add","subtract","multiply","divide","power","compare","percent_of"]},"a":{"type":"string"},"b":{"type":"string"},"scale":{"type":"integer","minimum":0,"maximum":36},"rounding":{"description":"rounding rule; default half_up (ties away from zero). half_even is banker's rounding","type":"string","enum":["down","up","floor","ceil","half_up","half_even","half_down"]}},"required":["op","a","b"],"additionalProperties":false},"price":"free","example":{"op":"divide","a":"1","b":"3","scale":6}},{"name":"table_calc","title":"Exact math over a table (sums, averages, per-group totals) — no hallucinated numbers","description":"Give it your rows (JSON or CSV) and the figures you need; it returns them computed exactly (decimal arithmetic, no floating point), so your agent never has to add up a column in its head. Metrics are expressions: sum([Amount]), avg(price), count(), count_distinct([Customer]), median(days), min/max, sum(qty * price), sum(amount) / total(amount) * 100 (share of the overall total), round(x, 2), avg(days_between([Invoiced], [Paid])), sum(age_days([Due])) with asOf. Group by columns or periods: month([Date]), week, quarter, year, weekday, or ranges such as bucket(age_days([Due]), 30, 60, 90) for an aging report. Optional: where filters (numbers or dates), sort, limit. Cells that are not numbers are never counted as 0: they are skipped and reported with row numbers (or refused with strictNumbers). Up to 10000 rows. The same input always gives the same output, with a receipt.","inputSchema":{"type":"object","properties":{"rows":{"description":"the data as JSON objects, one per row (up to 10000). Numbers as decimal strings are safest; JSON numbers are accepted","maxItems":10000,"type":"array","items":{"type":"object","propertyNames":{"type":"string","maxLength":200},"additionalProperties":{"anyOf":[{"type":"string","maxLength":10000},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},"csv":{"description":"the data as CSV text with a header row (instead of rows)","type":"string","maxLength":900000},"delimiter":{"description":"CSV delimiter, default comma","type":"string","enum":[",",";","\t","|"]},"where":{"description":"keep only rows matching ALL of these: eq, ne, gt, gte, lt, lte (numeric when both sides are numbers), contains (case-insensitive), in (list), empty, not_empty","maxItems":20,"type":"array","items":{"type":"object","properties":{"column":{"type":"string","minLength":1,"maxLength":200},"op":{"type":"string","enum":["eq","ne","gt","gte","lt","lte","contains","in","empty","not_empty"]},"value":{"description":"text; a list for \"in\"; numbers as decimal strings","anyOf":[{"type":"string","maxLength":500},{"maxItems":200,"type":"array","items":{"type":"string","maxLength":500}}]}},"required":["column","op"],"additionalProperties":false}},"strictNumbers":{"description":"true: refuse any cell that is not a plain decimal (no $, commas, %, or text in number columns). Default false: those are read and every change is reported","type":"boolean"},"dateFormat":{"description":"how to read slash dates like 03/04/2026: mdy (US) or dmy; ISO dates (2026-03-04, with or without a time) are always read. Default iso","type":"string","enum":["iso","mdy","dmy"]},"asOf":{"description":"the date age_days() counts up to, YYYY-MM-DD (required for age_days: answers never silently depend on today's date)","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"metrics":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80,"description":"label for this figure"},"expr":{"type":"string","minLength":1,"maxLength":500,"description":"e.g. sum([Amount]) or sum(qty * price) / count()"}},"required":["name","expr"],"additionalProperties":false}},"groupBy":{"description":"one figure set per distinct value: a column name, or a key such as month([Date]), week([Date]) (ISO), quarter, year, day, weekday, or bucket(age_days([Due]), 30, 60, 90) for ranges","maxItems":3,"type":"array","items":{"type":"string","minLength":1,"maxLength":200}},"sort":{"type":"object","properties":{"by":{"type":"string","description":"a metric name or a groupBy column"},"dir":{"type":"string","enum":["asc","desc"]}},"required":["by"],"additionalProperties":false},"limit":{"description":"return at most this many groups","type":"integer","minimum":1,"maximum":1000},"scale":{"description":"decimal places for every figure; default: exact, or 18 places when a value has no finite decimal form (like 1/3)","type":"integer","minimum":0,"maximum":18},"rounding":{"description":"rounding rule when scale applies; default half_up","type":"string","enum":["down","up","floor","ceil","half_up","half_even","half_down"]}},"required":["metrics"],"additionalProperties":false},"price":"$0.01","example":{"csv":"customer,qty,price\nAcme,3,19.99\nGlobex,1,249.00\nAcme,2,0.10","groupBy":["customer"],"metrics":[{"name":"revenue","expr":"sum(qty * price)"},{"name":"share %","expr":"round(sum(qty * price) / total(qty * price) * 100, 2)"}],"sort":{"by":"revenue"}}},{"name":"verify_answer","title":"Check numbers before you send them (correct / wrong + the right value)","description":"Before your agent sends a figure to a customer, a ledger or another agent, check it. Each claim is an expression and the value you believe it equals: plain arithmetic (\"1299.99 * 3 * 1.0825\" expected \"4221.87\") or over your rows (\"sum([Amount])\" expected \"4312.50\", with optional per-claim where filters). Answers per claim: \"correct\" (exactly equal, or within your tolerance), \"correct_when_rounded\" (equal once the true value is rounded half-up to the decimals you wrote), or \"wrong\", always with the exact value and the difference. Same exact engine as table_calc and decimal_calc; up to 50 claims per call, with a receipt you can attach as proof.","inputSchema":{"type":"object","properties":{"rows":{"description":"the data as JSON objects, one per row (up to 10000). Numbers as decimal strings are safest; JSON numbers are accepted","maxItems":10000,"type":"array","items":{"type":"object","propertyNames":{"type":"string","maxLength":200},"additionalProperties":{"anyOf":[{"type":"string","maxLength":10000},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},"csv":{"description":"the data as CSV text with a header row (instead of rows)","type":"string","maxLength":900000},"delimiter":{"description":"CSV delimiter, default comma","type":"string","enum":[",",";","\t","|"]},"where":{"description":"keep only rows matching ALL of these: eq, ne, gt, gte, lt, lte (numeric when both sides are numbers), contains (case-insensitive), in (list), empty, not_empty","maxItems":20,"type":"array","items":{"type":"object","properties":{"column":{"type":"string","minLength":1,"maxLength":200},"op":{"type":"string","enum":["eq","ne","gt","gte","lt","lte","contains","in","empty","not_empty"]},"value":{"description":"text; a list for \"in\"; numbers as decimal strings","anyOf":[{"type":"string","maxLength":500},{"maxItems":200,"type":"array","items":{"type":"string","maxLength":500}}]}},"required":["column","op"],"additionalProperties":false}},"strictNumbers":{"description":"true: refuse any cell that is not a plain decimal (no $, commas, %, or text in number columns). Default false: those are read and every change is reported","type":"boolean"},"dateFormat":{"description":"how to read slash dates like 03/04/2026: mdy (US) or dmy; ISO dates (2026-03-04, with or without a time) are always read. Default iso","type":"string","enum":["iso","mdy","dmy"]},"asOf":{"description":"the date age_days() counts up to, YYYY-MM-DD (required for age_days: answers never silently depend on today's date)","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"claims":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"label":{"description":"what the figure is, e.g. \"invoice total\"","type":"string","maxLength":120},"expr":{"type":"string","minLength":1,"maxLength":500,"description":"arithmetic, or an aggregate over the rows: sum([Amount]), count(), avg(price), sum(qty * price) * 1.08"},"expected":{"type":"string","maxLength":100,"description":"the value to check, as a decimal string; $, commas and % are read"},"tolerance":{"description":"accept a difference up to this (decimal string, e.g. \"0.01\"); default 0","type":"string","maxLength":40},"where":{"description":"filters for this claim only, on top of the top-level where","maxItems":20,"type":"array","items":{"type":"object","properties":{"column":{"type":"string","minLength":1,"maxLength":200},"op":{"type":"string","enum":["eq","ne","gt","gte","lt","lte","contains","in","empty","not_empty"]},"value":{"description":"text; a list for \"in\"; numbers as decimal strings","anyOf":[{"type":"string","maxLength":500},{"maxItems":200,"type":"array","items":{"type":"string","maxLength":500}}]}},"required":["column","op"],"additionalProperties":false}}},"required":["expr","expected"],"additionalProperties":false}}},"required":["claims"],"additionalProperties":false},"price":"$0.01","example":{"csv":"item,amount\nwidgets,1299.99\nshipping,24.50\ntax,107.25","claims":[{"label":"invoice total","expr":"sum(amount)","expected":"1431.74"},{"label":"tax at 8.25% of widgets","expr":"1299.99 * 0.0825","expected":"107.25"}]}},{"name":"quote_check","title":"Does the source really say this? (quote and citation check)","description":"Before your agent quotes, cites or summarises a document, check each quote against the source text. Per quote: \"exact\" (verbatim, with location), \"same_words\" (only capitalisation, spacing or punctuation differ), \"numbers_differ\" (the passage exists but a number was changed, e.g. 12% vs 21%), \"close_but_different\" (a similar passage exists, with the words that differ), or \"not_found\" (the source does not say it). Also flags a negation that was added or dropped (\"not\"). Returns the line, character offsets and the source passage. Up to 50 quotes per call against up to 600000 characters of source. Deterministic string matching, no model.","inputSchema":{"type":"object","properties":{"source":{"type":"string","minLength":1,"maxLength":600000,"description":"the full source text (document, page, transcript)"},"quotes":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":5000,"description":"the quote or claimed wording"},"label":{"type":"string","maxLength":120}},"required":["text"],"additionalProperties":false}}},"required":["source","quotes"],"additionalProperties":false},"price":"$0.01","example":{"source":"Q3 revenue grew 12% to $4.1 million. The company does not expect to raise prices in 2027.","quotes":[{"label":"verbatim","text":"Q3 revenue grew 12% to $4.1 million."},{"label":"changed number","text":"Q3 revenue grew 21% to $4.1 million"},{"label":"dropped negation","text":"The company expects to raise prices in 2027"}]}},{"name":"text_facts","title":"Exact counts, limits and differences for text","description":"Facts about a text that language models routinely get wrong: characters (as people see them, emoji included), words, lines, paragraphs, UTF-8 bytes, SMS segments (GSM-7 or UCS-2) and how often a word or letter appears (with positions; e.g. how many r in strawberry). Checks limits you give (max characters, words or SMS segments) before you post or send. With compareTo it returns exactly what changed between two versions (word or line diff). Deterministic, no model.","inputSchema":{"type":"object","properties":{"text":{"type":"string","maxLength":600000},"count":{"description":"words, phrases or letters to count","maxItems":50,"type":"array","items":{"type":"object","properties":{"term":{"type":"string","minLength":1,"maxLength":200},"caseSensitive":{"description":"default false","type":"boolean"},"wholeWord":{"description":"default false: also counts inside longer words","type":"boolean"}},"required":["term"],"additionalProperties":false}},"limits":{"type":"object","properties":{"maxCharacters":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxWords":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxSmsSegments":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"compareTo":{"description":"another version of the text: returns what changed from compareTo to text","type":"string","maxLength":600000},"diffBy":{"description":"diff granularity, default word","type":"string","enum":["word","line"]}},"required":["text"],"additionalProperties":false},"price":"$0.002","example":{"text":"How many r's are in strawberry? 🍓","count":[{"term":"r"}],"limits":{"maxCharacters":280,"maxSmsSegments":1}}},{"name":"reconcile","title":"Reconcile two lists (bank vs ledger, invoices vs payments): matched, mismatched, missing","description":"Match two lists that should agree, line by line, and list everything that does not: bank statement vs ledger, invoices vs payments received, payouts vs orders. Rules, in order: same reference and amount; same reference but a different amount (reported as a mismatch); then same amount within amountTolerance and dates within dateWindowDays. Each line matches at most once. Set sign \"opposite\" when one side records money out as negative, or \"ignore\" to compare sizes only. Returns matched pairs (row numbers on both sides), amount mismatches, unmatched lines on each side, and exact totals: left, right, matched, unmatched and the difference. Up to 5000 lines per side. Deterministic, exact decimals.","inputSchema":{"type":"object","properties":{"left":{"type":"object","properties":{"rows":{"description":"the lines as JSON objects","maxItems":5000,"type":"array","items":{"type":"object","propertyNames":{"type":"string","maxLength":200},"additionalProperties":{"anyOf":[{"type":"string","maxLength":2000},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},"csv":{"description":"the lines as CSV with a header row (instead of rows)","type":"string","maxLength":450000},"delimiter":{"type":"string","enum":[",",";","\t","|"]},"amount":{"type":"string","minLength":1,"maxLength":200,"description":"the amount column"},"date":{"description":"the date column (optional; enables the date window)","type":"string","maxLength":200},"ref":{"description":"a reference column to match on first: invoice number, order id, transaction id","type":"string","maxLength":200},"name":{"description":"what this list is, e.g. \"bank\" or \"ledger\"","type":"string","maxLength":60}},"required":["amount"],"additionalProperties":false,"description":"the first list, e.g. the bank statement"},"right":{"type":"object","properties":{"rows":{"description":"the lines as JSON objects","maxItems":5000,"type":"array","items":{"type":"object","propertyNames":{"type":"string","maxLength":200},"additionalProperties":{"anyOf":[{"type":"string","maxLength":2000},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},"csv":{"description":"the lines as CSV with a header row (instead of rows)","type":"string","maxLength":450000},"delimiter":{"type":"string","enum":[",",";","\t","|"]},"amount":{"type":"string","minLength":1,"maxLength":200,"description":"the amount column"},"date":{"description":"the date column (optional; enables the date window)","type":"string","maxLength":200},"ref":{"description":"a reference column to match on first: invoice number, order id, transaction id","type":"string","maxLength":200},"name":{"description":"what this list is, e.g. \"bank\" or \"ledger\"","type":"string","maxLength":60}},"required":["amount"],"additionalProperties":false,"description":"the second list, e.g. the ledger"},"amountTolerance":{"description":"largest amount difference that still counts as equal, e.g. \"0.01\"; default 0 (exact)","type":"string","maxLength":40},"dateWindowDays":{"description":"largest date gap for a match when both lists have dates; default 3 (bank posting delays)","type":"integer","minimum":0,"maximum":90},"sign":{"description":"same (default): amounts compared as written; opposite: right-side amounts are negated first; ignore: compare absolute values","type":"string","enum":["same","opposite","ignore"]},"dateFormat":{"description":"how to read slash dates; ISO dates always work","type":"string","enum":["iso","mdy","dmy"]}},"required":["left","right"],"additionalProperties":false},"price":"$0.05","example":{"left":{"name":"bank","csv":"date,description,amount\n2026-10-01,ACME PAYMENT INV-1001,1200.00\n2026-10-03,GLOBEX,349.99\n2026-10-05,STRIPE PAYOUT,87.10","date":"date","amount":"amount"},"right":{"name":"ledger","csv":"invoice,date,amount\nINV-1001,2026-09-30,1200.00\nINV-1002,2026-10-02,349.99\nINV-1003,2026-10-04,95.00","date":"date","amount":"amount"},"amountTolerance":"0","dateWindowDays":3}},{"name":"json_check","title":"Is this JSON valid and does it match the schema? (exact errors with paths)","description":"Check structured output before you use or send it. Give the raw text (a model reply works: set extract to pull the JSON out of ```json fences or surrounding prose) or the parsed data, and optionally a JSON Schema. Returns valid / invalid with every problem and its JSON Pointer path (e.g. /items/2/price: must be >= 0), or the line and column of a syntax error. Supports type, enum, const, required, properties, additionalProperties, patternProperties, items/prefixItems, min/max (length, items, properties), uniqueItems, contains, minimum/maximum/exclusive, multipleOf (exact decimals), pattern, format (email, date, date-time, time, uri, uuid, ipv4, ipv6, hostname) asserted, allOf/anyOf/oneOf/not, if/then/else and local $ref. Up to 100 errors listed.","inputSchema":{"type":"object","properties":{"text":{"description":"the JSON as text (or a model reply containing it, with extract: true)","type":"string","maxLength":500000},"data":{"description":"the value itself, already parsed (instead of text)"},"schema":{"description":"a JSON Schema; omit to only check that the text is valid JSON","anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"boolean"}]},"extract":{"description":"pull the JSON out of surrounding text: a ```json block, else the first {...} or [...]","type":"boolean"}},"additionalProperties":false},"price":"$0.002","example":{"text":"Here is the order:\n```json\n{\"id\": \"A-17\", \"qty\": 0, \"email\": \"pat@example\"}\n```","extract":true,"schema":{"type":"object","required":["id","qty","email","total"],"properties":{"id":{"type":"string","pattern":"^A-[0-9]+$"},"qty":{"type":"integer","minimum":1},"email":{"type":"string","format":"email"},"total":{"type":"string"}},"additionalProperties":false}}},{"name":"invoice_check","title":"Compute or check an invoice exactly (lines, discounts, tax, shipping, total)","description":"Line totals (qty x unit price, minus line discounts), subtotal, invoice discount (spread over the lines by value), tax per invoice or per line (the usual source of 1-cent differences: both are shown), shipping (taxable or not) and the total, in exact decimals rounded to cents only where an invoice rounds. Pass the figures written on an invoice in claimed (and claimedTotal per line) and each comes back correct or wrong with the right value. You choose the rates; not tax advice.","inputSchema":{"type":"object","properties":{"lines":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"object","properties":{"description":{"type":"string","maxLength":300},"qty":{"type":"string","maxLength":40,"description":"quantity as a decimal string, e.g. \"3\" or \"1.5\""},"unitPrice":{"type":"string","maxLength":40,"description":"price per unit, e.g. \"19.99\""},"discountPercent":{"description":"line discount in percent, e.g. \"10\"","type":"string","maxLength":20},"discountAmount":{"description":"line discount as an amount","type":"string","maxLength":40},"taxable":{"description":"default true","type":"boolean"},"taxRatePercent":{"description":"this line's tax rate if it differs from the invoice rate","type":"string","maxLength":20},"claimedTotal":{"description":"the line total written on the invoice, to check","type":"string","maxLength":40}},"required":["qty","unitPrice"],"additionalProperties":false}},"taxRatePercent":{"description":"e.g. \"8.25\"; default 0","type":"string","maxLength":20},"taxRounding":{"description":"round tax once on the invoice (default) or on each line and add up","type":"string","enum":["per_invoice","per_line"]},"discountPercent":{"description":"invoice-level discount in percent, before tax","type":"string","maxLength":20},"discountAmount":{"description":"invoice-level discount amount, before tax","type":"string","maxLength":40},"shipping":{"type":"string","maxLength":40},"shippingTaxable":{"description":"default false","type":"boolean"},"scale":{"description":"decimal places of the currency, default 2","type":"integer","minimum":0,"maximum":6},"rounding":{"description":"default half_up","type":"string","enum":["down","up","floor","ceil","half_up","half_even","half_down"]},"claimed":{"description":"figures written on the invoice, to check","type":"object","properties":{"subtotal":{"type":"string","maxLength":40},"discount":{"type":"string","maxLength":40},"tax":{"type":"string","maxLength":40},"shipping":{"type":"string","maxLength":40},"total":{"type":"string","maxLength":40}},"additionalProperties":false}},"required":["lines"],"additionalProperties":false},"price":"$0.01","example":{"lines":[{"description":"Office cleaning","qty":"4","unitPrice":"185.00"},{"description":"Supplies","qty":"1","unitPrice":"42.37","taxable":true},{"description":"Deep clean add-on","qty":"1","unitPrice":"120.00","discountPercent":"10"}],"taxRatePercent":"8.6","claimed":{"subtotal":"890.37","tax":"76.57","total":"966.94"}}},{"name":"timesheet_calc","title":"Hours, overtime and pay from clock-in/out entries (exact)","description":"From clock-in/clock-out entries per worker: hours worked (breaks removed, overnight shifts handled), optional punch rounding (e.g. to the nearest 15 minutes), regular / overtime / double-time hours under the rules you set (daily after N hours, double after M, weekly after 40, applied without counting an hour twice), and pay at each entry's rate. Per worker and per entry, with warnings for overlapping or very long shifts. Minutes are counted exactly; pay is rounded to cents once per worker. You choose the rules; not legal advice.","inputSchema":{"type":"object","properties":{"entries":{"minItems":1,"maxItems":5000,"type":"array","items":{"type":"object","properties":{"worker":{"type":"string","minLength":1,"maxLength":120},"date":{"description":"YYYY-MM-DD (needed for weekly overtime)","type":"string","maxLength":40},"start":{"type":"string","maxLength":20,"description":"clock-in, e.g. \"08:00\" or \"8:00 AM\""},"end":{"type":"string","maxLength":20,"description":"clock-out; earlier than start means the next day (overnight)"},"breakMinutes":{"description":"unpaid break minutes","type":"integer","minimum":0,"maximum":720},"rate":{"description":"hourly rate for this entry, e.g. \"22.50\"","type":"string","maxLength":40}},"required":["worker","start","end"],"additionalProperties":false}},"defaultRate":{"description":"hourly rate when an entry has none","type":"string","maxLength":40},"roundPunchesTo":{"description":"round each clock-in and clock-out to the nearest N minutes (ties round up)","type":"integer","minimum":1,"maximum":60},"overtime":{"type":"object","properties":{"dailyAfterHours":{"description":"hours per day before overtime, e.g. 8 (California)","type":"number","minimum":0,"maximum":24},"doubleAfterDailyHours":{"description":"hours per day before double time, e.g. 12","type":"number","minimum":0,"maximum":24},"weeklyAfterHours":{"description":"hours per week before overtime, e.g. 40 (US federal)","type":"number","minimum":0,"maximum":168},"multiplier":{"description":"overtime pay multiplier, default \"1.5\"","type":"string","maxLength":10},"doubleMultiplier":{"description":"double-time multiplier, default \"2\"","type":"string","maxLength":10}},"additionalProperties":false},"weekStarts":{"description":"first day of the pay week, default monday","type":"string","enum":["monday","sunday"]}},"required":["entries"],"additionalProperties":false},"price":"$0.02","example":{"entries":[{"worker":"Ana","date":"2026-10-26","start":"7:00 AM","end":"5:30 PM","breakMinutes":30,"rate":"22.50"},{"worker":"Ana","date":"2026-10-27","start":"22:00","end":"06:00","rate":"22.50"},{"worker":"Luis","date":"2026-10-26","start":"08:03","end":"16:58","breakMinutes":30,"rate":"19.00"}],"roundPunchesTo":15,"overtime":{"dailyAfterHours":8,"doubleAfterDailyHours":12,"weeklyAfterHours":40}}},{"name":"list_ops","title":"Exact list operations: dedupe, sort, union, intersection, difference, compare","description":"Set and order operations on lists of up to 50000 items, done exactly (language models drop or duplicate items in long lists). ops: dedupe (with the duplicates and their counts), sort (natural order: item2 before item10), union, intersection, difference (in a, not in b), symmetric_difference, frequency (each value and how often), compare (only in a, only in b, in both). Options: ignoreCase, trim (default true), sort the result. Order is first appearance unless you sort. Deterministic.","inputSchema":{"type":"object","properties":{"op":{"type":"string","enum":["dedupe","sort","union","intersection","difference","symmetric_difference","frequency","compare"]},"a":{"maxItems":50000,"type":"array","items":{"type":"string","maxLength":1000},"description":"the first list"},"b":{"description":"the second list (union, intersection, difference, symmetric_difference, compare)","maxItems":50000,"type":"array","items":{"type":"string","maxLength":1000}},"ignoreCase":{"description":"treat \"Acme\" and \"ACME\" as the same (the first spelling seen is kept); default false","type":"boolean"},"trim":{"description":"remove leading/trailing spaces and empty items first; default true","type":"boolean"},"sort":{"description":"order of the result; default none (first appearance), asc for op sort","type":"string","enum":["none","asc","desc"]},"natural":{"description":"natural order when sorting (item2 < item10); default true","type":"boolean"}},"required":["op","a"],"additionalProperties":false},"price":"$0.002","example":{"op":"compare","a":["acme.com","Globex.com","initech.com","item2","item10"],"b":["ACME.com","umbrella.com","item10"],"ignoreCase":true}},{"name":"contact_normalize","title":"Clean and dedupe emails and phone numbers (E.164)","description":"Normalise contact lists before they go into a CRM or a mail/SMS tool: emails (trimmed, display names and mailto: removed, domain lower-cased, syntax checked, typo domains like gmial.com flagged with a suggestion, role inboxes and disposable domains flagged) and phone numbers to E.164 (+14805550123; North American numbers checked against the numbering plan, others by shape, extensions kept). Duplicates that differ only in formatting are grouped. Up to 10000 of each. Deterministic, no lookups.","inputSchema":{"type":"object","properties":{"emails":{"maxItems":10000,"type":"array","items":{"type":"string","maxLength":320}},"phones":{"maxItems":10000,"type":"array","items":{"type":"string","maxLength":64}},"defaultCallingCode":{"description":"country calling code for numbers written without one, e.g. \"1\" (US/Canada, default) or \"44\" (UK)","type":"string","pattern":"^[1-9]\\d{0,2}$"}},"additionalProperties":false},"price":"$0.005","example":{"emails":[" Pat Lee <Pat.Lee@Gmial.com>","pat.lee@gmial.com","info@acme.com","bad@@example"],"phones":["(480) 555-0123","+1 480.555.0123","480-555-0123 ext 22","020 7946 0018"],"defaultCallingCode":"1"}},{"name":"find_free_slots","title":"Meeting times that work for everyone (time zones and DST handled)","description":"Finds meeting slots inside every participant's working hours (each in their own IANA time zone, daylight-saving changes included) that avoid all their busy times (optionally with a buffer). Returns each slot in your display zone and in every participant's local time, so nobody has to convert. Up to 31 days, 20 participants. Deterministic: zone rules come from the IANA database, not a guessed offset.","inputSchema":{"type":"object","properties":{"participants":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"timeZone":{"type":"string","maxLength":64,"description":"IANA zone, e.g. America/Phoenix, Europe/London"},"workingHours":{"description":"default 09:00-17:00, Monday to Friday, in their own zone","type":"object","properties":{"start":{"type":"string","maxLength":10,"description":"e.g. 09:00"},"end":{"type":"string","maxLength":10,"description":"e.g. 17:00"},"days":{"description":"default mon-fri","minItems":1,"maxItems":7,"type":"array","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"]}}},"required":["start","end"],"additionalProperties":false},"busy":{"description":"busy times as instants with an offset, e.g. 2026-11-02T15:00:00Z or 2026-11-02T08:00:00-07:00","maxItems":500,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","maxLength":40},"end":{"type":"string","maxLength":40}},"required":["start","end"],"additionalProperties":false}}},"required":["name","timeZone"],"additionalProperties":false}},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"first date to search, YYYY-MM-DD, in the display zone"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"last date to search (inclusive)"},"durationMinutes":{"type":"integer","minimum":5,"maximum":720},"stepMinutes":{"description":"start times on this grid of the display zone's clock, default 30","type":"integer","minimum":5,"maximum":120},"bufferMinutes":{"description":"keep this much free before and after busy times","type":"integer","minimum":0,"maximum":120},"displayTimeZone":{"description":"zone for from/to and for listing slots; default the first participant's","type":"string","maxLength":64},"maxResults":{"description":"default 20","type":"integer","minimum":1,"maximum":200}},"required":["participants","from","to","durationMinutes"],"additionalProperties":false},"price":"$0.005","example":{"participants":[{"name":"Conner","timeZone":"America/Phoenix","busy":[{"start":"2026-11-02T09:00:00-07:00","end":"2026-11-02T09:30:00-07:00"}]},{"name":"Priya","timeZone":"Europe/London"},{"name":"Sam","timeZone":"America/New_York","workingHours":{"start":"10:00","end":"18:00"}}],"from":"2026-11-02","to":"2026-11-04","durationMinutes":30}},{"name":"date_series","title":"Recurring dates: every 2nd Tuesday, last business day of the month, every 2 weeks","description":"Lists the dates of a recurrence exactly: daily / weekly (on chosen weekdays) / monthly (on day numbers like 1, 15 or -1 for the last day, or the nth weekday like 2nd Tuesday or -1 for the last Friday) / yearly, every N periods, from a start date up to a count or an until date. Days that do not exist (31 February) are skipped or clamped as you choose. Optional business-day adjustment (following, preceding, modified following) with your weekend rule and holidays, each moved date marked. Up to 500 dates.","inputSchema":{"type":"object","properties":{"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"first possible date, YYYY-MM-DD"},"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"description":"every N periods, default 1","type":"integer","minimum":1,"maximum":366},"count":{"description":"how many dates (default 12 when no until)","type":"integer","minimum":1,"maximum":500},"until":{"description":"last possible date (inclusive)","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"weekdays":{"description":"weekly: which days; monthly with nth: the weekday","minItems":1,"maxItems":7,"type":"array","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"]}},"nth":{"description":"monthly: 1 = first, 2 = second, -1 = last of the weekday in weekdays","type":"integer","minimum":-5,"maximum":5},"monthDays":{"description":"monthly: day numbers, -1 = last day of the month","minItems":1,"maxItems":31,"type":"array","items":{"type":"integer","minimum":-31,"maximum":31}},"missingDay":{"description":"when a month lacks the day (31st, Feb 29): skip (default) or use the last day","type":"string","enum":["skip","clamp"]},"adjust":{"description":"move dates off weekends/holidays; modified_following stays in the same month","type":"string","enum":["none","following","preceding","modified_following"]},"weekend":{"type":"string","enum":["sat_sun","fri_sat","sun_only","none"]},"holidays":{"maxItems":400,"type":"array","items":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}}},"required":["start","freq"],"additionalProperties":false},"price":"$0.002","example":{"start":"2026-11-01","freq":"monthly","monthDays":[-1],"adjust":"preceding","count":6}},{"name":"table_join","title":"Join two tables on a key (VLOOKUP done exactly)","description":"Bring columns from one table into another by a shared key (customer id, email, SKU), exactly: how \"left\" keeps every left row (blank when no match), \"inner\" keeps matches only, \"anti\" lists left rows with no match. Keys (up to 3 columns) match exactly, ignoring case, or as numbers (\"00123\" equals \"123\"). When the right table has the key more than once, take the first (like VLOOKUP) or all matches; duplicates are reported either way. Returns the joined rows plus counts of matched and unmatched rows on both sides. Up to 10000 rows per table.","inputSchema":{"type":"object","properties":{"left":{"type":"object","properties":{"rows":{"maxItems":10000,"type":"array","items":{"type":"object","propertyNames":{"type":"string","maxLength":200},"additionalProperties":{"anyOf":[{"type":"string","maxLength":5000},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},"csv":{"type":"string","maxLength":450000},"delimiter":{"type":"string","enum":[",",";","\t","|"]}},"additionalProperties":false,"description":"the table to enrich"},"right":{"type":"object","properties":{"rows":{"maxItems":10000,"type":"array","items":{"type":"object","propertyNames":{"type":"string","maxLength":200},"additionalProperties":{"anyOf":[{"type":"string","maxLength":5000},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},"csv":{"type":"string","maxLength":450000},"delimiter":{"type":"string","enum":[",",";","\t","|"]}},"additionalProperties":false,"description":"the lookup table"},"on":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"object","properties":{"left":{"type":"string","minLength":1,"maxLength":200},"right":{"type":"string","minLength":1,"maxLength":200}},"required":["left","right"],"additionalProperties":false},"description":"key columns, e.g. [{left: \"Email\", right: \"email\"}]"},"how":{"description":"default left","type":"string","enum":["left","inner","anti"]},"match":{"description":"how keys compare; default exact (after trimming spaces)","type":"string","enum":["exact","ignore_case","numeric"]},"duplicates":{"description":"right-side keys that repeat: first match (default, like VLOOKUP) or every match","type":"string","enum":["first","all"]},"columns":{"description":"right-side columns to bring in (default all except the keys)","maxItems":100,"type":"array","items":{"type":"string","maxLength":200}}},"required":["left","right","on"],"additionalProperties":false},"price":"$0.005","example":{"left":{"csv":"email,company\nPat@Acme.com,Acme\nsam@globex.com,Globex\nlee@initech.com,Initech"},"right":{"csv":"email,owner,stage\npat@acme.com,Ana,proposal\nlee@initech.com,Bo,won"},"on":[{"left":"email","right":"email"}],"match":"ignore_case"}},{"name":"pii_redact","title":"Find and redact personal data and secrets in text before it is logged or shared","description":"Scans text for emails, phone numbers, US SSNs, payment card numbers (Luhn-checked), IBANs (checksum-checked), IP addresses and secrets (API keys such as sk-..., AKIA..., ghp_..., xoxb-..., private keys and 0x-prefixed 64-hex keys), and returns the text redacted: label mode gives the same value the same placeholder ([EMAIL_1]) so the text still reads, mask keeps the last 4 characters, remove deletes. Findings list type, position and a masked preview, never the full value. Pattern and checksum based: it will not catch names or street addresses.","inputSchema":{"type":"object","properties":{"text":{"type":"string","maxLength":600000},"types":{"description":"which kinds to find, default all","minItems":1,"maxItems":7,"type":"array","items":{"type":"string","enum":["email","phone","ssn","card","iban","ip","secret"]}},"mode":{"description":"default label","type":"string","enum":["label","mask","remove"]}},"required":["text"],"additionalProperties":false},"price":"$0.002","example":{"text":"Call Pat at (480) 555-0123 or pat@example.com. Card on file 4111 1111 1111 1111. Test key sk-ant-abcdefghijklmnopqrstuvwxyz0123."}},{"name":"id_check","title":"Validate identifiers by their check digits (IBAN, routing number, barcode, ISBN, VIN, NPI, EIN)","description":"Catches typos in identifiers before they go on an invoice, a payment or an order: IBAN (country length + mod-97), US ABA routing number (3-7-1 checksum), GTIN/EAN/UPC barcodes, ISBN-10/13, VIN (check digit), US NPI, EIN (format and IRS prefix), or any Luhn number. type auto guesses from the shape. Up to 500 per call. A valid checksum means well-formed, not that the account or product exists.","inputSchema":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"object","properties":{"value":{"type":"string","minLength":1,"maxLength":64},"type":{"type":"string","enum":["auto","iban","gtin","isbn","aba_routing","vin","npi","luhn","ein"]}},"required":["value"],"additionalProperties":false}}},"required":["ids"],"additionalProperties":false},"price":"$0.001","example":{"ids":[{"value":"GB82 WEST 1234 5698 7654 32"},{"value":"021000021","type":"aba_routing"},{"value":"036000291452"},{"value":"1M8GDM9AXKP042788"},{"value":"GB82 WEST 1234 5698 7654 33"}]}},{"name":"table_profile","title":"Profile a spreadsheet: what every column holds and what is wrong with it","description":"Reads every cell of a table (JSON rows or CSV, up to 20000 rows) and reports per column: type (integer, decimal, date, boolean, text, mixed), filled and blank counts, distinct values, most common values, number sum/min/max (exact), date range, and whether it is unique (a possible id). Lists the problems that break later steps: numbers written with $ or commas, mixed date formats, ambiguous slash dates, stray spaces, the same value in different capitalisation, and duplicate rows (with row numbers). Use it before table_calc or table_join on data you have not seen.","inputSchema":{"type":"object","properties":{"rows":{"maxItems":20000,"type":"array","items":{"type":"object","propertyNames":{"type":"string","maxLength":200},"additionalProperties":{"anyOf":[{"type":"string","maxLength":5000},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},"csv":{"type":"string","maxLength":900000},"delimiter":{"type":"string","enum":[",",";","\t","|"]}},"additionalProperties":false},"price":"$0.005","example":{"rows":[{"customer":"Acme","amount":"$1,200.00","date":"2026-10-01"},{"customer":"ACME","amount":"350","date":"10/02/2026"},{"customer":"Globex ","amount":"n/a","date":"2026-10-03"},{"customer":"Acme","amount":"$1,200.00","date":"2026-10-01"}]}},{"name":"holiday_calendar","title":"Public holidays by rule: US federal, England and Wales bank holidays (with observed dates)","description":"Computes public holidays from the rules in law instead of memory: US federal holidays (fixed dates moved to Friday/Monday when they fall on a weekend, nth-weekday holidays such as Thanksgiving, Juneteenth from 2021) or bank holidays in England and Wales (Easter-based, substitute days for weekends, Christmas/Boxing Day combinations, and the one-off royal holidays proclaimed so far). For each: name, the calendar date, the observed day off and weekday. Also returns the observed dates as a list ready for business_days or date_series. Up to 10 years per call. Future one-off holidays are only included once proclaimed.","inputSchema":{"type":"object","properties":{"country":{"type":"string","enum":["US","GB-EAW"],"description":"US = United States federal; GB-EAW = England and Wales bank holidays"},"fromYear":{"type":"integer","minimum":2000,"maximum":2200},"toYear":{"description":"default fromYear","type":"integer","minimum":2000,"maximum":2200}},"required":["country","fromYear"],"additionalProperties":false},"price":"$0.001","example":{"country":"US","fromYear":2026,"toYear":2027}},{"name":"fx_rate","title":"Currency conversion at official ECB reference rates (dated, never guessed)","description":"Converts between about 30 currencies (USD, EUR, GBP, JPY, CAD, AUD, CHF, CNY, INR, MXN, BRL, ...) at the European Central Bank's euro reference rates, published once per business day around 16:00 CET. Cross rates go through the euro exactly as the ECB publishes them. Give a date (last 90 days) or get the latest; a weekend or holiday uses the last published rates and says which. Returns each rate, its inverse, the converted amount (rounded to the currency scale you choose) and the rate date. Reference rates are for information: banks and card networks add their own margins.","inputSchema":{"type":"object","properties":{"from":{"type":"string","pattern":"^[A-Za-z]{3}$","description":"ISO 4217 code, e.g. USD"},"to":{"minItems":1,"maxItems":30,"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{3}$"},"description":"one or more target codes, e.g. [\"EUR\", \"GBP\"]"},"amount":{"description":"amount to convert as a decimal string, default \"1\"","type":"string","maxLength":40},"date":{"description":"rates for this date (within the last 90 days); default the latest","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"scale":{"description":"decimal places of converted amounts, default 2","type":"integer","minimum":0,"maximum":8},"rounding":{"description":"default half_up","type":"string","enum":["down","up","floor","ceil","half_up","half_even","half_down"]}},"required":["from","to"],"additionalProperties":false},"price":"$0.002","example":{"from":"USD","to":["EUR","GBP","MXN"],"amount":"1250.00"}},{"name":"slippage_bounds","title":"Slippage bounds in base units","description":"From a quoted amount in base units (integer string) and a slippage tolerance in basis points, computes the minimum you should accept (min_out, rounded down) or the maximum you should pay (max_in, rounded up). Integer arithmetic only; the rounding direction is stated.","inputSchema":{"type":"object","properties":{"amount":{"type":"string"},"slippageBps":{"type":"integer","minimum":0,"maximum":10000},"direction":{"type":"string","enum":["min_out","max_in"]}},"required":["amount","slippageBps","direction"],"additionalProperties":false},"price":"$0.001","example":{"amount":"1000000","slippageBps":50,"direction":"min_out"}},{"name":"swap_price_impact","title":"Constant-product swap output and price impact","description":"For a Uniswap-V2-style pool, computes the exact output of a swap (the router's integer formula), the total cost versus the spot price including the fee, and the part due to trade size alone, in basis points. Inputs are reserves and amounts in base units. Does not know any pool: you supply the reserves.","inputSchema":{"type":"object","properties":{"reserveIn":{"type":"string"},"reserveOut":{"type":"string"},"amountIn":{"type":"string"},"feeBps":{"type":"integer","minimum":0,"maximum":10000}},"required":["reserveIn","reserveOut","amountIn"],"additionalProperties":false},"price":"$0.001","example":{"reserveIn":"1000000000","reserveOut":"500000000000","amountIn":"1000000","feeBps":30}},{"name":"money_calc","title":"Currency-aware money math","description":"Rounds, adds, subtracts, multiplies, or splits an amount of an ISO 4217 currency, using that currency's real number of minor units (JPY 0, USD 2, KWD 3). A currency not in the list is refused, never assumed to have 2 decimals. split divides a total into equal parts or by ratios so the parts always add back to the total exactly.","inputSchema":{"type":"object","properties":{"currency":{"type":"string"},"op":{"type":"string","enum":["round","add","subtract","multiply","split"]},"amount":{"type":"string"},"other":{"type":"string"},"factor":{"type":"string"},"parts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ratios":{"type":"array","items":{"type":"string"}},"rounding":{"description":"rounding rule; default half_up (ties away from zero). half_even is banker's rounding","type":"string","enum":["down","up","floor","ceil","half_up","half_even","half_down"]}},"required":["currency","op","amount"],"additionalProperties":false},"price":"$0.001","example":{"op":"split","currency":"USD","amount":"100.00","parts":3}},{"name":"interest_calc","title":"Simple and compound interest","description":"Exact simple or compound interest for a principal, an annual percentage rate and a term in years, compounded annually, semiannually, quarterly, monthly, weekly or daily. The number of periods must be whole; fractional periods are refused, not approximated. Also returns the effective annual rate.","inputSchema":{"type":"object","properties":{"principal":{"type":"string"},"ratePercent":{"type":"string"},"years":{"type":"string"},"compounding":{"type":"string","enum":["simple","annual","semiannual","quarterly","monthly","weekly","daily"]},"scale":{"type":"integer","minimum":0,"maximum":18},"rounding":{"description":"rounding rule; default half_up (ties away from zero). half_even is banker's rounding","type":"string","enum":["down","up","floor","ceil","half_up","half_even","half_down"]}},"required":["principal","ratePercent","years","compounding"],"additionalProperties":false},"price":"$0.001","example":{"principal":"1000","ratePercent":"5","years":"1","compounding":"monthly"}},{"name":"loan_calc","title":"Level-payment loan","description":"Monthly payment, total interest and total paid for a fixed-rate amortizing loan, in exact arithmetic. The payment is rounded once to the currency scale and the final payment absorbs the rounding so the balance ends at exactly zero.","inputSchema":{"type":"object","properties":{"principal":{"type":"string"},"annualRatePercent":{"type":"string"},"termMonths":{"type":"integer","minimum":1,"maximum":600},"scale":{"type":"integer","minimum":0,"maximum":8},"rounding":{"description":"rounding rule; default half_up (ties away from zero). half_even is banker's rounding","type":"string","enum":["down","up","floor","ceil","half_up","half_even","half_down"]}},"required":["principal","annualRatePercent","termMonths"],"additionalProperties":false},"price":"$0.001","example":{"principal":"200000","annualRatePercent":"6","termMonths":360}},{"name":"unit_convert","title":"Exact unit conversion","description":"Converts length, mass, volume, time, data, energy, area, speed and temperature using exact definitions (an inch is exactly 0.0254 m). Ambiguous names (oz, gal, pt, KB) return AMBIGUOUS_INPUT with the choices instead of picking one. Reports whether the result is exact or rounded.","inputSchema":{"type":"object","properties":{"value":{"type":"string"},"from":{"type":"string"},"to":{"type":"string"},"scale":{"type":"integer","minimum":0,"maximum":30},"rounding":{"description":"rounding rule; default half_up (ties away from zero). half_even is banker's rounding","type":"string","enum":["down","up","floor","ceil","half_up","half_even","half_down"]}},"required":["value","from","to"],"additionalProperties":false},"price":"free","example":{"value":"1","from":"ether","to":"gwei","scale":0}},{"name":"address_format_check","title":"Cross-chain address format check","description":"Checks whether a string is a well-formed address for EVM (EIP-55 checksum), Solana, Aptos (AIP-40) or Bitcoin (base58check, bech32, bech32m). With family \"auto\" it lists every family the string could be, and never picks one. A valid format is not evidence an address is safe, owned, or the one you meant.","inputSchema":{"type":"object","properties":{"address":{"type":"string"},"family":{"type":"string","enum":["evm","solana","aptos","bitcoin","auto"]}},"required":["address","family"],"additionalProperties":false},"price":"free","example":{"address":"bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq","family":"auto"}},{"name":"time_convert","title":"Time zone conversion","description":"Converts an ISO 8601 instant, or a local time plus its IANA zone, to another IANA zone. A local time skipped by a daylight-saving jump is refused; one that occurs twice returns AMBIGUOUS_INPUT with both instants. Zone abbreviations such as EST are refused.","inputSchema":{"type":"object","properties":{"time":{"type":"string"},"fromZone":{"type":"string"},"toZone":{"type":"string"}},"required":["time","toZone"],"additionalProperties":false},"price":"free","example":{"time":"2026-10-22T12:00:00Z","toZone":"America/Phoenix"}},{"name":"business_days","title":"Business-day arithmetic","description":"Counts business days between two dates, adds business days to a date, or tests whether a date is a business day. Weekends are configurable. NO holidays are assumed: pass the holidays you want observed. Dates are calendar dates (YYYY-MM-DD) with no time zone.","inputSchema":{"type":"object","properties":{"op":{"type":"string","enum":["count","add","is_business_day"]},"from":{"type":"string"},"to":{"type":"string"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"weekend":{"type":"string","enum":["sat_sun","fri_sat","sun_only","none"]},"holidays":{"maxItems":400,"type":"array","items":{"type":"string"}}},"required":["op","from"],"additionalProperties":false},"price":"$0.001","example":{"op":"count","from":"2026-10-19","to":"2026-10-30"}},{"name":"evm_balance","title":"EVM balances at one block","description":"Native and ERC-20 balances of an address, ALL read at one stated block (number and hash returned). Token decimals are read from the token contract, never assumed; an address with no code, or a contract that is not a standard ERC-20, is an error and is never reported as a zero balance. Amounts are exact strings.","inputSchema":{"type":"object","properties":{"chain":{"type":"string","description":"EVM CAIP-2 chain id such as eip155:8453, or a bare chain id number as a string. Chain names are refused."},"address":{"type":"string","description":"0x + 40 hex digits (EIP-55 checksum enforced when mixed-case)"},"assets":{"description":"\"native\" and/or token contract addresses; default [\"native\"]","minItems":1,"maxItems":20,"type":"array","items":{"type":"string"}},"block":{"description":"\"latest\" (default), \"safe\", \"finalized\", or a decimal block number. Every value in the answer is read at this one block","type":"string"}},"required":["chain","address"],"additionalProperties":false},"price":"$0.002","example":{"chain":"eip155:8453","address":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e","assets":["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"]}},{"name":"evm_nonce","title":"EVM account nonce","description":"The transaction count of an address at one stated block. Pending-pool transactions are not counted, and the answer says so.","inputSchema":{"type":"object","properties":{"chain":{"type":"string","description":"EVM CAIP-2 chain id such as eip155:8453, or a bare chain id number as a string. Chain names are refused."},"address":{"type":"string","description":"0x + 40 hex digits (EIP-55 checksum enforced when mixed-case)"},"block":{"description":"\"latest\" (default), \"safe\", \"finalized\", or a decimal block number. Every value in the answer is read at this one block","type":"string"}},"required":["chain","address"],"additionalProperties":false},"price":"$0.001","example":{"chain":"eip155:8453","address":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e"}},{"name":"evm_block","title":"EVM block summary","description":"Number, hash, timestamp, base fee (gwei), gas used/limit and transaction count of one block. Use block \"finalized\" for a block that can no longer reorganize.","inputSchema":{"type":"object","properties":{"chain":{"type":"string","description":"EVM CAIP-2 chain id such as eip155:8453, or a bare chain id number as a string. Chain names are refused."},"block":{"description":"\"latest\" (default), \"safe\", \"finalized\", or a decimal block number. Every value in the answer is read at this one block","type":"string"}},"required":["chain"],"additionalProperties":false},"price":"$0.001","example":{"chain":"eip155:8453"}},{"name":"evm_tx_receipt","title":"EVM transaction receipt","description":"Status (success / reverted / pending), block, gas used and the exact fee in wei and native units for a transaction hash. 'Not found' is reported as such and is not proof the transaction never existed.","inputSchema":{"type":"object","properties":{"chain":{"type":"string","description":"EVM CAIP-2 chain id such as eip155:8453, or a bare chain id number as a string. Chain names are refused."},"hash":{"type":"string"}},"required":["chain","hash"],"additionalProperties":false},"price":"$0.002","example":{"chain":"eip155:8453","hash":"0x600accdbbdaca7bcabef7f9e6a0777d0d22b5fd8188585db0c0d77ee2e7d34d9"}},{"name":"evm_token_metadata","title":"ERC-20 token metadata","description":"Name, symbol, decimals and total supply of an ERC-20 read from its contract at one block. Handles tokens whose name/symbol are bytes32. If decimals() is missing, it is an error: decimals are never assumed.","inputSchema":{"type":"object","properties":{"chain":{"type":"string","description":"EVM CAIP-2 chain id such as eip155:8453, or a bare chain id number as a string. Chain names are refused."},"token":{"type":"string","description":"0x + 40 hex digits (EIP-55 checksum enforced when mixed-case)"},"block":{"description":"\"latest\" (default), \"safe\", \"finalized\", or a decimal block number. Every value in the answer is read at this one block","type":"string"}},"required":["chain","token"],"additionalProperties":false},"price":"$0.002","example":{"chain":"eip155:8453","token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},{"name":"evm_allowance","title":"ERC-20 allowance","description":"How much a spender may take from an owner for a token, at one block, in exact base units and human units, flagging 'unlimited' approvals.","inputSchema":{"type":"object","properties":{"chain":{"type":"string","description":"EVM CAIP-2 chain id such as eip155:8453, or a bare chain id number as a string. Chain names are refused."},"token":{"type":"string","description":"0x + 40 hex digits (EIP-55 checksum enforced when mixed-case)"},"owner":{"type":"string","description":"0x + 40 hex digits (EIP-55 checksum enforced when mixed-case)"},"spender":{"type":"string","description":"0x + 40 hex digits (EIP-55 checksum enforced when mixed-case)"},"block":{"description":"\"latest\" (default), \"safe\", \"finalized\", or a decimal block number. Every value in the answer is read at this one block","type":"string"}},"required":["chain","token","owner","spender"],"additionalProperties":false},"price":"$0.002","example":{"chain":"eip155:8453","token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","owner":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e","spender":"0x000000000022D473030F116dDEE9F6B43aC78BA3"}},{"name":"evm_contract_type","title":"Classify an EVM address","description":"Says what is at an address using on-chain evidence: empty account, EIP-7702 delegated account, EIP-1167 minimal proxy, EIP-1967 proxy (with implementation and admin), Safe wallet (with owners and threshold), or other contract. Each classification lists the evidence. It is not a safety verdict.","inputSchema":{"type":"object","properties":{"chain":{"type":"string","description":"EVM CAIP-2 chain id such as eip155:8453, or a bare chain id number as a string. Chain names are refused."},"address":{"type":"string","description":"0x + 40 hex digits (EIP-55 checksum enforced when mixed-case)"},"block":{"description":"\"latest\" (default), \"safe\", \"finalized\", or a decimal block number. Every value in the answer is read at this one block","type":"string"}},"required":["chain","address"],"additionalProperties":false},"price":"$0.003","example":{"chain":"eip155:8453","address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},{"name":"evm_logs","title":"EVM event logs (bounded)","description":"Logs emitted by one contract in a block range of at most 2000 blocks, optionally filtered by topics. Refuses (rather than truncates) when more than 1000 logs match, so an answer is always complete.","inputSchema":{"type":"object","properties":{"chain":{"type":"string","description":"EVM CAIP-2 chain id such as eip155:8453, or a bare chain id number as a string. Chain names are refused."},"address":{"type":"string","description":"0x + 40 hex digits (EIP-55 checksum enforced when mixed-case)"},"fromBlock":{"type":"string"},"toBlock":{"type":"string"},"topics":{"maxItems":4,"type":"array","items":{"type":["string","null"]}}},"required":["chain","address","fromBlock","toBlock"],"additionalProperties":false},"price":"$0.003","example":{"chain":"eip155:8453","address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","fromBlock":"52952713","toBlock":"52952713","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",null,"0x00000000000000000000000078845031f7bca8fb9f3ac0cc86678ef8ce33ea0e"]}},{"name":"evm_calldata_decode","title":"Decode calldata with your ABI","description":"Decodes transaction calldata against an ABI that YOU supply and returns the function, its signature and each argument. If the selector is not in your ABI it says so and lists the selectors it does have; it does not guess from a selector database. An ABI that does not belong to the target contract can decode to plausible nonsense.","inputSchema":{"type":"object","properties":{"abi":{"minItems":1,"maxItems":500,"type":"array","items":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"string","maxLength":1000}]},"description":"JSON ABI objects, or human-readable signatures such as \"function transfer(address to, uint256 amount)\""},"data":{"type":"string"}},"required":["abi","data"],"additionalProperties":false},"price":"$0.001","example":{"abi":["function transfer(address to, uint256 amount)"],"data":"0xa9059cbb00000000000000000000000078845031f7bca8fb9f3ac0cc86678ef8ce33ea0e00000000000000000000000000000000000000000000000000000000000003e8"}},{"name":"evm_log_decode","title":"Decode an event log with your ABI","description":"Decodes one event log (its topics and data) against an ABI that YOU supply and returns the event name and arguments. If no event in your ABI matches topic0 it says so rather than guessing from a database of known events.","inputSchema":{"type":"object","properties":{"abi":{"minItems":1,"maxItems":500,"type":"array","items":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"string","maxLength":1000}]},"description":"JSON ABI objects, or human-readable signatures such as \"function transfer(address to, uint256 amount)\""},"topics":{"minItems":1,"maxItems":4,"type":"array","items":{"type":"string"}},"data":{"type":"string"}},"required":["abi","topics","data"],"additionalProperties":false},"price":"$0.001","example":{"abi":["event Transfer(address indexed from, address indexed to, uint256 value)"],"topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x00000000000000000000000078845031f7bca8fb9f3ac0cc86678ef8ce33ea0e","0x00000000000000000000000078845031f7bca8fb9f3ac0cc86678ef8ce33ea0e"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8"}},{"name":"payment_verify","title":"Verify a token payment from a receipt","description":"Given a transaction hash, lists the ERC-20 transfers in its receipt and, if you give expectations (payee, asset, amount, payer), says whether a successful transaction contains a matching transfer. Use it to check an x402 or other USDC payment. A match proves tokens moved; it does not prove what the payment was for.","inputSchema":{"type":"object","properties":{"chain":{"type":"string","description":"EVM CAIP-2 chain id such as eip155:8453, or a bare chain id number as a string. Chain names are refused."},"hash":{"type":"string"},"payTo":{"type":"string","description":"0x + 40 hex digits (EIP-55 checksum enforced when mixed-case)"},"asset":{"type":"string","description":"0x + 40 hex digits (EIP-55 checksum enforced when mixed-case)"},"amount":{"description":"base units","type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"payer":{"type":"string","description":"0x + 40 hex digits (EIP-55 checksum enforced when mixed-case)"}},"required":["chain","hash"],"additionalProperties":false},"price":"$0.002","example":{"chain":"eip155:8453","hash":"0x600accdbbdaca7bcabef7f9e6a0777d0d22b5fd8188585db0c0d77ee2e7d34d9","payTo":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","amount":"1000"}},{"name":"random_from_block","title":"Verifiable randomness from a finalized block","description":"Deterministic, publicly recomputable random integers derived from a FINALIZED block hash and a salt. Refuses a block that is not yet final. Not secret and not for cases where the salt can be chosen after seeing the block.","inputSchema":{"type":"object","properties":{"chain":{"type":"string","description":"EVM CAIP-2 chain id such as eip155:8453, or a bare chain id number as a string. Chain names are refused."},"block":{"type":"string"},"salt":{"type":"string","minLength":1,"maxLength":200},"count":{"type":"integer","minimum":1,"maximum":100},"max":{"type":"integer","minimum":2,"maximum":1000000}},"required":["chain","block","salt","count","max"],"additionalProperties":false},"price":"$0.002","example":{"chain":"eip155:8453","block":"52952713","salt":"demo","count":3,"max":6}},{"name":"erc8004_agent","title":"ERC-8004 agent identity","description":"Reads an agent from the ERC-8004 identity registry on Base: its owner address and the registration URI it points to, at one stated block. The URI is reported, not fetched (fetching arbitrary URLs for you is not this tool's job). An id that was never minted is NOT_FOUND.","inputSchema":{"type":"object","properties":{"agentId":{"type":"string","pattern":"^(0|[1-9][0-9]{0,30})$","description":"ERC-8004 agent id (decimal string)"},"block":{"type":"string"}},"required":["agentId"],"additionalProperties":false},"price":"free","example":{"agentId":"55092"}},{"name":"erc8004_reputation","title":"ERC-8004 reputation evidence","description":"Summarises the feedback posted about an agent in the ERC-8004 reputation registry on Base, at one block: number of distinct clients, number of feedback entries, the registry's own summary value, and each client's latest entry (value, tags, revoked). It is EVIDENCE, not a verdict: anyone can post feedback from any address, so many clients is not proof of many people, and tag text is free text written by the client (shown as untrusted).","inputSchema":{"type":"object","properties":{"agentId":{"type":"string","pattern":"^(0|[1-9][0-9]{0,30})$","description":"ERC-8004 agent id (decimal string)"},"block":{"type":"string"}},"required":["agentId"],"additionalProperties":false},"price":"free","example":{"agentId":"55092"}},{"name":"evm_spend_report","title":"Wallet token spend report (CSV)","description":"Every transfer of one ERC-20 token out of (or into) a wallet across a block range of up to 20,000 blocks, with exact amounts, per-counterparty totals, per-UTC-day totals, and an accounting CSV. Reads public chain data only. The range is queried in full 2000-block pieces and the report refuses (rather than truncates) when more than 2000 transfers match.","inputSchema":{"type":"object","properties":{"chain":{"type":"string"},"wallet":{"type":"string"},"token":{"type":"string"},"fromBlock":{"type":"string"},"toBlock":{"type":"string"},"direction":{"type":"string","enum":["out","in"]}},"required":["chain","wallet","token","fromBlock","toBlock"],"additionalProperties":false},"price":"$0.005","example":{"chain":"eip155:8453","wallet":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e","token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","fromBlock":"52952700","toBlock":"52952720","direction":"in"}},{"name":"x402_settlement_verify","title":"Did this agent really pay me? (x402 settlement check)","description":"For sellers taking x402 or other stablecoin payments: give the network, the settlement transaction (EVM hash or Solana signature) and your payout address, and optionally the asset, minimum amount (base units) and payer. Reads the chain itself and answers verdict \"paid\", \"not_paid\" (failed, or no matching transfer to you) or \"unknown\" (not found yet), with every token transfer it saw. Networks: eip155:84532, eip155:8453, eip155:1, eip155:137, eip155:42161, eip155:10, eip155:43114, eip155:1329, eip155:130, eip155:146, eip155:480, eip155:5042, eip155:999, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp, solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1. A match proves tokens reached you; it does not prove what they were for.","inputSchema":{"type":"object","properties":{"network":{"type":"string","description":"CAIP-2 id, one of: eip155:84532, eip155:8453, eip155:1, eip155:137, eip155:42161, eip155:10, eip155:43114, eip155:1329, eip155:130, eip155:146, eip155:480, eip155:5042, eip155:999, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp, solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"},"tx":{"type":"string","description":"EVM transaction hash (0x + 64 hex) or Solana transaction signature (base58)"},"payTo":{"type":"string","description":"your payout address (EVM 0x... or Solana base58)"},"asset":{"description":"token contract (EVM) or mint (Solana) you expect; omit to accept any token","type":"string"},"amount":{"description":"minimum amount in base units (USDC: 1 USD = 1000000)","type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"payer":{"description":"the address you expect the payment from","type":"string"}},"required":["network","tx","payTo"],"additionalProperties":false},"price":"$0.002","example":{"network":"eip155:8453","tx":"0x600accdbbdaca7bcabef7f9e6a0777d0d22b5fd8188585db0c0d77ee2e7d34d9","payTo":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","amount":"1000"}},{"name":"token_price","title":"Token price in USD (two exchanges must agree)","description":"Spot USD price of a crypto asset by ticker (BTC, ETH, SOL, USDC, APT, LINK, ...), read live from Coinbase and Kraken. A price is returned only when both answer and agree within 1%; the answer is their midpoint, with both readings and the deviation. If one venue is down or they disagree, you get an error with the readings instead of a guess. Ticker prices are for the market asset, not a specific token contract.","inputSchema":{"type":"object","properties":{"symbol":{"type":"string","minLength":2,"maxLength":10,"description":"ticker such as BTC, ETH, SOL, USDC (case-insensitive)"}},"required":["symbol"],"additionalProperties":false},"price":"$0.001","example":{"symbol":"ETH"}},{"name":"ens_resolve","title":"ENS name to address, or address to ENS name","description":"Resolves an ENS name (e.g. vitalik.eth) to its Ethereum address, or an address to its primary ENS name, read live from Ethereum mainnet. Give exactly one of name or address. A reverse result is returned only if that name resolves back to the same address (otherwise it is reported as unverified, never as the answer). Names are normalized (ENSIP-15) first; a name that cannot be normalized is refused.","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":3,"maxLength":255},"address":{"type":"string"}},"additionalProperties":false},"price":"$0.001","example":{"name":"vitalik.eth"}},{"name":"tx_safety_check","title":"Is this transaction safe to sign? (simulate + risk check)","description":"Before your agent signs an EVM transaction: simulates it on the current chain state and reports every token and native-coin movement in and out of the sender, decodes what it asks for (ERC-20 approve/permit, Permit2, setApprovalForAll, transfers), checks the counterparty (contract or wallet, sanctions lists) and, if you pass expectedTo, flags look-alike addresses (address poisoning). Verdict: \"danger\", \"caution\" or \"no_known_risk\", with every reason. It never says \"safe\": a simulation shows what would happen at this block. Chains: eip155:8453, eip155:1, eip155:137, eip155:42161, eip155:10, eip155:43114, eip155:1329, eip155:130, eip155:146, eip155:480, eip155:5042, eip155:999. Priced by the USD value at risk you declare in valueUsd: under $1,000: $0.005; under $10,000: $0.05; under $100,000: $0.50 (deep review); $100k and up: $2.00 (deep review). Deep review adds a second simulation on an independent provider and a counterparty check of every address involved.","inputSchema":{"type":"object","properties":{"chain":{"type":"string","description":"CAIP-2 EVM chain id, e.g. eip155:8453"},"from":{"type":"string","description":"the address that would sign"},"to":{"type":"string","description":"the transaction's to address"},"data":{"description":"calldata, 0x... (omit for a plain native transfer)","type":"string"},"value":{"description":"native amount in wei (base units)","type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"expectedTo":{"description":"the recipient or contract you MEANT to interact with; enables the look-alike check","type":"string"},"valueUsd":{"description":"approximate USD value at risk; sets the price tier, and $10,000+ includes the deep review","type":"number","minimum":0,"maximum":1000000000000}},"required":["chain","from","to"],"additionalProperties":false},"price":"$0.005","example":{"chain":"eip155:8453","from":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e","to":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","data":"0xa9059cbb000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa9604500000000000000000000000000000000000000000000000000000000000003e8","expectedTo":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}},{"name":"sanctions_check","title":"Sanctions screening for a crypto address","description":"Checks whether an address appears on public sanctions lists: the US Treasury OFAC SDN digital-currency addresses (EVM, Bitcoin, Solana, Tron, Litecoin, Bitcoin Cash) and, for EVM addresses, Chainalysis' on-chain sanctions oracle. Returns sanctioned true/false, which sources matched, which were checked or unavailable, and when the list was last updated. This is a list match, not legal advice; no match is not a clearance. If no source can be read you get an error, never a 'clean' result.","inputSchema":{"type":"object","properties":{"address":{"type":"string","minLength":20,"maxLength":120},"family":{"description":"auto-detected from the address format when omitted","type":"string","enum":["evm","solana","bitcoin","tron","litecoin","bitcoin_cash"]}},"required":["address"],"additionalProperties":false},"price":"$0.001","example":{"address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}},{"name":"counterparty_check","title":"Can I trust this counterparty? (sanctions, history, identity, verified deals)","description":"Before paying or delivering to an agent or address: checks sanctions lists, on-chain activity on Base and Ethereum (wallet, contract or EIP-7702 wallet; transaction counts), whether it owns an ERC-8004 agent identity, its record of deals verified by the LogicNodes notary (settled, and deliveries that failed their re-run check) and payments it made to LogicNodes. Returns every component, a 0-100 indicator and the formula: start 50; sanctions match = 0 (do not transact); +10 if 10+ transactions on Base or Ethereum, +10 more if 100+; +15 if it owns an ERC-8004 agent identity; +3 per deal settled through the LogicNodes notary (max +20); +1 per payment it made to LogicNodes (max +5); +10 if a domain operator is verified; -25 per delivery that failed its re-run check; clamped to 0-100. A new address has little history, which is not evidence of bad behaviour.","inputSchema":{"type":"object","properties":{"address":{"type":"string","description":"EVM address of the agent or counterparty"}},"required":["address"],"additionalProperties":false},"price":"$0.003","example":{"address":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e"}},{"name":"wallet_watch_create","title":"Watch a wallet for 30 days (signed webhooks)","description":"Subscribes for 30 days: LogicNodes watches one EVM address and POSTs a signed webhook (X-LogicNodes-Signature: sha256=HMAC of the body with your secret) when tokens arrive (incoming) or leave (outgoing), when it grants a token or NFT approval (approval), or when its sanctions status changes (sanctions). Returns the watch id and a secret shown only once. Native-coin transfers are not watched. The webhook must be a public https URL. Chains: eip155:84532, eip155:8453, eip155:1, eip155:137, eip155:42161, eip155:10, eip155:43114, eip155:1329, eip155:130, eip155:146, eip155:480, eip155:5042, eip155:999.","inputSchema":{"type":"object","properties":{"address":{"type":"string"},"network":{"type":"string","description":"CAIP-2 EVM chain id"},"webhookUrl":{"type":"string","maxLength":500,"description":"public https URL that receives the events"},"events":{"description":"default: all four","minItems":1,"maxItems":4,"type":"array","items":{"type":"string","enum":["incoming","outgoing","approval","sanctions"]}}},"required":["address","network","webhookUrl"],"additionalProperties":false},"price":"$5.00","example":{"address":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e","network":"eip155:8453","webhookUrl":"https://example.com/logicnodes-webhook","events":["incoming","outgoing"]}},{"name":"wallet_watch_status","title":"Status and recent events of a wallet watch","description":"Shows a watch's state (active, failing, cancelled, expired), the last block scanned, delivery counts and the last 20 events. Needs the watch id and its secret.","inputSchema":{"type":"object","properties":{"watchId":{"type":"string","maxLength":80},"secret":{"type":"string","maxLength":200}},"required":["watchId","secret"],"additionalProperties":false},"price":"free","example":{"watchId":"w_your_watch_id","secret":"whsec_your_secret"}},{"name":"wallet_watch_cancel","title":"Cancel a wallet watch","description":"Stops a watch immediately. Needs the watch id and its secret. (No refund: the subscription is pay-once.)","inputSchema":{"type":"object","properties":{"watchId":{"type":"string","maxLength":80},"secret":{"type":"string","maxLength":200}},"required":["watchId","secret"],"additionalProperties":false},"price":"free","example":{"watchId":"w_your_watch_id","secret":"whsec_your_secret"}},{"name":"audit_log_create","title":"Create a tamper-evident audit log","description":"Creates a logbook for an agent or business. Returns the log id, a write key (to append) and a read key (to export), shown only once. Every entry is hash-chained and timestamped into Bitcoin through the daily receipt root. Free to create; appending costs per entry.","inputSchema":{"type":"object","properties":{"label":{"description":"a name for your own reference","type":"string","maxLength":120}},"additionalProperties":false},"price":"free","example":{"label":"my agent payments"}},{"name":"audit_log_append","title":"Append an entry to an audit log","description":"Adds one entry (any JSON object up to 8 KB: a payment, a decision, a delivery, ...) to your log. Returns its sequence number, its chain hash and the receipt digest that will be in today's Bitcoin-timestamped root. Needs the log's write key.","inputSchema":{"type":"object","properties":{"logId":{"type":"string","maxLength":60},"writeKey":{"type":"string","maxLength":100},"entry":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["logId","writeKey","entry"],"additionalProperties":false},"price":"$0.001","example":{"logId":"log_your_log_id","writeKey":"lnw_your_write_key","entry":{"event":"payment_sent","tx":"0x600accdbbdaca7bcabef7f9e6a0777d0d22b5fd8188585db0c0d77ee2e7d34d9","amountUsd":"0.001"}}},{"name":"audit_log_export","title":"Export an audit log with its integrity check","description":"Returns entries of your log (up to 1000 per call, from fromSeq), re-verifies the whole hash chain, and gives each entry's Bitcoin proof status (pending until its day's root is built and timestamped). Needs the log's read key.","inputSchema":{"type":"object","properties":{"logId":{"type":"string","maxLength":60},"readKey":{"type":"string","maxLength":100},"fromSeq":{"type":"integer","minimum":1,"maximum":9007199254740991},"limit":{"type":"integer","minimum":1,"maximum":1000}},"required":["logId","readKey"],"additionalProperties":false},"price":"free","example":{"logId":"log_your_log_id","readKey":"lnr_your_read_key"}},{"name":"deal_dispute_review","title":"Advisory ruling on a notarized deal (dispute review)","description":"For a deal recorded by the LogicNodes deal notary: verifies the signed, hash-chained record and gives an ADVISORY ruling from fixed rules (R0, R1, R2, R3, R4, R5, R6: settled, delivered and checked, failed check, uncheckable, never delivered, never agreed). Returns the facts it used (with event hashes), the rule applied, and a ruling digest that goes into the Bitcoin-timestamped daily root. Advisory only: not a legal judgment and not enforced.","inputSchema":{"type":"object","properties":{"dealId":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["dealId"],"additionalProperties":false},"price":"$1.00","example":{"dealId":"0xabababababababababababababababababababababababababababababababab"}},{"name":"operator_verify_start","title":"Start verifying the domain behind an agent","description":"Step 1 (free) of the verified-operator badge. Returns one line to publish EITHER as the content of https://<domain>/.well-known/logicnodes-verify.txt OR as a DNS TXT record at _logicnodes.<domain>. Then call operator_verify_check. The badge proves control of the domain and is valid 365 days.","inputSchema":{"type":"object","properties":{"address":{"type":"string","description":"the agent's EVM address"},"domain":{"type":"string","description":"e.g. example.com"}},"required":["address","domain"],"additionalProperties":false},"price":"free","example":{"address":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e","domain":"logicnodes.io"}},{"name":"operator_verify_check","title":"Check and issue the verified-operator badge","description":"Step 2 of the verified-operator badge: reads https://<domain>/.well-known/logicnodes-verify.txt and the DNS TXT record _logicnodes.<domain>; if either holds the line from operator_verify_start, the badge is recorded for 365 days and shows in counterparty_check and at /v1/operators/<address>. A failed check is an error (and errors are never charged).","inputSchema":{"type":"object","properties":{"address":{"type":"string"},"domain":{"type":"string"}},"required":["address","domain"],"additionalProperties":false},"price":"$10.00","example":{"address":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e","domain":"logicnodes.io"}},{"name":"agent_register_prepare","title":"Prepare an agent's ERC-8004 registration (free)","description":"Step 1 (free): builds the ERC-8004 registration file and A2A agent card LogicNodes will host for your agent, and the exact message your agent address must sign (personal_sign) to publish them with agent_register_publish.","inputSchema":{"type":"object","properties":{"address":{"type":"string","description":"the agent's EVM address (it signs the publish message and the registration transaction)"},"name":{"type":"string","minLength":2,"maxLength":80},"description":{"type":"string","minLength":10,"maxLength":1000},"url":{"description":"the agent's website","type":"string","maxLength":300,"format":"uri"},"mcpUrl":{"type":"string","maxLength":300,"format":"uri"},"a2aUrl":{"description":"the agent's own A2A JSON-RPC endpoint","type":"string","maxLength":300,"format":"uri"},"imageUrl":{"type":"string","maxLength":300,"format":"uri"},"x402":{"description":"true if the agent accepts x402 payments","type":"boolean"}},"required":["address","name","description"],"additionalProperties":false},"price":"free","example":{"address":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e","name":"My research agent","description":"Writes sourced research briefs on request; pays and gets paid in USDC.","url":"https://example.com","a2aUrl":"https://example.com/a2a","x402":true}},{"name":"agent_register_publish","title":"Host the agent's files and build its ERC-8004 registration transaction","description":"Step 2: with the signature from agent_register_prepare, LogicNodes hosts the registration file at https://logicnodes.io/a/<address>/registration.json and the agent card next to it, and returns the unsigned transaction that calls register(tokenURI) on the ERC-8004 identity registry on Base (0x8004A169FB4a3325136EB29fA0ceB6D2e539a432). Your agent signs and sends it and pays the gas; LogicNodes never holds keys. Calling again with a new signature updates the hosted files.","inputSchema":{"type":"object","properties":{"address":{"type":"string","description":"the agent's EVM address (it signs the publish message and the registration transaction)"},"name":{"type":"string","minLength":2,"maxLength":80},"description":{"type":"string","minLength":10,"maxLength":1000},"url":{"description":"the agent's website","type":"string","maxLength":300,"format":"uri"},"mcpUrl":{"type":"string","maxLength":300,"format":"uri"},"a2aUrl":{"description":"the agent's own A2A JSON-RPC endpoint","type":"string","maxLength":300,"format":"uri"},"imageUrl":{"type":"string","maxLength":300,"format":"uri"},"x402":{"description":"true if the agent accepts x402 payments","type":"boolean"},"signature":{"type":"string","pattern":"^0x[0-9a-fA-F]{130}$"}},"required":["address","name","description","signature"],"additionalProperties":false},"price":"$5.00","example":{"address":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e","name":"My research agent","description":"Writes sourced research briefs on request; pays and gets paid in USDC.","url":"https://example.com","a2aUrl":"https://example.com/a2a","x402":true,"signature":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}},{"name":"x402_service_search","title":"Find a paid API for a task (ranked x402 services)","description":"Searches every paid API listed in the public x402 directories (Coinbase CDP and PayAI, about 100,000 endpoints) and ranks the providers by what LogicNodes measures itself: whether the endpoint really answers with valid x402 payment terms (checked around the clock), uptime over 72 hours, USDC its payout address received on Base in the last 7 days and distinct payers. Returns matching endpoints with price, networks, method and an example input, so an agent can call the best one directly. Filter by network (CAIP-2), maximum price and live-only.","inputSchema":{"type":"object","properties":{"query":{"type":"string","minLength":2,"maxLength":200,"description":"what you need, e.g. \"web scraping\", \"weather\", \"token price\""},"network":{"description":"only providers that accept payment on this CAIP-2 network, e.g. eip155:8453","type":"string","maxLength":80},"maxPriceUsd":{"description":"only providers with an endpoint at or below this price","type":"number","minimum":0,"maximum":1000},"liveOnly":{"description":"true: only providers whose last check returned valid x402 terms; false: everything; default: leave out providers whose last check failed (not-yet-checked ones are included, with checkedAt null, after the live ones)","type":"boolean"},"limit":{"description":"providers to return, default 5","type":"integer","minimum":1,"maximum":20}},"required":["query"],"additionalProperties":false},"price":"$0.002","example":{"query":"weather","liveOnly":true,"limit":3}},{"name":"x402_provider_report","title":"Everything measured about one x402 provider","description":"For one provider host (e.g. api.example.com): its listed paid endpoints and prices, the last checks (did it answer with valid x402 terms, how fast), 72-hour uptime, USDC received by its payout address on Base per day for 7 days, distinct payers, and its score with the formula. Use it before relying on a provider.","inputSchema":{"type":"object","properties":{"host":{"type":"string","minLength":3,"maxLength":253,"description":"provider host, e.g. api.example.com (a full URL is accepted)"}},"required":["host"],"additionalProperties":false},"price":"$0.001","example":{"host":"agent.pocket.network"}},{"name":"x402_monitor_create","title":"Monitor an x402 provider for 30 days (signed webhooks)","description":"For sellers watching their own API, or buyers that depend on one: LogicNodes checks the provider every 5 minutes for 30 days and POSTs a signed webhook (X-LogicNodes-Signature: sha256=HMAC of the body with your secret) when it stops answering with valid x402 payment terms (two failed checks in a row) and when it recovers. Returns a monitor id and a secret shown once. Also shows on the provider's public page as monitored.","inputSchema":{"type":"object","properties":{"host":{"type":"string","minLength":3,"maxLength":253,"description":"provider host from x402_service_search or the observatory"},"webhookUrl":{"type":"string","maxLength":500,"description":"public https URL that receives the alerts"}},"required":["host","webhookUrl"],"additionalProperties":false},"price":"$5.00","example":{"host":"agent.pocket.network","webhookUrl":"https://example.com/logicnodes-webhook"}},{"name":"x402_monitor_status","title":"Status and recent alerts of a provider monitor","description":"Shows a monitor's state, its provider's last checks and the last 20 alerts sent. Needs the monitor id and its secret.","inputSchema":{"type":"object","properties":{"monitorId":{"type":"string","maxLength":80},"secret":{"type":"string","maxLength":200}},"required":["monitorId","secret"],"additionalProperties":false},"price":"free","example":{"monitorId":"m_your_monitor_id","secret":"whsec_your_secret"}},{"name":"x402_monitor_cancel","title":"Cancel a provider monitor","description":"Stops a monitor immediately. Needs the monitor id and its secret. (No refund: the subscription is pay-once.)","inputSchema":{"type":"object","properties":{"monitorId":{"type":"string","maxLength":80},"secret":{"type":"string","maxLength":200}},"required":["monitorId","secret"],"additionalProperties":false},"price":"free","example":{"monitorId":"m_your_monitor_id","secret":"whsec_your_secret"}},{"name":"x402_provider_claim","title":"Claim your provider listing (free)","description":"For sellers: prove you operate a provider by signing \"LogicNodes observatory: I operate <host>\" (personal_sign) with one of the EVM payout addresses its x402 listings use. The listing then shows as claimed on the public observatory page. Free.","inputSchema":{"type":"object","properties":{"host":{"type":"string","minLength":3,"maxLength":253},"address":{"type":"string","description":"one of the provider's EVM payout addresses"},"signature":{"type":"string","pattern":"^0x[0-9a-fA-F]{130}$"}},"required":["host","address","signature"],"additionalProperties":false},"price":"free","example":{"host":"api.example.com","address":"0x78845031f7bCA8fB9F3Ac0cc86678Ef8cE33Ea0e","signature":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}]}