{"serverId":"mcp-registry/io.github.rebelartists/fortfi-treasury-mcp","tools":[{"name":"accept_cosigner_invite","fixed":{"name":"accept_cosigner_invite","description":"Accept a pending co-signer invite. After accepting, you will be able to approve/reject pending actions for that account.","inputSchema":{"type":"object","required":["inviteId"],"properties":{"inviteId":{"type":"string","description":"Invite id from list_incoming_cosigner_invites"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":101,"tokensAfter":101},{"name":"add_recipient","fixed":{"name":"add_recipient","description":"Add a payout address to the allowlist. Human developer key (frtfi_hu_* + DA): added with 24h cooldown (no Assist passkey). Agent key (frtfi_ag_*): GOVERN — funding-wallet signature required; then approved immediately.","inputSchema":{"type":"object","required":["address","chainId"],"properties":{"address":{"type":"string","description":"Wallet address (0x… or Solana base58)"},"chainId":{"type":"string","description":"FortFi chain id (e.g. hyperliquid-mainnet). Omit when fromWalletId is set — network is inferred from that wallet."},"nickname":{"type":"string","description":"Optional display name"},"challengeId":{"type":"string","description":"Agent GOVERN: challengeId from the first call"},"fromWalletId":{"type":"string","description":"Optional source wallet id (list_wallets). Sets allowlist network to that wallet's chain — use for HL sends without passing chainId."},"walletSignature":{"type":"string","description":"Agent GOVERN: funding-wallet signature"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":289,"tokensAfter":289},{"name":"approve_cosigner_action","fixed":{"name":"approve_cosigner_action","description":"Approve a pending action as co-signer. Use with list_pending_cosigner_approvals.","inputSchema":{"type":"object","required":["pendingApprovalId"],"properties":{"pendingApprovalId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":78,"tokensAfter":78},{"name":"approve_recipient","fixed":{"name":"approve_recipient","description":"Approve a recipient still in cooldown (early release). Active cosigners may approve directly. Human passkey owners: use the FortFi app (passkey) or the approval email link; owner bearer keys cannot self-clear. Agent-owned accounts: owner self-approval is GOVERN (funding-wallet signature).","inputSchema":{"type":"object","required":["recipientId"],"properties":{"challengeId":{"type":"string","description":"Governance challengeId from the first call"},"recipientId":{"type":"string","description":"Recipient id from list_recipients or add_recipient"},"walletSignature":{"type":"string","description":"Funding-wallet signature over the challenge message"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":204,"tokensAfter":204},{"name":"cancel_governance_change","fixed":{"name":"cancel_governance_change","description":"Veto/cancel a pending governance challenge before it is signed and applied. Cancelling TIGHTENS security, so it needs only the agent key (no signature). Also cancels legacy scheduled rows from before immediate-apply parity.","inputSchema":{"type":"object","required":["challengeId"],"properties":{"challengeId":{"type":"string","description":"The governance request id from list_governance_requests"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":134,"tokensAfter":134},{"name":"cancel_hyperliquid_orders","fixed":{"name":"cancel_hyperliquid_orders","description":"Propose cancelling resting Hyperliquid orders (limit orders and SL/TP triggers) on one market. Pass oids from list_hyperliquid_open_orders, or omit oids to cancel every resting order on that symbol. Moves no money, but cancelling a stop loss removes protection, so it follows the normal confirm_proposal flow.","inputSchema":{"type":"object","required":["walletId","symbol"],"properties":{"oids":{"type":"array","items":{"type":"number"},"description":"Resting order ids on this symbol (max 50). Omit to cancel all of them."},"symbol":{"type":"string","description":"e.g. BTC, xyz:TSLA"},"walletId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":195,"tokensAfter":195},{"name":"cancel_payment_request","fixed":{"name":"cancel_payment_request","description":"Cancel an open payment request with no verified settlement.","inputSchema":{"type":"object","required":["idOrPid"],"properties":{"idOrPid":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":66,"tokensAfter":66},{"name":"cancel_pending_action","fixed":{"name":"cancel_pending_action","description":"Cancel a pending approval that you (the account owner) initiated.","inputSchema":{"type":"object","required":["pendingApprovalId"],"properties":{"pendingApprovalId":{"type":"string","description":"Pending approval id from list_pending_cosigner_approvals or list_audit_log"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":98,"tokensAfter":98},{"name":"check_trade_allowance","fixed":{"name":"check_trade_allowance","description":"Check ERC-20 allowance for an upcoming CoW swap (cow_swap) or Fusion bridge (fusion_bridge). Call before propose_swap / propose_bridge; if insufficient, use propose_token_approve then confirm.","inputSchema":{"type":"object","required":["fromWalletId","tokenAddress","requiredAmountSmallest","flow"],"properties":{"flow":{"enum":["cow_swap","fusion_bridge"],"type":"string","description":"cow_swap = CoW VaultRelayer; fusion_bridge = 1inch Limit Order"},"fromWalletId":{"type":"string","description":"Source EVM wallet id"},"tokenAddress":{"type":"string","description":"Sell token contract (0x…)"},"requiredAmountSmallest":{"type":"string","description":"Required allowance in token smallest units (e.g. USDC 6 decimals)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":223,"tokensAfter":223},{"name":"create_checkout_session","fixed":{"name":"create_checkout_session","description":"Create a per-customer checkout session: resolves (or provisions) the customer's own vault from your externalCustomerId, mints a payment request that settles into it, and returns checkoutUrl + x402Url. The paid webhook then carries customer identity. Price from productSlug or ad-hoc amountUsd.","inputSchema":{"type":"object","required":["customer"],"properties":{"chainId":{"type":"string","description":"Chain for ad-hoc sessions (default base-mainnet)"},"customer":{"type":"object","required":["externalId"],"properties":{"namespace":{"type":"string","description":"Mapping namespace (default 'default')"},"externalId":{"type":"string","description":"Your customer id (e.g. platform-customer-42)"}},"description":"Your customer identity — vault is resolved per (namespace, externalId)","additionalProperties":false},"metadata":{"type":"object","description":"Optional metadata object"},"amountUsd":{"type":"number","description":"Ad-hoc price in USD (alternative to productSlug)"},"reference":{"type":"string","description":"Your order/session id, echoed on every webhook"},"description":{"type":"string","description":"Optional checkout note"},"productSlug":{"type":"string","description":"Price from an existing payment product (SKU)"},"idempotencyKey":{"type":"string","description":"Safe retries — same key returns the same session"},"expiresInMinutes":{"type":"number","description":"Session TTL (default 60, product default wins if set)"},"amountSmallestUnit":{"type":"string","description":"Ad-hoc USDC amount in smallest units"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":450,"tokensAfter":450},{"name":"create_customer","fixed":{"name":"create_customer","description":"Create or sync one customer vault synchronously (treasury + wallets:write). Idempotent on externalCustomerId + namespace + chain. Returns wallet address immediately; Turnkey wallet creation may take a few seconds on first call.","inputSchema":{"type":"object","required":["clientRequestId","externalCustomerId","wallet"],"properties":{"wallet":{"type":"object","required":["chainId","nickname"],"properties":{"chainId":{"type":"string","description":"e.g. base, ethereum, solana"},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"nickname":{"type":"string"},"spendingPolicy":{"type":"object"}},"description":"Wallet to create or reuse for this customer"},"namespace":{"type":"string","description":"Optional mapping namespace (default: default)"},"credential":{"type":"object","description":"Optional vault-scoped credential to issue for this wallet"},"clientRequestId":{"type":"string","description":"Caller idempotency id (unique per provisioning attempt)"},"externalCustomerId":{"type":"string","description":"Your platform customer id (stable across retries)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":322,"tokensAfter":322},{"name":"create_merchant_webhook","fixed":{"name":"create_merchant_webhook","description":"Register a webhook URL. FortFi generates a signing secret (returned once) for the merchant to verify HMAC on incoming POSTs. Not per-product — one endpoint receives all paid events.","inputSchema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"HTTPS callback URL on the merchant's server"},"description":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":124,"tokensAfter":124},{"name":"create_payment_product","fixed":{"name":"create_payment_product","description":"Create a persistent product checkout link (/pay/p/{slug}). Each visit mints a fresh payment request. One webhook endpoint receives paid events for all products.","inputSchema":{"type":"object","required":["walletMappingId","name"],"properties":{"name":{"type":"string","description":"Product display name"},"slug":{"type":"string","description":"Optional URL slug (auto-generated if omitted)"},"imageUrl":{"type":"string","description":"HTTPS product image URL for checkout branding"},"amountUsd":{"type":"number","description":"Price in USD/USDC"},"description":{"type":"string","description":"Checkout subtitle shown to buyers"},"merchantSiteUrl":{"type":"string","description":"Merchant homepage for checkout branding (optional)"},"walletMappingId":{"type":"string","description":"USDC collection vault id"},"amountSmallestUnit":{"type":"string","description":"Alternative: amount in token smallest units"},"successRedirectUrl":{"type":"string","description":"HTTPS buyer redirect after pay (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":302,"tokensAfter":302},{"name":"create_payment_request","fixed":{"name":"create_payment_request","description":"Create a shareable payment request for a vault. Returns pid, paymentUrl, and qrPayload for humans or agents.","inputSchema":{"type":"object","required":["walletMappingId"],"properties":{"metadata":{"type":"object","description":"Optional metadata object"},"amountUsd":{"type":"number","description":"Invoice amount in USD (1 USD = 1 USDC)"},"expiryDays":{"type":"number","description":"Days until expiry (default 30)"},"description":{"type":"string","description":"Optional invoice note"},"walletMappingId":{"type":"string","description":"Target collection vault id"},"externalReference":{"type":"string","description":"Optional external invoice id"},"amountSmallestUnit":{"type":"string","description":"USDC amount in smallest units (alternative to amountUsd)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":234,"tokensAfter":234},{"name":"create_provisioning_job","fixed":{"name":"create_provisioning_job","description":"Bulk-provision up to 20 customer vaults per job (treasury + keys:manage + wallets:write). Requires idempotencyKey in args. Poll get_provisioning_job until terminal; bearer secrets reveal once on first terminal GET.","inputSchema":{"type":"object","required":["idempotencyKey","items"],"properties":{"items":{"type":"array","items":{"type":"object"},"description":"Up to 20 provisioning items"},"idempotencyKey":{"type":"string","description":"Unique key (8–200 chars) — same key + body replays the job"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":163,"tokensAfter":163},{"name":"create_vault_credential","fixed":{"name":"create_vault_credential","description":"Mint a vault-scoped credential for an existing wallet (treasury + keys:manage). Returns bearerKey once when agentPublicKey is omitted. Requires FORTFI_VAULT_CREDENTIALS_ENABLED.","inputSchema":{"type":"object","required":["name","access","vaultGrants"],"properties":{"name":{"type":"string","description":"Credential label (2–100 chars)"},"access":{"enum":["read_only","read_write"],"type":"string"},"expiresAt":{"type":"string","description":"ISO-8601 expiry (optional)"},"vaultGrants":{"type":"array","items":{"type":"object","required":["walletId"],"properties":{"walletId":{"type":"string"},"dailyCapUsdMicros":{"type":"string"},"perTxCapUsdMicros":{"type":"string"},"monthlyCapUsdMicros":{"type":"string"},"maxTransactionsPerDay":{"type":"number"}}},"description":"Explicit wallet grants with optional USD micro caps"},"agentPublicKey":{"type":"string","description":"Optional uncompressed P-256 public key (04… hex) for ECDSA auth"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":284,"tokensAfter":284},{"name":"extend_payment_request","fixed":{"name":"extend_payment_request","description":"Extend an open payment request expiry (default extension window in days).","inputSchema":{"type":"object","required":["idOrPid","expiryDays"],"properties":{"idOrPid":{"type":"string"},"expiryDays":{"type":"number","description":"New expiry horizon from now (1-365)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":97,"tokensAfter":97},{"name":"get_account_holdings","fixed":{"name":"get_account_holdings","description":"Token holdings for a specific wallet, with USD values and 24h change.","inputSchema":{"type":"object","required":["walletId"],"properties":{"walletId":{"type":"string","description":"Wallet id from list_wallets"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":81,"tokensAfter":81},{"name":"get_copy_trade_wallet","fixed":{"name":"get_copy_trade_wallet","description":"Deep dive on any Hyperliquid address: account value, leverage, open positions with share of book, PnL and volume for day, week, month and all time, and a copy preview per leverage cap (which positions would be copied, coverage, and the minimum account size so each copied position is at least $10).","inputSchema":{"type":"object","required":["address"],"properties":{"address":{"type":"string","description":"0x Hyperliquid address"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":143,"tokensAfter":143},{"name":"get_cosigner_rules","fixed":{"name":"get_cosigner_rules","description":"Amount-banded cosigner quorum rules for sends and swaps. Below-band amounts auto-execute; matching bands require N cosigner votes.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":71,"tokensAfter":71},{"name":"get_fusion_order_status","fixed":{"name":"get_fusion_order_status","description":"Track an owned Fusion+ cross-chain order by orderHash. Returns authoritative settlement/refund status, source and destination transactions, receiver, and the real destination token contract.","inputSchema":{"type":"object","required":["orderHash"],"properties":{"orderHash":{"type":"string","description":"Fusion+ order hash (0x…)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":115,"tokensAfter":115},{"name":"get_hyperliquid_balances","fixed":{"name":"get_hyperliquid_balances","description":"Get Hyperliquid wallet balances: L1 perps margin (withdrawable), HL Spot USDC (MoonPay HyperCore lands here), and HyperEVM USDC/HYPE. Also returns a `perps` aggregate over open positions: openPositionCount, unrealizedPnlUsd, entryNotionalUsd, and unrealizedPnlPct (null when nothing is open).","inputSchema":{"type":"object","required":["walletId"],"properties":{"walletId":{"type":"string","description":"FortFi wallet id on hyperliquid-mainnet"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":147,"tokensAfter":147},{"name":"get_hyperliquid_cross_section","fixed":{"name":"get_hyperliquid_cross_section","description":"Rank a Hyperliquid perp universe by trailing return in one call, for a dollar-neutral long/short book. Returns dex, assetClass, trailing returns, realized vol, funding, rank, percentile, and long/short/hold buckets. Default scope=core (validated trend desk); pass scope=all for HIP-3 cross-asset books. Read-only; never creates proposals.","inputSchema":{"type":"object","properties":{"dex":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Filter dex ids. Comma-separated string or array."},"band":{"type":"number","description":"Hysteresis band, default 1.0. A held name stays eligible while inside the top legsPerSide*(1+band); surfaced as hold_long / hold_short."},"limit":{"type":"number","description":"Max symbols ranked by volume, default 60"},"scope":{"enum":["core","all"],"type":"string","description":"Default core"},"assetClass":{"oneOf":[{"type":"string"},{"type":"array","items":{"enum":["crypto","equity","commodity","fx","index","pre_ipo","other"],"type":"string"}}],"description":"Filter asset classes. Comma-separated string or array."},"legsPerSide":{"type":"number","description":"Legs per side, default 6"},"lookbackDays":{"type":"array","items":{"type":"number"},"description":"Trailing return windows in days. FIRST entry is the ranking signal. Default [14,7,30]."},"includeAllDesks":{"type":"boolean","description":"When true, same as scope=all"},"minDayVolumeUsd":{"type":"number","description":"Liquidity floor, default 2000000"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":439,"tokensAfter":439},{"name":"get_hyperliquid_market","fixed":{"name":"get_hyperliquid_market","description":"Get a Hyperliquid perp market by symbol with mark/funding context and optional candle history.","inputSchema":{"type":"object","required":["symbol"],"properties":{"symbol":{"type":"string","description":"Coin symbol, e.g. BTC"},"interval":{"enum":["1m","5m","15m","1h","4h","1d"],"type":"string","description":"Candle interval (default 1h)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":117,"tokensAfter":117},{"name":"get_hyperliquid_outcome_market","fixed":{"name":"get_hyperliquid_outcome_market","description":"One HIP-4 outcome market. id is the numeric outcome id. Optional walletId reads that Hyperliquid account's share balance.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"Outcome id, e.g. 9802"},"walletId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":101,"tokensAfter":101},{"name":"get_hyperliquid_research_data_stats","fixed":{"name":"get_hyperliquid_research_data_stats","description":"Row counts and last ingest time for hl_research_* tables (candles, funding, symbols). Use before backtests to confirm data freshness.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":76,"tokensAfter":76},{"name":"get_hyperliquid_trading_desk","fixed":{"name":"get_hyperliquid_trading_desk","description":"One-shot Hyperliquid trading desk snapshot for agent loops: margin, balances, positions, open orders, recent fills, and a `performance` block with unrealizedPnlUsd, unrealizedPnlPct, entryNotionalUsd, openPositionCount, and realizedPnlUsdRecentFills. Prefer this over many separate reads every 30-60 minutes.","inputSchema":{"type":"object","required":["walletId"],"properties":{"walletId":{"type":"string","description":"FortFi wallet id on hyperliquid-mainnet"},"fillLimit":{"type":"number","description":"Recent fills to include (default 100, max 500)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":179,"tokensAfter":179},{"name":"get_hyperliquid_user_fills","fixed":{"name":"get_hyperliquid_user_fills","description":"Recent Hyperliquid trade fills with closedPnl per fill. Use for P&L review and trade history (up to 2000 from HL).","inputSchema":{"type":"object","required":["walletId"],"properties":{"limit":{"type":"number","description":"Max fills to return (default 200, max 2000)"},"walletId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":107,"tokensAfter":107},{"name":"get_mcp_guide","fixed":{"name":"get_mcp_guide","description":"FortFi MCP capability guide: onboarding paths, pricing, limits, workflows, and full tool catalog. Call first when unsure which tool to use (e.g. market research → discover_tokens, not the Explore UI REST route).","inputSchema":{"type":"object","properties":{"topic":{"enum":["overview","tools","workflows","limits","pricing","all"],"type":"string","description":"Default overview"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":126,"tokensAfter":126},{"name":"get_payment_product","fixed":{"name":"get_payment_product","description":"Get a payment product by internal id or public slug.","inputSchema":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":62,"tokensAfter":62},{"name":"get_payment_request","fixed":{"name":"get_payment_request","description":"Get a payment request by internal id or public pid, including settlement attempts.","inputSchema":{"type":"object","required":["idOrPid"],"properties":{"idOrPid":{"type":"string","description":"Internal id or public pid"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":83,"tokensAfter":83},{"name":"get_policy_limits","fixed":{"name":"get_policy_limits","description":"Current policy limits: per-tx/daily/monthly caps (USDC smallest units). Agent accounts also include agent cap tier limits, maxWallets, and credential access expiry.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":80,"tokensAfter":80},{"name":"get_polymarket_market","fixed":{"name":"get_polymarket_market","description":"Get a Polymarket market by conditionId with optional outcome price history from the public CLOB API.","inputSchema":{"type":"object","required":["conditionId"],"properties":{"tokenId":{"type":"string","description":"Outcome token id for history (defaults to first outcome)"},"interval":{"enum":["1h","6h","1d","1w","max"],"type":"string","description":"Price history window (default 1w)"},"conditionId":{"type":"string","description":"Market condition id"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":149,"tokensAfter":149},{"name":"get_portfolio","fixed":{"name":"get_portfolio","description":"Full portfolio summary across all wallets: token balances with USD values, 24h change, and total net worth.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":63,"tokensAfter":63},{"name":"get_provisioning_job","fixed":{"name":"get_provisioning_job","description":"Poll a bulk provisioning job (treasury + keys:manage + wallets:read). bearerKey appears once when secretsDelivery is revealed.","inputSchema":{"type":"object","required":["jobId"],"properties":{"jobId":{"type":"string","description":"Job id from create_provisioning_job"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":97,"tokensAfter":97},{"name":"get_strategy","fixed":{"name":"get_strategy","description":"Get one strategy with its last 20 runs (each run lists the orders it placed and their result).","inputSchema":{"type":"object","required":["id","walletId"],"properties":{"id":{"type":"string","description":"Strategy id from list_strategies"},"walletId":{"type":"string","description":"Wallet the strategy runs on"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":107,"tokensAfter":107},{"name":"get_swap_routing_guide","fixed":{"name":"get_swap_routing_guide","description":"Returns which swap/bridge tool to use for a given from→to chain pair, with notes on protocols supported.","inputSchema":{"type":"object","required":["fromChainId","toChainId"],"properties":{"toChainId":{"type":"string","description":"Destination chain id"},"fromChainId":{"type":"string","description":"Source chain id"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":112,"tokensAfter":112},{"name":"get_token_chart","fixed":{"name":"get_token_chart","description":"Fetch a compact Zerion chart summary plus deterministic EMA, RSI, MACD, Bollinger, return, max-drawdown, and data-quality analysis. Raw points are omitted by default; set includePoints:true only for visual charting or external analysis. Discontinuous pre-migration/launch samples are excluded from TA.","inputSchema":{"type":"object","required":["chainId"],"properties":{"period":{"enum":["hour","day","week","month","3months","6months","year","5years","max"],"type":"string","description":"Chart window (default day)"},"address":{"type":"string","description":"Token contract address or Solana mint (fallback)"},"chainId":{"type":"string","description":"FortFi chain id, e.g. base-mainnet, ethereum-mainnet"},"fungibleId":{"type":"string","description":"Zerion fungible id returned by discover_tokens (preferred)"},"indicators":{"type":"array","items":{"enum":["return","drawdown","ema","rsi","macd","bollinger"],"type":"string"},"description":"Optional indicators to return; defaults to all. REST callers may pass a comma-separated value."},"includePoints":{"type":"boolean","description":"Include the raw chart points array. Default false."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":339,"tokensAfter":339},{"name":"get_treasury_context","fixed":{"name":"get_treasury_context","description":"Who am I? Returns treasury email, user id, credential kind/scopes, vault summary, and policy limits for this API key. Call first to confirm you are on the correct account before money-moving tools.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":90,"tokensAfter":90},{"name":"get_usage_balance","fixed":{"name":"get_usage_balance","description":"Monthly UpTo product balance: cap, used, remaining, and period bounds. Billable writes consume this pool; unused budget is refunded at period end.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":75,"tokensAfter":75},{"name":"get_yield_market_detail","fixed":{"name":"get_yield_market_detail","description":"Evidence for one Morpho vault: current net APY/TVL, historical APY and TVL series, period statistics, quality flags, allocation, instant-withdrawal liquidity, separated eligibility/readiness status, and timestamp. Rank on evidence.apy.medianPercent: the raw series contains upstream artifacts (points above 3000% APY) so averagePercent is filtered and medianPercent is the robust level. Check evidence.liquidity.redeemableUsd before sizing, since vaults typically run near 90% utilization and only un","inputSchema":{"type":"object","required":["chainId","vaultAddress"],"properties":{"apyDays":{"type":"number","description":"APY history window, 7–365 days; default 30"},"chainId":{"type":"string","description":"FortFi yield-supported chain id"},"tvlDays":{"type":"number","description":"TVL history window, 7–365 days; default 90"},"vaultAddress":{"type":"string","description":"Vault address from list_yield_markets"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":279,"tokensAfter":279},{"name":"invite_agent_cosigner","fixed":{"name":"invite_agent_cosigner","description":"Invite a co-signer. Agents: pass cosignerUserId (GOVERN / funding-wallet sign when using an agent API key). Humans: pass email — opens instructions for Security UI passkey provision (Turnkey dual-control with MCP DA).","inputSchema":{"type":"object","properties":{"email":{"type":"string","description":"Human path: invitee email for Security UI co-signer provision"},"nickname":{"type":"string","description":"Optional nickname for this co-signer"},"challengeId":{"type":"string","description":"Governance challengeId from the first call"},"cosignerUserId":{"type":"string","description":"Agent path: FortFi userId of the agent to invite as co-signer"},"walletSignature":{"type":"string","description":"Funding-wallet signature over the challenge message"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":233,"tokensAfter":233},{"name":"invite_cosigner","fixed":{"name":"invite_cosigner","description":"Alias of invite_agent_cosigner. Humans: email → Security UI. Agents: cosignerUserId.","inputSchema":{"type":"object","properties":{"email":{"type":"string"},"nickname":{"type":"string"},"challengeId":{"type":"string"},"cosignerUserId":{"type":"string"},"walletSignature":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":101,"tokensAfter":101},{"name":"list_activity_report","fixed":{"name":"list_activity_report","description":"Treasury activity timeline (JSON) for reconciliation: normalized labels, USD hints, vault scope, and categories. Optional walletId narrows to one vault. Requires reporting:read (or account:read).","inputSchema":{"type":"object","properties":{"category":{"enum":["all","money","security","account"],"type":"string","description":"Filter timeline category (default all)"},"walletId":{"type":"string","description":"Filter to one wallet mapping id"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":146,"tokensAfter":146},{"name":"list_audit_log","fixed":{"name":"list_audit_log","description":"Recent account activity: transfers, swaps, security events. Optional walletId filters to one vault's history. Pass cursor (from a previous page's nextCursor, even as an empty string on the first call) to switch the response to { items, nextCursor } and page back through full history instead of only the most recent entries.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Max entries to return (default 20, max 100)"},"cursor":{"type":"string","description":"Opaque cursor from a previous page's nextCursor. Passing this key (even as '') switches the response to { items, nextCursor }."},"walletId":{"type":"string","description":"Filter to audit entries for one wallet id"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":219,"tokensAfter":219},{"name":"list_copy_trade_leaders","fixed":{"name":"list_copy_trade_leaders","description":"Top Hyperliquid accounts by profit over a window (week, month, allTime), from Hyperliquid's public leaderboard. Only accounts over $25k that traded this month and are profitable all-time. Use get_copy_trade_wallet before copying one.","inputSchema":{"type":"object","properties":{"page":{"type":"number","description":"0-based page, default 0"},"query":{"type":"string","description":"Address prefix (0x...) or display name fragment"},"window":{"enum":["week","month","allTime"],"type":"string","description":"Default month"},"pageSize":{"type":"number","description":"1 to 50, default 20"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":187,"tokensAfter":187},{"name":"list_cosigner_memberships","fixed":{"name":"list_cosigner_memberships","description":"Active co-signers on this account.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":46,"tokensAfter":46},{"name":"list_funding_wallet_agents","fixed":{"name":"list_funding_wallet_agents","description":"List all FortFi agent accounts funded by the same payment wallet as this agent. Use to discover agentLabel / userId when renewing or spawning siblings (treasury multi-agent setups).","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":87,"tokensAfter":87},{"name":"list_governance_requests","fixed":{"name":"list_governance_requests","description":"List open governance requests on this account: pending (awaiting signature) and legacy scheduled rows. Use to monitor for unexpected loosening attempts.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":79,"tokensAfter":79},{"name":"list_hyperliquid_markets","fixed":{"name":"list_hyperliquid_markets","description":"List Hyperliquid perpetual markets with live mark/mid/oracle prices, funding, open interest, and 24h volume. Public data; no proposal.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Page size (default 30, max 100)"},"offset":{"type":"number","description":"Pagination offset (default 0)"},"search":{"type":"string","description":"Filter by coin symbol"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":132,"tokensAfter":132},{"name":"list_hyperliquid_open_orders","fixed":{"name":"list_hyperliquid_open_orders","description":"List resting Hyperliquid orders including SL/TP triggers for a wallet.","inputSchema":{"type":"object","required":["walletId"],"properties":{"walletId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":71,"tokensAfter":71},{"name":"list_hyperliquid_outcome_markets","fixed":{"name":"list_hyperliquid_outcome_markets","description":"List Hyperliquid HIP-4 outcome markets on the same account as perps. Prices are quote-micro (650000 = $0.65) from exchange mids. volumeUsd is 0 because outcomeMeta does not publish volume.","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"Search question, name, or description"},"limit":{"type":"number","description":"Page size, default 50, max 300"},"cursor":{"type":"string","description":"marketId from the previous page nextCursor"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":156,"tokensAfter":156},{"name":"list_hyperliquid_positions","fixed":{"name":"list_hyperliquid_positions","description":"List open Hyperliquid perp positions and margin summary for a hyperliquid-mainnet wallet (its address is used on the L1 order book).","inputSchema":{"type":"object","required":["walletId"],"properties":{"walletId":{"type":"string","description":"FortFi wallet id on hyperliquid-mainnet"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":104,"tokensAfter":104},{"name":"list_hyperliquid_symbol_master","fixed":{"name":"list_hyperliquid_symbol_master","description":"Security master for Hyperliquid perps: symbol, dex, desk label, short symbol, display name, asset class (crypto/equity/commodity/fx/index/pre_ipo), plus live volume and funding. Default scope=core; pass scope=all for HIP-3.","inputSchema":{"type":"object","properties":{"dex":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Filter dex ids (core, xyz, io, para). Comma-separated string or array."},"limit":{"type":"number","description":"Max rows by 24h volume (default all, max 500)"},"scope":{"enum":["core","all"],"type":"string","description":"Default core"},"assetClass":{"oneOf":[{"type":"string"},{"type":"array","items":{"enum":["crypto","equity","commodity","fx","index","pre_ipo","other"],"type":"string"}}],"description":"Filter asset classes. Comma-separated string or array."},"includeAllDesks":{"type":"boolean","description":"When true, same as scope=all"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":277,"tokensAfter":277},{"name":"list_incoming_cosigner_invites","fixed":{"name":"list_incoming_cosigner_invites","description":"List pending co-signer invites sent TO this account (where this account is the invitee). Use to discover accounts you can become a co-signer for.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":78,"tokensAfter":78},{"name":"list_merchant_webhook_deliveries","fixed":{"name":"list_merchant_webhook_deliveries","description":"List webhook delivery log. Use status=failed for dead-letter queue rows. Filter by paymentRequestId to find deliveries for one checkout.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Max rows (default 50, max 200)"},"status":{"enum":["pending","delivered","failed"],"type":"string"},"endpointId":{"type":"string"},"paymentRequestId":{"type":"string","description":"Internal payment request UUID"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":147,"tokensAfter":147},{"name":"list_merchant_webhooks","fixed":{"name":"list_merchant_webhooks","description":"List registered webhook endpoints (secrets are never returned).","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":53,"tokensAfter":53},{"name":"list_payment_products","fixed":{"name":"list_payment_products","description":"List persistent product checkout links for the account.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":51,"tokensAfter":51},{"name":"list_payment_purchases","fixed":{"name":"list_payment_purchases","description":"Buyer view: FortFi checkouts your vaults paid (what you bought). Matches settlements by payer wallet address across your fleet.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Max rows (default 200, max 500)"},"walletMappingId":{"type":"string","description":"Optional payer vault filter"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":114,"tokensAfter":114},{"name":"list_payment_requests","fixed":{"name":"list_payment_requests","description":"List payment requests for the authenticated account.","inputSchema":{"type":"object","properties":{"status":{"enum":["open","processing","partially_paid","paid","expired","cancelled"],"type":"string"},"walletMappingId":{"type":"string","description":"Optional vault filter"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":99,"tokensAfter":99},{"name":"list_payment_sales","fixed":{"name":"list_payment_sales","description":"Merchant view: paid and partially paid invoices on your collection vaults (what you sold). Includes payer, method, and settlement details.","inputSchema":{"type":"object","properties":{"walletMappingId":{"type":"string","description":"Optional collection vault filter"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":96,"tokensAfter":96},{"name":"list_pending_cosigner_approvals","fixed":{"name":"list_pending_cosigner_approvals","description":"Pending actions that require this account's co-signer approval. Use when this agent is a co-signer on another account.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Max entries (default 10)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":89,"tokensAfter":89},{"name":"list_polymarket_markets","fixed":{"name":"list_polymarket_markets","description":"List active Polymarket prediction markets on Polygon with volume, liquidity, and outcome prices.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Max markets (default 25)"},"search":{"type":"string","description":"Optional question/slug filter"},"sortBy":{"type":"string","description":"volume_24hr (default), volume, liquidity, or end_date"},"afterCursor":{"type":"string","description":"Pagination cursor from a prior list response"},"sortDirection":{"enum":["asc","desc"],"type":"string"},"minLiquidityUsd":{"type":"number","description":"Minimum liquidity USD (default 10000)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":195,"tokensAfter":195},{"name":"list_polymarket_positions","fixed":{"name":"list_polymarket_positions","description":"List Polymarket outcome token positions for a Polygon wallet. walletId is required.","inputSchema":{"type":"object","required":["walletId"],"properties":{"walletId":{"type":"string","description":"FortFi Polygon wallet id"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":85,"tokensAfter":85},{"name":"list_recipients","fixed":{"name":"list_recipients","description":"List all allowlisted recipients. Includes cooldown status: `cooldownActive: true` means the recipient cannot yet receive funds (24-hour gate).","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":73,"tokensAfter":73},{"name":"list_strategies","fixed":{"name":"list_strategies","description":"List strategies running on your Hyperliquid accounts (presets and copy trades): status, leverage, cap, next rebalance, and whether an API key started it. Stopped strategies are hidden unless includeStopped is true.","inputSchema":{"type":"object","properties":{"walletId":{"type":"string","description":"Optional: only this hyperliquid-mainnet wallet"},"includeStopped":{"type":"boolean","description":"Include stopped strategies"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":140,"tokensAfter":140},{"name":"list_strategy_presets","fixed":{"name":"list_strategy_presets","description":"List FortFi autonomous Hyperliquid strategies (house presets) with their published backtest: out-of-sample return, Sharpe and drawdown at 1x, walk-forward windows, every leverage scenario, tested leverage (start_strategy accepts these), high-risk leverage (owner passkey only), and the minimum account size per leverage. Read-only.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":127,"tokensAfter":127},{"name":"list_token_spender_grants","fixed":{"name":"list_token_spender_grants","description":"List active ERC-20 token approvals (spender grants) on this account. Useful before proposing a swap to confirm the CoW vault is approved.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":75,"tokensAfter":75},{"name":"list_wallets","fixed":{"name":"list_wallets","description":"List FortFi wallets for this account: chain, address, nickname, metadata tags, and default flag. Optional metadataKey/metadataValue filter (exact match). Pass cursor and/or limit to page through large fleets — response becomes { items, nextCursor } when either is set; omit both for the plain array of all wallets.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Page size when paginating (default 50, max 200)"},"cursor":{"type":"string","description":"Opaque cursor from a previous page's nextCursor. Passing this (even empty) switches the response to { items, nextCursor }."},"metadataKey":{"type":"string","description":"Filter wallets that include this metadata key (optional)"},"metadataValue":{"type":"string","description":"When set with metadataKey, require an exact value match"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":250,"tokensAfter":250},{"name":"list_yield_markets","fixed":{"name":"list_yield_markets","description":"Open Morpho yield discovery by chain with discovered, policyEligible, manuallyCurated, executionReady, and eligibilityReasons. Default minimum TVL is $500K everywhere (listing, policy, Turnkey). executionReady means TVL qualifies and you have a wallet on that chain; POLICY_SYNC_RECOMMENDED is advisory only.","inputSchema":{"type":"object","properties":{"asset":{"type":"string","description":"Asset symbol filter, default USDC"},"limit":{"type":"number","description":"Max vaults (default 15, max 25)"},"sortBy":{"type":"string","description":"net_apy (default) or tvl"},"chainId":{"type":"string","description":"FortFi chain id or omit for all yield chains"},"minTvlUsd":{"type":"number","description":"Minimum vault TVL in USD (default 500000)"},"verifiedOnly":{"type":"boolean","description":"If true, only FortFi curated vaults; default false = open discovery"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":262,"tokensAfter":262},{"name":"list_yield_positions","fixed":{"name":"list_yield_positions","description":"Active Morpho yield positions with per-vault valueUsd, earnedUsd (Morpho pnlUsd), netApy, and a summary block. summary.cumulativeEarnedUsd is the lifetime yield estimate from FortFi ledger cash flow: current value + total withdrawn − total deposited. Use at the start of every yield desk run to report standing P&L.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":123,"tokensAfter":123},{"name":"pay_payment_request_x402","fixed":{"name":"pay_payment_request_x402","description":"Pay an open FortFi invoice via x402 EIP-3009 from a governed Turnkey vault. Requires Delegated Access on human developer keys or an agent account. Base mainnet first.","inputSchema":{"type":"object","required":["paymentRequestPid","fromWalletId"],"properties":{"fromWalletId":{"type":"string","description":"Payer vault id (must match invoice chain)"},"paymentRequestPid":{"type":"string","description":"Public invoice pid from checkout URL or create_payment_request"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":153,"tokensAfter":153},{"name":"preview_bridge_quote","fixed":{"name":"preview_bridge_quote","description":"Optional advanced step: fetch a cross-chain bridge quote (Fusion+ or deBridge) and return previewQuoteId. Omit previewQuoteId on propose_bridge to bundle quote+proposal in one call.","inputSchema":{"type":"object","required":["fromWalletId","toWalletId","sellSymbol","buySymbol","amountUsd"],"properties":{"amountUsd":{"type":"string"},"buySymbol":{"type":"string"},"sellSymbol":{"type":"string"},"toWalletId":{"type":"string"},"fromWalletId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":150,"tokensAfter":150},{"name":"preview_swap_quote","fixed":{"name":"preview_swap_quote","description":"Optional advanced step: fetch a same-chain swap quote (CoW on EVM, Jupiter on Solana) and return previewQuoteId. Omit previewQuoteId on propose_* to bundle quote+proposal in one call. Does not execute or move funds.","inputSchema":{"type":"object","required":["fromWalletId","sellSymbol","buySymbol","amountUsd"],"properties":{"buyMint":{"type":"string","description":"Solana buy mint — omit for EVM"},"sellMint":{"type":"string","description":"Solana sell mint — omit for EVM"},"amountUsd":{"type":"string","description":"Approximate sell amount in USD"},"buySymbol":{"type":"string"},"sellSymbol":{"type":"string"},"toWalletId":{"type":"string","description":"Optional Solana receive wallet"},"fromWalletId":{"type":"string","description":"Source wallet id"},"buyTokenAddress":{"type":"string","description":"EVM buy token (0x…) — omit for Solana"},"slippagePercent":{"type":"number","description":"Optional Jupiter slippage 0–50"},"sellTokenAddress":{"type":"string","description":"EVM sell token (0x…) — omit for Solana"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":306,"tokensAfter":306},{"name":"propose_create_account","fixed":{"name":"propose_create_account","description":"Create a new wallet on a supported chain. Optional metadata tags (e.g. customer_id). Then call confirm_proposal with the returned proposalId. Agent accounts execute server-side when no cosigners are configured.","inputSchema":{"type":"object","required":["chainId","walletName"],"properties":{"chainId":{"type":"string","description":"FortFi chain id, e.g. base-mainnet, robinhood-mainnet, solana-mainnet"},"metadata":{"type":"object","description":"Optional flat string tags (max 20 keys), e.g. { \"customer_id\": \"cust_123\" }","additionalProperties":{"type":"string"}},"walletName":{"type":"string","description":"Display name for the new wallet (2–64 chars)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":207,"tokensAfter":207},{"name":"propose_hyperliquid_outcome_order","fixed":{"name":"propose_hyperliquid_outcome_order","description":"Propose a HIP-4 buy or sell on the Hyperliquid account. size is micro-USDC collateral (10000000 = $10). limitPrice is quote-micro. Runs outcome policy (no leverage, max notional) before any signature. Confirm with confirm_proposal.","inputSchema":{"type":"object","required":["walletId","marketId","outcomeId","side","size","orderType"],"properties":{"side":{"enum":["buy","sell"],"type":"string"},"size":{"type":"string","description":"Collateral in micro-USDC. Minimum 10000000 ($10)."},"marketId":{"type":"string","description":"Outcome id, e.g. 9802"},"walletId":{"type":"string"},"orderType":{"enum":["market","limit"],"type":"string"},"outcomeId":{"type":"string","description":"Side id outcomeId:sideIndex, e.g. 9802:0"},"limitPrice":{"type":"string","description":"Quote-micro. Required for limit. 650000 is $0.65."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":255,"tokensAfter":255},{"name":"propose_hyperliquid_perp_close","fixed":{"name":"propose_hyperliquid_perp_close","description":"Propose closing a Hyperliquid perp position (reduce-only). Omit size to close the whole position. Returns a proposalId for confirm_proposal.","inputSchema":{"type":"object","required":["walletId","symbol"],"properties":{"size":{"type":"string","description":"Optional; omit to close all"},"symbol":{"type":"string"},"walletId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":120,"tokensAfter":120},{"name":"propose_hyperliquid_send_asset","fixed":{"name":"propose_hyperliquid_send_asset","description":"Move USDC between Hyperliquid margin desks without HyperEVM (any perp book: core, xyz, io, para, mkts, …, or spot → any perp desk). Use list_hyperliquid_balances perpDesks[].dex for valid dex ids.","inputSchema":{"type":"object","required":["walletId","amountUsd","sourceDex","destinationDex"],"properties":{"walletId":{"type":"string"},"amountUsd":{"type":"string"},"sourceDex":{"type":"string","description":"core | spot | or any HIP-3 builder dex (xyz, io, para, mkts, …)"},"destinationDex":{"type":"string","description":"core | or any HIP-3 builder dex (not spot)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":183,"tokensAfter":183},{"name":"propose_payout_manifest","fixed":{"name":"propose_payout_manifest","description":"Execute a validated payout manifest sequentially (one ActionIntent per line). Requires Delegated Access or agent wallet. Set dryRun:true to validate only.","inputSchema":{"type":"object","required":["fromWalletId","lines"],"properties":{"lines":{"type":"array","items":{"type":"object","required":["recipientId","amountUsdc"],"properties":{"memo":{"type":"string"},"amountUsdc":{"type":"string"},"recipientId":{"type":"string"}}}},"dryRun":{"type":"boolean","description":"If true, validate only — no sends"},"fromWalletId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":173,"tokensAfter":173},{"name":"propose_polymarket_buy","fixed":{"name":"propose_polymarket_buy","description":"Propose buying Polymarket outcome shares, then call confirm_proposal. Requires Polygon wallet.","inputSchema":{"type":"object","required":["conditionId","outcomeIndex","price","sizeDisplay"],"properties":{"price":{"type":"string","description":"Limit price 0-1 (e.g. 0.52)"},"conditionId":{"type":"string","description":"Market condition id from list_polymarket_markets"},"sizeDisplay":{"type":"string","description":"Share count (e.g. 10)"},"fromWalletId":{"type":"string"},"outcomeIndex":{"type":"number","description":"0-based outcome index"},"fromAccountQuery":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":184,"tokensAfter":184},{"name":"propose_polymarket_sell","fixed":{"name":"propose_polymarket_sell","description":"Propose selling Polymarket outcome shares (redeem collateral), then call confirm_proposal.","inputSchema":{"type":"object","required":["conditionId","outcomeIndex","price","sizeDisplay"],"properties":{"price":{"type":"string"},"conditionId":{"type":"string"},"sizeDisplay":{"type":"string"},"fromWalletId":{"type":"string"},"outcomeIndex":{"type":"number"},"fromAccountQuery":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":132,"tokensAfter":132},{"name":"propose_rename_account","fixed":{"name":"propose_rename_account","description":"Rename a wallet (account nickname), then call confirm_proposal with the returned proposalId.","inputSchema":{"type":"object","required":["accountId","nickname"],"properties":{"nickname":{"type":"string","description":"New nickname (2–64 characters)"},"accountId":{"type":"string","description":"Wallet id from list_wallets"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":113,"tokensAfter":113},{"name":"propose_token_approve","fixed":{"name":"propose_token_approve","description":"Propose max ERC-20 approval for CoW or Fusion spenders. Returns proposalId — call confirm_proposal before swap/bridge.","inputSchema":{"type":"object","required":["fromWalletId","tokenAddress","flow"],"properties":{"flow":{"enum":["cow_swap","fusion_bridge"],"type":"string"},"fromWalletId":{"type":"string","description":"EVM wallet id"},"tokenAddress":{"type":"string","description":"Token to approve (0x…)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":136,"tokensAfter":136},{"name":"propose_transfer","fixed":{"name":"propose_transfer","description":"Transfer USDC to an allowlisted recipient, OR pay a FortFi invoice by public pid (paymentRequestPid + fromWalletId — amount optional for partial pay). Recipient path requires allowlist approval. Invoice path binds settlement to the pid (Delegated Access / agent accounts execute server-side when configured).","inputSchema":{"type":"object","required":["fromWalletId"],"properties":{"memo":{"type":"string","description":"Optional transfer note (max 256 chars)"},"amountUsdc":{"type":"string","description":"Amount in USDC as a decimal string, e.g. '5.00'. Required for recipient sends; optional for invoice pay (defaults to remaining balance)."},"recipientId":{"type":"string","description":"Allowlisted recipient id (omit when using paymentRequestPid)"},"fromWalletId":{"type":"string","description":"Source wallet id from list_wallets"},"networkChainId":{"type":"string","description":"Optional. Send from the same EVM address on another supported mainnet (e.g. 'arbitrum-mainnet' for USDC withdrawn from Hyperliquid). Recipient must be allowlisted on that network. Omit to use the wallet's home network. Not allowed with paymentRequestPid."},"paymentRequestPid":{"type":"string","description":"Public invoice pid from checkout URL — pays merchant vault with pid-bound settlement"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":378,"tokensAfter":378},{"name":"remove_backup_governance_wallet","fixed":{"name":"remove_backup_governance_wallet","description":"Remove the registered backup governance wallet. GOVERN action: sign with your funding wallet (challengeId + walletSignature); applies immediately once signed. After removal, only the funding wallet may authorize governance.","inputSchema":{"type":"object","properties":{"challengeId":{"type":"string","description":"Governance challengeId from the first call"},"walletSignature":{"type":"string","description":"Funding-wallet signature over the challenge message"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":154,"tokensAfter":154},{"name":"remove_cosigner","fixed":{"name":"remove_cosigner","description":"Remove an active co-signer from this account. GOVERN action (it shrinks the approver set): via an agent key, sign a challenge with your funding wallet (challengeId + walletSignature); applies immediately once signed.","inputSchema":{"type":"object","required":["membershipId"],"properties":{"challengeId":{"type":"string","description":"Governance challengeId from the first call"},"membershipId":{"type":"string","description":"Membership id from list_cosigner_memberships"},"walletSignature":{"type":"string","description":"Funding-wallet signature over the challenge message"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":182,"tokensAfter":182},{"name":"remove_recipient","fixed":{"name":"remove_recipient","description":"Remove a recipient from the FortFi allowlist (tightening policy — no funding-wallet GOVERN). Human developer key, session, or agent treasury key. Re-sync Turnkey policies in the app so the enclave matches.","inputSchema":{"type":"object","required":["recipientId"],"properties":{"recipientId":{"type":"string","description":"Recipient id from list_recipients"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":121,"tokensAfter":121},{"name":"revoke_cosigner_invite","fixed":{"name":"revoke_cosigner_invite","description":"Revoke a pending outbound co-signer invite before it is accepted.","inputSchema":{"type":"object","required":["inviteId"],"properties":{"inviteId":{"type":"string","description":"Invite id from the invite you sent"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":82,"tokensAfter":82},{"name":"revoke_vault_credential","fixed":{"name":"revoke_vault_credential","description":"Revoke a vault-scoped credential (treasury + keys:manage). Idempotent if already revoked.","inputSchema":{"type":"object","required":["credentialId"],"properties":{"credentialId":{"type":"string","description":"Vault credential id"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":87,"tokensAfter":87},{"name":"run_hyperliquid_research_backtest","fixed":{"name":"run_hyperliquid_research_backtest","description":"Run an out-of-sample backtest on Hyperliquid perp OHLCV stored in FortFi research Postgres (hl_research_candles). Returns IS/OOS metrics and a pass/fail verdict. Read-only; uses synced historical data, not live HL API for bars. Strategies: momentum_cross (default).","inputSchema":{"type":"object","properties":{"coins":{"type":"array","items":{"type":"string"},"description":"Optional fixed symbol list (e.g. BTC, ETH). Omit for volume-filtered universe"},"holdBars":{"type":"number","description":"Hold period in bars. Default 24"},"interval":{"enum":["1m","5m","15m","1h","4h","1d"],"type":"string","description":"Candle interval in research DB. Default 1h"},"strategy":{"enum":["momentum_cross","trailing_return_rank"],"type":"string","description":"Default momentum_cross"},"legsPerSide":{"type":"number","description":"Long/short leg count. Default 6"},"oosFraction":{"type":"number","description":"Out-of-sample tail fraction. Default 0.35"},"lookbackBars":{"type":"number","description":"Trailing return lookback. Default 336 on 1h (~14d)"},"minDayVolumeUsd":{"type":"number","description":"Universe liquidity floor when coins omitted. Default 1000000"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":348,"tokensAfter":348},{"name":"run_hyperliquid_research_backtest_spec","fixed":{"name":"run_hyperliquid_research_backtest_spec","description":"Run an out-of-sample backtest from a Strategy Spec JSON (universe + rank factor or named pattern + portfolio rules). Deterministic; reads hl_research_* Postgres. Agent should translate natural-language strategy ideas into the spec object before calling. Pass presetId instead of spec to get a FortFi house preset (crypto-majors, core-momentum, mag7, semis, memory, ai-compute, pre-ipo, ...) with its frozen spec and published OOS, walk-forward, drawdown and leverage scenarios; add rerun:true to reco","inputSchema":{"type":"object","properties":{"prod":{"type":"boolean","description":"Use production Supabase (default false in dev)"},"spec":{"type":"object","description":"Strategy Spec: name, universe {dex, minDayVolumeUsd, includeCoins, excludeCoins, maxSymbols}, interval, signal {type rank|pattern, factor|pattern, params}, portfolio, costs, validation"},"rerun":{"type":"boolean","description":"With presetId, rerun the preset spec live instead of returning published stats"},"presetId":{"type":"string","description":"House preset id. Returns the spec plus published stats."}},"additionalProperties":true},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":328,"tokensAfter":328},{"name":"search_credentials","fixed":{"name":"search_credentials","description":"Parent-treasury key-centric credential search (treasury credential + keys:manage + wallets:read). Complements search_vaults. Never returns raw bearer keys.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Page size (default 50, max 100)"},"query":{"type":"string","description":"Free-text search"},"access":{"enum":["read_only","read_write"],"type":"string"},"cursor":{"type":"string","description":"Pagination cursor"},"status":{"enum":["active","revoked"],"type":"string"},"walletId":{"type":"string","description":"Filter by vault wallet id"},"metadataKey":{"type":"string","description":"Exact metadata key (requires metadataValue)"},"metadataValue":{"type":"string","description":"Exact metadata value (requires metadataKey)"},"credentialKind":{"enum":["treasury","vault"],"type":"string"},"externalCustomerId":{"type":"string","description":"Exact external customer id"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":275,"tokensAfter":275},{"name":"search_polymarket_markets","fixed":{"name":"search_polymarket_markets","description":"Search Polymarket markets by question text.","inputSchema":{"type":"object","required":["query"],"properties":{"limit":{"type":"number"},"query":{"type":"string","description":"Search text"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":76,"tokensAfter":76},{"name":"search_vaults","fixed":{"name":"search_vaults","description":"Parent-treasury vault inventory search (treasury credential + keys:manage + wallets:read). Matches nicknames, wallet IDs, addresses, external customer IDs, credential names, and prefixes. Never returns raw bearer keys.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Page size (default 50, max 100)"},"query":{"type":"string","description":"Free-text search"},"cursor":{"type":"string","description":"Pagination cursor from prior response"},"chainId":{"type":"string","description":"Exact chain filter"},"metadataKey":{"type":"string","description":"Exact metadata key (requires metadataValue)"},"metadataValue":{"type":"string","description":"Exact metadata value (requires metadataKey)"},"credentialAccess":{"enum":["read_only","read_write"],"type":"string","description":"Filter by linked credential access mode"},"credentialStatus":{"enum":["active","revoked"],"type":"string","description":"Filter by linked credential status"},"externalCustomerId":{"type":"string","description":"Exact external customer id"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":312,"tokensAfter":312},{"name":"send_merchant_webhook_test","fixed":{"name":"send_merchant_webhook_test","description":"Send a signed webhook.test event to an endpoint.","inputSchema":{"type":"object","required":["endpointId"],"properties":{"endpointId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":66,"tokensAfter":66},{"name":"start_copy_trade","fixed":{"name":"start_copy_trade","description":"Copy another Hyperliquid account on one of your wallets. Every hour FortFi reads their book, keeps their largest positions until 95% of their exposure is covered (at most 10 names), scales to your equity and leverage cap, and trades only when a position drifts more than 10% from target. API keys may set a leverage cap of 1 or 2; 3 and 5 need the owner in the app. Same rails, caps and key re-checks as start_strategy.","inputSchema":{"type":"object","required":["walletId","address","leverage"],"properties":{"address":{"type":"string","description":"0x address to copy"},"leverage":{"type":"number","description":"Leverage cap: 1 or 2 for API keys"},"walletId":{"type":"string","description":"hyperliquid-mainnet wallet id"},"maxLossPct":{"type":"integer","maximum":90,"minimum":1,"description":"Optional loss cap, whole percent (1-90). If the strategy's P&L since start falls this far below the money it runs on, FortFi stops it and closes its positions. Checked every 5 minutes."},"maxAllocationUsd":{"type":"string","description":"Optional cap on equity used, e.g. \"500\""}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":321,"tokensAfter":321},{"name":"start_strategy","fixed":{"name":"start_strategy","description":"Start a house preset on a hyperliquid-mainnet wallet and place its first orders. Leverage must be one of the preset's testedLeverage levels; high-risk levels need the owner in the app. Requires the owner to have turned on autonomous trading and confirmed perps eligibility. One strategy per wallet. Every order is an ActionIntent under this key's caps and co-sign rules; the key is re-checked every run and the strategy pauses if it is revoked.","inputSchema":{"type":"object","required":["walletId","presetId","leverage"],"properties":{"leverage":{"type":"number","description":"One of the preset's testedLeverage levels"},"presetId":{"type":"string","description":"From list_strategy_presets"},"walletId":{"type":"string","description":"hyperliquid-mainnet wallet id"},"maxLossPct":{"type":"integer","maximum":90,"minimum":1,"description":"Optional loss cap, whole percent (1-90). If the strategy's P&L since start falls this far below the money it runs on, FortFi stops it and closes its positions. Checked every 5 minutes."},"maxAllocationUsd":{"type":"string","description":"Optional cap on equity the strategy sizes against, e.g. \"500\""}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":339,"tokensAfter":339},{"name":"stop_strategy","fixed":{"name":"stop_strategy","description":"Stop a strategy and close every position it opened (cash out). Positions it did not open are left alone.","inputSchema":{"type":"object","required":["id","walletId"],"properties":{"id":{"type":"string"},"walletId":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":84,"tokensAfter":84},{"name":"update_cosigner_rules","fixed":{"name":"update_cosigner_rules","description":"Set cosigner quorum rules (send + swap USD bands). Tightening rules works with the agent key alone. WEAKENING them (lower required cosigners / raise the amount floor) is a GOVERN action: sign a challenge with your funding wallet (challengeId + walletSignature); applies immediately once signed (same as passkey in the UI). Amounts use USDC micro-units (1 USDC = 1000000).","inputSchema":{"type":"object","required":["rules"],"properties":{"rules":{"type":"array","items":{"type":"object"}},"challengeId":{"type":"string","description":"Governance challengeId (only needed when weakening rules)"},"walletSignature":{"type":"string","description":"Funding-wallet signature over the challenge message"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":217,"tokensAfter":217},{"name":"update_strategy","fixed":{"name":"update_strategy","description":"Lower a strategy's leverage or allocation cap. API keys can only tighten: raising leverage or the cap returns OWNER_PASSKEY_REQUIRED.","inputSchema":{"type":"object","required":["id","walletId"],"properties":{"id":{"type":"string"},"leverage":{"type":"number","description":"New lower leverage"},"walletId":{"type":"string"},"maxLossPct":{"type":"integer","maximum":90,"minimum":1,"description":"New loss cap, whole percent. API keys may add a cap or lower it, never raise or remove it."},"maxAllocationUsd":{"type":"string","description":"New lower cap"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":175,"tokensAfter":175},{"name":"update_vault_credential","fixed":{"name":"update_vault_credential","description":"Atomically replace a vault credential's name, access mode, grants, and expiry (treasury + keys:manage). Revoked credentials cannot be updated.","inputSchema":{"type":"object","required":["credentialId","name","access","vaultGrants"],"properties":{"name":{"type":"string"},"access":{"enum":["read_only","read_write"],"type":"string"},"expiresAt":{"type":"string","description":"ISO-8601 expiry, or null to clear"},"vaultGrants":{"type":"array","items":{"type":"object","required":["walletId"],"properties":{"walletId":{"type":"string"},"dailyCapUsdMicros":{"type":"string"},"perTxCapUsdMicros":{"type":"string"},"monthlyCapUsdMicros":{"type":"string"},"maxTransactionsPerDay":{"type":"number"}}}},"credentialId":{"type":"string","description":"Vault credential id"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":235,"tokensAfter":235},{"name":"update_wallet_metadata","fixed":{"name":"update_wallet_metadata","description":"Propose updating wallet metadata tags (flat string key/value pairs; replaces existing tags on confirm). Returns proposalId; call confirm_proposal to apply. Not a money-moving action.","inputSchema":{"type":"object","required":["accountId","metadata"],"properties":{"metadata":{"type":"object","description":"Full metadata object, e.g. { \"customer_id\": \"cust_123\", \"agent_id\": \"ag_1\" }","additionalProperties":{"type":"string"}},"accountId":{"type":"string","description":"Wallet id from list_wallets"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":164,"tokensAfter":164},{"name":"validate_payout_manifest","fixed":{"name":"validate_payout_manifest","description":"Preview batch payroll/payout (max 50 lines). Each line: { recipientId, amountUsdc, memo? }. All recipients must be allowlisted, same chain as fromWalletId, and past cooldown.","inputSchema":{"type":"object","required":["fromWalletId","lines"],"properties":{"lines":{"type":"array","items":{"type":"object","required":["recipientId","amountUsdc"],"properties":{"memo":{"type":"string"},"amountUsdc":{"type":"string","description":"Decimal USD amount e.g. 125.50"},"recipientId":{"type":"string"}}}},"fromWalletId":{"type":"string","description":"Wallet id from list_wallets"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":183,"tokensAfter":183},{"name":"validate_recipient_manifest","fixed":{"name":"validate_recipient_manifest","description":"Preview a batch recipient import (max 50 rows). Each row: { address, chainId, nickname? }. Returns ready_new, already_exists, or invalid per line. Read-only.","inputSchema":{"type":"object","required":["recipients"],"properties":{"recipients":{"type":"array","items":{"type":"object","required":["address","chainId"],"properties":{"address":{"type":"string"},"chainId":{"type":"string"},"nickname":{"type":"string"}}}}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":140,"tokensAfter":140}],"toolsChanged":104,"tokensSaved":0,"todo":[{"tool":"approve_cosigner_action","params":["pendingApprovalId"]},{"tool":"cancel_hyperliquid_orders","params":["walletId"]},{"tool":"cancel_payment_request","params":["idOrPid"]},{"tool":"create_merchant_webhook","params":["description"]},{"tool":"create_vault_credential","params":["access"]},{"tool":"extend_payment_request","params":["idOrPid"]},{"tool":"get_hyperliquid_outcome_market","params":["walletId"]},{"tool":"get_hyperliquid_user_fills","params":["walletId"]},{"tool":"get_payment_product","params":["id","slug"]},{"tool":"invite_cosigner","params":["email","nickname","challengeId","cosignerUserId","walletSignature"]},{"tool":"list_hyperliquid_open_orders","params":["walletId"]},{"tool":"list_merchant_webhook_deliveries","params":["status","endpointId"]},{"tool":"list_payment_requests","params":["status"]},{"tool":"list_polymarket_markets","params":["sortDirection"]},{"tool":"pause_strategy","params":["id","walletId"]},{"tool":"preview_bridge_quote","params":["amountUsd","buySymbol","sellSymbol","toWalletId","fromWalletId"]},{"tool":"preview_swap_quote","params":["buySymbol","sellSymbol"]},{"tool":"propose_hyperliquid_deposit","params":["walletId","amountUsd"]},{"tool":"propose_hyperliquid_outcome_order","params":["side","walletId","orderType"]},{"tool":"propose_hyperliquid_perp_close","params":["symbol","walletId"]},{"tool":"propose_hyperliquid_perp_modify","params":["symbol","stopLoss","walletId","takeProfit"]},{"tool":"propose_hyperliquid_perp_open","params":["side","leverage","walletId"]},{"tool":"propose_hyperliquid_send_asset","params":["walletId","amountUsd"]},{"tool":"propose_hyperliquid_spot_to_perp","params":["walletId","amountUsd"]},{"tool":"propose_hyperliquid_withdraw","params":["walletId","amountUsd"]},{"tool":"propose_payout_manifest","params":["lines","fromWalletId"]},{"tool":"propose_polymarket_buy","params":["fromWalletId","fromAccountQuery"]},{"tool":"propose_polymarket_redeem","params":["conditionId","fromWalletId","outcomeIndex","fromAccountQuery"]},{"tool":"propose_polymarket_sell","params":["price","conditionId","sizeDisplay","fromWalletId","outcomeIndex","fromAccountQuery"]},{"tool":"propose_recipient_manifest","params":["recipients"]},{"tool":"propose_token_approve","params":["flow"]},{"tool":"propose_yield_deposit","params":["assetSymbol"]},{"tool":"propose_yield_withdraw","params":["vaultName","assetSymbol","fromWalletId","vaultAddress","amountDisplay","fromAccountQuery"]},{"tool":"rank_polymarket_markets","params":["limit","sortBy"]},{"tool":"rank_tokens","params":["mode","chains","periods"]},{"tool":"rebalance_strategy_now","params":["id","walletId"]},{"tool":"reject_cosigner_action","params":["pendingApprovalId"]},{"tool":"resume_strategy","params":["id","walletId"]},{"tool":"screen_hyperliquid_markets","params":["sideBias","indicators","includeCharts"]},{"tool":"screen_tokens","params":["mode","chains"]},{"tool":"search_credentials","params":["access","status","credentialKind"]},{"tool":"search_polymarket_markets","params":["limit"]},{"tool":"send_merchant_webhook_test","params":["endpointId"]},{"tool":"stop_strategy","params":["id","walletId"]},{"tool":"update_cosigner_rules","params":["rules"]},{"tool":"update_strategy","params":["id","walletId"]},{"tool":"update_vault_credential","params":["name","access","vaultGrants"]},{"tool":"validate_payout_manifest","params":["lines"]},{"tool":"validate_recipient_manifest","params":["recipients"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}