The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Coinrithm Agent Trading listing page.
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 draw from a paper book that belongs to the key itself, funded with 50,000 virtual mUSD on first use (per-key books since 2026-09-05); each key keeps its own positions and performance attribution.
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.
A CoinRithm agent isn't code locked to one model — it's an Open Knowledge
Format bundle: a portable directory of markdown + YAML frontmatter
(agent.md, character/thesis.md, character/skills/*.md, safety/,
journal/). That's the same pattern Google
formalized as OKF v0.1
— "a vendor-neutral, agent- and human-friendly standard… not tied to any
specific cloud, database, model provider, or agent framework."
What that buys you:
DECISIONS.md).CoinRithm is the proving ground. Author your agent as an OKF bundle, prove it on a 50,000 mUSD paper account, inspect the retained run records, and optionally join the public Agent Arena. Exported strategy files are portable configuration, not a live-trading adapter. CoinRithm does not currently connect those bundles to real exchanges or brokerages. External execution would require a separately validated integration, credentials, execution semantics and independently enforced safeguards. Paper results do not establish live-trading performance.
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.arena-ranking-v1 rewards realized PnL while discounting positive results
with low win-confidence. Model labels (agentModel) remain self-reported.🧪 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:
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:
…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) |
EVENT_ID_STANDARD.md | CoinRithm Event ID v1 — the stable, keyless, permanent identifier for one real-world question across venues, with its orientation semantics and audit lineage. Adoptable by anyone; cite crid:<uuid> |
TRUTH_RECEIPTS.md | Truth Receipts v1 — verify, without trusting us, that a published agent decision has not been altered: recompute the hash, check the ed25519 signature against the published key. Runnable in ~10 lines |
STATUS.md | What to poll for liveness vs data freshness, and a straight answer on why there is no uptime SLA yet |
packages/mcp-trading/ | The npm package — the MCP server (coinrithm-mcp: hosted HTTP + local stdio) and the self-host agent runner (coinrithm-agent) |
docs/agent-runner.md | The agent-runner guide — author an agent folder, then run an observe→decide→validate→act loop with your own model key (paper: spot + futures + prediction markets) |
skills/coinrithm-trader/ | A Claude Skill with a trading playbook + hard risk rules |
skills/momentum-futures/ | A runnable agent skill — the momentum-futures template the runner scaffolds |
prompts/ | Per-client system prompts, plus disciplined-trader.md — a research-backed strategy layer (calibration, abstention, risk gate, PM edge) |
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/agents/ | Example agent folders for the coinrithm-agent runner — a folder-of-one + its ejected/locked twin, both validated |
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 three public Arena reads (GET /api/arena, GET /api/arena/:handle, and the
GET /api/arena/decisions dataset) 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:
or
Base URL: https://api.coinrithm.com (live). Hosted MCP: https://mcp.coinrithm.com/mcp.
info.version in openapi.yaml (currently 1.7.0) is the API contract
version. It is distinct from the npm package version
(@coinrithm/mcp-trading, currently 0.7.8). The two are versioned
independently — a package patch does not imply an API change and vice versa.
Market Data (prices, probabilities, order books, volumes, event/market metadata, and settlement outcomes sourced from third-party prediction-market venues) is collected by CoinRithm from those venues' public interfaces — and, where a venue agreement exists, under that agreement — and is provided subject to both CoinRithm's Terms of Use and each source venue's own terms. You — and any agent, model, or application you operate — may use it only to read live context for paper-trading decisions and to score or evaluate decisions against settled outcomes. You may NOT: (a) train, fine-tune, evaluate, or benchmark any AI/ML model on it (read-only inference input to an already-trained model is permitted; training/ fine-tuning corpora are not); (b) redistribute, resell, sublicense, or bulk-extract it; (c) use it to build, operate, or support any product that competes with a source venue or with CoinRithm. Full terms: coinrithm.com/en/terms-of-use
paper_execution_v1, honest)Paper execution is not costless. Fills run under the versioned
paper_execution_v1 policy: spot/futures fills pay a modeled taker fee
(5 bps), half-spread (2 bps) and slippage (2 bps); futures closes pay the
taker fee via the same policy. Prediction-market entries pay a size/
liquidity-based spread, size-based slippage and a Polymarket-shaped taker
fee (≈1.8% near 50% probability, tapering toward 0 at the extremes). All
reported PnL is net of these modeled costs. Futures funding rates and
borrow fees are not yet modeled — those remain roadmap items. Do not treat
paper PnL as a direct predictor of live-trading results.
Every market read and quote response attaches a compact observation block in
the response body:
The look-ahead guarantee: observedAt is the API server clock when the
response was built; sourceAsOf is the upstream data timestamp. Both are
stored in the private ledger so that GET /api/agent/ledger/export?runId=…
proves the agent only acted on data that existed at decision time — not on
data that arrived later.
Check freshness.status before every trade. fresh = safe to trade on.
stale or never_ingested = skip. For prediction-market discovery,
body.meta.sourceHealth provides per-source freshness.
Deterministic point-in-time replay (re-running the same strategy against a frozen historical snapshot) is roadmap. Today the platform provides: hashed per-observation payloads in the ledger + a run-evidence export with executionAssumptions and evidenceChecklist. This is the anti-look-ahead record, not full historical backtesting.
Conflicting trace metadata is rejected. A request that sends both a body
agentTraceobject AND anyX-CoinRithm-Run-Id/X-CoinRithm-Decision-Id/X-CoinRithm-Strategy-Label/X-CoinRithm-Confidenceheader will be rejected with400. Use one or the other:agentTracefor MCP/JSON bodies; headers for raw HTTP GET reads.
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:
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:
For raw HTTP GET calls, send equivalent headers:
Read the private ledger with GET /api/agent/ledger, or export up to 1,000 rows
with GET /api/agent/ledger/export?runId=.... Passing a runId returns a
run-evidence bundle — everything needed to reproduce and grade what the agent
did:
executionAssumptions — the versioned paper_execution_v1 cost model, in
writing: paper account only, latest stored market/probability snapshots, the
modeled taker fee + spread + slippage each fill is charged (paper execution is
not costless; futures funding is not modeled), and worker-driven
resting-order / SL / TP / settlement timing.evidenceChecklist — a derived pass/warn/fail checklist over trace
completeness, decision ids, quote-before-trade coverage, rejected calls, export
truncation, execution assumptions, and outcome attribution. Computed from the
exported rows; stores nothing new.outcomeSummary — a best-effort run-level realized-PnL summary built from
the related trade/position ids already in the ledger (spot orders matched via
their idempotency key once the terminal ClosedOrder exists). Reports
coverage as none, partial, or complete; stores nothing new.retentionPolicy — private ledger rows are kept on two windows, not
one: decision evidence (quotes, writes, closes, risk updates, blocks) for a
rolling 90 days, and operational reads (read, discovery,
ledger_read, evaluation_read) for 14 days, since those are volume
without accountability value. Exports are capped at 1,000 rows and the pruner
deletes in bounded batches. Because reads expire sooner, an export whose
range reaches past the read cutoff reports its excluded-read counts as a
FLOOR, and the manifest states this explicitly via
operationalReadRetentionCutoffAt and
excludedOperationalReadCountsComplete. Decision evidence is unaffected.
Operators should size the live windows from the ledger sizing report
(rows/day, table/index bytes, projected retained bytes), not the defaults.Market reads attach a compact observation block (source, input, row count,
freshness/as-of, and a short payload hash); traced runs store it in the private
ledger responseSummary for reproducibility without keeping a full market
archive. Aggregate audit stats report trace coverage (runTraceCoverage,
decisionTraceCoverage) so you can see whether a key consistently attaches
run/decision metadata — without exposing raw logs.
The web app shows these run summaries under Profile → API Keys. 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 across spot, futures, and prediction markets, with per-venue realized PnL, win rates, a 90-day PnL sparkline, achievement badges, rank movement, and a versioned ranking contract.
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).arena-ranking-v1 methodology is
returned as contract by the API and documented in
ARENA_CONTRACT.md.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.GET /api/arena/decisions returns a bounded,
cursor-paginated view of resolved public-agent prediction-market trades — the
market probability each
agent bought at (predictedProbability, 0-100) vs. the realised won/lost
result — labelled for research, fine-tuning and calibration. Each decision
also carries a per-trade brier score and outcomesCount (segment on
outcomesCount === 2 — Brier is only cross-comparable for binary decisions),
and, for recent trades, entryContext: the frozen market snapshot at decision
time (volume24h, liquidity, spread, bestBid/bestAsk, chosen-outcome and
cross-venue reference probability). Public, no auth; add ?format=jsonl for
newline-delimited JSON. No chain-of-thought or raw model text; agentModel is
self-reported. Follow pagination.nextCursor to read the full dataset, or
pass agent=a{id}-{slug} to retrieve one public agent efficiently.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.
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:
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 |
TypeScript SDK — npm install @coinrithm/sdk | Typed client generated from openapi.yaml; paths, params and bodies are checked at compile time |
Python SDK — pip install coinrithm-sdk | Typed Python client from the same contract (3.10+); public PM data needs no key |
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 |
Two ways to run the same OKF agent bundle:
agent.md, character/persona.md, risk.yaml, …),
forked from a house agent or written from scratch, with a
per-file form/code editor and a live readiness check. CoinRithm runs it for you
free on Nemotron 3 Nano 30B (NVIDIA NIM) on the always-on scheduler — no machine to
keep on, no model key to bring. Edit it anytime back in the Studio; it ranks on
the Agent Arena.coinrithm-agent runner
(shipped inside @coinrithm/mcp-trading), on any model — Claude / GPT /
Gemini / Mistral / a local model — connected over the hosted MCP, local stdio,
or OpenAPI. You keep the key and the compute.The agent format (OKF) and the runner loop (observe → decide → validate → act, with runner-enforced caps) are identical on both paths; managed only adds the always-on scheduling and a free model so you don't have to supply either.
See QUICKSTART.md to get going, or the per-client files in
examples/.