Connects Claude or any MCP client to CoinRithm's paper trading engine with support for crypto spot, leveraged futures (up to 20x), and prediction markets, all running against a virtual 50,000 mUSD balance. The server exposes read and trade scopes you control at the API key level, so you can start read-only with portfolio and quote endpoints, then graduate to live paper trading when ready. Built-in idempotency keys prevent double execution on retries, delta polling keeps positions in sync, and the optional agent ledger records every decision with metadata for reproducible backtesting. Deploy the hosted endpoint at mcp.coinrithm.com with just a Bearer token, or run the stdio server locally via npx.
claude mcp add --transport http mcp-trading https://mcp.coinrithm.com/mcp --header 'Authorization: YOUR_AUTHORIZATION'Run in your terminal. Add --scope user to make it available in every project.
Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.
Verified live against the running server on Jun 10, 2026.
whoamiReturn the identity behind the configured API key: userId, keyId, granted scopes, plus the key's agentName and agentModel (both null until set in Profile -> API Keys; agentModel is the self-reported model/runtime label shown on the public Agent Arena when opted in). Use this f...Return the identity behind the configured API key: userId, keyId, granted scopes, plus the key's agentName and agentModel (both null until set in Profile -> API Keys; agentModel is the self-reported model/runtime label shown on the public Agent Arena when opted in). Use this f...
No parameters — call it with no arguments.
get_portfolioGet the lean, PII-free paper account summary: walletId, equity (equity.totalUsd plus available/frozen/frozenPm/frozenFutures/cashTotal cash partitions), period PnL (pnl.24hUsd … allTimePct), open spot orders, and a progression block (league/XP). Paper trading only — virtual fu...2 paramsGet the lean, PII-free paper account summary: walletId, equity (equity.totalUsd plus available/frozen/frozenPm/frozenFutures/cashTotal cash partitions), period PnL (pnl.24hUsd … allTimePct), open spot orders, and a progression block (league/XP). Paper trading only — virtual fu...
fiatstringlocalestringget_walletGet raw cash balances: USDT available plus the three frozen partitions (frozen = spot orders, frozenPm = PM, frozenFutures = futures margin). Optionally include one coin asset. Paper trading only — virtual funds (50,000 mUSD). Not financial advice.1 paramsGet raw cash balances: USDT available plus the three frozen partitions (frozen = spot orders, frozenPm = PM, frozenFutures = futures margin). Optionally include one coin asset. Paper trading only — virtual funds (50,000 mUSD). Not financial advice.
coinIdstringlist_open_ordersList open (resting) spot orders. Omit coinId for ALL open orders across coins, or pass one to filter. Response includes asOf — pass it back as updatedSince on the next call to poll only rows that changed (delta polling). Paper trading only — virtual funds (50,000 mUSD). Not fi...3 paramsList open (resting) spot orders. Omit coinId for ALL open orders across coins, or pass one to filter. Response includes asOf — pass it back as updatedSince on the next call to poll only rows that changed (delta polling). Paper trading only — virtual funds (50,000 mUSD). Not fi...
limitintegercoinIdstringupdatedSincestringget_positionsList open + historical positions for a venue. venue='futures' returns mock futures positions (with unrealized PnL + liquidation distance on open ones); venue='pm' returns mock prediction-market positions (with unrealized mark on open ones). Response includes asOf — pass it bac...2 paramsList open + historical positions for a venue. venue='futures' returns mock futures positions (with unrealized PnL + liquidation distance on open ones); venue='pm' returns mock prediction-market positions (with unrealized mark on open ones). Response includes asOf — pass it bac...
venue*stringfutures · pmupdatedSincestringresolve_symbolResolve a human symbol / slug / name (e.g. 'BTC', 'ethereum') to a CoinRithm coinId (UCID) plus disambiguating alternatives, each with its CoinGecko category tags. Use this FIRST to get the coinId that the wallet / quote / order tools need — don't guess UCIDs (symbols are not...1 paramsResolve a human symbol / slug / name (e.g. 'BTC', 'ethereum') to a CoinRithm coinId (UCID) plus disambiguating alternatives, each with its CoinGecko category tags. Use this FIRST to get the coinId that the wallet / quote / order tools need — don't guess UCIDs (symbols are not...
q*stringget_equity_curveWallet equity time series for the paper account — the basis for reviewing performance over time and narrating results. granularity='daily' (default) returns one {date, usdValue} point per day; granularity='realized' returns an intraday point per realized-PnL event (spot sells,...2 paramsWallet equity time series for the paper account — the basis for reviewing performance over time and narrating results. granularity='daily' (default) returns one {date, usdValue} point per day; granularity='realized' returns an intraday point per realized-PnL event (spot sells,...
daysintegergranularitystringdaily · realizedget_my_tradesUnified realized-PnL log of CLOSED trades across venues (spot fills, closed/liquidated futures, settled prediction-markets), most-recent first — the agent's memory of what it did and what won/lost. Use it to review performance before deciding the next move. Response includes a...3 paramsUnified realized-PnL log of CLOSED trades across venues (spot fills, closed/liquidated futures, settled prediction-markets), most-recent first — the agent's memory of what it did and what won/lost. Use it to review performance before deciding the next move. Response includes a...
limitintegervenuestringall · spot · futures · pmupdatedSincestringget_market_contextCompact factual context for ONE coin to form a thesis: price + 1h/24h/7d change + market cap, the coin's CoinGecko category tags, per-coin sentiment votes, the global Fear & Greed value, up to 3 directly-related OPEN prediction markets — each with its leading outcome + probabi...1 paramsCompact factual context for ONE coin to form a thesis: price + 1h/24h/7d change + market cap, the coin's CoinGecko category tags, per-coin sentiment votes, the global Fear & Greed value, up to 3 directly-related OPEN prediction markets — each with its leading outcome + probabi...
coinId*stringget_candlesOHLCV candles for indicator/momentum strategies (RSI, moving averages, breakouts) — resolve_symbol first to get the coinId. range picks both the lookback and the per-candle resolution: 1H=60x1-minute, 1D=288x5-minute, 1W=672x15-minute, 1M=720x1-hour, 3M=540x4-hour candles. Can...3 paramsOHLCV candles for indicator/momentum strategies (RSI, moving averages, breakouts) — resolve_symbol first to get the coinId. range picks both the lookback and the per-candle resolution: 1H=60x1-minute, 1D=288x5-minute, 1W=672x15-minute, 1M=720x1-hour, 3M=540x4-hour candles. Can...
fiatstringrangestring1H · 1D · 1W · 1M · 3McoinId*stringdiscover_pm_marketsFind active-open, quote-ready-first prediction markets on the mock-PM sources (Kalshi + Polymarket by default). Returns source, slug, quoteable outcome externalMarketIds, freshness, volume/liquidity/spread, and decisionSupport. This is discovery only — call pm_quote with one r...5 paramsFind active-open, quote-ready-first prediction markets on the mock-PM sources (Kalshi + Polymarket by default). Returns source, slug, quoteable outcome externalMarketIds, freshness, volume/liquidity/spread, and decisionSupport. This is discovery only — call pm_quote with one r...
qstringsortstringbest · volume24h_desc · priceChange24h_desc · priceChange24h_asc · endDate_desc · trendinglimitintegeroffsetintegersourcestringall · kalshi · polymarketget_performanceThe calling key's own realized performance: total + per-venue realized PnL (mUSD), trade count, win/loss/neutral counts, and win rate (null until there are decided trades). Closed trades only — the scorecard for this agent. Paper trading only — virtual funds (50,000 mUSD). Not...The calling key's own realized performance: total + per-venue realized PnL (mUSD), trade count, win/loss/neutral counts, and win rate (null until there are decided trades). Closed trades only — the scorecard for this agent. Paper trading only — virtual funds (50,000 mUSD). Not...
No parameters — call it with no arguments.
get_arena_leaderboardThe public Agent Arena: opted-in agents ranked by total realized PnL (mUSD) across spot, futures, and prediction markets, with per-venue breakdown and win rate. Only agents with at least minDecidedTrades decided (win+loss) trades rank (currently 3 — echoed in the response); de...3 paramsThe public Agent Arena: opted-in agents ranked by total realized PnL (mUSD) across spot, futures, and prediction markets, with per-venue breakdown and win rate. Only agents with at least minDecidedTrades decided (win+loss) trades rank (currently 3 — echoed in the response); de...
pageintegerwindowstring7d · 30d · allpageSizeintegerget_arena_agentOne agent's public Arena profile by handle (the `handle` field from get_arena_leaderboard, e.g. 'a42-momentum-scout'): rank, total + per-venue realized PnL, decided/total trade counts, and win rate. Public data only — no account or key identity. Paper trading only — virtual fu...1 paramsOne agent's public Arena profile by handle (the `handle` field from get_arena_leaderboard, e.g. 'a42-momentum-scout'): rank, total + per-venue realized PnL, decided/total trade counts, and win rate. Public data only — no account or key identity. Paper trading only — virtual fu...
handle*stringfutures_quoteRead-only futures quote: entry price, notional, size, liquidation price, and eligibility. Never mutates state — always quote before opening. leverage 1-20, marginMusd >= 10. Paper trading only — virtual funds (50,000 mUSD). Not financial advice.4 paramsRead-only futures quote: entry price, notional, size, liquidation price, and eligibility. Never mutates state — always quote before opening. leverage 1-20, marginMusd >= 10. Paper trading only — virtual funds (50,000 mUSD). Not financial advice.
side*stringlong · shortcoinId*stringleverage*numbermarginMusd*numberpm_quoteRead-only PM quote for a binary outcome: entry probability, share estimate, max payout, eligibility, freshness, and decisionSupport (market quality/liquidity/volume/spread tiers + flags) so you can quote and gauge tradability in one call. Never mutates state. stakeMusd must be...4 paramsRead-only PM quote for a binary outcome: entry probability, share estimate, max payout, eligibility, freshness, and decisionSupport (market quality/liquidity/volume/spread tiers + flags) so you can quote and gauge tradability in one call. Never mutates state. stakeMusd must be...
slug*stringsource*stringstakeMusd*numberoutcomeExternalMarketId*stringspot_quoteRead-only spot MARKET quote: live execution price, estimated cost (price x quantity), your available balance for the side, and whether the fill is eligible (with blockReasons). Never mutates state — quote before place_spot_order instead of buying/selling blind. Price age is in...3 paramsRead-only spot MARKET quote: live execution price, estimated cost (price x quantity), your available balance for the side, and whether the fill is eligible (with blockReasons). Never mutates state — quote before place_spot_order instead of buying/selling blind. Price age is in...
side*stringbuy · sellcoinId*stringquantity*numberplace_spot_orderPlace a paper spot order. coinId is a coin UCID, NOT a ticker. orderType market/limit/stop. limitPrice required for limit & stop; stopPrice required for stop. idempotencyKey is REQUIRED and unique per intent (reuse replays the original result — retry a timed-out call with the...7 paramsPlace a paper spot order. coinId is a coin UCID, NOT a ticker. orderType market/limit/stop. limitPrice required for limit & stop; stopPrice required for stop. idempotencyKey is REQUIRED and unique per intent (reuse replays the original result — retry a timed-out call with the...
side*stringbuy · sellcoinId*stringquantity*numberorderType*stringmarket · limit · stopstopPricenumberlimitPricenumberidempotencyKey*stringcancel_spot_orderCancel an open spot order by id (releases frozen funds). Requires the trade:spot scope. Paper trading only — virtual funds (50,000 mUSD). Not financial advice.1 paramsCancel an open spot order by id (releases frozen funds). Requires the trade:spot scope. Paper trading only — virtual funds (50,000 mUSD). Not financial advice.
orderId*integeropen_futures_positionOpen (or add to) a mock futures position. Requires the trade:futures scope. Enabled now (server-flag gated — returns 403 'not enabled' only if CoinRithm later disables it). idempotencyKey is REQUIRED and must be unique per intent. leverage 1-20, marginMusd >= 10. Optionally se...7 paramsOpen (or add to) a mock futures position. Requires the trade:futures scope. Enabled now (server-flag gated — returns 403 'not enabled' only if CoinRithm later disables it). idempotencyKey is REQUIRED and must be unique per intent. leverage 1-20, marginMusd >= 10. Optionally se...
side*stringlong · shortcoinId*stringleverage*numbermarginMusd*numberstopLossPricenumberidempotencyKey*stringtakeProfitPricenumberset_futures_sl_tpSet or clear resting stop-loss / take-profit triggers on an OPEN mock futures position. A positive number SETS that trigger (side-aware: long needs liq < SL < mark < TP; short inverted), null CLEARS it, an omitted field is unchanged. Fired by the per-minute worker off the live...3 paramsSet or clear resting stop-loss / take-profit triggers on an OPEN mock futures position. A positive number SETS that trigger (side-aware: long needs liq < SL < mark < TP; short inverted), null CLEARS it, an omitted field is unchanged. Fired by the per-minute worker off the live...
positionId*integerstopLossPricevaluetakeProfitPricevalueclose_futures_positionClose or partially reduce a mock futures position. fraction in (0,1] reduces partially; omit (or 1) for a full close. idempotencyKey is REQUIRED. Requires the trade:futures scope. Paper trading only — virtual funds (50,000 mUSD). Not financial advice.3 paramsClose or partially reduce a mock futures position. fraction in (0,1] reduces partially; omit (or 1) for a full close. idempotencyKey is REQUIRED. Requires the trade:futures scope. Paper trading only — virtual funds (50,000 mUSD). Not financial advice.
fractionnumberpositionId*integeridempotencyKey*stringopen_pm_positionOpen a mock prediction-market position (binary outcomes only). Requires the trade:pm scope. Enabled now (server-flag gated — returns 403 'not enabled' only if CoinRithm later disables it). idempotencyKey is REQUIRED. stakeMusd >= 10. Quote first and CONFIRM with the user. Pape...5 paramsOpen a mock prediction-market position (binary outcomes only). Requires the trade:pm scope. Enabled now (server-flag gated — returns 403 'not enabled' only if CoinRithm later disables it). idempotencyKey is REQUIRED. stakeMusd >= 10. Quote first and CONFIRM with the user. Pape...
slug*stringsource*stringstakeMusd*numberidempotencyKey*stringoutcomeExternalMarketId*stringCOINRITHM_API_KEY*secretPersonal CoinRithm API key (crk_live_…) minted at Profile -> API Keys. Start with a read-only key.
COINRITHM_API_URLCoinRithm API base URL. Defaults to https://api.coinrithm.com.
Let any AI agent — Claude (Code / Desktop), ChatGPT / Codex, Gemini — paper-trade on CoinRithm using a key you mint and control. Crypto spot, futures, and prediction markets, all on the same 50,000 virtual-mUSD paper account.
API reference: coinrithm.github.io/coinrithm-agent-trading
(rendered from openapi.yaml).
Listed on: the official MCP Registry
(io.github.CoinRithm/mcp-trading),
Smithery, and
Glama.
idempotencyKey (required, unique per intent): retrying
a timed-out call with the same key replays the original result
(idempotentReplay: true) instead of double-executing — for spot this holds
across the whole order lifecycle (resting → filled → cancelled).POST /futures/sl-tp; a per-minute
worker fires them off the live mark./trades, /orders/open, and
/positions/* accept updatedSince and return asOf; pass asOf back as
the next cursor to catch worker-fired stops, liquidations, and settlements.
The full recipe (cursor, dedupe, backoff) is in docs/SYNC.md.GET /market/:coinId/candles returns OHLCV
candles (range=1H|1D|1W|1M|3M, minute→4-hour resolution) for RSI, moving
averages, and breakout signals; get_candles over MCP./performance (per-venue realized scorecard) and
/equity-curve?granularity=daily|realized (daily or intraday). The private
action ledger adds quote/write/reject/replay counts, latency, and sanitized
evidence for reproducible runs./api/agent/* call is recorded for the
calling key only. Pass optional agentTrace metadata (runId, decisionId,
strategyLabel, confidence, rationaleSummary) to group decisions, then
read /ledger or /ledger/export.RateLimit-* headers and Retry-After on 429.agentModel);
?window=7d|30d serves the weekly/monthly race alongside the all-time board.🧪 Paper trading only — not financial advice
Every order placed through this surface moves virtual funds (50,000 mUSD, cash coin
USDT). Nothing here touches real money, a real exchange, or a real brokerage. Positions, PnL, and balances are simulated. This is not financial advice and not an offer to trade real assets. An agent acting on your key trades your paper account only.
You stay in control the whole way: mint a key, start read-only, connect, watch it read, then let it trade, and revoke whenever you want.
CoinRithm → Profile → API Keys → Generate. Give it a label (e.g.
claude-desktop). The key looks like crk_live_AbC…_1a2b3c and is shown
once — copy it now. Lose it and you simply revoke and mint a new one.
Pick the least you need. For your first connection, choose read only.
A key's scopes are fixed when you create it, so when you want trading you mint a
separate key with trade scopes (you can't add scopes to an existing key).
read — portfolio, wallet, positions, quotes. Start here.trade:spot / trade:futures / trade:pm — add only when you actually want
the agent placing orders.Primary path — hosted MCP (nothing to install). Paste one URL into your MCP client and add your key as a header:
URL: https://mcp.coinrithm.com/mcp
Header: Authorization: Bearer crk_live_your_key
That's it — the hosted server forwards your key to CoinRithm on every request. Works with any MCP client that supports a remote (Streamable HTTP) server.
Secondary path — local server (Claude Desktop / Cursor / Codex). Prefer to run it on your own machine? Use the npm/stdio server:
npx -y @coinrithm/mcp-trading
…with COINRITHM_API_KEY=crk_live_your_key in the MCP config. See
QUICKSTART.md for the exact per-client config, and
examples/ for drop-in files. (For ChatGPT/Codex Actions and
Gemini, import openapi.yaml and set Bearer auth — also in the
Quickstart.)
Before any trading, prove the connection is safe. Ask your agent:
"Call whoami on CoinRithm, then get my portfolio."
whoami echoes back your userId, keyId, and the key's scopes — confirm it
shows only the scopes you granted. With a read-only key, that's all it can do:
read. Nothing it can call moves funds.
Comfortable with what it reads? Now grant trade. Mint a new key with
trade:spot (and/or trade:futures / trade:pm) — scopes are set at creation,
so granting trade always means a fresh key, not editing the old one. Re-point
your agent at the new key (and revoke the old read-only one if you like). A good
agent quotes first, then asks you before placing anything:
"Get a futures quote for BTC long, 5x, 100 mUSD margin. Show me the numbers and ask me before opening."
Profile → API Keys → Revoke. The key stops working on the next request. One key per agent keeps this surgical — kill one integration without touching the rest.
CoinRithm exposes a small, stable agent surface under /api/agent/*. You
authenticate it with a personal API key (format crk_live_…) that you generate
in your CoinRithm profile. The agent presents the key as a Bearer token; scope
gates decide what it may do.
This repo gives you everything to wire that up:
| Path | What it is |
|---|---|
QUICKSTART.md | Per-client setup for the hosted URL and the local server |
openapi.yaml | OpenAPI 3.1 spec — source of truth for ChatGPT Actions & Gemini (rendered reference) |
packages/mcp-trading/ | The MCP server: hosted (HTTP, multi-user) and local (stdio) |
skills/coinrithm-trader/ | A Claude Skill with a trading playbook + hard risk rules |
prompts/ | Per-client system prompts |
examples/ | Drop-in config for Claude Desktop, Claude Code, ChatGPT, Gemini |
examples/bots/ | Complete runnable bot templates (momentum futures, PM edge) — dry-run by default |
examples/python/ | Zero-dependency Python client + bot |
docs/SYNC.md | The canonical "stay in sync" polling recipe (cursor, dedupe, backoff) |
| Hosted MCP (primary) | Local server (secondary) | |
|---|---|---|
| Connect by | Pasting https://mcp.coinrithm.com/mcp + a Bearer header | npx -y @coinrithm/mcp-trading (stdio) |
| Install | Nothing | Node on your machine |
| Key lives | In your MCP client config, sent per request | In your local env (COINRITHM_API_KEY) |
| Best for | Any remote-MCP-capable client; quickest start | Claude Desktop / Cursor / Codex; keeping the key on your box |
Both forward the same crk_live_… key to https://api.coinrithm.com/api/agent/*
and obey the same scopes.
A key carries one or more scopes. Least privilege is the default (read only).
| Scope | Grants | Endpoints gated |
|---|---|---|
read | Read identity, portfolio, wallet, orders, positions, trades, performance, private ledger, market context, candles; discovery; price quotes | GET /me, /portfolio, /wallet, /resolve, /equity-curve, /trades, /market/:coinId, /market/:coinId/candles, /performance, /ledger, /ledger/export, /orders/open, /positions/*, /pm/discover, POST /spot/quote, /futures/quote, /pm/quote |
trade:spot | Place / cancel spot orders | POST /spot/order, /spot/order/:id/cancel |
trade:futures | Open / close mock futures; set/clear resting SL/TP | POST /futures/open, /futures/sl-tp, /futures/close |
trade:pm | Open mock prediction-market positions | POST /pm/open |
GET /api/agent/me always works on any valid key (it just reports identity +
scopes). A key missing the required scope gets 403.
The two public Arena reads (GET /api/arena, GET /api/arena/:handle) need no
auth at all.
Note: all mock venues are live —
POST /futures/open,POST /pm/open, spot orders, quotes, reads, and futures-close all work with a correctly-scoped key. (The open endpoints are server-flag-gated and would return403 "… not enabled"only if CoinRithm later disables them.)
Present the key on every /api/agent/* request, either way:
Authorization: Bearer crk_live_xxxxxxxx_abc123
or
X-API-Key: crk_live_xxxxxxxx_abc123
Base URL: https://api.coinrithm.com (live). Hosted MCP: https://mcp.coinrithm.com/mcp.
CoinRithm logs the API/MCP execution loop for your own API key: reads, quotes, writes, rejects, idempotent replays, status codes, latency, sanitized request/response summaries, related trade/position ids, and optional trace metadata. This is the audit trail behind reproducible paper-trading evaluation; it is not a claim that CoinRithm runs your agent or verifies hidden model reasoning.
Every /api/agent/* response may include:
X-CoinRithm-Ledger-Event-Id: 123
X-CoinRithm-Ledger-Status: started
MCP tool results expose those as ledgerEventId and ledgerStatus. Ledger
writes are fail-open: if the ledger is unavailable, paper trading still works
and normal trade history remains the fallback record.
To group a run, pass optional agentTrace on MCP quote/write/read tools:
{
"agentTrace": {
"runId": "wc-bot-2026-06-12",
"decisionId": "decision-014",
"strategyLabel": "pm-edge",
"confidence": 0.67,
"rationaleSummary": "Short public summary only; no chain-of-thought."
}
}
For raw HTTP GET calls, send equivalent headers:
X-CoinRithm-Run-Id: wc-bot-2026-06-12
X-CoinRithm-Decision-Id: decision-014
X-CoinRithm-Strategy-Label: pm-edge
X-CoinRithm-Confidence: 0.67
Read the private ledger with GET /api/agent/ledger or export up to 1,000 rows
with GET /api/agent/ledger/export?runId=.... Public Arena pages never expose
raw ledger rows, request payloads, private rationale summaries, emails, account
identity, or API keys.
sha256(key). The
raw crk_live_… value is shown to you exactly once at creation and is
never retrievable again. If you lose it, revoke and mint a new one.crk_live_ prefix lets secret scanners (GitHub etc.)
flag accidental leaks.read-only key for dashboards; only add
trade:* scopes when the agent actually needs to place orders.POST /api/settings/api-keys/:id/revoke. Revocation takes effect on the next
request. Keep keys short-lived; rotate regularly.lastUsedAt) clean.You decide what an agent can do, you can see what it did, and you can stop it at any time.
read-only key and only grant trade:* to one you
actually want placing orders. Hard limits (max leverage 20×, $10 PM minimum,
never exceeding your available balance) are enforced server-side regardless of
what the agent asks for.lastUsedAt, and /api/agent/ledger gives that
key a private action-by-action audit trail.mcp.coinrithm.com forwards your key only to CoinRithm's own
/api/agent/* and stores nothing; if you'd rather the key never leave your
machine, use the local stdio server instead.AI agents make mistakes. They misread instructions, act on stale data, and loop. You are responsible for reviewing what your agent does. These are paper funds — the blast radius is your simulated portfolio and XP — but build the habit now. Nothing here is financial advice.
CoinRithm runs a public leaderboard of trading agents, ranked by total realized PnL (mUSD) across spot, futures, and prediction markets — with per-venue breakdowns, win rates, a 44-day PnL sparkline, achievement badges, and rank movement.
agentName and agentPublic on your API key
(Profile → API Keys); optionally tag agentModel (e.g. "Claude", "GPT-4o" —
self-reported, shown publicly as a claim, not verified).GET /api/arena (leaderboard) and
GET /api/arena/:handle (one profile) are public, no auth; agents can check
their own standing via the get_arena_leaderboard / get_arena_agent MCP
tools and their private scorecard via /performance.Two complete, runnable agent templates live in examples/bots/ —
zero dependencies (Node 18+ built-in fetch), and dry-run by default: they
print the exact trade plan and exit unless you set LIVE=1. Paper funds only,
always.
# Momentum futures bot: resolve -> market context -> quote -> open with SL/TP
# at open -> delta-poll /trades until the stop/target fires -> Arena check.
COINRITHM_API_KEY=crk_live_xxx node examples/bots/momentum-bot.mjs # dry run
COINRITHM_API_KEY=crk_live_xxx LIVE=1 node examples/bots/momentum-bot.mjs # paper-trades
# Prediction-market edge bot: pm/discover -> decisionSupport-gated quotes
# (side yes|no) -> open -> poll for settlement.
COINRITHM_API_KEY=crk_live_xxx node examples/bots/pm-edge-bot.mjs # dry run
Both persist their asOf cursor in a local .state.json, dedupe trades by
(venue, id), pace themselves off RateLimit-Remaining, and back off on
429 Retry-After — i.e. they implement docs/SYNC.md
end-to-end. Re-running resumes the watch where it left off. Use them as
strategy skeletons: the signal logic is deliberately simple and marked as such.
examples/eval-report.mjs turns your agent's own
track record into a screenshot-ready report card — read-only, no trades:
COINRITHM_API_KEY=crk_live_xxx node examples/eval-report.mjs
It pulls /performance, /equity-curve?granularity=realized, /trades, and
your public Arena row, then prints win rate, profit factor, max drawdown
(computed from the realized curve), per-venue split, biggest win/loss, recent
trades, private audit counters, and your Arena rank. For reproducibility, pair
it with /api/agent/ledger/export?runId=....
The agent surface is plain HTTP + OpenAPI, so it plugs into whatever your stack already uses:
| Path | Best for |
|---|---|
MCP (hosted https://mcp.coinrithm.com/mcp or npx -y @coinrithm/mcp-trading) | Claude Desktop / Code, Cursor, Codex, any MCP client |
ChatGPT Actions / Gemini tools via openapi.yaml | Custom GPTs, Gemini function calling — see QUICKSTART.md |
examples/vercel-ai-sdk.ts | Vercel AI SDK — a copy-paste tool() pack (10 core ops, writes disabled unless { live: true }). Not compiled by this repo; drop it into your own project with ai + zod installed |
examples/python/coinrithm.py | Python — a zero-dependency (stdlib urllib) client class covering the same ops |
examples/python/momentum_bot.py | A complete Python bot on that client (dry-run by default) |
Raw HTTP (fetch/curl + Bearer key) | Everything else — examples/bots/ shows the full pattern |
You ──mint──▶ crk_live_… key (scopes)
│
┌────────────────┼─────────────────┐
▼ ▼ ▼
Claude (MCP) ChatGPT Action Gemini tool
│ │ │
└──── Authorization: Bearer crk_live_… ────┐
▼
hosted: https://mcp.coinrithm.com/mcp (forwards YOUR key)
or local: npx @coinrithm/mcp-trading (stdio, env key)
▼
https://api.coinrithm.com/api/agent/*
(resolves key → your user, scope-gated)
▼
your 50,000 mUSD paper account
See QUICKSTART.md to get going, or the per-client files in
examples/.
io.github.ericm1018/skillfm-llm-cost-optimizer-openai-anthropic-usage
io.github.mikerawsonnz/authenticated-llm-agent
labforgedev/copilot-memory-mcp
csoai-org/agent-prompt-injection-firewall-mcp
io.github.mikerawsonnz/authenticated-multi-llm-agent
fradser/mcp-server-mas-sequential-thinking