{
  "server": {
    "name": "liveagents-exchange",
    "version": "1.0.0"
  },
  "count": 48,
  "tools": [
    {
      "name": "open_account",
      "needsToken": false,
      "description": "Open a practice account on this exchange. No signup, no wallet, no email: this generates a key, creates the account behind it and funds it with paper money, then hands back the one command that makes every other tool work. Call it when an account tool says there is no token. If the caller already put a key in their configuration they already have an account and do not need this - the key creates it on first use.",
      "arguments": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "list_markets",
      "needsToken": false,
      "description": "Every market on the exchange with its tick size, lot size, maximum leverage and current ticker. Spot pairs settle in the quote asset; PERP markets are perpetual futures margined in USDT. Call this before placing an order: a symbol that is not here is refused. These are all linear instruments - there are no options on this order book. Options do exist on this platform, on a separate desk: use list_option_expiries and get_option_chain for those rather than concluding there is nothing to trade.",
      "arguments": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "list_option_expiries",
      "needsToken": false,
      "description": "The option expiries this platform quotes, per currency, with the number of strikes on each and the current DVOL. Options are not on the exchange order book that list_markets returns: they are a separate desk quoting a real chain, settled in the same paper money. Start here to find an expiry code, then call get_option_chain with it.",
      "arguments": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "get_option_chain",
      "needsToken": false,
      "description": "Every strike on one expiry, with the call and the put side by side: bid, ask, mark, last, open interest, delta and both implied vols. This is what an option strategy is built from - the marks are real quotes rather than a model, so a spread priced from them is priceable. The expiry code comes from list_option_expiries and looks like 14SEP26.",
      "arguments": {
        "type": "object",
        "properties": {
          "family": {
            "type": "string",
            "description": "Currency, e.g. BTC or ETH."
          },
          "expiry": {
            "type": "string",
            "description": "Expiry code from list_option_expiries, e.g. 14SEP26."
          }
        },
        "required": [
          "family",
          "expiry"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_volatility_surface",
      "needsToken": false,
      "description": "Implied volatility across every expiry for one currency: at-the-money vol, skew, open interest and days to expiry on each. Read it before choosing an expiry - it is what says whether the front is bid relative to the back, and therefore which structures are worth pricing at all.",
      "arguments": {
        "type": "object",
        "properties": {
          "family": {
            "type": "string",
            "description": "Currency, e.g. BTC or ETH."
          }
        },
        "required": [
          "family"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_option_book",
      "needsToken": false,
      "description": "The resting bids and asks on one option instrument, named as it appears in the chain, e.g. BTC-14SEP26-68000-C. Use it before sizing: option books are thin, and a mark in the chain is frequently not available in the size a strategy assumes.",
      "arguments": {
        "type": "object",
        "properties": {
          "instrument": {
            "type": "string",
            "description": "Instrument name from get_option_chain."
          }
        },
        "required": [
          "instrument"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_orderbook",
      "needsToken": false,
      "description": "The resting bids and asks for one market, best price first. Use it to see what an order would actually fill against rather than assuming the last price is available in size.",
      "arguments": {
        "type": "object",
        "properties": {
          "market": {
            "type": "string",
            "description": "Market symbol, e.g. BTC-USDT or BTC-PERP."
          }
        },
        "required": [
          "market"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_ticker",
      "needsToken": false,
      "description": "Last price, 24-hour change, high, low and volume for one market.",
      "arguments": {
        "type": "object",
        "properties": {
          "market": {
            "type": "string",
            "description": "Market symbol."
          }
        },
        "required": [
          "market"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_candles",
      "needsToken": false,
      "description": "Historical bars for one market, oldest first. The venue keeps roughly the last 1,500 buckets per interval and takes a count rather than a date range, so asking for more than that returns what exists rather than older history.",
      "arguments": {
        "type": "object",
        "properties": {
          "market": {
            "type": "string",
            "description": "Market symbol."
          },
          "interval": {
            "type": "string",
            "description": "One of 1m, 5m, 15m, 1h, 4h, 1d. Defaults to 5m."
          },
          "limit": {
            "type": "number",
            "description": "How many bars, newest last. Defaults to 200."
          }
        },
        "required": [
          "market"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_funding",
      "needsToken": false,
      "description": "The funding rate for a perpetual market and when it is next charged. Funding is what a perpetual position pays or receives for being held, and over days it can exceed the move being traded.",
      "arguments": {
        "type": "object",
        "properties": {
          "market": {
            "type": "string",
            "description": "Perpetual market symbol, e.g. BTC-PERP."
          }
        },
        "required": [
          "market"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "whoami",
      "needsToken": true,
      "description": "Who the exchange thinks this token belongs to, which account it acts on, and what it is allowed to do. A trade-only token reports role \"agent\" and cannot deploy agents or draw from the faucet; an account token reports \"user\" and can.",
      "arguments": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "get_account",
      "needsToken": true,
      "description": "Balances, open positions and margin for one account. Spot balances and perpetual collateral are separate venues within the same account.",
      "arguments": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "list_accounts",
      "needsToken": true,
      "description": "Every account this token can reach, main and sub-accounts, with their equity.",
      "arguments": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "get_open_orders",
      "needsToken": true,
      "description": "Orders resting on the book right now, across markets.",
      "arguments": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "get_fills",
      "needsToken": true,
      "description": "Trades that actually executed, newest first, with the fee paid on each. Use this rather than order history when the question is what was done, not what was asked for.",
      "arguments": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          },
          "limit": {
            "type": "number",
            "description": "How many, newest first. Defaults to 50."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "place_order",
      "needsToken": true,
      "description": "Place an order. A market order here is immediate-or-cancel: it fills against what is on the book and any remainder is cancelled rather than resting. A limit order rests until filled or cancelled. Give size in the base asset, or quoteSize to spend a quote amount and let the exchange work out the size. reduceOnly will only ever shrink a position, which is what to use when closing one. Check the orderbook first: on a thin market a market order can fill far from the last price.",
      "arguments": {
        "type": "object",
        "properties": {
          "market": {
            "type": "string",
            "description": "Market symbol."
          },
          "side": {
            "type": "string",
            "enum": [
              "buy",
              "sell"
            ],
            "description": "Which way."
          },
          "type": {
            "type": "string",
            "enum": [
              "market",
              "limit"
            ],
            "description": "Defaults to market."
          },
          "size": {
            "type": "string",
            "description": "Amount in the base asset, as a decimal string."
          },
          "quoteSize": {
            "type": "string",
            "description": "Amount to spend in the quote asset instead of size."
          },
          "price": {
            "type": "string",
            "description": "Required for a limit order. Decimal string."
          },
          "tif": {
            "type": "string",
            "enum": [
              "gtc",
              "ioc",
              "fok"
            ],
            "description": "Time in force for a limit order. Defaults to gtc."
          },
          "reduceOnly": {
            "type": "boolean",
            "description": "Never increase a position."
          },
          "postOnly": {
            "type": "boolean",
            "description": "Cancel rather than take liquidity."
          },
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [
          "market",
          "side"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "cancel_order",
      "needsToken": true,
      "description": "Cancel one resting order by id. Cancelling an order that already filled is refused.",
      "arguments": {
        "type": "object",
        "properties": {
          "orderId": {
            "type": "string",
            "description": "The order id."
          },
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [
          "orderId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "cancel_all_orders",
      "needsToken": true,
      "description": "Cancel every resting order on this account, optionally only in one market.",
      "arguments": {
        "type": "object",
        "properties": {
          "market": {
            "type": "string",
            "description": "Restrict to one market."
          },
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "close_position",
      "needsToken": true,
      "description": "Close one perpetual position at market. This is a reduce-only market order, so it can never accidentally open the opposite side.",
      "arguments": {
        "type": "object",
        "properties": {
          "market": {
            "type": "string",
            "description": "Perpetual market symbol."
          },
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [
          "market"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "close_all_positions",
      "needsToken": true,
      "description": "Close every open perpetual position on this account at market.",
      "arguments": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "set_leverage",
      "needsToken": true,
      "description": "Set the leverage used for new positions in one perpetual market. Leverage decides the margin a position ties up, so raising it on an open position moves the liquidation price.",
      "arguments": {
        "type": "object",
        "properties": {
          "market": {
            "type": "string",
            "description": "Perpetual market symbol."
          },
          "leverage": {
            "type": "number",
            "description": "Whole number, up to the market maximum."
          },
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [
          "market",
          "leverage"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_paper_money",
      "needsToken": true,
      "description": "Draw from the faucet, which is the only way an account here is ever funded. It tops up to a target rather than adding to a balance: an account that has traded its way to 90,000 receives 10,000, and one already at the target receives nothing. Once a day per asset. USDT funds to 100,000; every other asset funds to a fixed worth at the current price. Call with no asset to see what is claimable before claiming.",
      "arguments": {
        "type": "object",
        "properties": {
          "asset": {
            "type": "string",
            "description": "USDT, BTC, ETH or LIVE. Omit to read what is claimable without claiming."
          },
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "fund_agent",
      "needsToken": true,
      "description": "Move money from your account into an agent’s, so it has something to trade with. An agent trades a sub-account of its own and starts empty - deploying one does not fund it, and an agent with an empty account places orders that are all refused. This is how you give it a budget, and how you take one back: a negative amount sweeps that much out of the agent and back to you. How much an agent may hold is bounded by staked LIVE, so this is refused with agent_capacity_exceeded when the stake does not admit it - draw LIVE from the faucet, call stake_live, then come back.",
      "arguments": {
        "type": "object",
        "properties": {
          "agentId": {
            "type": "string",
            "description": "The agent id, from list_agents."
          },
          "amount": {
            "type": "string",
            "description": "How much, as a decimal string. Negative takes it back."
          },
          "asset": {
            "type": "string",
            "description": "Defaults to the quote asset, which is what margin is posted in."
          }
        },
        "required": [
          "agentId",
          "amount"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "stake_live",
      "needsToken": true,
      "description": "Stake LIVE, which is what lets an agent hold capital. Agent capital is admitted against staked LIVE - with none staked, funding an agent is refused however much cash you have, because the stake is what bounds how much the platform lets agents run. Draw LIVE from the faucet first, then stake it, then fund the agent. A negative amount unstakes, which is refused while agents are holding more than the remaining stake would admit.",
      "arguments": {
        "type": "object",
        "properties": {
          "amount": {
            "type": "string",
            "description": "How much LIVE. Negative unstakes."
          }
        },
        "required": [
          "amount"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_staking",
      "needsToken": true,
      "description": "How much LIVE this holder has staked, and how much agent capital that admits. Read it when funding an agent is refused for capacity: the gap between what is admitted and what the agents already hold is what is left to allocate.",
      "arguments": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "transfer",
      "needsToken": true,
      "description": "Move an asset between accounts you own, or between the spot and perpetual venues of one account. Perpetual margin is posted from the perpetual venue, so cash sitting in spot cannot back a position until it is moved across. Use fund_agent instead when the destination is an agent.",
      "arguments": {
        "type": "object",
        "properties": {
          "toAccountId": {
            "type": "string",
            "description": "Destination account. Omit to move between venues of the source account."
          },
          "amount": {
            "type": "string",
            "description": "How much, as a decimal string."
          },
          "asset": {
            "type": "string",
            "description": "Defaults to the quote asset."
          },
          "fromVenue": {
            "type": "string",
            "enum": [
              "spot",
              "perp"
            ],
            "description": "Defaults to spot."
          },
          "toVenue": {
            "type": "string",
            "enum": [
              "spot",
              "perp"
            ],
            "description": "Defaults to the source venue."
          },
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [
          "amount"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_agents",
      "needsToken": true,
      "description": "Every agent this holder has deployed, with its status, the market it trades, its sub-account equity, and how it has actually done: trades, win rate and net P&L from the exchange’s own ledger rather than from the agent’s own claims.",
      "arguments": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "get_agent_source",
      "needsToken": true,
      "description": "The source of one deployed agent. Read a working agent before writing a new one: it is the only reliable way to see the runtime contract the container actually provides, rather than guessing at it.",
      "arguments": {
        "type": "object",
        "properties": {
          "agentId": {
            "type": "string",
            "description": "The agent id, from list_agents."
          }
        },
        "required": [
          "agentId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "deploy_agent",
      "needsToken": true,
      "description": "Deploy a new agent. The source is a Node.js program that runs in its own container and reaches this exchange over the same REST API these tools use, with its own token scoped to its own sub-account - an agent can trade its account and no other. Give it a lowercase name of letters, digits and dashes. Before writing one, call get_agent_source on an existing agent to see the contract the runtime provides. Deploying does not fund it - call fund_agent afterwards, or it will place orders that are all refused for want of a balance. Funding needs staked LIVE - see stake_live.",
      "arguments": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Lowercase letters, digits and dashes."
          },
          "market": {
            "type": "string",
            "description": "The market it trades. Must exist."
          },
          "source": {
            "type": "string",
            "description": "The agent program, as text."
          },
          "mode": {
            "type": "string",
            "enum": [
              "live",
              "demo"
            ],
            "description": "Defaults to live."
          },
          "agentType": {
            "type": "string",
            "description": "Free-form label, e.g. rule_based or self_healing. Gates nothing."
          },
          "params": {
            "type": "object",
            "description": "Declared parameters, stored with the agent."
          }
        },
        "required": [
          "name",
          "market",
          "source"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "redeploy_agent",
      "needsToken": true,
      "description": "Replace a running agent’s source and restart it. Use this to fix an agent rather than deleting and re-creating it: the sub-account, its balance and its history stay.",
      "arguments": {
        "type": "object",
        "properties": {
          "agentId": {
            "type": "string",
            "description": "The agent id."
          },
          "source": {
            "type": "string",
            "description": "The new program."
          },
          "market": {
            "type": "string",
            "description": "Change the market too."
          }
        },
        "required": [
          "agentId",
          "source"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "control_agent",
      "needsToken": true,
      "description": "Start or stop one agent. Stopping kills its container and its token stops working immediately, so a container that missed the shutdown cannot keep trading.",
      "arguments": {
        "type": "object",
        "properties": {
          "agentId": {
            "type": "string",
            "description": "The agent id."
          },
          "action": {
            "type": "string",
            "enum": [
              "start",
              "stop"
            ],
            "description": "What to do."
          }
        },
        "required": [
          "agentId",
          "action"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_agent_logs",
      "needsToken": true,
      "description": "What one agent has printed, newest last. This is where an agent that is failing says why. Note that output from a run that has already ended is kept and shown with its timestamp: check the time before concluding a current run is broken.",
      "arguments": {
        "type": "object",
        "properties": {
          "agentId": {
            "type": "string",
            "description": "The agent id."
          }
        },
        "required": [
          "agentId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_agent_fills",
      "needsToken": true,
      "description": "The trades one agent actually made, with fees. What it did, not what it logged.",
      "arguments": {
        "type": "object",
        "properties": {
          "agentId": {
            "type": "string",
            "description": "The agent id."
          }
        },
        "required": [
          "agentId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "how_am_i_doing",
      "needsToken": true,
      "description": "The whole picture in one answer: what the book is worth, what it made or lost today and what that is made of, every asset held with its weight, and every agent ranked by what it did today with the best and worst named. The balance is everything they are worth - their own accounts plus the value of any agent pools they back, which sits in the agent’s account rather than theirs and is split out as inOwnAccounts and inAgentPools. Call this first for any question about the account - balance, profit, holdings, which agent is winning - rather than assembling it from parts. The figures are the exchange’s own, so they agree with the console and with the ledger. Today is measured from midnight UTC, and the answer says so.",
      "arguments": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "rebalance",
      "needsToken": true,
      "description": "Work out the trades that would take the spot book to a target allocation, and place them only if asked. Targets are percentages by value and must total 100; anything held and not named is sold down, because that is what naming your targets means. Drift under half a percent of the book is left alone, since the fee and the spread would cost more than the drift being corrected. Sells go before buys, or the buys would be refused for want of cash the sells are about to produce. Returns the plan first - read it back before executing.",
      "arguments": {
        "type": "object",
        "properties": {
          "targets": {
            "type": "object",
            "description": "Asset to percent, e.g. {\"BTC\":40,\"ETH\":30,\"USDT\":30}. Must total 100."
          },
          "execute": {
            "type": "boolean",
            "description": "Place the trades. Defaults to false."
          }
        },
        "required": [
          "targets"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "best_assets_today",
      "needsToken": false,
      "description": "What the research desk currently rates highest, with the thesis behind each and a conviction score. These are the desk’s own opinions from published sources, not advice and not a signal to trade: read the thesis rather than the ranking. Public. Note that a name here may not be listed on this exchange - check list_markets before trying to trade one.",
      "arguments": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "number",
            "description": "How many, highest first. Defaults to 10."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "get_portfolio",
      "needsToken": true,
      "description": "The performance report for one account: equity, realised and unrealised P&L, return, volatility, Sharpe, maximum drawdown, fees paid and the equity curve. The window is whatever history exists and is stated in the answer rather than promised.",
      "arguments": {
        "type": "object",
        "properties": {
          "range": {
            "type": "string",
            "description": "all, 1d, 7d or 30d. Defaults to all."
          },
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "get_history",
      "needsToken": true,
      "description": "This holder’s equity across every account they own, already summed by the exchange, with the daily curve behind it. One request rather than one per sub-account.",
      "arguments": {
        "type": "object",
        "properties": {
          "range": {
            "type": "string",
            "description": "all, 1d, 7d or 30d. Defaults to all."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "get_transactions",
      "needsToken": true,
      "description": "Every credit and debit on the account, including faucet draws, transfers and settlements. The ledger is the truth about where the money came from.",
      "arguments": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          },
          "limit": {
            "type": "number",
            "description": "Defaults to 50."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "get_risk_exposure",
      "needsToken": true,
      "description": "What the account is carrying: exposure by market and asset, margin in use, and how close any position is to liquidation.",
      "arguments": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "get_leaderboard",
      "needsToken": false,
      "description": "How every account on the venue has done over a window, ranked. Public - it needs no token and shows no identities beyond the display names accounts chose.",
      "arguments": {
        "type": "object",
        "properties": {
          "window": {
            "type": "string",
            "description": "24h, 7d or 30d. Defaults to 7d."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "list_traders",
      "needsToken": false,
      "description": "Everyone worth copying: every live agent on the venue with its real record - trades, win rate, net P&L and drawdown from the exchange ledger rather than from anyone’s claims. This is the universe to choose a source from before calling get_trader_activity. Public, and an agent that has never traded says so rather than showing a blank record as a good one.",
      "arguments": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "find_trader",
      "needsToken": false,
      "description": "Find an account to follow by wallet address, name, or its place on the leaderboard. Give a wallet and it returns the account behind it; give nothing and it returns the ranking, which is where to look when the question is \"who is doing well\" rather than \"how is this person doing\". The accountId it returns is what get_trader_activity takes.",
      "arguments": {
        "type": "object",
        "properties": {
          "wallet": {
            "type": "string",
            "description": "A wallet address, or part of one, to match."
          },
          "window": {
            "type": "string",
            "description": "24h, 7d or 30d for the ranking. Defaults to 7d."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "get_trader_activity",
      "needsToken": false,
      "description": "The fills of the thing you are following, newest first - an agent by id or name, or any account by id. This is the copy-trading feed: poll it, look at what is new since the cursor you last saw, and decide what to do about it. It reports what was actually filled, not what was intended, so a source whose orders are being rejected shows as silence rather than as activity.",
      "arguments": {
        "type": "object",
        "properties": {
          "agent": {
            "type": "string",
            "description": "An agent id or name, from list_traders."
          },
          "accountId": {
            "type": "string",
            "description": "An account id, from find_trader. Use this for a wallet rather than an agent."
          },
          "limit": {
            "type": "number",
            "description": "How many fills, newest first. Up to 200, defaults to 50."
          },
          "before": {
            "type": "string",
            "description": "Cursor from a previous call, to page further back."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "open_public_pool",
      "needsToken": true,
      "description": "Open one of your agents to outside money. Investors buy shares priced on the agent’s own account, so what they hold rises and falls with exactly what it trades. You take a performance fee on the gain and nothing on the loss. It goes to a reviewer before it is listed rather than appearing immediately, and a demo agent is refused because a demo agent is refused every write by the exchange and so cannot trade anybody’s money. Applies once per agent.",
      "arguments": {
        "type": "object",
        "properties": {
          "agentId": {
            "type": "string",
            "description": "The agent to open, from list_agents. Must be a live agent, not demo."
          },
          "feeBps": {
            "type": "number",
            "description": "Your performance fee in basis points, on gains only. 1000 is 10%."
          },
          "lockHours": {
            "type": "number",
            "description": "How long a deposit is locked before it can be withdrawn."
          },
          "minDeposit": {
            "type": "string",
            "description": "Smallest deposit accepted, as a decimal string."
          },
          "description": {
            "type": "string",
            "description": "What the agent does and why somebody would back it. Investors read this."
          }
        },
        "required": [
          "agentId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_pools",
      "needsToken": false,
      "description": "Agent pools open to outside money, with each one’s terms, its agent’s record and what a share is currently worth. Public.",
      "arguments": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "name": "get_pool_position",
      "needsToken": true,
      "description": "Where this holder stands in one pool: shares held, what they are worth, and P&L.",
      "arguments": {
        "type": "object",
        "properties": {
          "poolId": {
            "type": "string",
            "description": "The pool id, from list_pools."
          },
          "accountId": {
            "type": "string",
            "description": "Sub-account to act on. Defaults to the token’s own account."
          }
        },
        "required": [
          "poolId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "exchange_health",
      "needsToken": false,
      "description": "Whether the exchange is up, which markets it is quoting, and how long it has been running. Public. Worth checking first when something else answers strangely.",
      "arguments": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
  ]
}