Koskamo

FortFi Treasury MCP

An MCP server that allows AI agents to execute policy-gated trading operations including opening perps, swapping assets, bridging chains, and managing yield positions. It enforces strict limits on transaction size, daily volume, and trusted recipients, ensuring agents never hold private keys and all actions pass risk checks.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

FortFi Treasury MCP logo, by FortFi LLCCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by FortFi LLC
You need:During the beta, human API keys and MCP access are included with your FortFi account.
MCP endpoint (Streamable HTTP)
https://fortfiapp.com/api/mcp
Vendor documentation

What its tools do

148 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

Not annotated (148)

148 of 148 have a description · 0 of 148 declare behavior hints · 76 of 131 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Open, modify, and close Hyperliquid perps for crypto, stocks, and commodities
  • Quote and propose same-chain swaps and cross-chain bridges
  • Read balances, positions, holdings, and PnL across every supported chain
  • Send funds only to recipients on a trusted list within defined caps

Source and maintenance

Community listingRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
fortfi 1.0.0
MCP protocol negotiated in check
2024-11-05
Tools
148 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Tools

148 advertised

get_mcp_guide
Advertised by the server during the last successful anonymous check.

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).

get_mcp_guide input schema
{
  "type": "object",
  "properties": {
    "topic": {
      "enum": [
        "overview",
        "tools",
        "workflows",
        "limits",
        "pricing",
        "all"
      ],
      "type": "string",
      "description": "Default overview"
    }
  },
  "additionalProperties": false
}
get_treasury_context
Advertised by the server during the last successful anonymous check.

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.

get_treasury_context input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_wallets
Advertised by the server during the last successful anonymous check.

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.

list_wallets input schema
{
  "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
}
list_recipients
Advertised by the server during the last successful anonymous check.

List all allowlisted recipients. Includes cooldown status: `cooldownActive: true` means the recipient cannot yet receive funds (24-hour gate).

list_recipients input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_audit_log
Advertised by the server during the last successful anonymous check.

Recent account activity: one row per money move (sends, swaps, bridges), blocked attempt, or account change (keys, recipients). Money rows and blocked rows carry a confirmationNumber (FF-XXXX-XXXX) the owner can quote to FortFi support. Blocked rows carry the reasons. Pass view: 'full' for every internal step. 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.

list_audit_log input schema
{
  "type": "object",
  "properties": {
    "view": {
      "enum": [
        "activity",
        "full"
      ],
      "type": "string",
      "description": "activity (default): one row per money move, blocked attempt, or account change. full: every audit step, including internal ones."
    },
    "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
}
list_activity_report
Advertised by the server during the last successful anonymous check.

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).

list_activity_report input schema
{
  "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
}
get_fusion_order_status
Advertised by the server during the last successful anonymous check.

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.

get_fusion_order_status input schema
{
  "type": "object",
  "required": [
    "orderHash"
  ],
  "properties": {
    "orderHash": {
      "type": "string",
      "description": "Fusion+ order hash (0x…)"
    }
  },
  "additionalProperties": false
}
get_policy_limits
Advertised by the server during the last successful anonymous check.

Current policy limits: per-tx/daily/monthly caps (USDC smallest units). Agent accounts also include agent cap tier limits, maxWallets, and credential access expiry.

get_policy_limits input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
get_usage_balance
Advertised by the server during the last successful anonymous check.

Monthly UpTo product balance: cap, used, remaining, and period bounds. Billable writes consume this pool; unused budget is refunded at period end.

get_usage_balance input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
resend_claim_link
Advertised by the server during the last successful anonymous check.

Resend the dashboard claim email to contactEmail (MCP agent API key only; keys:manage scope). Use when the original link expired (72h) or was lost. Rate limit: 3/hour.

resend_claim_link input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_funding_wallet_agents
Advertised by the server during the last successful anonymous check.

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).

list_funding_wallet_agents input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_cosigner_memberships
Advertised by the server during the last successful anonymous check.

Active co-signers on this account.

list_cosigner_memberships input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
get_cosigner_rules
Advertised by the server during the last successful anonymous check.

Amount-banded cosigner quorum rules for sends and swaps. Below-band amounts auto-execute; matching bands require N cosigner votes.

get_cosigner_rules input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
update_cosigner_rules
Advertised by the server during the last successful anonymous check.

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).

update_cosigner_rules input schema
{
  "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
}
list_pending_cosigner_approvals
Advertised by the server during the last successful anonymous check.

Pending actions that require this account's co-signer approval. Use when this agent is a co-signer on another account.

list_pending_cosigner_approvals input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "number",
      "description": "Max entries (default 10)"
    }
  },
  "additionalProperties": false
}
add_recipient
Advertised by the server during the last successful anonymous check.

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.

add_recipient input schema
{
  "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
}
remove_recipient
Advertised by the server during the last successful anonymous check.

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.

remove_recipient input schema
{
  "type": "object",
  "required": [
    "recipientId"
  ],
  "properties": {
    "recipientId": {
      "type": "string",
      "description": "Recipient id from list_recipients"
    }
  },
  "additionalProperties": false
}
approve_recipient
Advertised by the server during the last successful anonymous check.

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).

approve_recipient input schema
{
  "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
}
validate_recipient_manifest
Advertised by the server during the last successful anonymous check.

Preview a batch recipient import (max 50 rows). Each row: { address, chainId, nickname? }. Returns ready_new, already_exists, or invalid per line. Read-only.

validate_recipient_manifest input schema
{
  "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
}
propose_recipient_manifest
Advertised by the server during the last successful anonymous check.

Apply a validated recipient manifest (human/developer key). Adds new allowlist rows with normal 24h cooldown. Agent keys: use add_recipient per row (GOVERN).

propose_recipient_manifest input schema
{
  "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
}
validate_payout_manifest
Advertised by the server during the last successful anonymous check.

Preview batch payroll/payout (max 50 lines). Each line: { recipientId, amountUsdc, memo? }. All recipients must be allowlisted, same chain as fromWalletId, and past cooldown.

validate_payout_manifest input schema
{
  "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
}
propose_payout_manifest
Advertised by the server during the last successful anonymous check.

Execute a validated payout manifest sequentially (one ActionIntent per line). Requires Delegated Access or agent wallet. Set dryRun:true to validate only.

propose_payout_manifest input schema
{
  "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
}
propose_transfer
Advertised by the server during the last successful anonymous check.

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).

propose_transfer input schema
{
  "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
}
invite_agent_cosigner
Advertised by the server during the last successful anonymous check.

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).

invite_agent_cosigner input schema
{
  "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
}
invite_cosigner
Advertised by the server during the last successful anonymous check.

Alias of invite_agent_cosigner. Humans: email → Security UI. Agents: cosignerUserId.

invite_cosigner input schema
{
  "type": "object",
  "properties": {
    "email": {
      "type": "string"
    },
    "nickname": {
      "type": "string"
    },
    "challengeId": {
      "type": "string"
    },
    "cosignerUserId": {
      "type": "string"
    },
    "walletSignature": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
approve_cosigner_action
Advertised by the server during the last successful anonymous check.

Approve a pending action as co-signer. Use with list_pending_cosigner_approvals.

approve_cosigner_action input schema
{
  "type": "object",
  "required": [
    "pendingApprovalId"
  ],
  "properties": {
    "pendingApprovalId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
reject_cosigner_action
Advertised by the server during the last successful anonymous check.

Reject a pending action as co-signer.

reject_cosigner_action input schema
{
  "type": "object",
  "required": [
    "pendingApprovalId"
  ],
  "properties": {
    "reason": {
      "type": "string",
      "description": "Optional rejection reason"
    },
    "pendingApprovalId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_portfolio
Advertised by the server during the last successful anonymous check.

Full portfolio summary across all wallets: token balances with USD values, 24h change, and total net worth.

get_portfolio input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
get_account_holdings
Advertised by the server during the last successful anonymous check.

Token holdings for a specific wallet, with USD values and 24h change.

get_account_holdings input schema
{
  "type": "object",
  "required": [
    "walletId"
  ],
  "properties": {
    "walletId": {
      "type": "string",
      "description": "Wallet id from list_wallets"
    }
  },
  "additionalProperties": false
}
review_portfolio
Advertised by the server during the last successful anonymous check.

Read-only treasury review: allocation buckets (cash, yield, tokens), top holdings, and optional drift vs target weights. Safe for cron — no proposals created.

review_portfolio input schema
{
  "type": "object",
  "properties": {
    "targets": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "label",
          "weightPercent",
          "kind"
        ],
        "properties": {
          "kind": {
            "enum": [
              "cash",
              "yield",
              "token",
              "symbol"
            ],
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "symbol": {
            "type": "string",
            "description": "Required when kind=symbol (e.g. UNI)"
          },
          "weightPercent": {
            "type": "number"
          }
        }
      },
      "description": "Optional target allocation. Each row: { label, weightPercent, kind: cash|yield|token|symbol, symbol? }. Weights must sum to 100."
    },
    "minLegUsd": {
      "type": "number",
      "description": "Minimum USD for rebalance legs (default 1)"
    },
    "driftThresholdPercent": {
      "type": "number",
      "description": "Hysteresis band in percentage points (default 5)"
    }
  },
  "additionalProperties": false
}
plan_rebalance
Advertised by the server during the last successful anonymous check.

Read-only rebalance planner toward target weights. Returns suggested legs (swap, yield_deposit, yield_withdraw) without executing. Use propose_* + confirm_proposal to act.

plan_rebalance input schema
{
  "type": "object",
  "required": [
    "targets"
  ],
  "properties": {
    "targets": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "label",
          "weightPercent",
          "kind"
        ],
        "properties": {
          "kind": {
            "enum": [
              "cash",
              "yield",
              "token",
              "symbol"
            ],
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          },
          "weightPercent": {
            "type": "number"
          }
        }
      },
      "description": "Target allocation. Each row: { label, weightPercent, kind: cash|yield|token|symbol, symbol? }. Example: 40% cash, 10% yield, 30% UNI, 20% other tokens."
    },
    "minLegUsd": {
      "type": "number",
      "description": "Minimum leg size in USD (default 1)"
    },
    "driftThresholdPercent": {
      "type": "number",
      "description": "Ignore drift below this % (default 5)"
    }
  },
  "additionalProperties": false
}
discover_tokens
Advertised by the server during the last successful anonymous check.

Market-wide token discovery on a FortFi chain (USD). Use for trending/gainers/losers/volume/mcap — NOT the browser Explore REST route. Sorts: gainers_1d, gainers_30d, gainers_90d, gainers_365d, losers_1d, losers_30d, losers_90d, losers_365d, market_cap, volume_1d. No 7d or 30d-volume sort exists upstream — closest available gainers granularity to '1 week' is gainers_1d or gainers_30d; say so explicitly rather than silently picking one. Returns contract addresses for propose_swap / propose_bridge.

discover_tokens input schema
{
  "type": "object",
  "required": [
    "chainId"
  ],
  "properties": {
    "sort": {
      "type": "string",
      "description": "gainers_1d, gainers_30d, gainers_90d, gainers_365d, losers_1d, losers_30d, losers_90d, losers_365d, market_cap, volume_1d (default market_cap)"
    },
    "limit": {
      "type": "number",
      "description": "Max results (default 10, max 25)"
    },
    "query": {
      "type": "string",
      "description": "Optional name/symbol filter, e.g. 'USDC' or 'wrapped'"
    },
    "chainId": {
      "type": "string",
      "description": "FortFi chain id, e.g. base-mainnet, ethereum-mainnet"
    },
    "verifiedOnly": {
      "type": "boolean",
      "description": "Only verified tokens"
    }
  },
  "additionalProperties": false
}
get_token_chart
Advertised by the server during the last successful anonymous check.

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.

get_token_chart input schema
{
  "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
}
screen_tokens
Advertised by the server during the last successful anonymous check.

Batch cheap-screen tokens across requested chains. Defaults to verified assets, $5M market cap, $50K daily volume, top 30-day performers plus volume leaders, stablecoin removal, and cross-chain deduplication. Returns no proposal.

screen_tokens input schema
{
  "type": "object",
  "required": [
    "chains"
  ],
  "properties": {
    "mode": {
      "enum": [
        "quick",
        "standard",
        "deep"
      ],
      "type": "string"
    },
    "sorts": {
      "type": "array",
      "items": {
        "enum": [
          "gainers_1d",
          "gainers_30d",
          "gainers_90d",
          "gainers_365d",
          "volume_1d",
          "market_cap"
        ],
        "type": "string"
      },
      "description": "Defaults to gainers_30d + volume_1d. Add gainers_1d, gainers_90d, gainers_365d, or market_cap when requested."
    },
    "chains": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "deepOptIn": {
      "type": "boolean",
      "description": "Required when mode=deep"
    },
    "verifiedOnly": {
      "type": "boolean",
      "description": "Default true"
    },
    "candidateLimit": {
      "type": "number",
      "description": "Override merged candidate cap, max 100"
    },
    "minVolume1dUsd": {
      "type": "number",
      "description": "Default 50000"
    },
    "minMarketCapUsd": {
      "type": "number",
      "description": "Default 5000000"
    },
    "includeUnverified": {
      "type": "boolean",
      "description": "Default false; unverified results are labeled and need execution opt-in"
    }
  },
  "additionalProperties": false
}
rank_tokens
Advertised by the server during the last successful anonymous check.

Two-stage token ranking: run the cheap screen, then concurrently fetch deterministic chart evidence only for the strongest candidates. Quick charts 5 candidates over month+3months; standard charts 10 over day+month+3months+year; deep charts 20 and requires explicit opt-in. Returns evidence for user review and never creates a proposal.

rank_tokens input schema
{
  "type": "object",
  "required": [
    "chains"
  ],
  "properties": {
    "mode": {
      "enum": [
        "quick",
        "standard",
        "deep"
      ],
      "type": "string"
    },
    "sorts": {
      "type": "array",
      "items": {
        "enum": [
          "gainers_1d",
          "gainers_30d",
          "gainers_90d",
          "gainers_365d",
          "volume_1d",
          "market_cap"
        ],
        "type": "string"
      },
      "description": "Defaults to gainers_30d + volume_1d. Optional supplements: gainers_1d, gainers_90d, gainers_365d, market_cap."
    },
    "chains": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "periods": {
      "type": "array",
      "items": {
        "enum": [
          "hour",
          "day",
          "week",
          "month",
          "3months",
          "6months",
          "year",
          "5years",
          "max"
        ],
        "type": "string"
      }
    },
    "deepOptIn": {
      "type": "boolean",
      "description": "Required when mode=deep"
    },
    "verifiedOnly": {
      "type": "boolean",
      "description": "Default true"
    },
    "candidateLimit": {
      "type": "number",
      "description": "Override merged candidate cap, max 100"
    },
    "minVolume1dUsd": {
      "type": "number",
      "description": "Default 50000"
    },
    "minMarketCapUsd": {
      "type": "number",
      "description": "Default 5000000"
    },
    "includeUnverified": {
      "type": "boolean",
      "description": "Default false"
    },
    "chartCandidateLimit": {
      "type": "number",
      "description": "Override chart cap, max 20"
    }
  },
  "additionalProperties": false
}
get_swap_routing_guide
Advertised by the server during the last successful anonymous check.

Returns which swap/bridge tool to use for a given from→to chain pair, with notes on protocols supported.

get_swap_routing_guide input schema
{
  "type": "object",
  "required": [
    "fromChainId",
    "toChainId"
  ],
  "properties": {
    "toChainId": {
      "type": "string",
      "description": "Destination chain id"
    },
    "fromChainId": {
      "type": "string",
      "description": "Source chain id"
    }
  },
  "additionalProperties": false
}
list_token_spender_grants
Advertised by the server during the last successful anonymous check.

List active ERC-20 token approvals (spender grants) on this account. Useful before proposing a swap to confirm the CoW vault is approved.

list_token_spender_grants input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_incoming_cosigner_invites
Advertised by the server during the last successful anonymous check.

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.

list_incoming_cosigner_invites input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
accept_cosigner_invite
Advertised by the server during the last successful anonymous check.

Accept a pending co-signer invite. After accepting, you will be able to approve/reject pending actions for that account.

accept_cosigner_invite input schema
{
  "type": "object",
  "required": [
    "inviteId"
  ],
  "properties": {
    "inviteId": {
      "type": "string",
      "description": "Invite id from list_incoming_cosigner_invites"
    }
  },
  "additionalProperties": false
}
remove_cosigner
Advertised by the server during the last successful anonymous check.

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.

remove_cosigner input schema
{
  "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
}
register_backup_governance_wallet
Advertised by the server during the last successful anonymous check.

Register (or replace) a single backup governance wallet — the agentic equivalent of a backup passkey. Either the funding wallet or this backup can authorize future governance. GOVERN action: sign the challenge with your CURRENT funding wallet (challengeId + walletSignature); applies immediately once signed. Max one backup.

register_backup_governance_wallet input schema
{
  "type": "object",
  "required": [
    "walletAddress"
  ],
  "properties": {
    "challengeId": {
      "type": "string",
      "description": "Governance challengeId from the first call"
    },
    "walletAddress": {
      "type": "string",
      "description": "The backup wallet address (0x…) to register"
    },
    "walletSignature": {
      "type": "string",
      "description": "CURRENT funding-wallet signature over the challenge message"
    }
  },
  "additionalProperties": false
}
remove_backup_governance_wallet
Advertised by the server during the last successful anonymous check.

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.

remove_backup_governance_wallet input schema
{
  "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
}
list_governance_requests
Advertised by the server during the last successful anonymous check.

List open governance requests on this account: pending (awaiting signature) and legacy scheduled rows. Use to monitor for unexpected loosening attempts.

list_governance_requests input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
cancel_governance_change
Advertised by the server during the last successful anonymous check.

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.

cancel_governance_change input schema
{
  "type": "object",
  "required": [
    "challengeId"
  ],
  "properties": {
    "challengeId": {
      "type": "string",
      "description": "The governance request id from list_governance_requests"
    }
  },
  "additionalProperties": false
}
revoke_cosigner_invite
Advertised by the server during the last successful anonymous check.

Revoke a pending outbound co-signer invite before it is accepted.

revoke_cosigner_invite input schema
{
  "type": "object",
  "required": [
    "inviteId"
  ],
  "properties": {
    "inviteId": {
      "type": "string",
      "description": "Invite id from the invite you sent"
    }
  },
  "additionalProperties": false
}
cancel_pending_action
Advertised by the server during the last successful anonymous check.

Cancel a pending approval that you (the account owner) initiated.

cancel_pending_action input schema
{
  "type": "object",
  "required": [
    "pendingApprovalId"
  ],
  "properties": {
    "pendingApprovalId": {
      "type": "string",
      "description": "Pending approval id from list_pending_cosigner_approvals or list_audit_log"
    }
  },
  "additionalProperties": false
}
propose_rename_account
Advertised by the server during the last successful anonymous check.

Rename a wallet (account nickname), then call confirm_proposal with the returned proposalId.

propose_rename_account input schema
{
  "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
}
propose_create_account
Advertised by the server during the last successful anonymous check.

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.

propose_create_account input schema
{
  "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
}
confirm_proposal
Advertised by the server during the last successful anonymous check.

Confirm a pending proposal returned by a propose_* tool. Reuses the same policy, risk, allowlist, vault-grant, delegated-authority, and cosign checks as POST /api/mcp/confirm. Returns executed, pending-approval, or passkey-required status.

confirm_proposal input schema
{
  "type": "object",
  "required": [
    "proposalId"
  ],
  "properties": {
    "proposalId": {
      "type": "string",
      "description": "Proposal UUID returned by a propose_* tool"
    },
    "confirmToken": {
      "type": "string",
      "description": "Optional proposal-bound confirmation token when one was returned"
    }
  },
  "additionalProperties": false
}
update_wallet_metadata
Advertised by the server during the last successful anonymous check.

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.

update_wallet_metadata input schema
{
  "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
}
preview_swap_quote
Advertised by the server during the last successful anonymous check.

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.

preview_swap_quote input schema
{
  "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
}
preview_bridge_quote
Advertised by the server during the last successful anonymous check.

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.

preview_bridge_quote input schema
{
  "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
}
check_trade_allowance
Advertised by the server during the last successful anonymous check.

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.

check_trade_allowance input schema
{
  "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
}
propose_token_approve
Advertised by the server during the last successful anonymous check.

Propose max ERC-20 approval for CoW or Fusion spenders. Returns proposalId: call confirm_proposal before swap/bridge. API keys on a passkey account cannot approve the Fusion (bridge) spender: fusion_bridge returns OWNER_PASSKEY_REQUIRED.

propose_token_approve input schema
{
  "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
}
propose_swap
Advertised by the server during the last successful anonymous check.

Propose an EVM CoW swap. Autonomous agents: fetches and binds a quote inline (default), or pass previewQuoteId from preview_swap_quote for a two-step review. confirm always signs the bound quote — same principle as FortFi Assist. Human session MCP: confirm requires passkey in the app.

propose_swap input schema
{
  "type": "object",
  "required": [
    "fromWalletId",
    "sellTokenAddress",
    "buyTokenAddress",
    "sellSymbol",
    "buySymbol",
    "amountUsd"
  ],
  "properties": {
    "amountUsd": {
      "type": "string",
      "description": "Sell amount in USD"
    },
    "buySymbol": {
      "type": "string",
      "description": "Human-readable symbol of buy token, e.g. ETH"
    },
    "sellSymbol": {
      "type": "string",
      "description": "Human-readable symbol of sell token, e.g. USDC"
    },
    "fromWalletId": {
      "type": "string",
      "description": "Source wallet id (must be EVM, CoW-supported chain)"
    },
    "previewQuoteId": {
      "type": "string",
      "description": "Optional — from preview_swap_quote for explicit quote review before propose"
    },
    "buyTokenAddress": {
      "type": "string",
      "description": "Token contract address to buy (0x…)"
    },
    "slippagePercent": {
      "type": "number",
      "description": "Optional slippage tolerance 0–50 (default 0.5)"
    },
    "sellTokenAddress": {
      "type": "string",
      "description": "Token contract address to sell (0x…)"
    }
  },
  "additionalProperties": false
}
propose_solana_swap
Advertised by the server during the last successful anonymous check.

Propose a Solana Jupiter swap. Autonomous agents: inline quote by default, or previewQuoteId for two-step review. confirm signs the bound quote.

propose_solana_swap input schema
{
  "type": "object",
  "required": [
    "fromWalletId",
    "toWalletId",
    "sellMint",
    "buyMint",
    "sellSymbol",
    "buySymbol",
    "amountUsd"
  ],
  "properties": {
    "buyMint": {
      "type": "string",
      "description": "Mint address of token to buy"
    },
    "sellMint": {
      "type": "string",
      "description": "Mint address of token to sell"
    },
    "amountUsd": {
      "type": "string",
      "description": "Sell amount in USD"
    },
    "buySymbol": {
      "type": "string",
      "description": "Human-readable buy symbol"
    },
    "sellSymbol": {
      "type": "string",
      "description": "Human-readable sell symbol"
    },
    "toWalletId": {
      "type": "string",
      "description": "Solana wallet id to receive (can be same as fromWalletId)"
    },
    "fromWalletId": {
      "type": "string",
      "description": "Solana wallet id to sell from"
    },
    "previewQuoteId": {
      "type": "string",
      "description": "Optional — from preview_swap_quote for explicit quote review before propose"
    },
    "slippagePercent": {
      "type": "number",
      "description": "Optional slippage tolerance 0–50 (default 0.5)"
    }
  },
  "additionalProperties": false
}
propose_bridge
Advertised by the server during the last successful anonymous check.

Propose a Fusion+ or deBridge cross-chain swap. FortFi resolves chain-specific verified token contracts from sellSymbol/buySymbol; optional token addresses are mismatch assertions, never routing overrides. Inline quote by default, or use previewQuoteId for two-step review. Agent wallets execute on confirm_proposal. API keys on a passkey account cannot bridge: this returns OWNER_PASSKEY_REQUIRED, and the owner bridges in the FortFi app with their passkey (preview_bridge_quote still works).

propose_bridge input schema
{
  "type": "object",
  "required": [
    "fromWalletId",
    "toWalletId",
    "sellSymbol",
    "buySymbol",
    "amountUsd"
  ],
  "properties": {
    "amountUsd": {
      "type": "string",
      "description": "Bridge amount in USD"
    },
    "buySymbol": {
      "type": "string",
      "description": "Buy token symbol"
    },
    "sellSymbol": {
      "type": "string",
      "description": "Sell token symbol"
    },
    "toWalletId": {
      "type": "string",
      "description": "Destination wallet id (different chain)"
    },
    "fromWalletId": {
      "type": "string",
      "description": "Source wallet id"
    },
    "previewQuoteId": {
      "type": "string",
      "description": "Optional — from preview_bridge_quote for explicit quote review before propose"
    },
    "buyTokenAddress": {
      "type": "string",
      "description": "Optional expected destination token contract; proposal fails if it differs from FortFi's verified chain resolution"
    },
    "sellTokenAddress": {
      "type": "string",
      "description": "Optional expected source token contract; proposal fails if it differs from FortFi's verified chain resolution"
    }
  },
  "additionalProperties": false
}
list_yield_markets
Advertised by the server during the last successful anonymous check.

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.

list_yield_markets input schema
{
  "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
}
list_yield_positions
Advertised by the server during the last successful anonymous check.

Active Morpho yield positions with per-vault valueUsd, earnedUsd (Morpho pnlUsd), netApy, and a summary block. summary.cumulativeEarnedUsd matches Morpho pnl on the open vaults when the ledger cannot explain the balance. A deposit missing from the ledger is principal, not earnings. Use at the start of every yield desk run to report standing P&L.

list_yield_positions input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
get_yield_market_detail
Advertised by the server during the last successful anonymous check.

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 unborrowed supply can be withdrawn on demand. Use before recommending or proposing a deposit.

get_yield_market_detail input schema
{
  "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
}
rank_yield_markets
Advertised by the server during the last successful anonymous check.

Batch-rank Morpho markets using current net APY, APY median/average/range/volatility, TVL trend/drawdown, vault age, curation, instant-withdrawal liquidity, warnings, and current-user execution eligibility. Results are ordered by current net APY, which is a spot rate that spikes: re-rank on evidence.apy.medianPercent before acting, since a vault printing 12% today commonly pays under 5% tomorrow. Runs evidence requests concurrently and never creates a proposal.

rank_yield_markets input schema
{
  "type": "object",
  "properties": {
    "asset": {
      "type": "string",
      "description": "Asset symbol, default USDC"
    },
    "limit": {
      "type": "number",
      "description": "Default 10, max 25"
    },
    "apyDays": {
      "type": "number",
      "description": "Default 30"
    },
    "chainId": {
      "type": "string",
      "description": "FortFi chain id or all"
    },
    "tvlDays": {
      "type": "number",
      "description": "Default 90"
    },
    "minTvlUsd": {
      "type": "number",
      "description": "Default 500000"
    }
  },
  "additionalProperties": false
}
propose_yield_deposit
Advertised by the server during the last successful anonymous check.

Propose Morpho vault deposit, then call confirm_proposal. With Delegated Access / agent key this executes server-side when policy permits. Use list_yield_markets for vaultAddress.

propose_yield_deposit input schema
{
  "type": "object",
  "required": [
    "vaultAddress",
    "amountUsd"
  ],
  "properties": {
    "amountUsd": {
      "type": "string",
      "description": "USDC amount e.g. 100.00"
    },
    "assetSymbol": {
      "enum": [
        "USDC",
        "USDT"
      ],
      "type": "string"
    },
    "fromWalletId": {
      "type": "string",
      "description": "FortFi wallet id"
    },
    "vaultAddress": {
      "type": "string",
      "description": "Morpho vault contract (0x…)"
    },
    "fromAccountQuery": {
      "type": "string",
      "description": "Wallet nickname (alternative to fromWalletId)"
    }
  },
  "additionalProperties": false
}
propose_yield_withdraw
Advertised by the server during the last successful anonymous check.

Propose Morpho vault withdraw, then call confirm_proposal. With Delegated Access this executes server-side when policy permits. Use list_yield_positions for vaultAddress.

propose_yield_withdraw input schema
{
  "type": "object",
  "required": [
    "vaultAddress",
    "amountDisplay"
  ],
  "properties": {
    "vaultName": {
      "type": "string"
    },
    "assetSymbol": {
      "enum": [
        "USDC",
        "USDT"
      ],
      "type": "string"
    },
    "fromWalletId": {
      "type": "string"
    },
    "vaultAddress": {
      "type": "string"
    },
    "amountDisplay": {
      "type": "string"
    },
    "fromAccountQuery": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
list_polymarket_markets
Advertised by the server during the last successful anonymous check.

List active Polymarket prediction markets on Polygon with volume, liquidity, and outcome prices.

list_polymarket_markets input schema
{
  "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
}
search_polymarket_markets
Advertised by the server during the last successful anonymous check.

Search Polymarket markets by question text.

search_polymarket_markets input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "number"
    },
    "query": {
      "type": "string",
      "description": "Search text"
    }
  },
  "additionalProperties": false
}
rank_polymarket_markets
Advertised by the server during the last successful anonymous check.

Rank Polymarket markets by volume, liquidity, or 24h volume.

rank_polymarket_markets input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "number"
    },
    "sortBy": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_polymarket_market
Advertised by the server during the last successful anonymous check.

Get a Polymarket market by conditionId with optional outcome price history from the public CLOB API.

get_polymarket_market input schema
{
  "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
}
list_polymarket_positions
Advertised by the server during the last successful anonymous check.

List Polymarket outcome token positions for a Polygon wallet. walletId is required.

list_polymarket_positions input schema
{
  "type": "object",
  "required": [
    "walletId"
  ],
  "properties": {
    "walletId": {
      "type": "string",
      "description": "FortFi Polygon wallet id"
    }
  },
  "additionalProperties": false
}
propose_polymarket_buy
Advertised by the server during the last successful anonymous check.

Propose buying Polymarket outcome shares, then call confirm_proposal. Requires Polygon wallet.

propose_polymarket_buy input schema
{
  "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
}
propose_polymarket_sell
Advertised by the server during the last successful anonymous check.

Propose selling Polymarket outcome shares (redeem collateral), then call confirm_proposal.

propose_polymarket_sell input schema
{
  "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
}
propose_polymarket_redeem
Advertised by the server during the last successful anonymous check.

Propose redeeming winning shares from a resolved Polymarket market (CTF on Polygon), then call confirm_proposal.

propose_polymarket_redeem input schema
{
  "type": "object",
  "required": [
    "conditionId"
  ],
  "properties": {
    "conditionId": {
      "type": "string"
    },
    "fromWalletId": {
      "type": "string"
    },
    "outcomeIndex": {
      "type": "number"
    },
    "fromAccountQuery": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
list_hyperliquid_markets
Advertised by the server during the last successful anonymous check.

List Hyperliquid perpetual markets with live mark/mid/oracle prices, funding, open interest, and 24h volume. Public data; no proposal.

list_hyperliquid_markets input schema
{
  "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
}
get_hyperliquid_market
Advertised by the server during the last successful anonymous check.

Get a Hyperliquid perp market by symbol with mark/funding context and optional candle history.

get_hyperliquid_market input schema
{
  "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
}
get_hyperliquid_order_book
Advertised by the server during the last successful anonymous check.

Live order book for one Hyperliquid perp (core or HIP-3, e.g. BTC or xyz:NVDA) or, with market=spot, one spot pair: up to 20 levels a side, mid, spread, and USD resting within 0.5%, 1% and 2% of mid. Pass sizeUsd to see the average fill and price impact of a market buy and sell of that size. Use it before sizing an order or to compare liquidity across coins.

get_hyperliquid_order_book input schema
{
  "type": "object",
  "required": [
    "symbol"
  ],
  "properties": {
    "market": {
      "enum": [
        "perp",
        "spot"
      ],
      "type": "string",
      "description": "Default perp. spot reads the spot pair's book"
    },
    "symbol": {
      "type": "string",
      "description": "Coin symbol, e.g. BTC or xyz:NVDA. With market=spot: HYPE, HYPE/USDC or @107"
    },
    "sizeUsd": {
      "type": "number",
      "description": "Optional order size in USD for the price impact estimate"
    },
    "nSigFigs": {
      "enum": [
        2,
        3,
        4,
        5
      ],
      "type": "number",
      "description": "Group prices to this many significant figures to see deeper into the book (default: full precision)"
    }
  },
  "additionalProperties": false
}
get_hyperliquid_predicted_funding
Advertised by the server during the last successful anonymous check.

Next funding rate per Hyperliquid perp, per hour and annualized, with Binance and Bybit for the same coin and the gap between them. Positive means longs pay shorts. Without symbols: core coins sorted by the size of the Hyperliquid rate. HIP-3 coins (xyz:, …) need symbols and return the current hourly rate. For past funding use get_hyperliquid_history with includeFunding=true.

get_hyperliquid_predicted_funding input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "number",
      "description": "Rows to return, 1-300 (default 50)"
    },
    "symbols": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ],
      "description": "Coins to return. Comma-separated string or array, up to 100."
    }
  },
  "additionalProperties": false
}
get_hyperliquid_open_interest_history
Advertised by the server during the last successful anonymous check.

Hourly open interest for one Hyperliquid perp (core or HIP-3), in coins and dollars, with price and funding at each hour, plus the change over 1 hour, 24 hours and 7 days. Hyperliquid keeps no open interest history; FortFi records it every hour from 2026-11-05.

get_hyperliquid_open_interest_history input schema
{
  "type": "object",
  "required": [
    "symbol"
  ],
  "properties": {
    "hours": {
      "type": "number",
      "description": "Hours of history, 1-2160 (default 168)"
    },
    "symbol": {
      "type": "string",
      "description": "Coin symbol, e.g. BTC or xyz:CL"
    }
  },
  "additionalProperties": false
}
list_hyperliquid_symbol_master
Advertised by the server during the last successful anonymous check.

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.

list_hyperliquid_symbol_master input schema
{
  "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
}
rank_hyperliquid_markets
Advertised by the server during the last successful anonymous check.

Rank Hyperliquid perp markets by 24h volume, pctChange, or funding. Returns dex + assetClass tags. Default scope=core; pass scope=all for HIP-3. Cheap filter only — use screen_hyperliquid_markets for breakout TA.

rank_hyperliquid_markets input schema
{
  "type": "object",
  "properties": {
    "dex": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ],
      "description": "Filter dex ids. Comma-separated string or array."
    },
    "sort": {
      "enum": [
        "volume",
        "pctChange",
        "funding",
        "openInterest"
      ],
      "type": "string",
      "description": "Default volume"
    },
    "limit": {
      "type": "number",
      "description": "Default 20"
    },
    "scope": {
      "enum": [
        "core",
        "all"
      ],
      "type": "string",
      "description": "Default core"
    },
    "direction": {
      "enum": [
        "asc",
        "desc"
      ],
      "type": "string",
      "description": "Default desc"
    },
    "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
}
screen_hyperliquid_markets
Advertised by the server during the last successful anonymous check.

Breakout screener for Hyperliquid perps: min volume filter, rank, HL candle TA (RSI, MACD, Bollinger). Returns dex + assetClass tags and long/short/neutral bias. Default scope=core; scope=all for HIP-3. Never creates proposals.

screen_hyperliquid_markets input schema
{
  "type": "object",
  "properties": {
    "dex": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ],
      "description": "Filter dex ids. Comma-separated string or array."
    },
    "sort": {
      "enum": [
        "volume",
        "pctChange",
        "funding",
        "openInterest"
      ],
      "type": "string",
      "description": "Default pctChange"
    },
    "limit": {
      "type": "number",
      "description": "Default 40"
    },
    "scope": {
      "enum": [
        "core",
        "all"
      ],
      "type": "string",
      "description": "Default core"
    },
    "interval": {
      "enum": [
        "1m",
        "5m",
        "15m",
        "1h",
        "4h",
        "1d"
      ],
      "type": "string",
      "description": "Default 1h"
    },
    "sideBias": {
      "enum": [
        "long",
        "short",
        "both"
      ],
      "type": "string"
    },
    "direction": {
      "enum": [
        "asc",
        "desc"
      ],
      "type": "string",
      "description": "desc=gainers, asc=losers/short ideas"
    },
    "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."
    },
    "chartLimit": {
      "type": "number",
      "description": "TA depth, default 10"
    },
    "indicators": {
      "type": "array",
      "items": {
        "enum": [
          "return",
          "drawdown",
          "ema",
          "rsi",
          "macd",
          "bollinger"
        ],
        "type": "string"
      }
    },
    "includeCharts": {
      "type": "boolean"
    },
    "includeAllDesks": {
      "type": "boolean",
      "description": "When true, same as scope=all"
    },
    "minDayVolumeUsd": {
      "type": "number",
      "description": "Default 1000000"
    }
  },
  "additionalProperties": false
}
get_hyperliquid_cross_section
Advertised by the server during the last successful anonymous check.

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.

get_hyperliquid_cross_section input schema
{
  "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
}
run_hyperliquid_research_backtest
Advertised by the server during the last successful anonymous check.

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).

run_hyperliquid_research_backtest input schema
{
  "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
}
run_hyperliquid_research_backtest_spec
Advertised by the server during the last successful anonymous check.

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 recompute it live.

run_hyperliquid_research_backtest_spec input schema
{
  "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
}
get_hyperliquid_history
Advertised by the server during the last successful anonymous check.

Long price history for one Hyperliquid perp, with no gap up to now: FortFi's stored candles (years for most markets, synced daily) plus live candles since the last sync. Returns the latest `limit` candles in the window, oldest first, as {t,o,h,l,c,v}. When older candles exist, olderEndTime is set: pass it as endTime to page back. includeFunding adds hourly funding rates for the same window. Use get_hyperliquid_market for a quick recent look, this for research.

get_hyperliquid_history input schema
{
  "type": "object",
  "required": [
    "symbol"
  ],
  "properties": {
    "limit": {
      "type": "number",
      "description": "Max candles returned (default 500, max 5000)"
    },
    "symbol": {
      "type": "string",
      "description": "Market symbol, e.g. BTC, kPEPE, xyz:NVDA"
    },
    "endTime": {
      "oneOf": [
        {
          "type": "number"
        },
        {
          "type": "string"
        }
      ],
      "description": "Window end, epoch ms or ISO date. Default: now."
    },
    "interval": {
      "enum": [
        "1m",
        "5m",
        "15m",
        "1h",
        "4h",
        "1d"
      ],
      "type": "string",
      "description": "Candle interval (default 1h)"
    },
    "startTime": {
      "oneOf": [
        {
          "type": "number"
        },
        {
          "type": "string"
        }
      ],
      "description": "Window start, epoch ms or ISO date. Default: limit candles before endTime."
    },
    "includeFunding": {
      "type": "boolean",
      "description": "Add hourly funding rates for the window"
    }
  },
  "additionalProperties": false
}
get_wallet_loss_cap
Advertised by the server during the last successful anonymous check.

Read the loss cap on a Hyperliquid wallet: the max loss in percent, whether it is armed or tripped, the balance it was set at, and (live) how much the wallet has lost or made since. Deposits and withdrawals do not count as gains or losses. Returns lossCap null when none is set.

get_wallet_loss_cap input schema
{
  "type": "object",
  "required": [
    "walletId"
  ],
  "properties": {
    "walletId": {
      "type": "string",
      "description": "hyperliquid-mainnet wallet id"
    }
  },
  "additionalProperties": false
}
set_wallet_loss_cap
Advertised by the server during the last successful anonymous check.

Add a loss cap to a Hyperliquid wallet, or lower the one it has. If the wallet loses maxLossPct from the balance at the moment the cap is set, FortFi cancels its open orders, closes its positions and blocks new trades on it until the owner resets the cap in the app. An API key can only add or tighten a cap: raising, removing or resetting it needs the owner's passkey in the app. The cap is also measured from when it is set, so set it before trading.

set_wallet_loss_cap input schema
{
  "type": "object",
  "required": [
    "walletId",
    "maxLossPct"
  ],
  "properties": {
    "walletId": {
      "type": "string",
      "description": "hyperliquid-mainnet wallet id"
    },
    "maxLossPct": {
      "type": "number",
      "description": "Max loss in percent of the balance when set, 1 to 90 (whole numbers)"
    }
  },
  "additionalProperties": false
}
get_wallet_scoreboard
Advertised by the server during the last successful anonymous check.

Scoreboard for a Hyperliquid wallet from Hyperliquid's public data: balance, P&L in dollars and percent, win rate (closed trades that beat their fees), trades, fees, volume, worst drop, the loss cap, and BTC buy-and-hold over the same window (no leverage) as the bar to beat. Same numbers anyone can check on the Hyperliquid explorer (explorerUrl). Use it to review how your trading is going before changing anything.

get_wallet_scoreboard input schema
{
  "type": "object",
  "required": [
    "walletId"
  ],
  "properties": {
    "period": {
      "enum": [
        "day",
        "week",
        "month",
        "allTime"
      ],
      "type": "string",
      "description": "Window (default week)"
    },
    "walletId": {
      "type": "string",
      "description": "hyperliquid-mainnet wallet id"
    },
    "includeHistory": {
      "type": "boolean",
      "description": "Add balance and P&L-over-time points [timestampMs, usd]"
    }
  },
  "additionalProperties": false
}
get_hyperliquid_research_data_stats
Advertised by the server during the last successful anonymous check.

Row counts and last ingest time for hl_research_* tables (candles, funding, symbols). Use before backtests to confirm data freshness.

get_hyperliquid_research_data_stats input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_strategy_presets
Advertised by the server during the last successful anonymous check.

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.

list_strategy_presets input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_strategies
Advertised by the server during the last successful anonymous check.

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.

list_strategies input schema
{
  "type": "object",
  "properties": {
    "walletId": {
      "type": "string",
      "description": "Optional: only this hyperliquid-mainnet wallet"
    },
    "includeStopped": {
      "type": "boolean",
      "description": "Include stopped strategies"
    }
  },
  "additionalProperties": false
}
get_strategy
Advertised by the server during the last successful anonymous check.

Get one strategy with its last 20 runs (each run lists the orders it placed and their result).

get_strategy input schema
{
  "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
}
list_copy_trade_leaders
Advertised by the server during the last successful anonymous check.

Top Hyperliquid accounts to copy, from Hyperliquid's public leaderboard. Only accounts over $25k that traded this month and are profitable all-time. Each row has profit per window, turnoverPerDay (volume / account value per day, last 30 days) and a trackRecord (30- and 90-day return, worst drop, Calmar) once FortFi has computed it. Accounts trading over 20x their account a day (market makers, high-frequency bots) are hidden unless includeHighTurnover=true. Use get_copy_trade_wallet and backtest_copy_trade before copying one.

list_copy_trade_leaders input schema
{
  "type": "object",
  "properties": {
    "page": {
      "type": "number",
      "description": "0-based page, default 0"
    },
    "sort": {
      "enum": [
        "pnl",
        "return90d",
        "calmar90d",
        "worstDrop90d"
      ],
      "type": "string",
      "description": "pnl (default): profit over window. return90d: best 90-day return. calmar90d: 90-day return / worst drop. worstDrop90d: smallest worst drop among profitable leaders. Track-record sorts skip leaders not yet computed"
    },
    "query": {
      "type": "string",
      "description": "Address prefix (0x...) or display name fragment"
    },
    "window": {
      "enum": [
        "day",
        "week",
        "month",
        "allTime"
      ],
      "type": "string",
      "description": "Profit window that must be positive and ranks sort=pnl. Default month"
    },
    "pageSize": {
      "type": "number",
      "description": "1 to 50, default 20"
    },
    "maxTurnoverPerDay": {
      "type": "number",
      "description": "Hide accounts trading more than this multiple of their account a day (default 20)"
    },
    "maxWorstDrop90dPct": {
      "type": "number",
      "description": "Hide leaders whose 90-day worst drop is above this percent"
    },
    "includeHighTurnover": {
      "type": "boolean",
      "description": "Show every account regardless of turnover"
    }
  },
  "additionalProperties": false
}
backtest_copy_trade
Advertised by the server during the last successful anonymous check.

Copy past test for any Hyperliquid address: replays the leader's own profit history over 7, 30 or 90 days at your leverage cap and account size, minus trading costs on their turnover. Returns end value, return, worst drop, costs, the leader's own numbers and an equity curve. An estimate from sampled history; read the assumptions.

backtest_copy_trade input schema
{
  "type": "object",
  "required": [
    "address"
  ],
  "properties": {
    "days": {
      "enum": [
        7,
        30,
        90
      ],
      "type": "number",
      "description": "Default 30"
    },
    "address": {
      "type": "string",
      "description": "0x Hyperliquid address"
    },
    "costBps": {
      "type": "number",
      "description": "Fees plus price movement per traded dollar, basis points (default 10)"
    },
    "leverageCap": {
      "enum": [
        1,
        2,
        3,
        5,
        10,
        20
      ],
      "type": "number",
      "description": "Your copy leverage cap (default 2)"
    },
    "startEquityUsd": {
      "type": "number",
      "description": "Your starting account, USD (default 100)"
    }
  },
  "additionalProperties": false
}
list_copy_leader_fills
Advertised by the server during the last successful anonymous check.

What a Hyperliquid address traded recently: fills since N minutes ago, grouped per market (opens, closes, flips, dollars bought and sold, profit taken) plus the latest fills. Poll it to follow a leader between your runs.

list_copy_leader_fills input schema
{
  "type": "object",
  "required": [
    "address"
  ],
  "properties": {
    "limit": {
      "type": "number",
      "description": "Latest fills to list, 1-500 (default 100)"
    },
    "address": {
      "type": "string",
      "description": "0x Hyperliquid address"
    },
    "sinceMinutes": {
      "type": "number",
      "description": "Look back this many minutes, 1-10080 (default 60)"
    }
  },
  "additionalProperties": false
}
get_copy_trade_wallet
Advertised by the server during the last successful anonymous check.

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).

get_copy_trade_wallet input schema
{
  "type": "object",
  "required": [
    "address"
  ],
  "properties": {
    "address": {
      "type": "string",
      "description": "0x Hyperliquid address"
    }
  },
  "additionalProperties": false
}
start_strategy
Advertised by the server during the last successful anonymous check.

Start a house preset on a hyperliquid-mainnet wallet and place its first orders. Leverage must be one of the preset's testedLeverage or highRiskLeverage levels; high-risk levels need acceptHighRisk: true. 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.

start_strategy input schema
{
  "type": "object",
  "required": [
    "walletId",
    "presetId",
    "leverage"
  ],
  "properties": {
    "leverage": {
      "type": "number",
      "description": "One of the preset's testedLeverage or highRiskLeverage 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."
    },
    "acceptHighRisk": {
      "enum": [
        true
      ],
      "type": "boolean",
      "description": "Required for a highRiskLeverage level: you accept it can lose most of the money in this wallet."
    },
    "maxAllocationUsd": {
      "type": "string",
      "description": "Optional cap on equity the strategy sizes against, e.g. \"500\""
    }
  },
  "additionalProperties": false
}
start_copy_trade
Advertised by the server during the last successful anonymous check.

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. Leverage cap 1 or 2; 3 and 5 are high risk and need acceptHighRisk: true. Same rails, caps and key re-checks as start_strategy.

start_copy_trade input schema
{
  "type": "object",
  "required": [
    "walletId",
    "address",
    "leverage"
  ],
  "properties": {
    "address": {
      "type": "string",
      "description": "0x address to copy"
    },
    "leverage": {
      "type": "number",
      "description": "Leverage cap: 1, 2, 3 or 5 (3 and 5 need acceptHighRisk)"
    },
    "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."
    },
    "acceptHighRisk": {
      "enum": [
        true
      ],
      "type": "boolean",
      "description": "Required for a 3x or 5x cap: you accept it can lose most of the money in this wallet."
    },
    "maxAllocationUsd": {
      "type": "string",
      "description": "Optional cap on equity used, e.g. \"500\""
    }
  },
  "additionalProperties": false
}
update_strategy
Advertised by the server during the last successful anonymous check.

Resize a strategy or copy trade: raise or lower its leverage (offered levels only) or allocation cap. Moving into a high-risk level needs acceptHighRisk: true. The loss cap can be added or lowered, never raised or removed (OWNER_PASSKEY_REQUIRED).

update_strategy input schema
{
  "type": "object",
  "required": [
    "id",
    "walletId"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "leverage": {
      "type": "number",
      "description": "New leverage (higher or lower)"
    },
    "walletId": {
      "type": "string"
    },
    "autoStops": {
      "type": "boolean",
      "description": "Copy trades only: keep a full-size stop on every copied position (on by default). API keys may turn it on, never off."
    },
    "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."
    },
    "acceptHighRisk": {
      "enum": [
        true
      ],
      "type": "boolean",
      "description": "Required when the new leverage is a high-risk level you have not already accepted."
    },
    "maxAllocationUsd": {
      "type": "string",
      "description": "New allocation cap in USD (higher or lower), e.g. \"800\""
    }
  },
  "additionalProperties": false
}
pause_strategy
Advertised by the server during the last successful anonymous check.

Pause a strategy. Positions stay open; no more orders until resumed.

pause_strategy input schema
{
  "type": "object",
  "required": [
    "id",
    "walletId"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "walletId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
resume_strategy
Advertised by the server during the last successful anonymous check.

Resume a paused strategy. An API key can only resume a strategy it started; others need the owner in the app.

resume_strategy input schema
{
  "type": "object",
  "required": [
    "id",
    "walletId"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "walletId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
stop_strategy
Advertised by the server during the last successful anonymous check.

Stop a strategy and close every position it opened (cash out). Positions it did not open are left alone.

stop_strategy input schema
{
  "type": "object",
  "required": [
    "id",
    "walletId"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "walletId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
rebalance_strategy_now
Advertised by the server during the last successful anonymous check.

Run a strategy's rebalance now instead of waiting for its schedule. Returns the run outcome.

rebalance_strategy_now input schema
{
  "type": "object",
  "required": [
    "id",
    "walletId"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "walletId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
list_hyperliquid_positions
Advertised by the server during the last successful anonymous check.

List open Hyperliquid perp positions and margin summary for a hyperliquid-mainnet wallet (its address is used on the L1 order book).

list_hyperliquid_positions input schema
{
  "type": "object",
  "required": [
    "walletId"
  ],
  "properties": {
    "walletId": {
      "type": "string",
      "description": "FortFi wallet id on hyperliquid-mainnet"
    }
  },
  "additionalProperties": false
}
get_hyperliquid_balances
Advertised by the server during the last successful anonymous check.

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).

get_hyperliquid_balances input schema
{
  "type": "object",
  "required": [
    "walletId"
  ],
  "properties": {
    "walletId": {
      "type": "string",
      "description": "FortFi wallet id on hyperliquid-mainnet"
    }
  },
  "additionalProperties": false
}
get_hyperliquid_trading_desk
Advertised by the server during the last successful anonymous check.

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.

get_hyperliquid_trading_desk input schema
{
  "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
}
list_hyperliquid_open_orders
Advertised by the server during the last successful anonymous check.

List resting Hyperliquid orders including SL/TP triggers for a wallet.

list_hyperliquid_open_orders input schema
{
  "type": "object",
  "required": [
    "walletId"
  ],
  "properties": {
    "walletId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_hyperliquid_user_fills
Advertised by the server during the last successful anonymous check.

Recent Hyperliquid trade fills with closedPnl per fill. Use for P&L review and trade history (up to 2000 from HL).

get_hyperliquid_user_fills input schema
{
  "type": "object",
  "required": [
    "walletId"
  ],
  "properties": {
    "limit": {
      "type": "number",
      "description": "Max fills to return (default 200, max 2000)"
    },
    "walletId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
propose_hyperliquid_perp_open
Advertised by the server during the last successful anonymous check.

Propose opening a Hyperliquid perp position. Runs FortFi perp policy (max leverage, max notional) and rejects non-hyperliquid-mainnet wallets. Optional marginMode picks cross or isolated margin. Returns a proposalId for confirm_proposal.

propose_hyperliquid_perp_open input schema
{
  "type": "object",
  "required": [
    "walletId",
    "symbol",
    "side"
  ],
  "properties": {
    "side": {
      "enum": [
        "long",
        "short"
      ],
      "type": "string"
    },
    "size": {
      "type": "string",
      "description": "Coin-unit size (string). Use sizeUsd instead for USD notional."
    },
    "symbol": {
      "type": "string",
      "description": "e.g. BTC, ETH, xyz:TSLA, xyz:GOLD"
    },
    "sizeUsd": {
      "type": "string",
      "description": "USD notional target (min $10 on HL). Preferred for agents."
    },
    "leverage": {
      "type": "number"
    },
    "stopLoss": {
      "type": "string",
      "description": "Optional stop-loss trigger. With limitPrice it attaches to the order (normalTpsl) and arms once it fills, validated against the limit price."
    },
    "walletId": {
      "type": "string"
    },
    "limitPrice": {
      "type": "string",
      "description": "Optional resting limit price (GTC). Must be within 5% of mid when it crosses the book. Omit for a market order."
    },
    "marginMode": {
      "enum": [
        "cross",
        "isolated"
      ],
      "type": "string",
      "description": "Optional. cross shares the wallet's margin across positions; isolated caps the loss at the margin put into this position. Omit for cross (isolated on isolated-only markets). An already-open position keeps its mode, so a mismatch is rejected."
    },
    "takeProfit": {
      "type": "string",
      "description": "Optional take-profit trigger. With limitPrice it attaches to the order (normalTpsl) and arms once it fills, validated against the limit price."
    },
    "timeInForce": {
      "enum": [
        "Gtc",
        "Alo",
        "Ioc"
      ],
      "type": "string",
      "description": "Limit orders only. Gtc (default), Alo (post only, rejected if it would cross), Ioc."
    },
    "closeAfterHours": {
      "type": "number",
      "maximum": 2160,
      "minimum": 0.25,
      "description": "Optional time stop: FortFi closes the whole position this many hours from now (checked every 5 minutes). Refused on accounts a strategy runs."
    },
    "trailingStopPct": {
      "type": "number",
      "maximum": 50,
      "minimum": 0.5,
      "description": "Optional. FortFi keeps a stop this % behind the best price since the fill and only ever moves it toward the price (checked every 5 minutes). Needs the set_hyperliquid_managed_exit operation. Same as calling set_hyperliquid_managed_exit after the fill."
    },
    "trailStartProfitPct": {
      "type": "number",
      "maximum": 500,
      "minimum": 0.1,
      "description": "Optional, with trailingStopPct. Trailing starts only once the price is this % past your entry price (price move, not leverage-adjusted). Until then your normal stop stays put."
    },
    "breakEvenAtProfitPct": {
      "type": "number",
      "maximum": 500,
      "minimum": 0.1,
      "description": "Optional. Once the price is this % past your entry price, FortFi moves the stop to the entry price."
    },
    "acknowledgePriceImpact": {
      "type": "boolean",
      "description": "Set true only after a HYPERLIQUID_PRICE_IMPACT_CONFIRM_REQUIRED error, to accept >=1% book impact on a market order. Prefer limitPrice or a smaller size."
    }
  },
  "additionalProperties": false
}
propose_hyperliquid_perp_close
Advertised by the server during the last successful anonymous check.

Propose closing a Hyperliquid perp position (reduce-only). Omit size to close the whole position. Returns a proposalId for confirm_proposal.

propose_hyperliquid_perp_close input schema
{
  "type": "object",
  "required": [
    "walletId",
    "symbol"
  ],
  "properties": {
    "size": {
      "type": "string",
      "description": "Optional; omit to close all"
    },
    "symbol": {
      "type": "string"
    },
    "walletId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
propose_hyperliquid_perp_modify
Advertised by the server during the last successful anonymous check.

Propose modifying an open Hyperliquid perp position: its stop-loss / take-profit and/or its leverage. Only the exit you pass is replaced: changing stopLoss keeps the resting take-profit(s), and vice versa. leverage changes the open position's leverage in place (keeps its cross / isolated mode, size unchanged). Raising leverage runs FortFi perp policy (max leverage) and the wallet loss cap; lowering it needs enough margin on Hyperliquid. Returns a proposalId for confirm_proposal.

propose_hyperliquid_perp_modify input schema
{
  "type": "object",
  "required": [
    "walletId",
    "symbol"
  ],
  "properties": {
    "symbol": {
      "type": "string"
    },
    "leverage": {
      "type": "integer",
      "minimum": 1,
      "description": "New leverage for the open position (whole number, up to the market max and the owner's policy max). Must differ from the current leverage."
    },
    "stopLoss": {
      "type": "string",
      "description": "New stop-loss trigger for the whole position. Replaces the resting stop only."
    },
    "walletId": {
      "type": "string"
    },
    "takeProfit": {
      "type": "string",
      "description": "New take-profit trigger. Replaces the resting take-profit(s) only."
    },
    "takeProfitSizePercent": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Close only this % of the position at takeProfit (e.g. 50 to bank half at 2R and let the rest run). Default 100. The stop keeps covering the full position."
    }
  },
  "additionalProperties": false
}
cancel_hyperliquid_orders
Advertised by the server during the last successful anonymous check.

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.

cancel_hyperliquid_orders input schema
{
  "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
}
propose_hyperliquid_deposit
Advertised by the server during the last successful anonymous check.

Propose moving HyperEVM USDC into Hyperliquid perp margin (top up). Set perpDex for HIP-3 desks (xyz, io, para). Returns proposalId; execute with confirm_proposal (server-side when Delegated Access or agent credential).

propose_hyperliquid_deposit input schema
{
  "type": "object",
  "required": [
    "walletId",
    "amountUsd"
  ],
  "properties": {
    "perpDex": {
      "type": "string",
      "description": "core | xyz | io | para (default core)"
    },
    "walletId": {
      "type": "string"
    },
    "amountUsd": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
propose_hyperliquid_withdraw
Advertised by the server during the last successful anonymous check.

Propose moving Hyperliquid perp USDC to the owner's own HyperEVM wallet (same address; perp to HL Spot, then sendAsset to the USDC system address). Funds cannot go to any other recipient. Returns proposalId; human confirms with passkey via Perps Withdraw to HyperEVM or confirm_proposal.

propose_hyperliquid_withdraw input schema
{
  "type": "object",
  "required": [
    "walletId",
    "amountUsd"
  ],
  "properties": {
    "walletId": {
      "type": "string"
    },
    "amountUsd": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
propose_hyperliquid_spot_to_perp
Advertised by the server during the last successful anonymous check.

Propose moving USDC from HL Spot into core perps margin (required after MoonPay HyperCore on-ramp). Returns proposalId; human confirms via Perps Deposit to tradable balance or confirm_proposal.

propose_hyperliquid_spot_to_perp input schema
{
  "type": "object",
  "required": [
    "walletId",
    "amountUsd"
  ],
  "properties": {
    "walletId": {
      "type": "string"
    },
    "amountUsd": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
propose_hyperliquid_send_asset
Advertised by the server during the last successful anonymous check.

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.

propose_hyperliquid_send_asset input schema
{
  "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
}
list_hyperliquid_outcome_markets
Advertised by the server during the last successful anonymous check.

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.

list_hyperliquid_outcome_markets input schema
{
  "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
}
get_hyperliquid_outcome_market
Advertised by the server during the last successful anonymous check.

One HIP-4 outcome market. id is the numeric outcome id. Optional walletId reads that Hyperliquid account's share balance.

get_hyperliquid_outcome_market input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Outcome id, e.g. 9802"
    },
    "walletId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
propose_hyperliquid_outcome_order
Advertised by the server during the last successful anonymous check.

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.

propose_hyperliquid_outcome_order input schema
{
  "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
}
list_hyperliquid_spot_markets
Advertised by the server during the last successful anonymous check.

List Hyperliquid spot pairs (you own the coin, no leverage, no funding). Each row has price, 24h change, 24h volume, size decimals and, when the coin also has a perp, the perp's funding as carryAprPct (what a short earns per year at today's rate) and basisPct (spot vs perp price). sort=carry ranks carry pairs. tradeable=false means the pair is priced in a token FortFi does not support.

list_hyperliquid_spot_markets input schema
{
  "type": "object",
  "properties": {
    "sort": {
      "enum": [
        "volume",
        "change",
        "carry"
      ],
      "type": "string",
      "description": "Default volume"
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Default 50"
    },
    "query": {
      "type": "string",
      "description": "HYPE, HYPE/USDC, @107, or a perp name like BTC"
    },
    "onlyWithPerp": {
      "type": "boolean",
      "description": "Only pairs that also have a perp (carry candidates)"
    },
    "minDayVolumeUsd": {
      "type": "number"
    }
  },
  "additionalProperties": false
}
propose_hyperliquid_spot_order
Advertised by the server during the last successful anonymous check.

Propose a Hyperliquid spot buy or sell on the same Hyperliquid account as perps. Buys spend the quote token (usually USDC), sells sell coins you hold. Give size (coins) or sizeUsd (dollars). size "all" sells everything free. Market orders cross the book by at most 1% and fill now or cancel. Minimum $10. Runs spot policy (no leverage, max trade size) and the wallet loss cap on buys. API keys cannot buy spot on an account a strategy runs (the cash would leave the perps account the strategy trades from); sells still work. Spot symbols: prefer the pair form (HYPE/USDC) or the wrapped name (UBTC, UETH); BTC maps to UBTC. Confirm with confirm_proposal. The key needs the propose_hyperliquid_spot_order grant.

propose_hyperliquid_spot_order input schema
{
  "type": "object",
  "required": [
    "walletId",
    "symbol",
    "side"
  ],
  "properties": {
    "side": {
      "enum": [
        "buy",
        "sell"
      ],
      "type": "string"
    },
    "size": {
      "type": "string",
      "description": "Coin amount, or \"all\" to sell everything free"
    },
    "symbol": {
      "type": "string",
      "description": "HYPE, HYPE/USDC, @107, or a perp name like BTC (maps to UBTC/USDC)"
    },
    "sizeUsd": {
      "type": "string",
      "description": "Dollar amount (alternative to size)"
    },
    "walletId": {
      "type": "string"
    },
    "orderType": {
      "enum": [
        "market",
        "limit"
      ],
      "type": "string",
      "description": "Default market"
    },
    "limitPrice": {
      "type": "string",
      "description": "Required for limit orders, in the quote token"
    },
    "timeInForce": {
      "enum": [
        "Gtc",
        "Alo",
        "Ioc"
      ],
      "type": "string",
      "description": "Limit only. Gtc stay open, Alo add to book only, Ioc fill now or cancel"
    }
  },
  "additionalProperties": false
}
set_hyperliquid_managed_exit
Advertised by the server during the last successful anonymous check.

Trailing stop, break-even stop and/or time stop that FortFi keeps on an open perp position. Trailing: a stop trailingStopPct behind the best price since set, moved only toward the price, never away; a tighter stop already on the book (yours, or a copy-trade stop) is kept. With trailStartProfitPct, trailing starts only once the price is that % past your entry price. Break-even: once the price is breakEvenAtProfitPct past entry, the stop moves to the entry price. Time stop: closes the whole position after closeAfterHours; refused on accounts a strategy runs, since the strategy would reopen it. Checked every 5 minutes, so fast moves can pass the trail before it updates; the stop on the book is what protects you between checks. Each change runs through policy and the audit log. Stop moves that only tighten skip co-sign rules; if a co-sign rule would make a close wait for approval, the managed exit stops and says why. Calling again replaces the settings. Needs automated signing (Delegated Access) on human accounts.

set_hyperliquid_managed_exit input schema
{
  "type": "object",
  "required": [
    "walletId",
    "symbol"
  ],
  "properties": {
    "symbol": {
      "type": "string",
      "description": "Perp symbol, e.g. BTC or xyz:NVDA"
    },
    "walletId": {
      "type": "string"
    },
    "closeAfterHours": {
      "type": "number",
      "maximum": 2160,
      "minimum": 0.25,
      "description": "Close the position this many hours from now. Refused on accounts a strategy runs."
    },
    "trailingStopPct": {
      "type": "number",
      "maximum": 50,
      "minimum": 0.5,
      "description": "Percent behind the best price"
    },
    "trailStartProfitPct": {
      "type": "number",
      "maximum": 500,
      "minimum": 0.1,
      "description": "Start trailing only once the price is this % past the entry price. Needs trailingStopPct."
    },
    "breakEvenAtProfitPct": {
      "type": "number",
      "maximum": 500,
      "minimum": 0.1,
      "description": "Once the price is this % past the entry price, move the stop to the entry price"
    }
  },
  "additionalProperties": false
}
cancel_hyperliquid_managed_exit
Advertised by the server during the last successful anonymous check.

Turn off the trailing or time stop FortFi manages on a position. Stops already on the book stay where they are.

cancel_hyperliquid_managed_exit input schema
{
  "type": "object",
  "required": [
    "walletId",
    "symbol"
  ],
  "properties": {
    "symbol": {
      "type": "string"
    },
    "walletId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
list_hyperliquid_managed_exits
Advertised by the server during the last successful anonymous check.

Trailing and time stops FortFi manages: settings, best price so far, the stop it last placed, and a note when something stopped it. includeEnded=true adds finished ones.

list_hyperliquid_managed_exits input schema
{
  "type": "object",
  "properties": {
    "walletId": {
      "type": "string",
      "description": "Required for vault-scoped keys"
    },
    "includeEnded": {
      "type": "boolean"
    }
  },
  "additionalProperties": false
}
propose_hyperliquid_carry
Advertised by the server during the last successful anonymous check.

Funding carry in one call: buy the coin on spot, then short the same size on its perp, so price moves cancel out and the short earns funding while funding is positive. Both legs run through the normal policy, grant, loss cap and audit checks (the key needs propose_hyperliquid_spot_order and propose_hyperliquid_perp_open). If either leg would need co-signer approval, nothing is placed. If funding is not positive, the prices are more than 2% apart, or the account runs a strategy, nothing is placed. If the short fails after the buy, FortFi sells the spot back at once (unwound=true); only if that also fails is the result hedged=false, unwound=false, and you should sell with propose_hyperliquid_spot_order size=all. No size cap beyond your policy and loss cap: keep spare money on the account so the short is not closed out by a jump. Use dryRun=true to see sizes and cash needed first. Unwind with propose_hyperliquid_perp_close and propose_hyperliquid_spot_order side=sell.

propose_hyperliquid_carry input schema
{
  "type": "object",
  "required": [
    "walletId",
    "symbol",
    "sizeUsd"
  ],
  "properties": {
    "dryRun": {
      "type": "boolean",
      "description": "Plan only, place nothing"
    },
    "symbol": {
      "type": "string",
      "description": "Coin or perp name: HYPE, BTC, ETH, SOL ..."
    },
    "sizeUsd": {
      "type": "number",
      "description": "Dollar size of each leg. Minimum 10."
    },
    "walletId": {
      "type": "string"
    },
    "perpLeverage": {
      "type": "integer",
      "maximum": 3,
      "minimum": 1,
      "description": "Short leverage. Default 1 (safest)."
    }
  },
  "additionalProperties": false
}
create_checkout_session
Advertised by the server during the last successful anonymous check.

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.

create_checkout_session input schema
{
  "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
}
create_payment_request
Advertised by the server during the last successful anonymous check.

Create a shareable payment request for a vault. Returns pid, paymentUrl, and qrPayload for humans or agents.

create_payment_request input schema
{
  "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
}
get_payment_request
Advertised by the server during the last successful anonymous check.

Get a payment request by internal id or public pid, including settlement attempts.

get_payment_request input schema
{
  "type": "object",
  "required": [
    "idOrPid"
  ],
  "properties": {
    "idOrPid": {
      "type": "string",
      "description": "Internal id or public pid"
    }
  },
  "additionalProperties": false
}
list_payment_requests
Advertised by the server during the last successful anonymous check.

List payment requests for the authenticated account.

list_payment_requests input schema
{
  "type": "object",
  "properties": {
    "status": {
      "enum": [
        "open",
        "processing",
        "partially_paid",
        "paid",
        "expired",
        "cancelled"
      ],
      "type": "string"
    },
    "walletMappingId": {
      "type": "string",
      "description": "Optional vault filter"
    }
  },
  "additionalProperties": false
}
cancel_payment_request
Advertised by the server during the last successful anonymous check.

Cancel an open payment request with no verified settlement.

cancel_payment_request input schema
{
  "type": "object",
  "required": [
    "idOrPid"
  ],
  "properties": {
    "idOrPid": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
extend_payment_request
Advertised by the server during the last successful anonymous check.

Extend an open payment request expiry (default extension window in days).

extend_payment_request input schema
{
  "type": "object",
  "required": [
    "idOrPid",
    "expiryDays"
  ],
  "properties": {
    "idOrPid": {
      "type": "string"
    },
    "expiryDays": {
      "type": "number",
      "description": "New expiry horizon from now (1-365)"
    }
  },
  "additionalProperties": false
}
pay_payment_request_x402
Advertised by the server during the last successful anonymous check.

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.

pay_payment_request_x402 input schema
{
  "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
}
list_payment_sales
Advertised by the server during the last successful anonymous check.

Merchant view: paid and partially paid invoices on your collection vaults (what you sold). Includes payer, method, and settlement details.

list_payment_sales input schema
{
  "type": "object",
  "properties": {
    "walletMappingId": {
      "type": "string",
      "description": "Optional collection vault filter"
    }
  },
  "additionalProperties": false
}
list_payment_purchases
Advertised by the server during the last successful anonymous check.

Buyer view: FortFi checkouts your vaults paid (what you bought). Matches settlements by payer wallet address across your fleet.

list_payment_purchases input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "number",
      "description": "Max rows (default 200, max 500)"
    },
    "walletMappingId": {
      "type": "string",
      "description": "Optional payer vault filter"
    }
  },
  "additionalProperties": false
}
create_payment_product
Advertised by the server during the last successful anonymous check.

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.

create_payment_product input schema
{
  "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
}
list_payment_products
Advertised by the server during the last successful anonymous check.

List persistent product checkout links for the account.

list_payment_products input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
get_payment_product
Advertised by the server during the last successful anonymous check.

Get a payment product by internal id or public slug.

get_payment_product input schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "slug": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
create_merchant_webhook
Advertised by the server during the last successful anonymous check.

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.

create_merchant_webhook input schema
{
  "type": "object",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "HTTPS callback URL on the merchant's server"
    },
    "description": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
list_merchant_webhooks
Advertised by the server during the last successful anonymous check.

List registered webhook endpoints (secrets are never returned).

list_merchant_webhooks input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_merchant_webhook_deliveries
Advertised by the server during the last successful anonymous check.

List webhook delivery log. Use status=failed for dead-letter queue rows. Filter by paymentRequestId to find deliveries for one checkout.

list_merchant_webhook_deliveries input schema
{
  "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
}
replay_merchant_webhook_delivery
Advertised by the server during the last successful anonymous check.

Replay a dead-lettered or failed webhook delivery after fixing your endpoint. Re-sends the same event id and body for idempotent handlers.

replay_merchant_webhook_delivery input schema
{
  "type": "object",
  "required": [
    "deliveryId"
  ],
  "properties": {
    "deliveryId": {
      "type": "string",
      "description": "Delivery row id from list_merchant_webhook_deliveries"
    }
  },
  "additionalProperties": false
}
send_merchant_webhook_test
Advertised by the server during the last successful anonymous check.

Send a signed webhook.test event to an endpoint.

send_merchant_webhook_test input schema
{
  "type": "object",
  "required": [
    "endpointId"
  ],
  "properties": {
    "endpointId": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
search_vaults
Advertised by the server during the last successful anonymous check.

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.

search_vaults input schema
{
  "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
}
search_credentials
Advertised by the server during the last successful anonymous check.

Parent-treasury key-centric credential search (treasury credential + keys:manage + wallets:read). Complements search_vaults. Never returns raw bearer keys.

search_credentials input schema
{
  "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
}
create_vault_credential
Advertised by the server during the last successful anonymous check.

Mint a vault-scoped credential for an existing wallet (treasury + keys:manage). Returns bearerKey once when agentPublicKey is omitted. Requires FORTFI_VAULT_CREDENTIALS_ENABLED.

create_vault_credential input schema
{
  "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
}
update_vault_credential
Advertised by the server during the last successful anonymous check.

Atomically replace a vault credential's name, access mode, grants, and expiry (treasury + keys:manage). Revoked credentials cannot be updated.

update_vault_credential input schema
{
  "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
}
revoke_vault_credential
Advertised by the server during the last successful anonymous check.

Revoke a vault-scoped credential (treasury + keys:manage). Idempotent if already revoked.

revoke_vault_credential input schema
{
  "type": "object",
  "required": [
    "credentialId"
  ],
  "properties": {
    "credentialId": {
      "type": "string",
      "description": "Vault credential id"
    }
  },
  "additionalProperties": false
}
create_provisioning_job
Advertised by the server during the last successful anonymous check.

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.

create_provisioning_job input schema
{
  "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
}
get_provisioning_job
Advertised by the server during the last successful anonymous check.

Poll a bulk provisioning job (treasury + keys:manage + wallets:read). bearerKey appears once when secretsDelivery is revealed.

get_provisioning_job input schema
{
  "type": "object",
  "required": [
    "jobId"
  ],
  "properties": {
    "jobId": {
      "type": "string",
      "description": "Job id from create_provisioning_job"
    }
  },
  "additionalProperties": false
}
create_customer
Advertised by the server during the last successful anonymous check.

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.

create_customer input schema
{
  "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
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-09: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1089 ms
95th percentile latency
1089 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1089 ms · metadata changed · 148 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http fortfi-treasury-mcp https://fortfiapp.com/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add fortfi-treasury-mcp --url https://fortfiapp.com/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable fortfi-treasury-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "fortfi-treasury-mcp": {
      "url": "https://fortfiapp.com/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "fortfi-treasury-mcp": {
      "type": "streamableHttp",
      "url": "https://fortfiapp.com/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start fortfi-treasury-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "fortfi-treasury-mcp": {
      "type": "http",
      "url": "https://fortfiapp.com/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http fortfi-treasury-mcp https://fortfiapp.com/api/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://fortfiapp.com/api/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "fortfi-treasury-mcp": {
      "serverUrl": "https://fortfiapp.com/api/mcp"
    }
  }
}

Let your agent find its tools

Find servers like FortFi Treasury MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.