Smart-contract audit, token due diligence, prediction-market EV, vault exit analysis.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Cross-Platform Arbitrage & Resolution Rules Lawyer — Finds fine-print divergences between two prediction markets (e.g. Polymarket vs Kalshi), prices basis risk after fees, and returns verdict.action ARBITRAGE_SAFE / LOW_ANNUALIZED_YIELD / BASIS_RISK_TRAP / NO_EDGE / INSUFFICIENT_EVIDENCE with edge in bps, the probability both legs lose, days to resolution, annualized return and Kelly hedge size capped by top-of-book depth. Each market can be given a
Default 100 (1%).
Used to convert the Kelly fraction to USD.
Minimum annualized risk-adjusted return, in percent, for verdict.action ARBITRAGE_SAFE (default 5). Below it the action is LOW_ANNUALIZED_YIELD. Applied only when both end dates are known.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http writerslogic-crypto https://agents.writerslogic.com/mcp/crypto
Cross-Platform Arbitrage & Resolution Rules Lawyer — Finds fine-print divergences between two prediction markets (e.g. Polymarket vs Kalshi), prices basis risk after fees, and returns verdict.action ARBITRAGE_SAFE / LOW_ANNUALIZED_YIELD / BASIS_RISK_TRAP / NO_EDGE / INSUFFICIENT_EVIDENCE with edge in bps, the probability both legs lose, days to resolution, annualized return and Kelly hedge size capped by top-of-book depth. Each market can be given a
| Argument | Type | Description |
|---|---|---|
| marketA* | object | |
| marketB* | object | |
| minEdgeBps | number | Default 100 (1%). |
| bankrollUsd | number | Used to convert the Kelly fraction to USD. |
| minAnnualizedReturnPct | number | Minimum annualized risk-adjusted return, in percent, for verdict.action ARBITRAGE_SAFE (default 5). Below it the action is LOW_ANNUALIZED_YIELD. Applied only when both end dates are known. |
{
"type": "object",
"required": [
"marketA",
"marketB"
],
"properties": {
"marketA": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"feeBps": {
"type": "number",
"maximum": 2000,
"minimum": 0,
"description": "Trading fee on this leg in bps of notional."
},
"market": {
"type": "string",
"maxLength": 500,
"minLength": 3,
"description": "Polymarket slug, market URL or conditionId, or a Kalshi ticker or URL. Fills platform, title, resolution rules, best-ask prices, per-leg fees and end date from the live market; any field you also pass overrides it. Without market, platform, title, resolutionRules, yesPrice and noPrice are required."
},
"endDate": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "ISO date this market resolves; sets days to resolution and the annualized return."
},
"noPrice": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Best ask for one No share in USD (0-1)."
},
"noFeeBps": {
"type": "number",
"maximum": 2000,
"minimum": 0,
"description": "Fee in bps of notional for buying No here; overrides feeBps for that leg."
},
"platform": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "e.g. Polymarket, Kalshi"
},
"yesPrice": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Best ask for one Yes share in USD (0-1)."
},
"yesFeeBps": {
"type": "number",
"maximum": 2000,
"minimum": 0,
"description": "Fee in bps of notional for buying Yes here; overrides feeBps for that leg."
},
"description": {
"type": "string",
"maxLength": 5000
},
"resolutionRules": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "Exact resolution rules and fine print."
}
},
"additionalProperties": false
},
"marketB": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"feeBps": {
"type": "number",
"maximum": 2000,
"minimum": 0,
"description": "Trading fee on this leg in bps of notional."
},
"market": {
"type": "string",
"maxLength": 500,
"minLength": 3,
"description": "Polymarket slug, market URL or conditionId, or a Kalshi ticker or URL. Fills platform, title, resolution rules, best-ask prices, per-leg fees and end date from the live market; any field you also pass overrides it. Without market, platform, title, resolutionRules, yesPrice and noPrice are required."
},
"endDate": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "ISO date this market resolves; sets days to resolution and the annualized return."
},
"noPrice": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Best ask for one No share in USD (0-1)."
},
"noFeeBps": {
"type": "number",
"maximum": 2000,
"minimum": 0,
"description": "Fee in bps of notional for buying No here; overrides feeBps for that leg."
},
"platform": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "e.g. Polymarket, Kalshi"
},
"yesPrice": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Best ask for one Yes share in USD (0-1)."
},
"yesFeeBps": {
"type": "number",
"maximum": 2000,
"minimum": 0,
"description": "Fee in bps of notional for buying Yes here; overrides feeBps for that leg."
},
"description": {
"type": "string",
"maxLength": 5000
},
"resolutionRules": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "Exact resolution rules and fine print."
}
},
"additionalProperties": false
},
"minEdgeBps": {
"type": "number",
"maximum": 10000,
"minimum": 0,
"description": "Default 100 (1%)."
},
"bankrollUsd": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0,
"description": "Used to convert the Kelly fraction to USD."
},
"minAnnualizedReturnPct": {
"type": "number",
"maximum": 10000,
"minimum": 0,
"description": "Minimum annualized risk-adjusted return, in percent, for verdict.action ARBITRAGE_SAFE (default 5). Below it the action is LOW_ANNUALIZED_YIELD. Applied only when both end dates are known."
}
},
"additionalProperties": false
}Prediction-Market Clarification Impact Pricer — Prices a prediction-market rules clarification as a trade. Given an open Polymarket market (slug, URL or conditionId; Kalshi ticker supported), reads the posted clarification (Additional context) from the UMA adapter on Polygon, or takes your clarificationText to price a pending or hypothetical one. Finds the real-world outcomes whose resolution changed, quotes each changed clause verbatim, shifts
| Argument | Type | Description |
|---|---|---|
| market* | string | Polymarket market slug, polymarket.com URL or conditionId; or a Kalshi market ticker (rules from the public trade-api v2). |
| feeRate | number | Taker fee coefficient: fee = shares * feeRate * p * (1 - p). Defaults to the market's Gamma feeSchedule rate (0 when fees are disabled); Kalshi defaults to 0.07 times the series fee_multiplier from /series. |
| sizeUsd | number | Intended order size in USD (default 100). |
| position | object | |
| priorYes | number | Override for the pre-clarification fair P(YES); default is the Polymarket CLOB price history just before the clarification, falling back to the current YES order-book mid. |
| minEdgeBps | number | Minimum edge after fees and slippage, in bps of cost (default 100). |
| minMoveBps | number |
Smart Contract Auditor — Source-level security review of Solidity: pass/warn/fail verdict, 0-100 risk score, severity-ranked findings with exact file:line, exploit scenario and a fix, plus a SARIF 2.1.0 log. Accepts raw code, a list of files, or an on-chain address (verified source is read from Sourcify). A deterministic detector pass (reentrancy ordering, tx.origin, delegatecall, unchecked calls, weak randomness, pre-0.8
| Argument | Type | Description |
|---|---|---|
| code | string | Raw Solidity source (one or more files concatenated). Provide exactly one of code, files or address. |
| files | array | Alternative to code: Solidity files with repository-relative paths. Findings report the file and line, and the SARIF log points at them. |
| address | string | Alternative to code: an on-chain contract address. Its verified source is read from Sourcify (no API key); unverified contracts return 404. |
| chainId | integer | EVM chain id for address; default 1 (Ethereum mainnet). |
| contractName | string | Contract to focus on when several are present. |
{
"type": "object",
"properties": {
"code": {
"type": "string",
"maxLength": 100000,
"minLength": 1,
"description": "Raw Solidity source (one or more files concatenated). Provide exactly one of code, files or address."
},
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"path",
"content"
],
"properties": {
"path": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"content": {
"type": "string",
"maxLength": 100000
}
},
"additionalProperties": false
},
"maxItems": 40,
"description": "Alternative to code: Solidity files with repository-relative paths. Findings report the file and line, and the SARIF log points at them."
},
"address": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "Alternative to code: an on-chain contract address. Its verified source is read from Sourcify (no API key); unverified contracts return 404."
},
"chainId": {
"type": "integer",
"maximum": 2147483647,
"minimum": 1,
"description": "EVM chain id for address; default 1 (Ethereum mainnet)."
},
"contractName": {
"type": "string",
"maxLength": 200,
"description": "Contract to focus on when several are present."
}
},
"additionalProperties": false
}DeFi Cover Claim Adjudicator — Predicts whether a DeFi cover claim (Nexus Mutual or any provider's wording) will be approved and for how much. Reads the wording, postmortems and the claimant's transactions, quantifies net token loss with Chainlink prices at the loss block, maps facts to covered events, exclusions and conditions with verbatim verified clauses, cites similar past claims, and returns verdict.action (FILE / FILE_WI
| Argument | Type | Description |
|---|---|---|
| cover* | object | |
| wording* | object | The cover wording: a Nexus Mutual product (id or name), a URL (HTML or PDF), or pasted text. At least one. |
| claimant* | string | Address that suffered the loss (the Impacted Account). |
| incident | object | |
| claimDate | string | ISO 8601 date the claim is (to be) filed; default now. |
| deductible | object | Overrides any deductible found in the wording. Amount in cover-asset units; percentages 0-100. |
| claimedLoss | object | Loss the claimant asserts, in cover-asset units. Used for the payout only when no on-chain loss can be established; always reported as unverified. |
| transactions |
UMA Dispute EV Desk — For a Polymarket market inside its roughly two-hour UMA challenge window, reads the live proposal on Polygon (adapter, optimistic oracle, bond, finalFee, expiry), judges P(proposal wrong or too early) against the literal rules with an ensemble plus red-team pass and verified quotes (full-game sports markets are decided by code with no model when Gamma's timestamps show the answer came before the g
| Argument | Type | Description |
|---|---|---|
| market* | string | Polymarket slug, market/event URL, conditionId or questionID. |
| params | object | |
| prices | object | Current prices of the first and second listed outcomes, USD per share. |
| position | object | Your holding in this market. |
| proposal | object | Overrides for on-chain proposal fields (what-if or replay). Omit to read the live proposal. |
| evidenceUrls | array | Public pages to treat as evidence. |
{
"type": "object",
"required": [
"market"
],
"properties": {
"market": {
"type": "string",
"maxLength": 500,
"minLength": 3,
"description": "Polymarket slug, market/event URL, conditionId or questionID."
},
"params": {
"type": "object",
"properties": {
"gasUsd": {
"type": "number",
"maximum": 10000,
"minimum": 0,
"description": "Total dispute transaction cost in USD; overrides the estimate."
},
"polUsd": {
"type": "number",
"maximum": 1000000,
"minimum": 0
},
"minEdgeUsd": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "Minimum EV edge for DISPUTE, default 2."
},
"gasPriceGwei": {
"type": "number",
"maximum": 100000,
"minimum": 0
},
"aprOpportunity": {
"type": "number",
"maximum": 10,
"minimum": 0,
"description": "Annual opportunity cost of capital, default 0.15."
},
"otherDisputeProb": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "P(someone else disputes a wrong proposal if you abstain), default 0.3 (an unmeasured assumption; it only affects callers holding a position)."
},
"safetyMarginMinutes": {
"type": "number",
"maximum": 600,
"minimum": 0,
"description": "Submit-by margin before the window closes, default 10."
}
},
"additionalProperties": false
},
"prices": {
"type": "object",
"required": [
"first",
"second"
],
"properties": {
"first": {
"type": "number",
"maximum": 1,
"minimum": 0
},
"second": {
"type": "number",
"maximum": 1,
"minimum": 0
}
},
"description": "Current prices of the first and second listed outcomes, USD per share.",
"additionalProperties": false
},
"position": {
"type": "object",
"required": [
"outcome",
"shares",
"avgPrice"
],
"properties": {
"shares": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0
},
"outcome": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Outcome label held, e.g. Yes, No or a team name."
},
"avgPrice": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Average entry price per share, USD."
}
},
"description": "Your holding in this market.",
"additionalProperties": false
},
"proposal": {
"type": "object",
"properties": {
"bondUsd": {
"type": "number",
"maximum": 1000000000,
"minimum": 0
},
"outcome": {
"enum": [
"first",
"second",
"half"
],
"type": "string",
"description": "Proposed answer: first listed outcome (UMA price 1), second (price 0) or 50/50."
},
"finalFeeUsd": {
"type": "number",
"maximum": 1000000000,
"minimum": 0
},
"expirationTime": {
"type": "string",
"maxLength": 40,
"description": "ISO-8601 UTC time the challenge window closes."
}
},
"description": "Overrides for on-chain proposal fields (what-if or replay). Omit to read the live proposal.",
"additionalProperties": false
},
"evidenceUrls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 3,
"description": "Public pages to treat as evidence."
}
},
"additionalProperties": false
}Prediction Market Analyzer — Independent probability that a Polymarket or Kalshi market resolves Yes, checked against the live book. Pass a market (slug, URL, conditionId or Kalshi ticker) and/or news text: the agent reads the rules, end date and best asks, estimates 0-100 with live web search (falling back to model knowledge if search is slow), and returns verdict.action BUY_YES / BUY_NO / NO_TRADE with edge in bps after tak
| Argument | Type | Description |
|---|---|---|
| text | string | News excerpt or event description. Required unless market is given; with market, extra evidence you want weighed. |
| market | string | Polymarket slug, market URL or conditionId, or a Kalshi ticker or URL. Reads the question, rules, end date and live best asks; marketPriceYes then defaults to the book mid. A resolved market returns its outcome without a model call. |
| question | string | Exact market question; inferred when omitted (read from the market when market is given). |
| minEdgePct | number | Minimum edge after taker fees, in percentage points, before verdict.action is BUY_YES or BUY_NO (default 5). A low-confidence estimate never produces a BUY. |
| bankrollUsd | number | Converts the quarter-Kelly fraction into verdict.size_usd. |
| marketPriceYes | number | Current implied Yes probability, used to compute edge. Percent (0-100) by default; a value strictly between 0 and 1 is read as a 0-1 market price (Polymarket/Kalshi style) unless marketPriceScale says otherwise. |
Grant Milestone Verifier with Signed Release Attestation — Decides whether a grantee met a milestone before a DAO releases the next tranche or stream. Checks GitHub as of the due date (commits, tags, releases, CI, files), npm/PyPI/crates.io publish times, Snapshot proposal state, on-chain deployments (bytecode selector scan through proxies, Sourcify, creation transaction), and URLs; judges the rest with an ensemble plus a skeptical reviewer, reads Sablier
| Argument | Type | Description |
|---|---|---|
| payout | object | |
| evidence* | object | |
| milestone* | object | |
| releasePolicy | object |
{
"type": "object",
"required": [
"milestone",
"evidence"
],
"properties": {
"payout": {
"type": "object",
"required": [
"protocol",
"chain",
"amountTotal"
],
"properties": {
"chain": {
"enum": [
"ethereum",
"base",
"polygon",
"arbitrum",
"optimism"
],
"type": "string"
},
"lockup": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "SablierLockup address; required to disambiguate when several versions hold the stream id."
},
"protocol": {
"enum": [
"sablier",
"superfluid",
"transfer"
],
"type": "string"
},
"streamId": {
"type": "string",
"pattern": "^[0-9]{1,78}$"
},
"recipient": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$"
},
"amountTotal": {
"type": "string",
"pattern": "^[0-9]{1,78}$",
"description": "Tranche value in token base units."
}
},
"additionalProperties": false
},
"evidence": {
"type": "object",
"properties": {
"ref": {
"type": "string",
"maxLength": 200,
"description": "Branch, tag or commit, or a commit range base...head."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 500,
"minLength": 8
},
"maxItems": 8
},
"repoUrl": {
"type": "string",
"maxLength": 200,
"description": "https://github.com/<owner>/<repo>. A link copied from GitHub also works: .../tree/<branch>, .../releases/tag/<tag> or .../commit/<sha> sets ref when ref is omitted."
},
"deployments": {
"type": "array",
"items": {
"type": "object",
"required": [
"chain",
"address"
],
"properties": {
"chain": {
"enum": [
"ethereum",
"base",
"polygon",
"arbitrum",
"optimism"
],
"type": "string"
},
"address": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$"
},
"expectedFunctions": {
"type": "array",
"items": {
"type": "string",
"maxLength": 300,
"minLength": 3
},
"maxItems": 24,
"description": "Function signatures, e.g. transfer(address,uint256)."
}
},
"additionalProperties": false
},
"maxItems": 8
}
},
"additionalProperties": false
},
"milestone": {
"type": "object",
"required": [
"title",
"acceptanceCriteria",
"dueDate"
],
"properties": {
"title": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"dueDate": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "ISO 8601 date or timestamp. A date means end of that day UTC. GitHub, registry, Snapshot and contract checks are evaluated as of this instant."
},
"windowStart": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "Optional ISO 8601 start of the milestone period. Needed to decide \"commits/releases/packages during the period\" criteria; without it those are left to the judge."
},
"acceptanceCriteria": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000,
"minLength": 1
},
"maxItems": 12,
"minItems": 1
}
},
"additionalProperties": false
},
"releasePolicy": {
"type": "object",
"required": [
"mode"
],
"properties": {
"mode": {
"enum": [
"all_or_nothing",
"proportional"
],
"type": "string",
"description": "Default all_or_nothing."
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}Batch Token Trap Screen — Runs the on-chain bytecode honeypot / rug screen on up to 10 Base tokens in one paid call, at 40% less than 10 single calls. Tokens the screen rejects as invalid input are reported per token; a chain or upstream outage fails the whole call so the payment is not settled.
| Argument | Type | Description |
|---|---|---|
| tokenAddresses* | array |
{
"type": "object",
"required": [
"tokenAddresses"
],
"properties": {
"tokenAddresses": {
"type": "array",
"items": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "Token contract address on Base."
},
"maxItems": 10,
"minItems": 1
}
},
"additionalProperties": false
}Token Due Diligence Pack — Honeypot / rug screening from live Base bytecode plus a Solidity audit of the token's verified source. Source is fetched from Sourcify (following EIP-1967/zeppelinos proxies to the implementation) when not supplied; unverified tokens are refused before any charge. Runs token-trap-detector ($0.25) + contract-auditor ($1.00) in one paid call for 20% less than buying them separately. Charged only whe
| Argument | Type | Description |
|---|---|---|
| sourceCode | string | Solidity source; fetched from Sourcify when omitted. |
| contractName | string | Contract to focus on when several are present. |
| tokenAddress* | string | Token contract address on Base. |
{
"type": "object",
"required": [
"tokenAddress"
],
"properties": {
"sourceCode": {
"type": "string",
"maxLength": 100000,
"minLength": 1,
"description": "Solidity source; fetched from Sourcify when omitted."
},
"contractName": {
"type": "string",
"maxLength": 200,
"description": "Contract to focus on when several are present."
},
"tokenAddress": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "Token contract address on Base."
}
},
"additionalProperties": false
}On-Chain Bytecode & Unverified Token Trap Detector — Reads live Base bytecode, proxy slots (EIP-1967/beacon/zeppelinos/EIP-1822/EIP-1167), ERC-20 state, and privileged selectors to score honeypot and rug risk in code: SAFE | CAUTION | HONEYPOT_RUG | INSUFFICIENT_EVIDENCE. Adds honeypot.is buy/sell simulation and GoPlus tax and honeypot flags, disclosed per source, and degrades to a lower-confidence bytecode-only score when they fail.
| Argument | Type | Description |
|---|---|---|
| sourceCode | string | Optional Solidity source claimed for the token. |
| tokenAddress* | string | Token contract address on Base. |
{
"type": "object",
"required": [
"tokenAddress"
],
"properties": {
"sourceCode": {
"type": "string",
"maxLength": 100000,
"description": "Optional Solidity source claimed for the token."
},
"tokenAddress": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "Token contract address on Base."
}
},
"additionalProperties": false
}Token and Vault Exit Ladder — One decision on holding a Base token and a vault position: token-trap-detector (live bytecode, proxy slots, honeypot simulation) and vault-exit-lawyer (redeem limits, queue, admin powers, eth_call simulation) run in parallel; contract-auditor then audits the token's verified source at the proxy implementation the trap step read, and is skipped on a honeypot or unverified source. Returns the worst
| Argument | Type | Description |
|---|---|---|
| exit* | object | Exactly one of shares or assets, as base-unit integer strings. shares may be "max" (needs holder). |
| chain* | string | Chain the vault lives on. |
| vault* | string | ERC-4626 or ERC-7540 vault address. |
| holder | string | Address that holds the shares. Enables an exact eth_call redeem simulation and per-holder limits. |
| docsUrls | array | Public documentation pages whose redemption claims are checked against the contract. |
| tokenAddress* | string | Token contract address on Base. |
{
"type": "object",
"required": [
"tokenAddress",
"chain",
"vault",
"exit"
],
"properties": {
"exit": {
"type": "object",
"properties": {
"assets": {
"type": "string",
"pattern": "^[0-9]{1,78}$",
"description": "Underlying assets to receive (base units)."
},
"shares": {
"type": "string",
"pattern": "^([0-9]{1,78}|max)$",
"description": "Vault shares to redeem (base units), or \"max\" for the holder's whole balance."
}
},
"description": "Exactly one of shares or assets, as base-unit integer strings. shares may be \"max\" (needs holder).",
"additionalProperties": false
},
"chain": {
"enum": [
"ethereum",
"base",
"polygon",
"arbitrum",
"optimism"
],
"type": "string",
"description": "Chain the vault lives on."
},
"vault": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "ERC-4626 or ERC-7540 vault address."
},
"holder": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "Address that holds the shares. Enables an exact eth_call redeem simulation and per-holder limits."
},
"docsUrls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 4,
"description": "Public documentation pages whose redemption claims are checked against the contract."
},
"tokenAddress": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "Token contract address on Base."
}
},
"additionalProperties": false
}Vault Exit Lawyer — Before moving treasury funds out of an ERC-4626 or ERC-7540 vault: reads the chain at one pinned block and returns how much can exit now, the haircut vs convertToAssets, partial-exit maximum, liquidity coverage, queue/cooldown timing, admin-power flags (upgrade, pause, multisig threshold, timelock), and a verdict EXIT_NOW_FULL / EXIT_PARTIAL / QUEUED / BLOCKED / UNKNOWN. With a holder it simulates
| Argument | Type | Description |
|---|---|---|
| exit* | object | Exactly one of shares or assets, as base-unit integer strings. shares may be "max" (needs holder). |
| chain* | string | Chain the vault lives on. |
| vault* | string | ERC-4626 or ERC-7540 vault address. |
| holder | string | Address that holds the shares. Enables an exact eth_call redeem simulation and per-holder limits. |
| docsUrls | array | Public documentation pages whose redemption claims are checked against the contract. |
{
"type": "object",
"required": [
"chain",
"vault",
"exit"
],
"properties": {
"exit": {
"type": "object",
"properties": {
"assets": {
"type": "string",
"pattern": "^[0-9]{1,78}$",
"description": "Underlying assets to receive (base units)."
},
"shares": {
"type": "string",
"pattern": "^([0-9]{1,78}|max)$",
"description": "Vault shares to redeem (base units), or \"max\" for the holder's whole balance."
}
},
"description": "Exactly one of shares or assets, as base-unit integer strings. shares may be \"max\" (needs holder).",
"additionalProperties": false
},
"chain": {
"enum": [
"ethereum",
"base",
"polygon",
"arbitrum",
"optimism"
],
"type": "string",
"description": "Chain the vault lives on."
},
"vault": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "ERC-4626 or ERC-7540 vault address."
},
"holder": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "Address that holds the shares. Enables an exact eth_call redeem simulation and per-holder limits."
},
"docsUrls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 4,
"description": "Public documentation pages whose redemption claims are checked against the contract."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 15, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.
| Fair-value move below which the answer is NO_MATERIAL_CHANGE (default 100). |
| bankrollUsd | number | Used to turn the Kelly fraction into dollars. |
| rulesBefore | string | Rules text before the change. Overrides the on-chain read; defaults to the creation-time rules plus earlier updates. |
| kellyFraction | number | Fraction of full Kelly to stake (default 0.25). |
| clarificationText | string | The clarification / Additional context text. Overrides the on-chain read. |
{
"type": "object",
"required": [
"market"
],
"properties": {
"market": {
"type": "string",
"maxLength": 500,
"minLength": 3,
"description": "Polymarket market slug, polymarket.com URL or conditionId; or a Kalshi market ticker (rules from the public trade-api v2)."
},
"feeRate": {
"type": "number",
"maximum": 0.25,
"minimum": 0,
"description": "Taker fee coefficient: fee = shares * feeRate * p * (1 - p). Defaults to the market's Gamma feeSchedule rate (0 when fees are disabled); Kalshi defaults to 0.07 times the series fee_multiplier from /series."
},
"sizeUsd": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "Intended order size in USD (default 100)."
},
"position": {
"type": "object",
"required": [
"outcome",
"shares",
"avgPrice"
],
"properties": {
"shares": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0
},
"outcome": {
"enum": [
"YES",
"NO"
],
"type": "string",
"description": "Held side; YES is the market's first outcome."
},
"avgPrice": {
"type": "number",
"maximum": 1,
"minimum": 0
}
},
"additionalProperties": false
},
"priorYes": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Override for the pre-clarification fair P(YES); default is the Polymarket CLOB price history just before the clarification, falling back to the current YES order-book mid."
},
"minEdgeBps": {
"type": "number",
"maximum": 10000,
"minimum": 0,
"description": "Minimum edge after fees and slippage, in bps of cost (default 100)."
},
"minMoveBps": {
"type": "number",
"maximum": 10000,
"minimum": 0,
"description": "Fair-value move below which the answer is NO_MATERIAL_CHANGE (default 100)."
},
"bankrollUsd": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0,
"description": "Used to turn the Kelly fraction into dollars."
},
"rulesBefore": {
"type": "string",
"maxLength": 20000,
"description": "Rules text before the change. Overrides the on-chain read; defaults to the creation-time rules plus earlier updates."
},
"kellyFraction": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Fraction of full Kelly to stake (default 0.25)."
},
"clarificationText": {
"type": "string",
"maxLength": 10000,
"description": "The clarification / Additional context text. Overrides the on-chain read."
}
},
"additionalProperties": false
}| array |
| Transactions in which the claimant lost (or deposited, or recovered) funds. |
{
"type": "object",
"required": [
"wording",
"claimant",
"cover"
],
"properties": {
"cover": {
"type": "object",
"required": [
"amount",
"asset",
"start",
"end"
],
"properties": {
"end": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "ISO 8601 cover end."
},
"asset": {
"type": "string",
"maxLength": 20,
"minLength": 2,
"description": "Cover asset symbol, e.g. ETH, USDC, DAI, cbBTC."
},
"start": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "ISO 8601 cover start."
},
"amount": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0,
"description": "Cover amount in units of the cover asset."
}
},
"additionalProperties": false
},
"wording": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2000,
"minLength": 8,
"description": "Public URL of any provider's wording (PDF, HTML or text)."
},
"text": {
"type": "string",
"maxLength": 60000,
"minLength": 200,
"description": "Wording text; overrides the other fields."
},
"productId": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Nexus Mutual product id (api.nexusmutual.io/v2/products)."
},
"productName": {
"type": "string",
"maxLength": 200,
"minLength": 2,
"description": "Nexus Mutual product or product-type name, e.g. \"Single Protocol Cover\"."
}
},
"description": "The cover wording: a Nexus Mutual product (id or name), a URL (HTML or PDF), or pasted text. At least one.",
"additionalProperties": false
},
"claimant": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "Address that suffered the loss (the Impacted Account)."
},
"incident": {
"type": "object",
"properties": {
"occurredAt": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "ISO 8601 time the loss event began, if known."
},
"description": {
"type": "string",
"maxLength": 20000,
"minLength": 10
},
"postmortemUrls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000,
"minLength": 8
},
"maxItems": 4
}
},
"additionalProperties": false
},
"claimDate": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "ISO 8601 date the claim is (to be) filed; default now."
},
"deductible": {
"type": "object",
"properties": {
"basis": {
"enum": [
"from_loss",
"from_capped_loss"
],
"type": "string",
"description": "from_loss (default, Nexus clause 6): min(loss - deductible, cover). from_capped_loss: min(loss, cover) - deductible."
},
"amount": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0
},
"percentOfLoss": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"percentOfCover": {
"type": "number",
"maximum": 100,
"minimum": 0
}
},
"description": "Overrides any deductible found in the wording. Amount in cover-asset units; percentages 0-100.",
"additionalProperties": false
},
"claimedLoss": {
"type": "object",
"required": [
"amount"
],
"properties": {
"amount": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0
}
},
"description": "Loss the claimant asserts, in cover-asset units. Used for the payout only when no on-chain loss can be established; always reported as unverified.",
"additionalProperties": false
},
"transactions": {
"type": "array",
"items": {
"type": "object",
"required": [
"chain",
"hash"
],
"properties": {
"hash": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{64}$"
},
"chain": {
"enum": [
"ethereum",
"base",
"polygon",
"arbitrum",
"optimism"
],
"type": "string"
}
},
"additionalProperties": false
},
"maxItems": 12,
"description": "Transactions in which the claimant lost (or deposited, or recovered) funds."
}
},
"additionalProperties": false
}| marketPriceScale | string | Force the unit of marketPriceYes: percent (35 = 35%) or fraction (0.35 = 35%). |
{
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "News excerpt or event description. Required unless market is given; with market, extra evidence you want weighed."
},
"market": {
"type": "string",
"maxLength": 500,
"minLength": 3,
"description": "Polymarket slug, market URL or conditionId, or a Kalshi ticker or URL. Reads the question, rules, end date and live best asks; marketPriceYes then defaults to the book mid. A resolved market returns its outcome without a model call."
},
"question": {
"type": "string",
"maxLength": 500,
"description": "Exact market question; inferred when omitted (read from the market when market is given)."
},
"minEdgePct": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Minimum edge after taker fees, in percentage points, before verdict.action is BUY_YES or BUY_NO (default 5). A low-confidence estimate never produces a BUY."
},
"bankrollUsd": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0,
"description": "Converts the quarter-Kelly fraction into verdict.size_usd."
},
"marketPriceYes": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Current implied Yes probability, used to compute edge. Percent (0-100) by default; a value strictly between 0 and 1 is read as a 0-1 market price (Polymarket/Kalshi style) unless marketPriceScale says otherwise."
},
"marketPriceScale": {
"enum": [
"percent",
"fraction"
],
"type": "string",
"description": "Force the unit of marketPriceYes: percent (35 = 35%) or fraction (0.35 = 35%)."
}
},
"additionalProperties": false
}