canli-mcp / Paper market

How can AI agents trade against each other without real money?

canli-mcp's exchange_run runs a closed paper market with order books, margin and forced selling, where market makers, value traders, momentum traders and your own agents trade made-up money. In this recorded run of 200 steps there were 5,178 trades, and the first asset's worst price move was -26.23% while its true value was cut 10%.

Price: $0 to run. Updated 2026-11-02. Free and MIT-licensed, with no account and no API key. Or run claude mcp add canli -- npx -y canli-mcp in Claude Code.

Ask it

Run a paper market with market makers, value and momentum traders, and a 10% fall in true value halfway.

The agent finds the tool through canli-mcp's find_tool and runs it through run_tool. This is the call:

{
  "name": "exchange_run",
  "arguments": {
    "seed": 7,
    "assets": 2,
    "personas": {
      "market_maker": 2,
      "value": 3,
      "momentum": 3,
      "noise": 4,
      "deleverager": 1
    },
    "steps": 200,
    "shocks": [
      {
        "step": 100,
        "kind": "value",
        "percent": -10
      }
    ]
  }
}

What came back

Recorded from canli-mcp 0.16.1 on 2026-11-02, with no API key set. The model read 1,923 characters.

What exchange_run returned: who, every row
whoagentsgaingain per agentforced salestradesabout
value312650242167.401958
market_maker23675.551837.7704735
stop_loss47160.531790.130223
noise4-13069-3267.260695
momentum3-23989.1-7996.370742
deleverager1-22012.1-22012.10616
levered_long4-142188-35547.101387
The result exchange_run sent back, in full form
{
  "ref": "r2",
  "steps": 200,
  "seed": 7,
  "trades": 5178,
  "tape_hash": "a597c9eb5c85ce8012ffdf03ca6907a707d850256a4c00e70bc2a2487bcff72c",
  "assets": [
    {
      "asset": "ART1",
      "last": 42.21,
      "true_value": 43.37,
      "worst_fall_percent": -26.23,
      "worst_fall_from_step": 60,
      "worst_fall_to_step": 200,
      "steps_to_recover_to_within_5_percent": "not within this run",
      "median_spread": 0.16,
      "widest_spread": 0.49,
      "thinnest_book": 0,
      "usual_book": 169
    },
    {
      "asset": "ART2",
      "last": 57.12,
      "true_value": 56.62,
      "worst_fall_percent": -17.87,
      "worst_fall_from_step": 103,
      "worst_fall_to_step": 138,
      "steps_to_recover_to_within_5_percent": "not within this run",
      "median_spread": 0.18,
      "widest_spread": 0.59,
      "thinnest_book": 0,
      "usual_book": 178
    }
  ],
  "who": {
    "columns": [
      "who",
      "agents",
      "gain",
      "gain_per_agent",
      "forced_sales",
      "trades",
      "…"
    ],
    "rows": [
      [
        "value",
        3,
        126502,
        42167.4,
        0,
        1958,
        "…"
      ],
      [
        "market_maker",
        2,
        3675.55,
        1837.77,
        0,
        4735,
        "…"
      ],
      [
        "stop_loss",
        4,
        7160.53,
        1790.13,
        0,
        223,
        "…"
      ],
      [
        "noise",
        4,
        -13069,
        -3267.26,
        0,
        695,
        "…"
      ],
      [
        "momentum",
        3,
        -23989.1,
        -7996.37,
        0,
        742,
        "…"
      ],
      [
        "deleverager",
        1,
        -22012.1,
        -22012.1,
        0,
        616,
        "…"
      ],
      "…"
    ]
  },
  "cascades": {
    "forced_share_of_volume_percent": 0,
    "accounts_forced_at_the_worst_step": 0,
    "longest_chain_in_one_step": 0,
    "steps_with_forced_sales": 0
  },
  "orders_refused_by_the_margin_rule": 10,
  "how_to_check": "The tape_hash chains every trade. Rerun with the same seed, personas, shocks and joined agents' orders and the hash must match.",
  "limits": [
    "Paper only: made-up assets and made-up money. Nothing here represents or can reach a real security, token or currency.",
    "A simulated market leaves out most of what moves real ones: no real news, no real funding, no real people. It shows how a set of rules can b…",
    "Personas are simple scripts with parameters someone chose. Different parameters give different cascades, so a result here is a question to a…"
  ]
}

Prices, filings and statistics are as the sources published them on that day; run the call again for today's. Nothing here is investment advice.

The tools behind the answer

From canli-mcp's tool index
ToolPackWhat it does
exchange_runbacktestRun a whole paper exchange of scripted traders in one call and report it: for comparing set-ups, such as how much leverage turns a shock into a cascade. A simulation, not a forecast.

Add canli-mcp

Claude Code
claude mcp add canli -- npx -y canli-mcp
Cursor, Claude Desktop or any MCP client
{ "mcpServers": { "canli": { "command": "npx", "args": ["-y", "canli-mcp"] } } }
claude.ai, ChatGPT or any client that takes a URL
https://canlicapital.com/mcp/canli

Everything canli-mcp does · How it compares with other finance MCP servers

Related questions