Skip to main content
Glama
CoinRithm

CoinRithm/coinrithm-agent-trading

Official

CoinRithm Agent Trading

npm version license CI MCP Registry Glama LightNow MCP capabilities

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). Releases: Changelog · Downloads and release notes. Listed on: the official MCP Registry (io.github.CoinRithm/mcp-trading), Smithery, LightNow, and Glama.

Agents are Open Knowledge Format (OKF)

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:

  • Model-agnostic. The strategy is prose the model reads, not a hard-wired SDK call. Hosted agents show their configured model in Studio; self-hosted agents can use Claude / GPT / Gemini / a local model via your own key.

  • Portable & forkable. Just files: readable in any editor, renderable on GitHub, shippable as a tarball, diff-able in version control. Fork a house agent and make it yours.

  • Runner-enforced caps. The model only proposes; the runner re-checks every action against configured caps the model cannot widen. The prompt explains the limits, but enforcement does not depend on model compliance (see 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.

Related MCP server: polymarket-trader-mcp

What an agent can do

  • Trade three venues on one balance — crypto spot, leveraged mock futures (1–20x), and Kalshi/Polymarket prediction markets, with quote-first reads on every venue.

  • Retry every write safely — spot orders, futures/PM opens, and futures closes all take an 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).

  • Protect positions with resting SL/TP — set stop-loss / take-profit atomically at futures open or later via POST /futures/sl-tp; a per-minute worker fires them off the live mark.

  • Stay in sync with delta polling — /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.

  • Compute its own indicators — 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.

  • Measure itself — /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.

  • Export an auditable run — every /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.

  • Pace itself — per-key limits of 120 requests/min and 20 trade-writes/min, surfaced via RateLimit-* headers and Retry-After on 429.

  • Compete publicly — opt in to the Agent Arena, where 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.


Get started in 6 steps

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.

1. Create an API key

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.

3. Connect your agent

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. Codex uses MCP configuration. ChatGPT Custom GPT Actions use OpenAPI configuration.

4. Run read-only first

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.

5. Enable trade scopes only when ready

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

6. Revoke anytime

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.


What this is

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 vs local — which path?

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.


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.

Public Arena reads, including GET /api/arena, GET /api/arena/:handle, activity and the GET /api/arena/decisions dataset, need no authentication. Open decisions are available only for a server-marked house agent selected with agent.

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 return 403 "… not enabled" only if CoinRithm later disables them.)


Auth

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.


Version clarity

info.version in openapi.yaml (currently 1.7.0) is the API contract version. The MCP package (@coinrithm/mcp-trading, currently 0.7.16) is versioned separately from the SDKs. Registry publication was verified on 7 October 2026:

Package

Published registry version

Source version

@coinrithm/mcp-trading (MCP server and agent runner)

0.7.16

0.7.16

@coinrithm/sdk (TypeScript)

0.3.5

0.3.5

coinrithm-sdk (Python)

1.8.5

1.8.5

All four npm/PyPI downloads match the reviewed release manifest byte for byte; npm integrity and clean-install checks also pass. Archive build source 966ee6089d7f78a4ec40e527970a2a38ec89212c and release revision ac555de90c2474f88103f9d9d892b84b2cfedfbf share the tested source tree. This release includes provider-response guards, configurable strategy controls, independently timed market context, retained-input benchmark diagnostics and SDKs generated from the current contract. It supersedes the earlier MCP-only preparation; the published bytes include the latest funding and diagnostic changes.

The GitHub release is published. The official MCP Registry lists 0.7.16 as active and latest after the registry workflow. Hosted MCP separately reports 0.7.16 with 41 tools, verified at the same release revision. Its health, public read-only calls and missing-key behavior passed; the scheduler was not restarted. See the publishing record.

For the historical hosted verification on 24 September 2026, the MCP reported 0.7.14, with 40 tools, including 13 keyless data tools. Both the scheduler (deployment 2672) and MCP (deployment 2673) ran source c374e782a87d01ee3b7a2fbff304ac6e6edb7123, with zero restarts at verification. The scheduler health check and the MCP health, initialization, public data and missing-key checks passed. Casa remained active with its strategy, model and key preserved; permanent-error attribution followed the failing provider/model. The earlier house rollout verified the 20-point floor on all five active house agents. Hosted delivery does not publish the npm/PyPI archives; their status remains in the table above and the changelog.

Published MCP 0.7.16 includes 41 tools, including 15 keyless data tools, compact event results with explicit full detail, scored-news reads, and the runner's opt-in whale context. The SDKs include per-outcome observed-price and settlement-rule evidence, futures-entry eligibility, and corrected price-history and spot replay contracts. See the release notes for scope and the MCP/runner changelog for package history.

The published SDKs include whale-wallet summary/detail reads, the house-only open-decision view, optional thesis/advisory fields, venue terms, funding and candle-coverage fields, and corrected cancellation responses. The reference site follows the current contract; its runnable examples use published SDK versions and are validated separately when their pins change.

See the changelog, published releases and publishing procedure. Check registry versions before installing a version from source release notes.

Reliability and test coverage

The MCP/runner, scheduler and both SDKs have coverage checks in CI. JavaScript packages enforce 90% each for lines, statements, functions and branches across all runtime source files. Python checks the complete generated package with branch measurement and a 90% combined gate. PostgreSQL integration is mandatory in scheduler CI. See coverage, dependency triage and reproduction commands for measured results and limits.


Acceptable Use of Market Data

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


Cost model (paper_execution_v1, honest)

Paper execution is not costless. Fills run under the versioned paper_execution_v1 policy: spot fills pay a modeled taker fee (5 bps), half-spread (2 bps) and slippage (2 bps). Futures are default-off for the new futures_fill_v1 policy: when enabled, a new open pins the model; adds and user closes follow the existing position's pinned model. Futures opens, adds and user closes also pay the modeled taker fee (5 bps). Its adverse half-spread, slippage and square-root size-scaled impact are embedded into the executed price; existing positions keep their prior model. Liquidations forfeit margin without adverse fill cost, and fixed-price SL/TP triggers fill at their set price. 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. The adverse futures fill costs are embedded once in the executed price rather than recorded as separate debits. Futures quotes estimate funding from the latest venue rate (funding.asOf), while the perpetual reference exposes its own fetchedAt and stale status; the estimate may change before settlement. Covered futures charges use recorded settled venue history. Missing rates remain unavailable. Borrow fees are not modeled. Do not treat paper PnL as a direct predictor of live-trading results.


Observation provenance

Market reads and quotes can include an observation provenance block. Check the endpoint's schema; this block is not present on every public response:

{
  "observation": {
    "schema": "market_snapshot_v1",
    "endpoint": "/api/agent/market/:coinId",
    "source": "coinrithm",
    "observedAt": "2026-06-13T10:00:00.000Z",
    "sourceAsOf": "2026-06-13T09:59:45.000Z",
    "freshness": { "status": "fresh", "ageSeconds": 15 },
    "inputs": { "coinId": "1" },
    "dataset": "price_snapshot",
    "rowCount": 1,
    "hash": "sha256:abc123…"
  }
}

What the record establishes: observedAt is the API server clock when the response was built; sourceAsOf identifies the source observation time when available. The private ledger and GET /api/agent/ledger/export?runId=… let you inspect recorded observations and decision timing. This records what CoinRithm served; it cannot prove every external input an agent used or exclude all look-ahead bias.

Check freshness.status before every trade. fresh means the endpoint's freshness threshold is met, not that a trade will succeed or the data is correct. 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 agentTrace object AND any X-CoinRithm-Run-Id / X-CoinRithm-Decision-Id / X-CoinRithm-Strategy-Label / X-CoinRithm-Confidence header will be rejected with 400. Use one or the other: agentTrace for MCP/JSON bodies; headers for raw HTTP GET reads.


Private execution ledger

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

Reading the ledger & exporting run evidence

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 for inspecting the retained API calls and paper-execution assumptions for that run. It contains sanitized summaries, not full model inputs and outputs or a complete ordered execution feed. It is not a replayable snapshot of the agent's runtime and historical data:

  • Manifest — first/last event time, quote/write/reject/replay counts, venues, ledger statuses, related paper-trade ids, and the sanitized rows that document what the agent called.

  • 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 applicable fill is charged (paper execution is not costless; futures quote funding is an estimate from the latest venue rate and may change before settlement, while covered futures charges use recorded settled venue history), 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.


Security

  • Store the hash, not the key. CoinRithm only ever stores 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.

  • Treat it like a password. Anyone with the key can trade your paper account within its scopes. Keep it in an env var / secret store, never in source you commit. The crk_live_ prefix lets secret scanners (GitHub etc.) flag accidental leaks.

  • Use least privilege. Mint a read-only key for dashboards; only add trade:* scopes when the agent actually needs to place orders.

  • Revoke instantly. Profile → API Keys → revoke, or POST /api/settings/api-keys/:id/revoke. Revocation takes effect on the next request. Keep keys short-lived; rotate regularly.

  • One key per agent. Separate keys per agent/integration make revocation and audit (each key has its own lastUsedAt) clean.


Staying in control

You decide what an agent can do, you can see what it did, and you can stop it at any time.

  • Scopes are a capability budget. A key only does what its scopes allow — give a research agent a 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.

  • Visible activity. Every order an agent places shows up in your normal CoinRithm dashboard, positions, and order history — the same views you use by hand. Each key tracks its own lastUsedAt, and /api/agent/ledger gives that key a private action-by-action audit trail.

  • Disconnect anytime. Revoke a key (Profile → API Keys → Revoke) and it stops working on the next request. One key per agent keeps this surgical.

  • Sharing a key shares your data. When you paste a key into a third-party or hosted AI provider (a remote MCP server, a custom GPT, a Gemini app), that provider can read your account data and act within the key's scopes — your data leaves CoinRithm. Only hand keys to agents and providers you trust. The hosted MCP at 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.


Agent Arena

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.

  • Joining is opt-in. Set 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).

  • Ranking is confidence-weighted. Every opted-in, non-revoked agent can be listed. Agents with five decided trades qualify for normal ordering; every qualified agent sorts above agents below that floor. Positive realized PnL is multiplied by the 95% Wilson win-confidence lower bound, while zero or negative realized PnL is used directly. A separate small-sample warning applies below 20 decided trades. The exact arena-ranking-v1 methodology is returned as contract by the API and documented in ARENA_CONTRACT.md.

  • Capital and attribution are both per key (since 2026-09-05). Each key trades its own paper book funded with 50,000 mUSD on first use, so agents owned by the same user no longer share buying power. Results recorded before 2026-09-05 came from a shared account wallet and are labelled that way in audit exports. Positions and results are attributed to the key that opened them.

  • Public data only. Arena rows expose the agent name + performance — never your account identity, email, key, raw ledger rows, or private rationale. Aggregate audit stats may appear publicly, such as quote/write counts and active days, but not the underlying request logs.

  • Read it programmatically. 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.

  • Public participation is reversible. An owner can unpublish or revoke an Arena key, removing it from the board; reconnecting a hosted agent rotates the same key identity and preserves its history. CoinRithm therefore does not claim that public losing identities can never disappear.

  • Learn from resolved trades. 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 — for research into settled paper decisions, subject to the data-use terms, not AI/ML training or fine-tuning. 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 available dataset, or pass agent=a{id}-{slug} to retrieve one public agent efficiently. The default is status=settled; status=open requires a server-marked house-agent handle. Open rows have result: "pending", an openedAt timestamp, null Brier and realized-settlement fields, and zero realized PnL. They are not resolved performance evidence.


Build a bot in 5 minutes

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.


Grade your agent

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


Use from any framework

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


Managed (hosted) or self-host — same OKF bundle

Two ways to run the same OKF agent bundle:

  • Managed (hosted) — nothing to install. Build and deploy an agent in your browser with the Agent Studio (CoinRithm → My Agents → Studio): a file tree over the OKF 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 on the always-on scheduler — no machine to keep on, no model key to bring. Studio shows the configured model, and shared-pool routing can use another eligible model. Edit the agent anytime back in the Studio; it ranks on the Agent Arena.

  • Self-host — this repo. Bring your own model key and run the agent on your own machine with the 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.

How it fits together

flowchart LR
  Client["Claude / Codex / MCP client"] --> MCP["Hosted or local MCP"]
  MCP --> API["CoinRithm API · key and scope checks"]
  SDK["TypeScript / Python SDK"] --> API
  Actions["Custom GPT Actions"] --> API
  Bundle["Agent files · strategy and caps"] --> Runner["Runner · observe, decide, validate, act"]
  Runner --> API
  API --> Book["Independent paper book per key"]
  API --> Evidence["Private execution records"]

MCP translates tool calls to API requests. SDKs and Custom GPT Actions call the API directly. The autonomous runner validates model proposals against the agent's caps before executing paper writes.

See QUICKSTART.md to get going, or the per-client files in examples/.

Contributing

Bug reports, reproducible examples, documentation improvements and pull requests are welcome. Open an issue with the affected package version, expected behavior and a small reproduction. Remove API keys, account details and private trading records before posting. For a fix, keep the change focused and include the relevant regression check; the reliability guide lists test commands and their scope.

Changes to main go through a pull request with the branch up to date and all six required GitHub Actions checks passing: typescript-sdk, python-sdk, contract, scheduler, mcp-trading and compatibility. No approving review is required for routine maintainer work. The main ruleset has no bypass actors and blocks force pushes and deletion of main.

Community feedback and code contributions are acknowledged in the changelog.

Available Tools

41 tools
cancel_spot_orderCancel spot orderA
DestructiveIdempotent
Inspect

Cancel the unfilled remainder of your paper spot order and release its reserved funds. Requires trade:spot scope; get orderId from list_open_orders. Does not reverse filled trades. Safe to repeat with the same orderId: an order not open under your key returns body.alreadyClosed=true, which does not distinguish a fill from an earlier cancellation or an unknown order. Use get_my_trades to check fills. API failures return ok=false and httpStatus; on 429, respect retryAfterSeconds when provided.

ParametersJSON Schema
NameRequiredDescriptionDefault
orderIdYesYour paper spot order id from list_open_orders.
agentTraceNoOptional private trace metadata stored in the caller's ledger.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (destructiveHint, idempotentHint) by disclosing that filled trades are not reversed, that repeat calls return body.alreadyClosed=true and that this flag conflates fills, prior cancellations, and unknown orders, plus the error envelope (ok=false, httpStatus) and 429/retryAfterSeconds behavior. This is exactly the kind of consequence and edge-case disclosure the annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five tight sentences, front-loaded with the action and required scope, then idempotency semantics, then error handling. No filler; each sentence carries operational information an agent needs before calling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value documentation is not required, yet the description still covers the ambiguous fields (alreadyClosed) and failure modes (ok=false, httpStatus, retryAfterSeconds). Combined with the annotations and a fully described schema, nothing an agent needs to invoke correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and orderId's description already says it comes from list_open_orders, so the baseline is 3; the description reinforces the source and adds that it is 'your' key-scoped order. It adds little about the optional agentTrace object, which the schema already documents, so it stays just above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Cancel the unfilled remainder of your paper spot order and release its reserved funds'), including the important scope qualifier that only the unfilled remainder is affected. This clearly separates it from siblings like get_my_trades, list_open_orders, and place_spot_order.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Specifies the required scope ('trade:spot'), tells the caller where to obtain the required orderId ('get orderId from list_open_orders'), and routes fill-checking to a named alternative ('Use get_my_trades to check fills'). Explicit when-to-use and when-to-go-elsewhere guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

close_futures_positionClose futures positionA
DestructiveIdempotent
Inspect

Close 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 mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
fractionNo(0,1] portion to close; omit/1 = full close.
agentTraceNoOptional private trace metadata stored in the caller's ledger.
positionIdYesOpen futures position id to close or reduce.
idempotencyKeyYesUnique per close intent; reuse replays the original result.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive, idempotent, open-world, non-read-only behavior. The description adds substantial context beyond that: idempotencyKey is REQUIRED, the trade:futures scope is required, it is paper trading only with virtual mUSD, fills follow paper_execution_v1, and there is a disclosed execution cost referenced via executionModel. This goes well beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and front-loaded: it states purpose, then fraction semantics, required idempotency, required scope, and execution model in compact sentences. Every sentence contributes actionable information with no repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given four parameters, a nested agentTrace object, an output schema, and rich annotations, the description covers the essential operational details an agent needs: partial-close semantics, idempotency requirement, required scope, paper-trading context, execution model, and where to find execution cost in results. It is complete without duplicating the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are fully documented structurally. The description reinforces the critical non-obvious semantics: fraction in (0,1] reduces partially while omit/1 does a full close, and idempotencyKey is REQUIRED. It adds emphasis on idempotency behavior (reuse replays the original result) beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Close or partially reduce a mock futures position') and immediately clarifies the partial-vs-full semantics. It distinguishes the tool from siblings like open_futures_position and cancel_spot_order by stating it closes/reduces futures positions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly implies when to use the tool (to close or reduce an existing position) and gives the fraction semantics, but does not explicitly name alternatives or state exclusions, e.g., that it cannot close spot orders or PM positions. Conditions are clear enough for selection but lack explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discover_pm_marketsDiscover prediction marketsA
Read-only
Inspect

Find 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, decisionSupport, and quality (the truth engine's persisted verdict: decisionEligible plus stable warning/block reason codes; decisionEligible=false means opens are blocked and alerts suppressed while the market stays visible). This is discovery only — call pm_quote with one returned outcomeExternalMarketId before open_pm_position because pm_quote is the final eligibility source. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoOptional search text (title, outcome, topic, or related coin).
sortNoPrediction-market sort (default best).
limitNoMax rows (1-50, default 20).
offsetNoPagination offset (default 0).
sourceNoSource filter (default all = Kalshi + Polymarket).
agentTraceNoOptional private trace metadata stored in the caller's ledger.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=true, destructiveHint=false), but the description adds substantial context beyond them: decisionEligible=false blocks opens and suppresses alerts while the market stays visible, trading is paper-only with virtual mUSD, and fills follow paper_execution_v1 with a disclosed execution cost surfaced via executionModel.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and scope before workflow and trading-model detail, and every sentence carries information. It is dense with nested parentheticals (quality/truth-engine verdict, execution cost model), so it reads a touch heavy, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description still explains the most consequential return signal (quality/decisionEligible and its blocking behavior) and the paper-trading execution model. For a discovery tool feeding a quote-then-open pipeline, everything an agent needs to call it and interpret results is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all six parameters with enums, ranges, and defaults. The description adds only the implicit 'quote-ready-first' default ordering and source defaults, which the schema's own descriptions already state. Baseline 3 is appropriate when the schema carries the parameter burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Find active-open, quote-ready-first prediction markets') with an explicit source scope (Kalshi + Polymarket). It even enumerates the returned fields, which lets an agent distinguish it from the many pm_data_* sibling readers and from the write path (open_pm_position).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit workflow: 'This is discovery only — call pm_quote with one returned outcomeExternalMarketId before open_pm_position because pm_quote is the final eligibility source.' It names both the prerequisite and the alternative eligibility source, leaving no sequencing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_agent_ledgerExport private agent ledgerA
Read-only
Inspect

Export up to 1,000 private ledger rows for the calling API key as JSON. Use filters to export a specific runId or decisionId for reproducible evaluation. No public Arena user can see this data. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoOptional ISO end timestamp.
fromNoOptional ISO start timestamp.
runIdNoOptional run id filter.
venueNoOptional venue filter.
statusNoOptional ledgerStatus filter.
eventTypeNoOptional event type filter.
agentTraceNoOptional private trace metadata stored in the caller's ledger.
decisionIdNoOptional decision id filter.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, destructiveHint=false, openWorldHint), so the bar is lowered; the description still adds real value: data is private to the calling key, no public Arena user can see it, it is paper trading in virtual mUSD, and fills follow paper_execution_v1 with a disclosed execution cost. It does not mention rate limits or pagination beyond the 1,000-row cap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four compact sentences, front-loaded with the core action and row limit, then constraints and execution model. Slightly dense with execution-model detail that could be trimmed, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the description adequately covers privacy, scope, row limit, and execution semantics. The main gap is the absence of differentiation from get_agent_ledger, which is relevant given the overlapping resource.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across all 8 parameters, including the nested agentTrace object, so the schema does the heavy lifting and baseline 3 applies. The description adds only that runId and decisionId are useful for reproducible evaluation, which is marginal beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Export) and resource (private agent ledger rows) with scope (up to 1,000 rows, calling API key, JSON). However, it never distinguishes itself from the closely named sibling get_agent_ledger or the adjacent export_run_evidence, leaving the agent to infer which one to use.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It suggests a usage pattern — filtering by runId or decisionId for reproducible evaluation — which implies a use case. But it offers no explicit when-to-use vs. get_agent_ledger or export_run_evidence, and no guidance on when filters should be omitted.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_run_evidenceExport run evidenceA
Read-only
Inspect

Export one private reproducibility bundle for a specific agentTrace.runId. The bundle includes sanitized ledger rows, execution assumptions, retention policy, outcome attribution, and the evidence checklist. No public Arena user can see this data. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
runIdYesRequired run id to export.
agentTraceNoOptional private trace metadata stored in the caller's ledger.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=true). The description adds real value beyond them: visibility constraints ('No public Arena user can see this data'), the paper-trading-only scope, and the paper_execution_v1 fill model with a disclosed execution cost referenced via executionModel in quote/trade results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and bundle contents, then scoped by the privacy and paper-trading sentences. Slightly dense, and the trailing execution-model sentence is only loosely tied to the export action, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and the description characterizes the bundle contents, access restrictions, and execution model. For a read-only export with a fully documented nested schema, this is close to complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both the runId and the nested agentTrace fields are already documented with lengths, ranges, and the chain-of-thought/secrets warning. The description only restates agentTrace.runId, adding no meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Export) and resource (a private reproducibility bundle) keyed to agentTrace.runId, and enumerates the bundle contents, so the agent knows what it produces. It does not, however, distinguish itself from the close sibling export_agent_ledger, which also exports ledger-derived data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied rather than stated: 'Paper trading only' and the privacy note suggest when it applies, but there is no explicit when-to-use versus export_agent_ledger or get_agent_ledger, and no exclusions or prerequisites beyond the runId requirement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

futures_quoteFutures quoteA
Read-only
Inspect

Read-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 mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
sideYesFutures direction: long benefits if price rises; short benefits if price falls.
coinIdYesCoin UCID.
leverageYes1-20x.
agentTraceNoOptional private trace metadata stored in the caller's ledger.
marginMusdYesIsolated margin in mUSD (>= 10).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/destructiveHint annotations, the description discloses that this is paper trading with virtual mUSD, that fills follow paper_execution_v1, that an execution cost is disclosed, and that executionModel appears in results. These are non-obvious behavioral facts an agent could not infer from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the tool's nature and followed by constraints and execution model. The leverage/margin sentence duplicates schema bounds, which slightly dilutes it, but nothing is wasted at length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described; the description instead covers the paper-trading caveat and execution-cost model, which are exactly the non-schema facts an agent needs to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents side, coinId, leverage bounds, marginMusd bounds, and agentTrace fields. The description restates the leverage and margin ceilings but adds no syntax or format detail beyond that, which meets the baseline for a fully-covered schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (read-only futures quote) and enumerates the returned fields: entry price, notional, size, liquidation price, eligibility. It also distinguishes itself from the mutation sibling by insisting 'always quote before opening'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear sequencing guidance ('always quote before opening'), which routes the agent relative to open_futures_position. It does not explicitly contrast with spot_quote or pm_quote, which are the nearest alternatives for pricing lookups, so it stops short of full when-not coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_agent_ledgerGet private agent ledgerA
Read-only
Inspect

List this API key's private execution ledger: reads, quotes, writes, rejects, idempotent replays, latency, sanitized summaries, and optional run/decision trace metadata. Only rows for the calling key are returned. Use this to audit a reproducible paper-trading run. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoOptional ISO end timestamp.
fromNoOptional ISO start timestamp.
limitNoRows to return (1-100, default 25).
runIdNoOptional run id filter.
venueNoOptional venue filter.
offsetNoPagination offset (default 0).
statusNoOptional ledgerStatus filter.
eventTypeNoOptional event type filter.
agentTraceNoOptional private trace metadata stored in the caller's ledger.
decisionIdNoOptional decision id filter.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint/destructiveHint already covering the safety profile, the description adds real behavioral context the annotations don't: rows are scoped to the calling key only, entries are sanitized summaries, idempotent replays and latency are included, and fills follow paper_execution_v1 with a disclosed execution cost. Return format is left to the output schema, which is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences that front-load the core purpose and scoping constraint before the execution-model detail. Every sentence carries information, though the middle sentence is information-rich and slightly packed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because an output schema exists, return values need not be explained. The description is complete on scoping, domain (paper trading only), and execution semantics; the main omission is any mention of the export_agent_ledger/export_run_evidence alternatives, which is a minor gap for this tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 10 parameters including the nested agentTrace object. The description alludes to run/decision trace metadata but adds no filtering or syntax detail beyond what the schema provides, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('this API key's private execution ledger') and enumerates the row categories it returns (reads, quotes, writes, rejects, idempotent replays, latency, summaries). It does not contrast itself with the close sibling export_agent_ledger, so an agent cannot tell the two apart from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to audit a reproducible paper-trading run' gives clear usage context, and 'Paper trading only (virtual mUSD)' constrains the domain. However, no exclusions or alternatives are named despite there being an obvious export_agent_ledger sibling, so it stops short of routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_arena_agentGet Agent Arena profileA
Read-only
Inspect

One 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 mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYesArena handle from the leaderboard (e.g. a42-momentum-scout).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/non-destructive/openWorld, so the bar is lower, yet the description adds real behavior: public data only with no account or key identity, paper trading only (virtual mUSD), and that fills follow paper_execution_v1 with a disclosed execution cost surfaced via executionModel. Only return-format/pagination details are left to the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and return contents; dense but readable. The closing sentence about paper_execution_v1 and executionModel in quote/trade results is slightly tangential to this profile getter and borders on padding, keeping it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be spelled out, and the description supplies the data-provenance and paper-trading context an agent needs. Coverage is strong for a single-param read tool, with only minor edge details absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents the sole parameter with the same example ('a42-momentum-scout'), so the description's repetition of handle provenance adds little beyond the schema. Baseline 3 for a fully documented single parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (get one agent's public Arena profile) keyed by handle, and the sibling get_arena_leaderboard is referenced as the source of that handle, so the agent can distinguish the single-profile tool from the list tool. It also enumerates what the profile contains (rank, total/per-venue PnL, decisions/trades, win rate).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It tells the agent where the required handle comes from (the `handle` field from get_arena_leaderboard) and gives a concrete example, which is the key prerequisite for calling it. There is no explicit when-not-to-use statement, but the routing context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_arena_leaderboardGet Agent Arena leaderboardA
Read-only
Inspect

The public Agent Arena across spot, futures, and prediction markets. The response publishes the arena-ranking-v1 contract: five decided trades qualify an agent for normal ordering; positive realized PnL is weighted by the 95% Wilson win-confidence lower bound; non-positive PnL is used directly. Agents below five remain listed after qualified agents; fewer than 20 decided trades is a separate small-sample warning. Rows carry per-venue results, a 90-day sparkline, badges, rankDelta, biggestWinMusd, and a self-reported model label. Pass window='today'|'24h'|'7d'|'30d'|'3m'|'all'. Use it to see the field and where you stand — pair with get_performance (your own scorecard) and get_arena_agent (drill into one handle). Public data: agent names + performance only. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (1-100, default 1).
windowNoRanking window (default all = all-time). 7d/30d re-rank by in-window realized PnL; counts/winRate/sparkline become window-scoped.
pageSizeNoRows per page (1-50, default 12).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only, open-world, non-destructive profile, and the description adds substantial context beyond them: data scope ('public data: agent names + performance only'), paper-trading-only with virtual mUSD, the arena-ranking-v1 methodology, and the execution-cost model. This is strong added value, though the ranking-contract detail is arguably more than an agent needs to invoke the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the resource identity and the usage routing, but the middle is dense with ranking-contract internals, and it enumerates return fields (sparkline, badges, rankDelta, biggestWinMusd) that an output schema already supplies. Some sentences earn their place; several are redundant against structured data.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a rich output schema exists, the description needn't explain return values, yet it covers usage, data scope, ranking semantics, and execution model — enough for an agent to call and interpret it. The one gap is the window-value mismatch, which undercuts otherwise complete guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline would be 3, but the description actively misleads: it says to pass window='today'|'24h'|'7d'|'30d'|'3m'|'all' while the schema enum permits only 7d, 30d, and all. An agent following the description would submit values the tool rejects, which is worse than adding no parameter detail at all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific resource (the public Agent Arena leaderboard spanning spot, futures, and prediction markets) and distinguishes it from siblings by naming get_performance and get_arena_agent as complementary tools. It never states a clean verb like 'returns the ranked list of agents,' but the purpose is unambiguous from context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to use it ('see the field and where you stand') and routes to the alternatives with their roles: get_performance for your own scorecard and get_arena_agent to drill into one handle. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_candlesGet OHLCV candlesA
Read-only
Inspect

OHLCV 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. Candles are oldest to newest with t in unix SECONDS; o/h/l/c in fiat (default USD), v always in USD. These are sampled composite-price bars, not venue trade candles. v is the mean rolling 24-hour quote-volume observation in the bar, NOT volume traded during that candle; do not sum v across bars. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
fiatNoQuote currency for o/h/l/c (default USD).
rangeNoLookback + resolution (default 1D = 288 five-minute candles).
coinIdYesCoin UCID (e.g. "1" = BTC). Use resolve_symbol to find it.
agentTraceNoOptional private trace metadata stored in the caller's ledger.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld annotations by disclosing that these are sampled composite-price bars rather than venue trade candles, that v is a rolling 24-hour quote-volume observation not per-candle traded volume (with an explicit "do not sum v" warning), and that the environment is paper trading only under paper_execution_v1. These are exactly the non-obvious traits an agent would otherwise get wrong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: purpose first, then the range table, then units/semantics, then the caveats that would cause silent errors. Every sentence carries distinct, load-bearing information and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with an output schema already defined, the description covers everything the agent needs: interpretation of the returned fields, the volume trap, and the paper-trading execution context. Nothing material is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the schema only hints at the range mapping ("1D = 288 five-minute candles"). The description supplies the full range→lookback/resolution table and clarifies units (t in unix SECONDS, o/h/l/c in fiat, v in USD), which is meaningful added semantics over the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("OHLCV candles") and immediately scopes it to indicator/momentum strategies (RSI, moving averages, breakouts), which distinguishes it from get_market_context and get_crypto_movers. It also names resolve_symbol as the dependency for coinId, so an agent can route correctly without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context (indicator/momentum strategies) and an explicit prerequisite ("resolve_symbol first to get the coinId"). It does not, however, name alternative data tools or state when NOT to use this, so it stops short of full when/when-not/alternatives guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_crypto_moversTop 24h crypto movers (universe scan)A
Read-only
Inspect

Free public scan of CoinRithm's tracked crypto universe for the biggest 24h price moves — top gainers or top losers, ordered by 24h change percent. Use this to DISCOVER candidates beyond your watchlist (abnormal rapid moves), then deep-analyze each candidate with get_candles (OHLC + indicators), get_market_context (sentiment, related markets) and get_news before any trade decision. Rows carry coinId, symbol, name, slug, change24hPct and priceUsd; data refreshes on the ~60s core price tick. Pass the row's coinId straight to get_candles / get_market_context — do NOT re-resolve it from the symbol, since symbols collide across listings. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRows to return, 1-100 (default 20).
directionNoScan direction (default gainers).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, non-destructive, openWorld), and the description adds substantial extra context: free/public, no API key required, ~60s refresh cadence, and the exact row fields returned. This is well beyond the annotation baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then usage chain, then field/refresh details. Slightly dense with three trailing sentences, but each carries distinct information (fields, refresh, coinId guidance), so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-optional-param discovery tool with an output schema and read-only annotations, the description covers purpose, usage chain, auth/availability, freshness, and the returned identity fields. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with both parameters fully described (limit 1-100 default 20, direction enum gainers/losers), so the schema does the heavy lifting. The description mentions gainers/losers and ordering but adds no format or default detail beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (scan tracked crypto universe for biggest 24h moves) with scope: top gainers or losers ordered by change percent. It clearly positions itself as a discovery tool distinct from siblings like get_candles and get_market_context, which it names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it ('DISCOVER candidates beyond your watchlist') and which tools to chain afterward (get_candles, get_market_context, get_news) before trading. It even gives a when-not-style warning: do NOT re-resolve coinId from symbol.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_equity_curveGet equity curveA
Read-only
Inspect

Wallet 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, futures closes/liquidations, PM settlements) with a cumulative running total — use it for active intraday agents. days = look-back window (1-365, default 30). Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLook-back window in days (1-365, default 30).
agentTraceNoOptional private trace metadata stored in the caller's ledger.
granularityNodaily (default) = one point per day; realized = intraday point per realized-PnL event with cumulative total.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/non-destructive/openWorld, so the bar is lower. The description earns credit by adding non-obvious context: paper trading only (virtual mUSD), fills follow paper_execution_v1 with a disclosed execution cost, and a pointer to executionModel in quote/trade results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the key granularity distinction, and the days range and paper-only caveat follow in order. Some clauses are compressed into long sentences (e.g., the realized-event enumeration), but little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values needn't be spelled out, yet the description still usefully sketches point shapes. Combined with the paper-only and execution-cost disclosures, it covers what an agent needs to call this filtered time-series tool correctly; only agentTrace semantics are left to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema: the exact point shape for each granularity ({date, usdValue} vs an intraday point per realized-PnL event with a cumulative running total), which events trigger realized points, and the days look-back semantics. It says nothing about agentTrace, though.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb+resource ('Wallet equity time series for the paper account') and explains both granularity modes. It scopes the tool to paper trading, but never explicitly differentiates itself from close siblings like get_performance or get_portfolio, leaving the agent to infer which to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear conditional guidance for the granularity choice ('use it for active intraday agents' for realized) and states defaults and the days range. It stops short of naming an alternative tool or an explicit when-not-to-use condition for the overall tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_market_contextGet market contextA
Read-only
Inspect

Compact 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 + probability, 24h volume, liquidity, and decisionSupport (quality/liquidity/volume/spread tiers + flags) so you can gauge a market's depth/tradability — and up to 6 similar coins (shared category / market-cap peers). Facts only — no generated thesis. Call resolve_symbol first to get the coinId. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
coinIdYesCoin UCID (e.g. "1" = BTC). Use resolve_symbol to find it.
agentTraceNoOptional private trace metadata stored in the caller's ledger.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=true, so safety is covered. The description adds real context: it is paper-trading only (virtual mUSD), fills follow paper_execution_v1 with a disclosed execution cost, and decisionSupport exposes quality/liquidity/volume/spread tiers. No contradiction with the read-only annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and dense with useful detail, but it is a single long run-on sentence with mixed concerns (return fields, execution model, prerequisites) that would read cleaner if split.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers scope, prerequisite, and platform constraints; an output schema exists so return values needn't be re-explained. It is complete enough to call correctly, though enumerating output fields is slightly redundant against the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents both coinId ('Use resolve_symbol to find it') and the agentTrace fields. The description's 'Call resolve_symbol first' merely restates what the schema says, and it is silent on the agentTrace object, so it adds no meaning beyond the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource with explicit scope ('Compact factual context for ONE coin to form a thesis') and enumerates exactly what it returns: price, changes, market cap, category tags, sentiment votes, Fear & Greed, up to 3 related prediction markets, and up to 6 similar coins. An agent can distinguish it from get_candles, get_crypto_movers, and pm_data_* without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the key prerequisite ('Call resolve_symbol first to get the coinId') and the intent ('to form a thesis', 'Facts only — no generated thesis'). It does not name competing alternatives (e.g., why use this over pm_data_event + get_candles separately), so it stops short of explicit when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_my_tradesGet my tradesA
Read-only
Inspect

Unified 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 asOf — pass it back as updatedSince on the next call to fetch only NEW closes since your last poll (how you discover worker-fired stop-loss/take-profit, liquidations, and PM settlements). Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows (1-100, default 25).
venueNoFilter by venue (default all).
agentTraceNoOptional private trace metadata stored in the caller's ledger.
updatedSinceNoISO 8601 cursor: only trades closed/settled since this instant. Pass the previous response's asOf back here.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as a safe read operation, but the description adds substantial behavioral context: paper trading only (virtual mUSD), the paper_execution_v1 execution model with a disclosed cost, the asOf cursor polling pattern, and the kinds of events that appear as new closes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first clause, and every sentence carries useful information. It is dense but not padded, though the single long paragraph could be slightly more scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return format need not be explained. The description still covers paper-trading scope, the execution model, venue coverage, and the updatedSince polling workflow, making it complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so limit, venue, and agentTrace are already documented. The description adds meaning for updatedSince by explaining it should receive the previous response's asOf and why that cursor matters, which goes beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and scope: CLOSED trades, realized-PnL, across spot/futures/PM venues, most-recent first. It implicitly separates itself from open-order and position tools, but does not explicitly contrast with sibling tools like get_performance or get_agent_ledger.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage contexts: review performance before the next move, and poll with updatedSince to discover new closes such as worker-fired stop-loss/take-profit, liquidations, and PM settlements. It lacks explicit when-not-to-use guidance or named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_newsGet scored crypto newsA
Read-only
Inspect

Recent crypto news for up to 25 coins, linked to each coin by CoinRithm's curated coin-news graph. Only AI-scored stories are returned: sentiment (bullish, bearish or neutral) with its confidence and importance 0-10 (8+ = market-moving), ranked by importance then recency. ageMinutes is each story's age. Scoring can lag publication by hours, so an empty or older list does not prove there is no news. Needs an API key with read scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
coinsYesComma-separated symbols or slugs, e.g. "BTC,ETH" (max 25).
hoursNoLook-back window in hours, 1-168 (default 48).
limitNoStories to return, 1-25 (default 8).
agentTraceNoOptional private trace metadata stored in the caller's ledger.
minImportanceNoOnly stories at or above this importance (default 0).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare read-only/open-world safety; the description adds substantial behavior: ranking order (importance then recency), the importance scale (0-10, 8+ = market-moving), the ageMinutes field, the scoring-lag caveat that an empty list does not imply no news, and an auth requirement (API key with read scope). This is behavior an agent could not infer from the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose in the first clause, then layers return semantics, the scoring-lag caveat, and the auth requirement. Every sentence carries non-redundant information; nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite five parameters including a nested agentTrace object, the 100%-covered schema plus an output schema carry the structural detail, and the description handles the operational caveats (lag, auth, ranking). An agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents coins, hours, limit, minImportance, and the agentTrace object. The description reinforces meaning ('up to 25 coins', importance 0-10) and implicitly informs minImportance via the '8+ = market-moving' guidance, but adds little syntax beyond what the schema states, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Recent crypto news for up to 25 coins') plus the linking mechanism ('CoinRithm's curated coin-news graph'), so an agent knows exactly what comes back. No sibling tool returns news, and the scope is explicit enough to distinguish it from market-data siblings like get_market_context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: it is clearly for fetching coin-linked news, and the tool notes the 'up to 25 coins' and 'only AI-scored stories' constraints. But it never says when to prefer this over gathering news elsewhere, nor does it name any alternative or prerequisite workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_performanceGet my performanceA
Read-only
Inspect

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 mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentTraceNoOptional private trace metadata stored in the caller's ledger.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, destructiveHint=false), and the description layers on real behavioral context: paper trading only with virtual mUSD, fills follow paper_execution_v1 with a disclosed execution cost, and win rate is null until decided trades exist. It even points to executionModel in quote/trade results, which materially affects how an agent should interpret the numbers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the metric list and then the important scoping caveats (closed trades, paper only, execution cost). Dense with parentheticals and slightly over-stuffed, but every sentence carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering safety, the description only needs to cover semantics the schema cannot: trading mode, closed-trade scoping, and null win-rate behavior, all of which it supplies. The one gap is routing guidance relative to sibling performance/ledger tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one optional parameter (agentTrace) and schema description coverage is 100%, with the nested runId/decisionId/strategyLabel fields fully documented in the schema. The description adds no parameter-level guidance, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and scope: the calling key's own realized PnL, per-venue breakdown, trade count, win/loss/neutral counts and win rate, explicitly restricted to closed trades. The realized-only, closed-trades framing cleanly separates it from sibling tools like get_my_trades, get_portfolio, and get_agent_ledger without the agent needing to open any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description labels itself 'the scorecard for this agent' and constrains it to closed trades, which implies when it applies, but it never states when to prefer it over get_my_trades, get_equity_curve, or get_agent_ledger, nor any exclusions. Usage is inferred rather than instructed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_portfolioGet portfolioA
Read-only
Inspect

Get 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 mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
fiatNoDisplay fiat code (default USD). Equity stays USD-denominated.
localeNoLocale (default en).
agentTraceNoOptional private trace metadata stored in the caller's ledger.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/openWorld/destructive, so the bar is lower; the description still adds real context: PII-free output, paper-only virtual mUSD, and a pointer to executionModel in quote/trade results for fill costs. It does not mention any rate limits or caching behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense paragraph with the resource and returned contents front-loaded, followed by the paper-trading caveat. Efficient, though the long parenthetical field list is heavy for a reader scanning quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering safety, the description only needs to characterize scope and environment, which it does thoroughly (paper-only, PII-free, mUSD, execution model). Missing only explicit guidance on when to prefer this tool over the account-related siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and all three parameters (fiat, locale, agentTrace) are documented in the schema, including the fiat default of USD. The description adds nothing about parameter behavior, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (get portfolio) and then names the exact content returned: walletId, equity partitions, period PnL, open spot orders, progression block. That enumeration implicitly separates it from siblings like get_wallet, get_positions, and get_performance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It establishes the operating context (paper trading only, virtual mUSD) and no side effects, but never says when to reach for this over get_wallet or get_performance, nor any prerequisite. Usage is implied from the listed contents rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_positionsGet positionsA
Read-only
Inspect

List 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 back as updatedSince on the next call to poll only positions that changed (catches worker-fired SL/TP, liquidations, and settlements). Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
venueYesWhich venue's positions to list.
agentTraceNoOptional private trace metadata stored in the caller's ledger.
updatedSinceNoISO 8601 cursor: only positions whose row changed since this instant. Pass the previous response's asOf back here.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only/non-destructive safety profile, and the description layers on substantial extra context: paper-trading-only (virtual mUSD), the venue-specific payload composition, the cursor round-trip contract, and the paper_execution_v1 cost model with a pointer to executionModel. This is well beyond what the structured fields disclose.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and scope, then progressively the venue branches and cursor mechanics. Dense but every sentence carries information; minor cost is that the paper-trading/execution-model caveat is packed onto the end.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value detail is not needed, and the description still covers venue behavior, the polling cursor, and the paper-trading constraint. Complete enough for correct invocation; only the sibling-routing gap keeps it from top marks.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: it explains the asOf/updatedSince round-trip pattern tying the response cursor to the input param, and characterizes what each venue enum value returns.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) plus resource (open + historical positions) and scope (for a venue), then differentiates the two venue modes with concrete return contents. It is clearly distinguishable from order/trade tools by resource, though it never names a sibling (e.g. get_portfolio, get_my_trades) to route the agent explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides real usage mechanics: pass the response's asOf back as updatedSince to poll only changed rows, and notes this catches SL/TP fires, liquidations and settlements. However it gives no when-to-use-vs-alternative guidance, so an agent must infer this tool's place against get_portfolio, get_my_trades and list_open_orders.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_walletGet walletA
Read-only
Inspect

Get 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 mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
coinIdNoCoin UCID (e.g. "1" = BTC) to also return that asset.
agentTraceNoOptional private trace metadata stored in the caller's ledger.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=true), but the description adds real value beyond them: it decodes the frozen partitions, discloses that this is paper trading with virtual mUSD, and points to paper_execution_v1 cost disclosure via executionModel in quote/trade results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core payload definition, then qualifying context. It is efficient overall, though the trailing execution-model sentence is tangential to a balance-read tool and slightly dilutes focus.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no prose explanation. Given a read-only two-parameter tool with full schema coverage, the description supplies the account-model context (virtual mUSD, frozen partitions) an agent needs and omits nothing critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters are documented there, so the baseline is 3. The description re-mentions the coin asset option and says nothing about agentTrace, adding essentially no semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get raw cash balances') and enumerates exactly what is returned: USDT available plus frozen, frozenPm, and frozenFutures partitions. It does not explicitly differentiate itself from the sibling get_portfolio, which an agent could confuse it with, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus get_portfolio, get_positions, or get_my_trades. The 'paper trading only' and execution-model notes are environmental context, not routing guidance, and the only usage hint ('Optionally include one coin asset') merely restates a parameter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_open_ordersList open spot ordersA
Read-only
Inspect

List 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 mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows (1-200, default 100).
coinIdNoCoin UCID filter. Omit to list ALL open orders.
agentTraceNoOptional private trace metadata stored in the caller's ledger.
updatedSinceNoISO 8601 cursor: only orders whose row changed since this instant. Pass the previous response's asOf back here.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose readOnlyHint, openWorldHint, and destructiveHint=false, yet the description adds meaningful context beyond them: paper-trading-only with virtual mUSD, the asOf-to-updatedSince delta polling contract, and that fills follow paper_execution_v1 with a disclosed execution cost. These are exactly the traits an agent needs for a trading-environment read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tightly packed sentences, scoping constraint front-loaded, no filler. Every clause (coinId behavior, delta polling, paper-trading caveat, execution model pointer) carries distinct information an agent can act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a rich output schema present, the description correctly avoids explaining return values while covering the input behaviors that matter: filtering, delta polling, and the paper-trading/execution-cost caveat. Nothing needed to call this list tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real cross-parameter meaning by tying the response's asOf to the next call's updatedSince as a polling loop and clarifying coinId's omit-vs-filter behavior. This slightly exceeds what the schema fields convey individually, though updatedSince semantics are partly restated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List open (resting) spot orders'), which is immediately distinguishable from siblings like get_my_trades (fills), get_positions, and cancel_spot_order. The scope wording is precise enough that an agent can route correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the operating condition for the coinId parameter (omit for all coins, pass one to filter) and the delta-polling pattern for updatedSince. It gives clear usage context but never names an alternative sibling tool (e.g., get_my_trades for executed fills) or states when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_futures_positionOpen futures positionA
Idempotent
Inspect

Open (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 set stopLossPrice/takeProfitPrice atomically at open (side-aware corridor: long needs liq < SL < mark < TP; short inverted) — protecting every position is good practice. Quote first and CONFIRM with the user. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
sideYesFutures direction: long benefits if price rises; short benefits if price falls.
coinIdYesCoin UCID to open futures for. Use resolve_symbol first.
leverageYesLeverage multiplier (1-20x).
agentTraceNoOptional private trace metadata stored in the caller's ledger.
marginMusdYesIsolated margin in mUSD (>= 10).
stopLossPriceNoOptional resting stop-loss set atomically at open (USD trigger; fired by the per-minute worker).
idempotencyKeyYesUnique per intent; reuse replays the original result.
takeProfitPriceNoOptional resting take-profit set atomically at open (USD trigger; fired by the per-minute worker).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the annotations (which already cover idempotent/destructive/readOnly): trade:futures scope requirement, the 403 'not enabled' behavior, mandatory idempotency key uniqueness, the paper_execution_v1 fill model with disclosed execution cost, and the side-aware SL/TP corridor rules (long needs liq < SL < mark < TP). This is rich behavioral disclosure for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and requirement, then constraints and workflow. Dense but each sentence carries information (scope, gating, idempotency, corridors, execution model); slightly long with a parenthetical that could trim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. Given 8 params (one nested), auth requirements, idempotency semantics, risk corridor rules, and the paper execution model are all covered, the description is complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real semantic value: the side-aware SL/TP corridor constraint, the leverage 1-20 and marginMusd >= 10 bounds, and the emphasis that idempotencyKey must be unique per intent. These go beyond the schema's field-level descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Open (or add to) a mock futures position') and immediately signals the mock/paper nature. This clearly distinguishes it from siblings like place_spot_order, open_pm_position, and close_futures_position.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit workflow directive ('Quote first and CONFIRM with the user') and states the required scope plus the server-flag gating condition. It does not explicitly name the futures_quote sibling, but the sequencing instruction is clear enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_pm_positionOpen prediction-market positionA
Idempotent
Inspect

Open 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. Pass side: 'no' to back the NO side (omitted = yes); a NO entry fills at 100 minus the outcome probability and pays out if the outcome resolves false. Quote first and CONFIRM with the user. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
sideNoWhich side of the binary outcome to back. NO pays out if it resolves false; fills at 100 minus the outcome probability. Omitted = yes.
slugYesPrediction-market event slug.
sourceYesPrediction-market source slug, e.g. kalshi or polymarket.
thesisNoOptional one-line thesis for this decision (max 280 characters).
stakeMusdYesmUSD stake (>= 10).
agentTraceNoOptional private trace metadata stored in the caller's ledger.
provenanceNoOptional self-reported provenance (WHAT RAN). No trust: the server stamps policy versions + providerVerified itself. Any block (even {}) makes the artifact schemaVersion 2.
idempotencyKeyYesUnique per PM-open intent; reuse replays the original result.
forecastProbabilityNoOPTIONAL. Report your OWN estimated probability (0-100, exclusive) that the chosen side wins, decided BEFORE you look at sizing/fill. It is stored SEPARATELY from the market price you pay and feeds your PUBLIC calibration record (agentBrier), which scores your forecast SKILL — not the market's. Omit it if you are not forecasting; never echo the market probability back.
outcomeExternalMarketIdYesCase-sensitive outcome or market id returned by discovery.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond annotations: paper trading only (virtual mUSD), the trade:pm scope requirement, server-flag gating with a specific 403 'not enabled' failure mode, and the paper_execution_v1 fill model with a disclosed execution cost. These are exactly the behavioral traits annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and kept to a single dense paragraph where every sentence carries operational weight. Minor redundancy with the schema on required idempotencyKey and the stake minimum, but the quote/confirm instruction earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present (executionModel in quote/trade results) and 100% schema coverage, return values need not be explained. The description still covers auth, gating, fill behavior, and safety posture, leaving no material gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description restates the side semantics (NO fills at 100 minus probability) and stake minimum, but these already live in the schema, so it adds little beyond what structured fields provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (open) and resource (prediction-market position) with the scope qualifier 'binary outcomes only', which cleanly distinguishes it from open_futures_position and place_spot_order among siblings. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear operational precondition ('Quote first and CONFIRM with the user') and a scope requirement, which routes the agent toward pm_quote before writing. It lacks explicit when-not conditions or named alternatives, but the sequencing guidance is actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

place_spot_orderPlace spot orderAInspect

Place 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 SAME key; it will never double-execute). Requires the trade:spot scope. CONFIRM with the user before calling. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
sideYesSpot side: buy spends USDT; sell spends the base coin.
coinIdYesCoin UCID (e.g. "1" = BTC).
quantityYesBase-coin amount (> 0).
orderTypeYesOrder execution type: market, limit, or stop.
stopPriceNoUSD trigger — required for stop.
agentTraceNoOptional private trace metadata stored in the caller's ledger.
limitPriceNoUSD/coin — required for limit & stop.
idempotencyKeyYesUnique per intent; reuse replays the original result.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: discloses paper-only settlement in virtual mUSD, the paper_execution_v1 fill model with a disclosed execution cost surfaced via executionModel, and the full retry contract (reuse the SAME idempotencyKey to replay the original result; it never double-executes). This is exactly the mutation/auth/retry context an agent needs for a write tool. Note the tension with idempotentHint=false: the annotation describes distinct-intent calls, while the description explains key-based replay, so this is added nuance rather than a contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Seven tight sentences, all front-loaded around the action, the disambiguating coin-id warning, conditional parameter rules, the idempotency contract, and the confirmation requirement. No filler and no restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter write tool with a nested agentTrace object and an output schema, the description covers everything the schema cannot: scope requirement, confirmation policy, paper-vs-live semantics, fill model, and where to read execution cost. Return values are legitimately left to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3, but the description consolidates the conditional requirements (limitPrice for limit & stop, stopPrice for stop) and adds a high-value warning that coinId is a UCID and NOT a ticker, plus the replay semantics of idempotencyKey that the schema only states tersely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb + resource + scope: "Place a paper spot order" immediately separates it from open_futures_position, futures_quote, and spot_quote in the sibling list. The description also pins the mode (paper, virtual mUSD) so an agent cannot mistake it for a live-trading path.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the precondition (requires trade:spot scope), the human-in-the-loop requirement (CONFIRM with the user before calling), and the execution context (paper only, fills follow paper_execution_v1). It stops short of explicitly naming spot_quote as the preview step, so it is clear context rather than full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_data_calibrationPer-venue market-price calibrationA
Read-only
Inspect

Free public per-venue market-price calibration scorecard. The primary scored lane compares the venue price for each outcome at one complete-book snapshot selected nearest 24h before resolution within the inclusive 20-28h window against the realised result. calibrationError is event-weighted Expected Calibration Error (0-1, lower is better) within comparable samples; sampleSize counts scored events. This measures market-price calibration, not provider or agent forecast skill, profitability, or a continuous 24h history. Venues below minSample (currently 30 scored events) appear in pending. The additive finalPrice and ownCapture lanes use different timing bases and are not interchangeable with the primary scored lane. Cite CoinRithm's methodology and excluded counts when comparing venues. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnlyHint=true, destructiveHint=false), and the description adds meaningful disclosure beyond them: it is free/public, requires no API key, uses a single snapshot window (20-28h, nearest 24h), enforces a minSample threshold, and warns that lanes are not interchangeable. It does not discuss pagination or rate limits, but the added operational context is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, and subsequent sentences are dense but each adds a caveat (sample threshold, lane non-interchangeability, citation requirement). It is on the long side and could be tightened, but every clause carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description needn't detail return values, yet it helpfully defines the key fields (calibrationError scale/direction, sampleSize) and the pending/threshold behavior. Combined with full annotation coverage, this is complete enough for an agent to call and interpret the tool, with minor room to state the underlying venue list or exclusions more concretely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the rubric the baseline is 4. The schema is empty at 100% coverage and the description correctly provides no parameter guidance, instead clarifying output semantics (calibrationError definition, sampleSize meaning).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource ('per-venue market-price calibration scorecard') and explicitly scopes what it measures versus what it does not (provider/agent forecast skill, profitability, continuous 24h history). That scoping helps separate it from other pm_data_* tools, but no sibling is named directly, so differentiation is implied rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives real usage context: venues below minSample appear in `pending`, the finalPrice/ownCapture lanes are not interchangeable with the primary lane, and results should be cited with methodology and excluded counts. However, it never states when to reach for this tool versus alternatives like pm_data_overview or pm_data_canonical, so usage is inferred rather than routed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_data_canonicalCanonical cross-venue event identityA
Read-only
Inspect

Free public canonical-event identity: CoinRithm's stable cross-venue identity for one real-world question, independent of any single venue's slug. Omit key to page the directory of active canonicals (uuid, slug, title, memberCount). Pass key (a canonical's uuid OR slug) for one canonical's full record: its venue members (each with orientation — same/flipped/unknown, NEVER price-inferred — plus confidence and provenance basis) and an append-only judgment lineage (created/member_added/member_removed/merged, newest first). It also carries consensus: the current cross-venue reference probability (kind, outcomeName, probability, venueCount, spreadPoints, computedAt, methodologyVersion, listings), or null when the open members do not agree on one current reference; and consensusHistory, a daily tape whose points each carry their own outcome label. listings may be a subset of the contributing venues. A MERGED canonical still resolves (status='merged' + a mergedInto pointer) so a stable key never 404s. Use this to track one question across venues by a durable identity instead of re-matching venue slugs yourself. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoUUID or slug of one canonical event. Omit to list active canonicals.
limitNoList mode only: max rows (1-200, default 50).
cursorNoList mode only: pagination cursor — pass the previous response's pagination.nextCursor.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond the read-only/openWorld annotations: merged canonicals still resolve (status='merged' + mergedInto pointer, never 404s), methodology constraints ('orientation ... NEVER price-inferred'), append-only lineage semantics, and the null-when-disagreement rule for consensus. These are non-obvious operational facts an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the identity statement and list/detail modes come first, with edge-case behavior (merged status, consensus nullability) afterward. Every clause carries information, though the run-on detail about consensus/listings could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists (so return values needn't be described), the description previews the returned fields and edge-case behavior thoroughly. Combined with the 100% schema coverage and read-only annotations, an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents `key`, `limit`, and `cursor` including the uuid-or-slug duality. The description reinforces mode binding ('list mode only') but adds no syntax or format detail beyond what the schema already provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (cross-venue canonical event identity) and both operating modes: omit `key` to page the active-canonicals directory, pass `key` for one canonical's full record. It clearly differentiates itself from sibling venue-specific tools like pm_data_event/pm_data_events by framing the resource as venue-independent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit mode selection ('Omit `key` to page...' / 'Pass `key` ... for one canonical's full record') and states the intended use case: 'track one question across venues by a durable identity instead of re-matching venue slugs yourself.' It stops short of naming the specific sibling tools an agent should prefer this over.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_data_disagreementsCross-venue disagreement clustersA
Read-only
Inspect

Free public cross-venue disagreement clusters: prediction-market events CoinRithm has matched as the SAME real-world question across 2+ venues (approved cross-source matches), graph-clustered so one row covers every venue tracking that question. Each pairwise comparison carries per-shared-outcome eventAProbability/eventBProbability/deltaPoints (points, 0-100 scale) plus a summary (matchedOutcomeCount, overallDeltaPoints, maxSharedOutcomeDeltaPoints); maxOverallGap/maxOutcomeGap/maxConfidence are the cluster's headline numbers, and referenceProbability (when present) is CoinRithm's own liquidity-weighted median across matched venues. Orientation between matched markets is human/aggregator-reviewed — NEVER price-inferred — so every delta is orientation-proven disagreement, not noise. requirePriced (default true) drops any pair where a side is an unpriced/untraded placeholder or fails a quote-dead liveness check — the same quality floor CoinRithm's own /today disagreement page uses; pass false only for research/debug. This is the same methodology powering CoinRithm's public divergence rankings — cite CoinRithm when quoting a gap. Research/data only: for tradability of one specific outcome use pm_quote. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault
fiatNoFiat currency code for monetary figures (default usd).
sortNoRanking: confidence_desc (default) = strongest match first; divergence_desc = total cross-outcome gap; max_outcome_delta_desc = single largest shared-outcome gap (avoids multi-leg basket noise).
limitNoMax clusters (1-25, default 3).
offsetNoPagination offset (default 0).
statusNoPass 'open' to require BOTH matched events be currently open.
sourceKindNoPass 'market' to restrict both sides of every pair to real-money market venues (excludes forecast/play-money venues like Metaculus/Manifold).
minDivergenceNoFloor (points, 0-100) on whichever metric the active sort ranks by.
requirePricedNoDefault true: drops any pair where a side is an unpriced/untraded placeholder or fails a quote-dead liveness check. Set false only for research/debug.
maxSnapshotAgeMinutesNoRequire both matched events' probability come from a price snapshot captured within this many minutes.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: explains that orientation is human/aggregator-reviewed and never price-inferred, what requirePriced drops (unpriced placeholders and quote-dead pairs), what referenceProbability means, and the citation requirement. The readOnlyHint is implicit but not contradicted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core concept and ends with usage routing, which is good, but the middle is dense with metric names (maxOverallGap, maxOutcomeGap, maxConfidence) and parenthetical asides that would benefit from trimming or structuing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-param research tool with an output schema, this covers origin of matches, quality floor, orientation, and citation expectations. It does not need to reproduce the output schema, and nothing an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so a baseline of 3 applies, and the prose adds real meaning for requirePriced and the divergence metrics that minDivergence and sort act on. This is a meaningful lift over the schema descriptions alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb/resource: free public cross-venue disagreement clusters built from approved cross-source matches, graph-clustered so one row spans every venue. Clearly distinguishes itself from the many pm_data_* siblings by naming the matched-question clustering concept.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes single-outcome tradability to pm_quote and labels requirePriced=false as research/debug only, giving a clear when-not-to-use case. Still doesn't state when to prefer this over pm_data_canonical or pm_data_event for the same question.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_data_eventGet prediction-market event detailA
Read-only
Inspect

Free public detail for one prediction-market event by venue + slug: outcomes with probabilities, price snapshots, resolution evidence, crossSourceMatches (the SAME real-world question priced on other venues — read probability divergence directly from it), referenceProbability when present (CoinRithm's canonical cross-venue number: the liquidity-weighted median Yes probability across matched real-money venues, with venueCount and spreadPoints — quote all three together, venues disagree and the spread says by how much), recent whale trades on the event, related events, related news, and volumeHistory when present (daily volume points captured since 2026-07-02 — read the event's volume trend directly from it). The default summary bounds outcomes, related events, matches and tape for agent context windows while preserving counts and core evidence. Outcome summaries may include hasObservedPrice and bounded sourceObservation: hasObservedPrice:false means the provider supplied no usable observed price input, while an omitted hasObservedPrice field is unknown; sourceObservation:null means unavailable provenance, not proof that the outcome has no price. Neither field is a live, liquidity, or trading guarantee. priceBasis:'unquoted' (Polymarket/Kalshi) means never traded with no usable book: that probability is not a price. Set detail=full only when the untouched provider-rich record is needed. This is the cross-venue research view; for tradability use pm_quote. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault
fiatNoFiat currency code for monetary figures (default usd).
slugYesEvent slug on that venue.
detailNoResponse detail: bounded summary (default) or untouched full record.
sourceYesVenue slug: polymarket, kalshi, rothera, limitless, smarkets, manifold, metaculus, predictit, futuur, myriad, forecastex, or gemini.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover only the safety profile (readOnly/openWorld/non-destructive), and the description adds substantial behaviour beyond that: the default summary bounds arrays while preserving counts, hasObservedPrice:false vs omitted vs unknown, sourceObservation:null meaning 'unavailable provenance, not proof of absence', priceBasis:'unquoted' meaning never traded with no usable book, and the referenceProbability composition (liquidity-weighted median over matched real-money venues with venueCount and spreadPoints, which must be quoted together). It also discloses auth ('No API key required') and data-capture windows (volume points since 2026-07-02).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and payload, and most parentheticals carry real semantic load. It is nonetheless a very long, heavily nested single block, and the caveat chain (hasObservedPrice / sourceObservation / priceBasis) is dense enough that a reader can lose the main thread before reaching the pm_quote routing line.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, annotations covering safety, and 100% parameter coverage, the description supplies exactly the missing layer: field-level semantics for the ambiguous/auxiliary fields, default-vs-full behaviour, and the sibling routing rule. Nothing an agent needs to call or interpret the result correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description goes modestly beyond it by explaining what detail=full actually yields versus the bounded default summary, and by framing source as the venue key for slug resolution, but fiat is left entirely to the schema and no format/syntax detail is added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+keying scheme: fetch free public detail for one prediction-market event by venue + slug, then enumerates the concrete return payload (outcomes/probabilities, price snapshots, resolution evidence, crossSourceMatches, referenceProbability, whales, related events/news, volumeHistory). It explicitly separates itself from the tradability sibling: 'This is the cross-venue research view; for tradability use pm_quote.' An agent can place it against pm_data_events/pm_quote without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear usage context and one explicit alternative ('for tradability use pm_quote', plus 'No API key required'), and it gives a condition for the detail flag ('Set detail=full only when the untouched provider-rich record is needed'). It does not, however, disambiguate against the closest research siblings (pm_data_canonical, pm_data_disagreements, pm_data_events) even though it describes canonical/cross-venue concepts those tools likely own.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_data_eventsSearch prediction markets across all venuesA
Read-only
Inspect

Free public search over prediction-market events across ALL 12 venues (Polymarket, Kalshi, Rothera, Limitless, Smarkets, Manifold, Metaculus, PredictIt, Futuur, Myriad, ForecastEx, Gemini) — broader than discover_pm_markets, which is scoped to the paper-tradeable venues. Returns titles, probabilities, volume/liquidity, status, and source per event, plus up to five outcomes, with current outcomes ahead of terminal result rows when an event still has live quotes, plus the full outcome count. Use pm_data_event for all outcomes and full evidence. Also returns referenceProbability when present (CoinRithm's canonical cross-venue number for open events matched across venues — probability, venueCount, spreadPoints, and outcomeName for multi-outcome leaders), quality (persisted truth-engine verdict: decisionEligible + warning/block reason codes — blocked markets stay visible but cannot drive paper opens or alerts), and crossPlatform (sibling venues pricing the same question). Research/data only: to trade, use discover_pm_markets + pm_quote instead. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoOptional search text.
fiatNoFiat currency code for monetary figures (default usd).
sortNoOptional sort key.
limitNoMax rows (1-50, default 20).
offsetNoPagination offset (default 0).
sourceNoOptional venue filter: polymarket, kalshi, rothera, limitless, smarkets, manifold, metaculus, predictit, futuur, myriad, forecastex, or gemini.
statusNoStatus filter: open (default), closed, or all. Without it the API's newest-first list starts with long-closed markets.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/openWorldHint/destructiveHint=false, so safety is covered. The description still adds real behavioral context beyond that: the outcome-ordering rule (live quotes ahead of terminal rows), the referenceProbability and quality verdict semantics (blocked markets stay visible but cannot drive paper opens or alerts), and the no-API-key requirement. It stops short of documenting rate limits or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core scoping distinction is front-loaded well, but the single paragraph then enumerates return fields, referenceProbability internals, and quality reason codes — much of which duplicates the existing output schema. Those sentences do not earn their place given the output schema is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a research/search tool with annotations and an output schema already present, the description covers routing, auth, scope, and notable response behaviors. Nothing an agent needs to select or invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds venue-scope context but no syntax or format detail for q, fiat, sort, limit, offset, source, or status beyond what the schema already documents, so it neither compensates nor regresses.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search) and resource (prediction-market events) and pins the scope to ALL 12 venues, naming them explicitly. It also differentiates itself from discover_pm_markets (paper-tradeable only) and pm_data_event (all outcomes/full evidence), so an agent can pick the right tool without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when-not: 'Research/data only: to trade, use discover_pm_markets + pm_quote instead,' and routes single-event deep dives to pm_data_event. Both the alternative and the selecting condition are named, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_data_overviewCross-venue prediction-market statisticsA
Read-only
Inspect

Free public cross-venue prediction-market statistics: total/open/closed market counts, total volume, 24h volume, and liquidity aggregated across all 12 venues (Polymarket, Kalshi, Rothera, Limitless, Smarkets, Manifold, Metaculus, PredictIt, Futuur, Myriad, ForecastEx, Gemini), plus market highlights in a compact discovery shape. Use pm_data_event for full event evidence. Freshness is SOURCE-AWARE — each venue ingests independently; per-venue health (freshness tier, lag, stale reason) is at /api/prediction-markets/sources/health. Volume is reported on each venue's own basis (see the methodology at https://coinrithm.com/en/prediction-markets/stats) and monetary totals cover real-money venues only — these are self-computed aggregates, so cite CoinRithm when quoting them. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault
fiatNoFiat currency code for monetary figures (default usd).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the read-safe, open-world profile, but the description adds substantial context the annotations do not: no API key required, freshness is source-aware with per-venue lag/health, monetary totals cover real-money venues only, and aggregates are self-computed requiring attribution to CoinRithm. These are meaningful operational caveats beyond the structured hints, though it does not describe rate limits or payload shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The lead sentence front-loads what the tool is and the metrics it returns, and the remaining sentences each add a distinct caveat (sibling routing, freshness, venue basis, attribution, auth). It is dense and long for a one-parameter read tool, but there is little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be re-explained, and the description covers scope, freshness semantics, monetary caveats, attribution, and auth. Combined with the schema it is essentially complete for correct invocation, with only minor ambiguity about the 'compact discovery shape'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 100% and a single optional fiat parameter already documented in the schema, the description does not need to carry parameter burden. It only implies that fiat governs monetary figures, which the schema already states, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (cross-venue prediction-market statistics) and enumerates the exact metrics returned (total/open/closed market counts, total and 24h volume, liquidity) plus the full list of 12 venues. It explicitly distinguishes itself from the pm_data_event sibling, so an agent can tell them apart without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names one alternative with its selecting condition: 'Use pm_data_event for full event evidence.' It also points to /api/prediction-markets/sources/health for per-venue freshness, which is real routing guidance. It does not, however, disambiguate against the many other pm_data_* siblings (volume_history, disagreements, calibration), so the guidance is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_data_sourcesPrediction-market venue methodology and coverageA
Read-only
Inspect

Free public methodology and comparable coverage for every CoinRithm prediction-market venue: source kind, supported metrics, market counts, explicit 24h/cumulative volume bases, currency basis, comparability, and as-of timestamps. Use this before comparing venue totals so a completed-day figure is never described as rolling 24h and play-money points are never described as USD. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault
fiatNoFiat currency code for monetary figures (default usd).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint/openWorldHint/destructiveHint already covering the safety profile, the description adds genuinely new behavioral context: 'Free public', 'No API key required', and that outputs carry explicit as-of timestamps and volume bases. These tell the agent about access requirements and data provenance beyond the annotations. No return-format or rate-limit detail is added, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the resource and its contents, then the usage rule. The field enumeration is dense but each item is substantive and earns its place. Slightly list-heavy but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only metadata endpoint with an output schema, the description need not explain return values, and it covers scope, contents, and usage rationale. An output schema exists and annotations carry safety, so the remaining burden is low. Adequate and nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single fiat parameter, so the schema already documents it fully (default usd). The description's mention of 'currency basis' loosely relates but adds no syntax or constraint detail beyond the schema. Baseline 3 is correct when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (methodology and comparable coverage for every prediction-market venue) and enumerates what it returns: source kind, supported metrics, market counts, volume bases, currency basis, comparability, timestamps. That is far more than a restated name. It stops short of differentiating itself from close siblings like pm_data_sources_health or pm_data_overview, so an agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit, actionable context: 'Use this before comparing venue totals so a completed-day figure is never described as rolling 24h and play-money points are never described as USD.' That is clear when-to-use guidance tied to a concrete failure mode. It does not name alternatives or state when-not-to-use, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_data_sources_healthPrediction-market venue freshness and healthA
Read-only
Inspect

Free public per-venue ingest health across all CoinRithm sources: freshness tier, observed lag, stale/degraded reason, coverage counts, and current health timestamps. Check this before using a quote or claiming cross-venue coverage; a venue being in the catalogue does not by itself prove its hot prices meet the live freshness target. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new context: the endpoint is free, public, and requires no API key, and it clarifies the semantics of 'freshness' relative to a quote. Return format is left to the output schema, which is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences that front-load the resource and scope before the usage warning. Each sentence carries information, though the final 'No API key required' is a minor add-on that could be merged. No padding or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only inspection tool with an existing output schema, the description supplies everything an agent needs: what it reports, when to consult it, and its auth profile. Nothing material for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no parameter semantics to document and the baseline of 4 applies. No description content is needed here and none is missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (per-venue ingest health) and enumerates the outputs (freshness tier, observed lag, stale/degraded reason, coverage counts, health timestamps) with the scope 'all CoinRithm sources'. It distinguishes itself from the catalogue concept (pm_data_sources) by warning that catalogue presence alone doesn't guarantee live freshness, though it never names that sibling directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear triggering condition: 'Check this before using a quote or claiming cross-venue coverage.' That is actionable when-to-use guidance. It does not name alternative tools or state explicit when-not-to-use cases, so it falls short of the top band.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_data_volume_historyGlobal prediction-market volume trendA
Read-only
Inspect

Free public global daily prediction-market volume trend: one point per UTC calendar day (day-over-day delta of each event's cumulative volume, summed across REAL-MONEY venues only — play-money/forecast venues like Manifold and Metaculus are excluded), with a per-venue breakdown (bySource) each day. Captured forward since 2026-07-02, bounded to a rolling ~90-day window; a day or venue with no known value is a gap (null), never a zero bar — do not read a gap as zero activity. Use this to see whether cross-venue prediction-market activity is growing or shrinking over time. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/openWorld/non-destructive, but the description adds substantial behavior the annotations cannot: forward capture since 2026-07-02, a rolling ~90-day bound, daily UTC bucketing, per-venue bySource breakdown, and the crucial semantic that missing values are null gaps, never zero. The 'do not read a gap as zero activity' warning materially prevents misinterpretation of results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core definition is front-loaded and information-dense, with caveats (window, null semantics, no key) following. Overall efficient, though 'Free public' and 'No API key required' restate the same access fact and the opening sentence is heavily parenthesized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-argument aggregation tool with an output schema present, the description covers everything an agent needs: what the series means, its time bounds, granularity, venue inclusion rules, and how to interpret nulls. With the output schema carrying return structure, nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. No parameter claims are contradicted or left ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource (daily prediction-market volume trend) with the exact scope: cross-venue, real-money venues only, per-UTC-day granularity. An agent can distinguish it immediately from siblings like pm_data_overview, pm_data_calibration, or pm_data_sources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the intended use case — 'see whether cross-venue prediction-market activity is growing or shrinking over time' — which gives clear context for selection. It does not, however, name or exclude any specific alternative sibling tool, so routing vs. pm_data_overview or pm_data_calibration is left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_data_whalesGet latest prediction-market whale tradesA
Read-only
Inspect

Free public tape of the latest large prediction-market trades (roughly $1k+ notional) across venues, newest first: side, outcome, USD value, price, market question, and the event it printed on. Polymarket rows are wallet-attributed; Kalshi rows are anonymized exchange prints. A large print is information, not a recommendation. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows (1-50, default 10).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and destructiveHint, so safety is covered. The description adds real behavioral context beyond that: it is free/public, needs no API key, uses a ~$1k+ notional cutoff, distinguishes wallet-attributed Polymarket rows from anonymized Kalshi prints, and cautions that a large print is information, not a recommendation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the resource and scope, each carrying distinct value (what it is, source caveats, disclaimers). No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tape tool with an output schema and full annotation coverage, the description is nearly complete. The field list slightly duplicates the output schema, but the venue/attribution caveats and threshold make it sufficiently informative for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single, fully documented 'limit' parameter (1-50, default 10), so the schema does the heavy lifting. The description adds no additional parameter meaning, making the baseline 3 correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource clearly: a tape of the latest large prediction-market trades across venues, with an explicit $1k+ notional threshold and 'newest first'. It is distinct from siblings like pm_data_overview or pm_data_events, though it never names the closest alternatives (pm_data_whale_wallet/wallets) to explicitly distinguish scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the 'latest large trades, newest first' framing and the notional threshold, but there is no explicit when-to-use, no when-not-to-use, and no routing to the sibling whale-wallet tools for per-wallet views. The agent must infer the niche from context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_data_whale_walletInspect one prediction-market whale walletA
Read-only
Inspect

Free public wallet movement detail for one supported on-chain prediction-market venue and address. Returns observed trade-notional summaries, daily activity, top events, and recent BUY/SELL fills with event provenance. CoinRithm flow fields are matched-trade observations; optional provider-reported positions/PnL context is separate and may carry its own availability and as-of markers. Absence of a row is not proof of inactivity. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesSupported wallet-address venue.
walletYesFull walletAddress from pm_data_whales or pm_data_event, or address from pm_data_whale_wallets. The shortened wallet display is not an address.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/non-destructive/open-world, and the description adds real contextual value: no API key required, the distinction between matched-trade flow fields and separately-sourced provider positions/PnL, as-of markers, and the caveat that 'absence of a row is not proof of inactivity.' That is meaningful disclosure beyond the annotations, though it stops short of rate limits or caching behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and every sentence carries information. The middle sentences on CoinRithm flow fields and provider PnL are dense but earn their place; nothing is purely filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be spelled out, and annotations cover safety, so the remaining burden is usage routing, which is only implicit. For a two-param read tool this is close to complete, missing only explicit when-to-use guidance versus sibling whale tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both params are fully documented in the schema (venue enum, address pattern, provenance of the address). The description's phrase 'one supported ... venue and address' merely restates the two params without adding format or semantics beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('wallet movement detail for one supported on-chain prediction-market venue and address') and constrains scope to a single wallet, which distinguishes it from the sibling list tool pm_data_whales. An agent can tell what it retrieves without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (free public single-wallet lookup) but never explicitly says when to reach for this versus pm_data_whales or pm_data_whale_wallets, nor any prerequisite beyond 'no API key.' The routing hint exists only in the wallet param schema, not in the tool description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_data_whale_walletsExplore prediction-market whale walletsA
Read-only
Inspect

Free public 7-day (default) or 30-day aggregation of identifiable large-trader wallet activity for the on-chain venues that expose wallet addresses. Returns trade count, total and maximum notional, venue attribution, and first/last observed times. An absent wallet does not prove absent trading: anonymized venues and unavailable feeds are excluded. This is market context, not a wallet identity guarantee or recommendation. No API key required.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax wallets (1-50, default 10).
sourceNoRestrict results to one wallet-address venue.
windowNoObserved aggregation window (default 7d).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/destructive/openWorld, so the bar is lower; the description adds genuinely useful behavioral context beyond them — free, no API key, default window, and crucially the coverage limitation that anonymized venues and unavailable feeds are excluded, so an absent wallet is not proof of absent trading. It stops short of describing pagination or rate limits, but the caveats it does disclose are valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what the tool returns, then the caveats and the no-key note. Five sentences is on the long side but each carries distinct information; nothing is redundant with the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value documentation is not strictly required, and the description nonetheless names the returned fields. It covers caveats and access constraints well. The one omission is sibling differentiation against the other whale tools, which leaves an agent without a clear selection rule.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents limit, source, and window with defaults and enums. The description only echoes the default window and the venue-address restriction, adding little beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: aggregation of identifiable large-trader wallet activity for prediction markets over a 7d/30d window. It is clear on what is produced (trade count, notional, venue attribution, timestamps). However, it never differentiates itself from the close siblings pm_data_whales and pm_data_whale_wallet, which an agent must distinguish by name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives implied context (market context, not a recommendation) but no explicit 'use this when' guidance or alternatives. With pm_data_whales and pm_data_whale_wallet in the sibling set, the absence of routing guidance is a real gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pm_quotePrediction-market quoteA
Read-only
Inspect

Read-only PM quote for a binary outcome: entry probability, share estimate, max payout, eligibility, freshness, decisionSupport (market quality/liquidity/volume/spread tiers + flags), quality (the persisted truth-engine verdict), and openBlocked/openBlockReasons — a preview of the open-time quality gate: when openBlocked is true, open_pm_position would be rejected 422 with those stored reason codes (quality_state_missing, quality_state_stale, quote_dead, stale_freshness, ...). Never mutates state. stakeMusd must be > 0 (min to open is 10). Pass side: 'no' to quote backing the NO side (omitted = yes); a NO entry fills at 100 minus the outcome probability and pays out if the outcome resolves false. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
sideNoWhich side of the binary outcome to back. NO pays out if it resolves false; fills at 100 minus the outcome probability. Omitted = yes.
slugYesEvent slug.
sourceYesSource slug (e.g. kalshi, polymarket).
stakeMusdYesmUSD to stake (> 0).
agentTraceNoOptional private trace metadata stored in the caller's ledger.
bankrollMusdNoOptional bankroll in mUSD for the advisory suggested stake.
forecastProbabilityNoOptional own probability that the selected side wins (0-100 exclusive) for advisory edge sizing.
outcomeExternalMarketIdYesCase-sensitive outcome / market id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations: 'Never mutates state', paper-trading-only (virtual mUSD), fills follow paper_execution_v1 with a disclosed execution cost, min-to-open is 10, and it discloses specific 422 reject codes (quality_state_missing, quality_state_stale, quote_dead, stale_freshness). This is exactly the kind of behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and scope before the long field enumeration, and every sentence carries substantive information. It is dense and the list of decisionSupport/quality subfields partly duplicates what the output schema already exposes, keeping it short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with 8 params, an output schema, and nested objects, the description covers intent, trade-safety semantics, gating behavior, execution model, and error previews. Nothing an agent needs in order to invoke and interpret it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so baseline is 3, but the description adds real meaning: the stakeMusd > 0 floor plus the 'min to open is 10' threshold and the side='no' payoff/fill mechanics (fills at 100 minus probability, pays if resolved false), which are not stated in the schema for the minimum.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Read-only PM quote for a binary outcome') and enumerates the quote's contents, so an agent can immediately tell it apart from pm_data_* reads and from open_pm_position.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the related sibling and the condition that routes to it: when openBlocked is true, open_pm_position would be rejected 422 with the stored reason codes, making this a pre-trade gate preview. It doesn't state when NOT to use this tool versus the pm_data_* family, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

report_pm_opportunityReport a non-opened PM opportunityAInspect

Save a durable SELF-REPORT of a prediction-market evaluation for a decision that did not open a position. This WRITES an evidence record but never moves paper funds; authorization requires the read scope. It does not independently verify your evaluation. Choose abstained, forecast_only (requires your own forecastProbability, 1-99), or quote_expired. Report once per decision cycle; cohort.universeSize records its breadth. Supply a non-empty decisionId and reuse it with the same API key on retries: the first stored record wins. agentTrace.decisionId is a fallback; omitting both creates separate records. Success returns body.decisionUuid and, on replay, body.idempotentReplay=true. Check ok/httpStatus before treating delivery as confirmed; a network error does not prove rejection. Use open_pm_position to place a paper trade.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesabstained = evaluated but did not bet; forecast_only = formed your own probability without trading (forecastProbability required); quote_expired = a validated open the server rejected at act time.
slugNoOptional subject event slug.
runIdNoYour own run id for grouping.
cohortNoOpportunity-cohort breadth (frozen into the artifact).
sourceNoOptional subject market source slug (e.g. kalshi).
agentTraceNoOptional private trace metadata stored in the caller's ledger.
decisionIdNoNon-empty id for this decision, unique within your API key. Reuse for retries. Falls back to agentTrace.decisionId; omitting both creates a new record on each call.
provenanceNoOptional self-reported provenance (WHAT RAN). No trust: the server stamps policy versions + providerVerified itself. Any block (even {}) makes the artifact schemaVersion 2.
reasonCodeNoShort structured reason (e.g. 'no_edge', 'stale_data').
marketProbabilityNoThe market price (0-100) you observed at the time.
forecastProbabilityNoYour OWN forecast probability (1-99). REQUIRED for forecast_only; optional for other kinds. Never echo the market price.
outcomeExternalMarketIdNoOptional case-sensitive outcome/market id of the subject.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover only the generic write/non-destructive profile, and the description adds the operationally critical details: it never moves paper funds, requires the read scope, does not verify the caller's evaluation, the first stored record wins on retries, and a network error does not prove rejection. It even explains the idempotentReplay/decisionUuid return semantics, none of which annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded, leading with what gets written and the safety boundary before enumerating the kind choices and retry semantics. Every sentence carries information, though it is on the longer side for a single tool description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter write tool with nested objects, the description covers the mutation semantics, scope requirement, retry/idempotency behavior, success-confirmation guidance, and the sibling alternative. An output schema exists, yet the return fields are still summarized, leaving no material gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, but the description adds genuine meaning: forecastProbability must be the caller's own (1-99) and never the market price, cohort.universeSize records cohort breadth, and decisionId must be reused for retries with an agentTrace.decisionId fallback. These rules go beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: saves a durable SELF-REPORT of a PM evaluation for a decision that did not open a position. It is clearly distinguishable from open_pm_position, which it explicitly names as the tool for the opposite case (actually placing a paper trade).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly covers when to use it (non-opened evaluations), how to choose among the three kinds (abstained / forecast_only / quote_expired, with the forecastProbability requirement called out), and the alternative (open_pm_position) for the case where a trade is actually placed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_symbolResolve symbol -> coinIdA
Read-only
Inspect

Resolve 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 unique). Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesSymbol, slug, or name (e.g. BTC, bitcoin, Ethereum).
agentTraceNoOptional private trace metadata stored in the caller's ledger.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds genuine context beyond that: paper trading only (virtual mUSD), fills follow paper_execution_v1 with a disclosed execution cost, and executionModel appears in quote/trade results. Some of that execution detail belongs more to the trade tools than to a resolver, but the environment constraint is useful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, followed by usage routing, then environment notes — a sensible order with minimal waste. The trailing sentence about paper_execution_v1 and execution cost is slightly tangential for a pure resolution tool, trimming it to a 4.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be re-explained, and the description covers purpose, usage ordering, and environment. The only soft spot is that the execution-cost sentence is more relevant to downstream quote/trade calls, but it does no harm.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both `q` and `agentTrace` (with its nested fields) are already documented in the schema. The description's format examples ('BTC', 'ethereum') restate what the schema provides, adding little beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Resolve a human symbol / slug / name ... to a CoinRithm coinId (UCID) plus disambiguating alternatives, each with its CoinGecko category tags.' It clearly names its output and its role relative to the wallet/quote/order tools, so an agent can distinguish it from siblings without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this FIRST to get the coinId that the wallet / quote / order tools need — don't guess UCIDs (symbols are not unique)' gives explicit ordering, names the dependent tools, and states an exclusion (don't guess). Nothing about when to invoke is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_futures_sl_tpSet futures stop-loss / take-profitA
Idempotent
Inspect

Set 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 mark (liquidation always takes precedence); a fire closes the FULL position at mark with realized PnL. Discover fills between polls via my_trades with updatedSince. Requires the trade:futures scope. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentTraceNoOptional private trace metadata stored in the caller's ledger.
positionIdYesOpen futures position id.
stopLossPriceNoPositive number sets; null clears; omit = unchanged.
takeProfitPriceNoPositive number sets; null clears; omit = unchanged.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnly=false, idempotent=true, destructive=false) by disclosing that a per-minute worker fires off the live mark, that liquidation takes precedence, that a fire closes the FULL position at mark with realized PnL, that fills between polls surface via my_trades with updatedSince, and that execution follows paper_execution_v1 with a disclosed cost. This is unusually rich operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the core action and trigger semantics come first, then firing behavior, then scope/paper-mode caveats. Some clauses (agentTrace is not mentioned at all, executionModel pointer) could be trimmed, but each sentence carries real information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers the remaining gaps an agent needs: side-aware constraints, firing mechanics, scope, paper-trading status, and the execution-cost model.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, and the schema already states 'positive sets; null clears; omit = unchanged'. The description adds genuine value beyond that with the side-aware ordering constraint (long: liq < SL < mark < TP; short inverted), which the schema does not encode.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair ('Set or clear') and precise resource ('resting stop-loss / take-profit triggers on an OPEN mock futures position'), which cleanly distinguishes it from open_futures_position and close_futures_position among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the precondition (position must be OPEN), the semantics of set/clear/omit, and the scope requirement (trade:futures), so the agent knows the context. It does not explicitly name alternative tools for adjacent needs (e.g. close_futures_position for full exits), which keeps it short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

spot_quoteSpot quoteA
Read-only
Inspect

Read-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 informational only (a market order fills regardless). coinId is a UCID, NOT a ticker — use resolve_symbol first. Paper trading only (virtual mUSD). Fills follow paper_execution_v1 with a disclosed execution cost; see executionModel in quote/trade results.

ParametersJSON Schema
NameRequiredDescriptionDefault
sideYesSpot side: buy increases the coin balance; sell reduces it.
coinIdYesCoin UCID (e.g. '1' = BTC).
quantityYesAmount of the base coin (> 0).
agentTraceNoOptional private trace metadata stored in the caller's ledger.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/destructive/openWorld, but the description adds substantial context: it never mutates state, price age is informational because market orders fill regardless, it is paper trading only (virtual mUSD), fills follow paper_execution_v1 with a disclosed execution cost visible via executionModel. This is meaningfully more than the safety hints alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the read-only quote nature and its outputs come first, then the guidance, then the caveats (price age, UCID, paper trading, execution model). Slightly overloaded with distinct caveats in a single block, but every sentence carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-field documentation is not required, yet the description still flags blockReasons and executionModel. Combined with the paper-trading and execution-model notes, an agent has everything needed to call this correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds value by reinforcing that coinId is a UCID (not a ticker) and must be produced by resolve_symbol, which changes how the caller prepares the argument. It does not, however, clarify the semantics of agentTrace beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource ('Read-only spot MARKET quote') and enumerates exactly what it returns: live execution price, estimated cost, available balance, and fill eligibility with blockReasons. This makes it immediately distinguishable from sibling tools like futures_quote, pm_quote, and place_spot_order.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'quote before place_spot_order instead of buying/selling blind' and 'use resolve_symbol first' to convert a ticker to a coinId. It names both the downstream alternative and the prerequisite tool, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

whoamiWho am I (CoinRithm)A
Read-only
Inspect

Check the caller's CoinRithm API-key identity and permissions before using account or trading tools. Returns userId, keyId, scopes, usage, and nullable agentName/agentModel labels; agentModel is self-reported, not verified runtime identity. Any valid configured or per-request key works; no additional scope is required. Missing or invalid keys return 401. Omit agentTrace for a simple check. Does not change permissions or paper balances; requests update usage/last-used metadata and may be privately logged.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentTraceNoOptional private trace metadata stored in the caller's ledger.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
bodyNo
httpStatusYes
ledgerStatusNo
ledgerEventIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/destructive annotations, it discloses the 401 failure mode for missing/invalid keys, that permissions and paper balances are unaffected, that requests update usage/last-used metadata and may be privately logged, and that agentModel is self-reported rather than verified identity. This resolves the apparent tension with readOnlyHint=true by clarifying the only side effects are metadata/logging.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and prerequisite are front-loaded, and nearly every clause carries distinct information (returns, auth behavior, side effects, parameter hint). It is denser than strictly necessary and could be trimmed slightly, but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, the description needn't explain return values in depth, yet it does briefly enumerate them. Combined with auth behavior, side-effect disclosure, and the parameter hint, an agent has everything needed to call it correctly in a pre-trade identity check.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage and a nested agentTrace object, the baseline is 3, but the description adds real value: it tells the agent to omit agentTrace for a simple check and warns that strategyLabel/agentModel content is self-reported metadata, not verified identity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb (check) and resource (CoinRithm API-key identity and permissions) and positions it as a prerequisite to account/trading tools, which clearly separates it from siblings like get_portfolio or place_spot_order. It also enumerates the returned fields, so an agent knows exactly what it gets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context ('before using account or trading tools') and practical conditions ('Any valid configured or per-request key works; no additional scope is required', 'Omit agentTrace for a simple check'). It doesn't name an alternative tool or explicit when-not-to-use, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 41 tool updatesv0.1.23
    • Changedcancel_spot_order5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedclose_futures_position5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changeddiscover_pm_markets5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedexport_agent_ledger5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedexport_run_evidence5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedfutures_quote5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedget_agent_ledger5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedget_arena_agent5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedget_arena_leaderboard5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedget_candles5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedget_crypto_movers5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedget_equity_curve5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedget_market_context5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedget_my_trades5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Addedget_news
    • Changedget_performance5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedget_portfolio5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedget_positions5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedget_wallet5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedlist_open_orders5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedopen_futures_position5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedopen_pm_position5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedplace_spot_order5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_data_calibration5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_data_canonical5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_data_disagreements6 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max clusters (1-25, default 10)."New value: +"Max clusters (1-25, default 3)."
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_data_event5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_data_events6 fields changed
      • changedInput schema / properties / status / description
        Previous value: -"Optional status filter (e.g. open or closed)."New value: +"Status filter: open (default), closed, or all. Without it the API's newest-first list starts with long-closed markets."
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_data_overview5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_data_sources5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_data_sources_health5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_data_volume_history5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_data_whale_wallet6 fields changed
      • changedInput schema / properties / wallet / description
        Previous value: -"Wallet address returned by pm_data_whale_wallets."New value: +"Full walletAddress from pm_data_whales or pm_data_event, or address from pm_data_whale_wallets. The shortened wallet display is not an address."
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_data_whale_wallets5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_data_whales5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedpm_quote5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedreport_pm_opportunity5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedresolve_symbol5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedset_futures_sl_tp5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedspot_quote5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
    • Changedwhoami5 fields changed
      • removedOutput schema / properties / body / description
        Removed value: -"Parsed CoinRithm response body, or raw text when the response is not JSON."
      • removedOutput schema / properties / httpStatus / description
        Removed value: -"HTTP status returned by CoinRithm, or 0 for network errors."
      • removedOutput schema / properties / ledgerEventId / description
        Removed value: -"Private AgentActionEvent id returned by /api/agent/*, when present."
      • removedOutput schema / properties / ledgerStatus / description
        Removed value: -"Ledger write status header returned by CoinRithm, when present."
      • removedOutput schema / properties / ok / description
        Removed value: -"True when CoinRithm returned a successful 2xx response."
  2. 4 tool updatesv0.1.21
    • Changedopen_pm_position1 field changed
      • addedInput schema / properties / thesis
        Added value: +{
        +  "description": "Optional one-line thesis for this decision (max 280 characters).",
        +  "maxLength": 280,
        +  "type": "string"
        +}
    • Addedpm_data_whale_wallet
    • Addedpm_data_whale_wallets
    • Changedpm_quote2 fields changed
      • addedInput schema / properties / bankrollMusd
        Added value: +{
        +  "description": "Optional bankroll in mUSD for the advisory suggested stake.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / forecastProbability
        Added value: +{
        +  "description": "Optional own probability that the selected side wins (0-100 exclusive) for advisory edge sizing.",
        +  "exclusiveMaximum": 100,
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
  3. 2 tool updatesv0.1.19
    • Changedcancel_spot_order1 field changed
      • changedInput schema / properties / orderId / description
        Previous value: -"Open order id."New value: +"Your paper spot order id from list_open_orders."
    • Changedreport_pm_opportunity2 fields changed
      • changedInput schema / properties / decisionId / description
        Previous value: -"Your own id for this decision — idempotency key within your API key."New value: +"Non-empty id for this decision, unique within your API key. Reuse for retries. Falls back to agentTrace.decisionId; omitting both creates a new record on each call."
      • changedInput schema / properties / forecastProbability / description
        Previous value: -"Your OWN probability (1-99) the chosen side wins. REQUIRED for forecast_only; omit for the other kinds. Never echo the market price."New value: +"Your OWN forecast probability (1-99). REQUIRED for forecast_only; optional for other kinds. Never echo the market price."
  4. 1 tool updatev0.1.15
    • Addedget_crypto_movers
  5. 9 tool updatesv0.1.14
    • Addedpm_data_calibration
    • Addedpm_data_canonical
    • Addedpm_data_disagreements
    • Changedpm_data_event2 fields changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Response detail: bounded summary (default) or untouched full record.",
        +  "enum": [
        +    "summary",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / source / description
        Previous value: -"Venue slug: polymarket, kalshi, rothera, limitless, smarkets, manifold, metaculus, predictit, futuur, myriad, or forecastex."New value: +"Venue slug: polymarket, kalshi, rothera, limitless, smarkets, manifold, metaculus, predictit, futuur, myriad, forecastex, or gemini."
    • Changedpm_data_events1 field changed
      • changedInput schema / properties / source / description
        Previous value: -"Optional venue filter: polymarket, kalshi, rothera, limitless, smarkets, manifold, metaculus, predictit, futuur, myriad, or forecastex."New value: +"Optional venue filter: polymarket, kalshi, rothera, limitless, smarkets, manifold, metaculus, predictit, futuur, myriad, forecastex, or gemini."
    • Addedpm_data_sources
    • Addedpm_data_sources_health
    • Addedpm_data_volume_history
    • Changedpm_data_whales2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Max rows (1-50, default 10).",
        +  "maximum": 50,
        +  "minimum": 1,
        +  "type": "integer"
        +}
  6. 4 tool updatesv0.1.13
    • Changedopen_pm_position2 fields changed
      • addedInput schema / properties / forecastProbability
        Added value: +{
        +  "description": "OPTIONAL. Report your OWN estimated probability (0-100, exclusive) that the chosen side wins, decided BEFORE you look at sizing/fill. It is stored SEPARATELY from the market price you pay and feeds your PUBLIC calibration record (agentBrier), which scores your forecast SKILL — not the market's. Omit it if you are not forecasting; never echo the market probability back.",
        +  "exclusiveMaximum": 100,
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / provenance
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional self-reported provenance (WHAT RAN). No trust: the server stamps policy versions + providerVerified itself. Any block (even {}) makes the artifact schemaVersion 2.",
        +  "properties": {
        +    "bundleId": {
        +      "maxLength": 120,
        +      "type": "string"
        +    },
        +    "bundleVersion": {
        +      "maxLength": 40,
        +      "type": "string"
        +    },
        +    "configHash": {
        +      "description": "sha256 hex of your resolved config/spec. HASH ONLY — never raw text.",
        +      "pattern": "^[0-9a-fA-F]{64}$",
        +      "type": "string"
        +    },
        +    "evidenceRef": {
        +      "additionalProperties": false,
        +      "description": "Pointers to the observation evidence (never the evidence itself).",
        +      "properties": {
        +        "snapshotIds": {
        +          "description": "Opaque snapshot ids (capped at 100).",
        +          "items": {
        +            "maxLength": 200,
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "sourceCapturedAt": {
        +          "description": "Source capture time (ISO 8601).",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "modelName": {
        +      "maxLength": 80,
        +      "type": "string"
        +    },
        +    "modelProvider": {
        +      "maxLength": 80,
        +      "type": "string"
        +    },
        +    "packageVersion": {
        +      "maxLength": 40,
        +      "type": "string"
        +    },
        +    "promptHash": {
        +      "description": "sha256 hex of your exact prompt strings. HASH ONLY — never raw text.",
        +      "pattern": "^[0-9a-fA-F]{64}$",
        +      "type": "string"
        +    },
        +    "runtimeKind": {
        +      "description": "The runtime surface you ran on (self-reported; no trust).",
        +      "enum": [
        +        "hosted_scheduler",
        +        "self_host_runner",
        +        "byo_api",
        +        "mcp_tool"
        +      ],
        +      "type": "string"
        +    },
        +    "skillVersions": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "{skillId: version}. Capped: 50 keys, key<=120 / value<=40.",
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedpm_data_event1 field changed
      • changedInput schema / properties / source / description
        Previous value: -"Venue slug: polymarket, kalshi, metaculus, predictit, limitless, manifold, or smarkets."New value: +"Venue slug: polymarket, kalshi, rothera, limitless, smarkets, manifold, metaculus, predictit, futuur, myriad, or forecastex."
    • Changedpm_data_events1 field changed
      • changedInput schema / properties / source / description
        Previous value: -"Optional venue filter: polymarket, kalshi, metaculus, predictit, limitless, manifold, or smarkets."New value: +"Optional venue filter: polymarket, kalshi, rothera, limitless, smarkets, manifold, metaculus, predictit, futuur, myriad, or forecastex."
    • Addedreport_pm_opportunity
  7. 6 tool updatesv0.1.12
    • Changedopen_pm_position1 field changed
      • addedInput schema / properties / side
        Added value: +{
        +  "description": "Which side of the binary outcome to back. NO pays out if it resolves false; fills at 100 minus the outcome probability. Omitted = yes.",
        +  "enum": [
        +    "yes",
        +    "no"
        +  ],
        +  "type": "string"
        +}
    • Addedpm_data_event
    • Addedpm_data_events
    • Addedpm_data_overview
    • Addedpm_data_whales
    • Changedpm_quote1 field changed
      • addedInput schema / properties / side
        Added value: +{
        +  "description": "Which side of the binary outcome to back. NO pays out if it resolves false; fills at 100 minus the outcome probability. Omitted = yes.",
        +  "enum": [
        +    "yes",
        +    "no"
        +  ],
        +  "type": "string"
        +}
  8. 1 tool updatev0.1.10
    • Addedexport_run_evidence
  9. 25 tool updatesv0.1.8
    • Changedcancel_spot_order3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedclose_futures_position3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changeddiscover_pm_markets3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Addedexport_agent_ledger
    • Changedfutures_quote3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Addedget_agent_ledger
    • Changedget_arena_agent2 fields changed
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedget_arena_leaderboard2 fields changed
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedget_candles3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedget_equity_curve3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedget_market_context3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedget_my_trades3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedget_performance4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedget_portfolio3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedget_positions3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedget_wallet3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedlist_open_orders3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedopen_futures_position3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedopen_pm_position3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedplace_spot_order3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedpm_quote3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedresolve_symbol3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedset_futures_sl_tp3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedspot_quote3 fields changed
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedwhoami4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / agentTrace
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Optional private trace metadata stored in the caller's ledger.",
        +  "properties": {
        +    "confidence": {
        +      "description": "Optional confidence score from 0 to 1.",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "decisionId": {
        +      "description": "Agent decision id for quote/write attribution.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "rationaleSummary": {
        +      "description": "Optional concise rationale summary. Do not include chain-of-thought, secrets, or account identity.",
        +      "maxLength": 1200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "runId": {
        +      "description": "Agent run id for grouping.",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "strategyLabel": {
        +      "description": "Short strategy label, self-reported by the caller.",
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / ledgerEventId
        Added value: +{
        +  "description": "Private AgentActionEvent id returned by /api/agent/*, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ledgerStatus
        Added value: +{
        +  "description": "Ledger write status header returned by CoinRithm, when present.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  10. 3 tool updatesv0.1.7
    • Changedget_arena_leaderboard1 field changed
      • addedInput schema / properties / window
        Added value: +{
        +  "description": "Ranking window (default all = all-time). 7d/30d re-rank by in-window realized PnL; counts/winRate/sparkline become window-scoped.",
        +  "enum": [
        +    "7d",
        +    "30d",
        +    "all"
        +  ],
        +  "type": "string"
        +}
    • Addedget_candles
    • Changedplace_spot_order2 fields changed
      • addedInput schema / properties / idempotencyKey
        Added value: +{
        +  "description": "Unique per intent; reuse replays the original result.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "coinId",
        -  "side",
        -  "orderType",
        -  "quantity"
        -]New value: +[
        +  "coinId",
        +  "side",
        +  "orderType",
        +  "quantity",
        +  "idempotencyKey"
        +]
  11. 5 tool updatesv0.1.6
    • Changedget_equity_curve1 field changed
      • addedInput schema / properties / granularity
        Added value: +{
        +  "description": "daily (default) = one point per day; realized = intraday point per realized-PnL event with cumulative total.",
        +  "enum": [
        +    "daily",
        +    "realized"
        +  ],
        +  "type": "string"
        +}
    • Changedget_my_trades1 field changed
      • addedInput schema / properties / updatedSince
        Added value: +{
        +  "description": "ISO 8601 cursor: only trades closed/settled since this instant. Pass the previous response's asOf back here.",
        +  "type": "string"
        +}
    • Changedget_positions1 field changed
      • addedInput schema / properties / updatedSince
        Added value: +{
        +  "description": "ISO 8601 cursor: only positions whose row changed since this instant. Pass the previous response's asOf back here.",
        +  "type": "string"
        +}
    • Changedlist_open_orders3 fields changed
      • changedInput schema / properties / coinId / description
        Previous value: -"Coin UCID to list open orders for."New value: +"Coin UCID filter. Omit to list ALL open orders."
      • addedInput schema / properties / updatedSince
        Added value: +{
        +  "description": "ISO 8601 cursor: only orders whose row changed since this instant. Pass the previous response's asOf back here.",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "coinId"
        -]
    • Changedopen_futures_position2 fields changed
      • addedInput schema / properties / stopLossPrice
        Added value: +{
        +  "description": "Optional resting stop-loss set atomically at open (USD trigger; fired by the per-minute worker).",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / takeProfitPrice
        Added value: +{
        +  "description": "Optional resting take-profit set atomically at open (USD trigger; fired by the per-minute worker).",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
  12. 22 tool updatesv0.1.5
    • Changedcancel_spot_order1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedclose_futures_position3 fields changed
      • addedInput schema / properties / idempotencyKey / description
        Added value: +"Unique per close intent; reuse replays the original result."
      • addedInput schema / properties / positionId / description
        Added value: +"Open futures position id to close or reduce."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changeddiscover_pm_markets1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedfutures_quote2 fields changed
      • addedInput schema / properties / side / description
        Added value: +"Futures direction: long benefits if price rises; short benefits if price falls."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedget_arena_agent1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedget_arena_leaderboard1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedget_equity_curve1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedget_market_context1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedget_my_trades1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedget_performance1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedget_portfolio1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedget_positions1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedget_wallet1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_open_orders1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedopen_futures_position5 fields changed
      • addedInput schema / properties / coinId / description
        Added value: +"Coin UCID to open futures for. Use resolve_symbol first."
      • addedInput schema / properties / leverage / description
        Added value: +"Leverage multiplier (1-20x)."
      • addedInput schema / properties / marginMusd / description
        Added value: +"Isolated margin in mUSD (>= 10)."
      • addedInput schema / properties / side / description
        Added value: +"Futures direction: long benefits if price rises; short benefits if price falls."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedopen_pm_position5 fields changed
      • addedInput schema / properties / idempotencyKey / description
        Added value: +"Unique per PM-open intent; reuse replays the original result."
      • addedInput schema / properties / outcomeExternalMarketId / description
        Added value: +"Case-sensitive outcome or market id returned by discovery."
      • addedInput schema / properties / slug / description
        Added value: +"Prediction-market event slug."
      • addedInput schema / properties / source / description
        Added value: +"Prediction-market source slug, e.g. kalshi or polymarket."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedplace_spot_order3 fields changed
      • addedInput schema / properties / orderType / description
        Added value: +"Order execution type: market, limit, or stop."
      • addedInput schema / properties / side / description
        Added value: +"Spot side: buy spends USDT; sell spends the base coin."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedpm_quote1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedresolve_symbol1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Addedset_futures_sl_tp
    • Changedspot_quote2 fields changed
      • addedInput schema / properties / side / description
        Added value: +"Spot side: buy increases the coin balance; sell reduces it."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedwhoami1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "body": {
        +      "description": "Parsed CoinRithm response body, or raw text when the response is not JSON."
        +    },
        +    "httpStatus": {
        +      "description": "HTTP status returned by CoinRithm, or 0 for network errors.",
        +      "type": "integer"
        +    },
        +    "ok": {
        +      "description": "True when CoinRithm returned a successful 2xx response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "httpStatus",
        +    "ok"
        +  ],
        +  "type": "object"
        +}
  13. 21 tool updatesv0.1.4
    • First observedcancel_spot_order
    • First observedclose_futures_position
    • First observeddiscover_pm_markets
    • First observedfutures_quote
    • First observedget_arena_agent
    • First observedget_arena_leaderboard
    • First observedget_equity_curve
    • First observedget_market_context
    • First observedget_my_trades
    • First observedget_performance
    • First observedget_portfolio
    • First observedget_positions
    • First observedget_wallet
    • First observedlist_open_orders
    • First observedopen_futures_position
    • First observedopen_pm_position
    • First observedplace_spot_order
    • First observedpm_quote
    • First observedresolve_symbol
    • First observedspot_quote
    • First observedwhoami

TDQS

A3.7/5.0

Scored across 41 tools

Disambiguation4/5

Most tools have clearly distinct purposes (quotes vs. order placement vs. data research are separated well). However, the set includes many overlapping data tools: get_market_context, get_news, get_candles, get_crypto_movers, pm_data_events, pm_data_event, pm_data_disagreements, pm_data_overview, discover_pm_markets — an agent can struggle to pick which PM research tool answers a given question, and get_market_context vs. get_candles vs. get_crypto_movers overlap conceptually.

Naming Consistency3/5

There are several prefix conventions (pm_data_*, get_*, pm_/futures_/spot_ prefixes) and the domain prefixes are mostly consistent within families (pm_data_event / pm_data_events, spot_quote / place_spot_order), but mixing 'get_' verbs with domain-prefixed action verbs (open_pm_position, place_spot_order, export_run_evidence, report_pm_opportunity) yields a mixed but still readable scheme.

Tool Count1/5

41 tools is very heavy for a single agent trading surface, and several are near-duplicates (pm_data_event / pm_data_events, export_agent_ledger / export_run_evidence / get_agent_ledger). The public PM data tools are a distinct product surface bolted onto the trading server, inflating the count well past what an agent can reliably navigate.

Completeness4/5

The domain (paper trading across spot, futures, PM plus performance/audit) is covered end-to-end: quotes, open/close, SL/TP, order management, portfolio, trades, leaderboard, ledger. Minor gaps exist — no explicit cancel for futures/PM positions beyond close, no direct 'modify order' for spot, and resolution of PM markets is only read-only — but core workflows are present.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Alpaca’s official MCP Server lets you trade stocks, ETFs, crypto, and options, run data analysis, and build strategies in plain English directly from your favorite LLM tools and IDEs
    72
    1,012
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Trade, analyze, and automate Polymarket prediction markets via AI. 34 tools for direct trading, smart money flow, copy trading, backtest, and portfolio management.
    48
    80 npm
    16
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables AI agents to trade crypto with paper money, access market data, view leaderboards, and manage trading bots via an MCP-compatible interface.
    16
    MIT