Roundhouse
REMOTE · API.ROUNDHOUSEAI.IO
Read-only analytics on x402 agent payments and ERC-8004 agent identity, with SQL.
Available components
Last scanned (5 hours ago)
Scores higher than 52% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Crypto and Web3
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one. See how to fix → View diagnostics → Partial
- HTTPS enforcement could not be verified: the plaintext port answered with HTTP 405, which proves neither a plaintext path nor enforcement. View diagnostics → Unverified
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability57
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 8739 tokens (~514/item across 17 items; 17 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management30
- Stability observed for 9 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 17 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 18 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.
- 2 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.
- 29 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 28 Oct 26 0
- Stability: unverified → 0.03 ▲ functional
- 27 Oct 26 +31
- Authorization: pass → partial ▼ security
- Transport: unverified → pass ▲ security
- Injection markers: unverified → pass ▲ security
- First check of Judged manipulation: pass security
- MCP protocol: unverified → fail ▼ functional
- Tool coverage: unverified → 100 ▲ functional
- First check of Schema quality: fail functional
- First check of Schema quality: excellent functional
- First check of Destructive annotations: pass functional
- First check of Schema quality: fail functional
- First check of Tool coverage: 100 functional
- 16 Oct 26 31
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://api.roundhouseai.io/v0/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=roundhouseai.io | CN=WE1,O=Google Trust Services,C=US | 1 Nov 2026 | 30 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | 8ee092e37dbc6c800e5367747b5cad63 |
| SANs: roundhouseai.io, api.roundhouseai.io, *.api.roundhouseai.io | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of api.roundhouseai.io. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| io. | present | 38690 | 8 | Verified |
| roundhouseai.io. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.roundhouseai.io/v0/mcp | Verified | 200 | |
| http (plaintext) | http://api.roundhouseai.io/v0/mcp | Inconclusive | 405 |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
get_account What this caller is entitled to, and what it would be charged ~857
Who the credential in front of this request resolves to, which of the two paid lanes it would take, what it has left to spend, and the price of every route on both lanes. Unmetered and answerable WITHOUT a key: checking your balance must never cost a unit and must never be the thing that fails. A caller with no key gets a real answer (`tier: anonymous`, `lane: x402`, the full price list), not a 401, so both prices can be compared before committing to either. An unrecognised key also answers 200, with `key_recognised: false` — this is the endpoint you reach for when your key is the thing that is broken, so it must work then. Wraps GET /v0/account. Access: no API key required. Returns: - authenticated: Whether a credential was accepted. - key_present: Whether a credential was sent at all. - key_recognised: Whether it resolved, or NULL when none was sent — three-valued, because "no key" and "a key that did not resolve" need different fixes and one `false` for both would conflate them. - tier: `anonymous`, `trial`, `oauth`, or the organization key tier. - plan: The organization's plan key, or null when there is no organization. - lane: Which lane this caller would take on a metered route, so it can be PREDICTED rather than discovered by being refused: `credit` draws down Query Units, `x402` pays per call, `invalid_key` resolves to nothing, `no_account` is a caller with no organisation behind it on the MCP surface, where there is no x402 door, and `upgrade_required` is that same surface reached by a caller that HAS an organisation whose plan excludes the route. The last two were one value until a signed-in connection with an organisation and a balance was told it had no account behind it. - organisation: Id and display name, or null. Named so an operator with several accounts knows which one to top up. - balance: Units available and the low-balance threshold, or NULL with a `balance_note` saying why there is no balance to report — an organizationless caller has none,…
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_agent Per-agent stats and identity ~780
One wallet in its paying role: its resolved identity and its own settlement aggregates. Every figure is that wallet's own — there are no site-wide totals on this endpoint. Wraps GET /v0/agents/{wallet}. Access: requires an API key (Authorization: Bearer rh_live_… or x-api-key). Returns: - wallet: The wallet queried, lowercased. - role: The role it was queried in: `agent` or `merchant`. - coverage: **Read this first.** `known` false means the index has never observed this address, so every figure below is a zero meaning "not observed" — not "observed to be nothing". Also `first_seen`, `last_seen`, `settlements_scanned`, `scan_truncated` and `scan_cap`. - entities: Resolved identity rows: display name, ENS, ERC-8004 card, role, first and last seen. - erc8004_agents: ERC-8004 registrations whose on-chain agentWallet is this address. - aggregates: That wallet's own totals: inbound/outbound USD and counts, distinct counterparties, chain split. `basis` says what they were computed over — `index_rollup` is the whole history, `scanned_settlements` is the capped scan and is a floor when `coverage.scan_truncated` is set. `distinct_counterparties` excludes the wallet itself on both bases. `chain_split` is the exception and carries its own `chain_split_basis`: the rollup is keyed by wallet and holds no chain dimension, so that split is ALWAYS the scan and is capped with it, whatever the object-level `basis` says. - data_quality: The risk annotation. **Route on `verdict`, not on `note`.** `verdict` is one of `unobserved` (never seen — nothing assessed), `patterns_detected`, `no_patterns_detected`, or `insufficient_evidence` — the last meaning the address WAS observed, nothing fired, and not enough of its history was examined for that to rule anything out. `checks` carries every check with its `threshold`, what was `observed`, its own `basis`, and `conclusive`: a check that FIRED is always conclusive (a pattern seen in a sample happened), a check that did not fire on a truncat…
| Name | Type | Req | Description |
|---|---|---|---|
| recent_limit | integer | – | Settlement rows to embed in the profile. 0 omits them. Default 5 — this was an unbounded 25, which is most of the payload on a surface where a response is billed as context tokens. |
| wallet | string | yes | An EVM address (`0x` + 40 hex digits; case-insensitive, lowercased before lookup) or a Solana address (base58; case-sensitive, used exactly as given). An address the index has not observed answers `c… |
No output schema declared.
No examples provided.
get_capability One capability: who offers it, and what it costs ~353
Every indexed endpoint that does this job, with the market's going rate. `price.spot` is the call-WEIGHTED price, not the median — a median counts one wallet's forty near-identical listings as forty votes for its price. Check `price.spot_basis`: `median` means no offer reported any calls and the figure is a fallback, which does not mean the same thing as a market rate. `truncated: true` means the offer list is a floor. Wraps GET /v0/unified/{slug}. Access: no API key required. Returns: - capability: The registry entry: the job, its priced unit, and its canonical request/response. - price: Going rate (`spot`), its basis, and the min / p25 / median / p75 / max spread. - stats: How many offers, distinct providers, distinct hosts, and how many were answering when last probed. - models: For inference capabilities: which model families are sold here, and by how many providers. - offers: Each endpoint, its listed price, its index against spot (100 = the going rate), and its reported 30-day demand. - truncated: True when the candidate read hit its cap, so the offer list is a floor rather than the whole market.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Rows to return. Clamped to 200; values outside the range are clamped, not rejected. |
| probable | boolean | – | Include endpoints the matcher was not confident about. Off by default: grouping two endpoints that do different jobs invents a cheaper competitor that does not exist. |
| slug | string | yes | Capability slug, from `/v0/unified`. |
No output schema declared.
No examples provided.
get_graph Payment graph: nodes and payer→payee edges ~1,027
Entities as nodes and settlements aggregated into edges, over a bounded window. Two window forms, and exactly one may be sent: `window=N` is a row count running to the live tip (briefly cacheable); `days=N` covers **whole UTC days only**, excluding today, so an answer is stable for the day. Use `days` for anything an agent will cache. Self-payments are excluded from BOTH edges and node totals and counted in `meta.excluded`, so `sum(node.window_usd)` is exactly twice `sum(edge.usd)`. Wraps GET /v0/graph. Access: requires an API key (Authorization: Bearer rh_live_… or x-api-key). Returns: - applied: Every parameter as APPLIED, not as requested — both windows, the edge cap, the facilitator caps, the chain, the filters. Read this rather than assuming the request was honoured verbatim. `days` and `window` can BOTH be non-null: a wallet-focused day window is read row by row, so a row cap applies inside the declared range and `complete` says whether it bit. - complete: Whether the declared window was read in full. False means a row cap stopped the read inside the range — the response then covers the newest `applied.window` settlements in it, not the whole of it, and `meta.warnings` says so. Only `?days=` with `?wallet=` can be false. - days: The whole-UTC-day window applied, or `null` on the `window=N` path. - since: Inclusive start of the day window, or `null` on the `window=N` path. - until: Exclusive end of the day window (midnight today), or `null` on the `window=N` path. - since_day: The `since` bound as a UTC date, or `null`. - until_day: The `until` bound as a UTC date, or `null`. - mode: `daily` when the answer came from the per-day rollup, which covers the window exactly; `raw` when it was folded from settlement rows. - bucket: What one source row represented: `day` under `mode: daily`, `settlement` under `raw`. - truncated: True when the edge cap dropped edges the window contained. - nodes: One entry per wallet: role, display name, ENS, and its window totals.…
| Name | Type | Req | Description |
|---|---|---|---|
| chain | string | – | CAIP-2 chain id. Defaults to the chain this deployment indexes (`eip155:8453` in production, `eip155:84532` on staging) — the same default every endpoint on this API uses. A chain the index does not… |
| days | integer | – | Whole UTC days, excluding today, honoured exactly: `days=1` is one day. Mutually exclusive with `window`. Out of `[1,180]` is refused rather than clamped. |
| edges | integer | – | Hard cap on edges returned, highest volume first. Honoured exactly; `truncated` says whether it bit. |
| min_probability | number | – | Minimum x402 confidence, in `[0,1]`. Default 0.5. |
| min_usd | number | – | Drop settlements below this USD value. |
| via | string | – | Restrict to settlements relayed by this facilitator key or wallet. |
| wallet | string | – | Restrict to edges touching this wallet. Must be a well-formed EVM address (case-insensitive) or Solana address (base58, case-sensitive). |
| window | integer | – | Row count back from the live tip. Mutually exclusive with `days` — sending both is refused with 400, not silently resolved in favour of one. |
No output schema declared.
No examples provided.
get_leaderboard ERC-8004 agents by registry feedback score ~316
Agents ordered by the ERC-8004 reputation score, which is the on-chain registry's number and not a Roundhouse rating. Unscored agents sort last rather than dropping out, so a board where nothing has been scored still comes back looking ordered — check `meta.page_scored_agents`, which is how many rows on the page carry a score at all. Zero means the order is the `agent_id` tie-break and nothing more. It pages by `offset` rather than a cursor, because a rank is a position and `score` is nullable — a keyset has nothing stable to compare against across the scored/unscored boundary. Wraps GET /v0/leaderboard. Access: requires an API key (Authorization: Bearer rh_live_… or x-api-key). Returns: - leaderboard: Agent rows in score order, unscored last. - next_offset: Offset for the next page, or `null`. - meta: The chain served, `as_of`, and `page_scored_agents` — rows on this page with a non-null score. A `no_agent_on_this_page_has_a_score` warning when that is zero.
| Name | Type | Req | Description |
|---|---|---|---|
| include_spam | string | – | Set to `1` to include agents with no feedback, which are hidden by default. |
| limit | integer | – | Rows to return. Clamped to 100; values outside the range are clamped, not rejected. |
| offset | integer | – | Rows to skip. Use the returned `next_offset`. |
No output schema declared.
No examples provided.
get_merchant Per-merchant stats and identity ~765
The same shape as `/agents/{wallet}`, for a wallet in its receiving role. Wraps GET /v0/merchants/{wallet}. Access: requires an API key (Authorization: Bearer rh_live_… or x-api-key). Returns: - wallet: The wallet queried, lowercased. - role: The role it was queried in: `agent` or `merchant`. - coverage: **Read this first.** `known` false means the index has never observed this address, so every figure below is a zero meaning "not observed" — not "observed to be nothing". Also `first_seen`, `last_seen`, `settlements_scanned`, `scan_truncated` and `scan_cap`. - entities: Resolved identity rows: display name, ENS, ERC-8004 card, role, first and last seen. - erc8004_agents: ERC-8004 registrations whose on-chain agentWallet is this address. - aggregates: That wallet's own totals: inbound/outbound USD and counts, distinct counterparties, chain split. `basis` says what they were computed over — `index_rollup` is the whole history, `scanned_settlements` is the capped scan and is a floor when `coverage.scan_truncated` is set. `distinct_counterparties` excludes the wallet itself on both bases. `chain_split` is the exception and carries its own `chain_split_basis`: the rollup is keyed by wallet and holds no chain dimension, so that split is ALWAYS the scan and is capped with it, whatever the object-level `basis` says. - data_quality: The risk annotation. **Route on `verdict`, not on `note`.** `verdict` is one of `unobserved` (never seen — nothing assessed), `patterns_detected`, `no_patterns_detected`, or `insufficient_evidence` — the last meaning the address WAS observed, nothing fired, and not enough of its history was examined for that to rule anything out. `checks` carries every check with its `threshold`, what was `observed`, its own `basis`, and `conclusive`: a check that FIRED is always conclusive (a pattern seen in a sample happened), a check that did not fire on a truncated scan is not. `note` says the same thing in a sentence and is derived from the two. - recent:…
| Name | Type | Req | Description |
|---|---|---|---|
| recent_limit | integer | – | Settlement rows to embed in the profile. 0 omits them. Default 5 — this was an unbounded 25, which is most of the payload on a surface where a response is billed as context tokens. |
| wallet | string | yes | An EVM address (`0x` + 40 hex digits; case-insensitive, lowercased before lookup) or a Solana address (base58; case-sensitive, used exactly as given). An address the index has not observed answers `c… |
No output schema declared.
No examples provided.
list_agent_feedback ERC-8004 feedback for one agent ~211
Raw feedback entries from the ReputationRegistry for a single agent id. Wraps GET /v0/agents/{agentId}/feedback. Access: requires an API key (Authorization: Bearer rh_live_… or x-api-key). Returns: - agent_id: The id queried. - chain: The chain the feedback was read from. - feedback: Feedback entries. - meta: The chain served and `as_of`. On an EMPTY list it also carries `dataset_last_written_at`, `dataset_row_count` and any `warnings` (e.g. `endpoints_catalog_stale`) — so a zero can be read as a quiet market or a stalled ingest rather than guessed at.
| Name | Type | Req | Description |
|---|---|---|---|
| agentId | string | yes | ERC-8004 agent id. |
| chain | string | – | CAIP-2 chain id. An agent id is not unique across chains. |
| limit | integer | – | Rows to return. Clamped to 100; values outside the range are clamped, not rejected. |
No output schema declared.
No examples provided.
list_agents Indexed ERC-8004 agents ~631
Agents read from the on-chain IdentityRegistry, with their registration card and payment wallet. `score` is the ERC-8004 reputation score derived from on-chain feedback — it is the REGISTRY's number, not a Roundhouse rating, and it is null for every agent no counterparty has left feedback for. Roundhouse publishes no trust score of its own. Wraps GET /v0/agents. Access: requires an API key (Authorization: Bearer rh_live_… or x-api-key). Returns: - agents: Agent rows with identity, wallet and the ERC-8004 `score` (null where the registry holds no feedback). `x402_support` is the registration card's own declaration; `last_activity_at` and `activity_status` are the observed halves, derived from settlements and feedback. - next_before: Cursor for the next page, or `null`. - meta: The chain served and `as_of`. On an EMPTY list it also carries `dataset_last_written_at`, `dataset_row_count` and any `warnings` (e.g. `endpoints_catalog_stale`) — so a zero can be read as a quiet market or a stalled ingest rather than guessed at.
| Name | Type | Req | Description |
|---|---|---|---|
| before | string | – | Opaque cursor from a previous response's `next_before`. It encodes the whole sort key, tiebreaker included, so a page boundary inside a group of rows sharing a timestamp does not skip the rest. Do no… |
| limit | integer | – | Rows to return. Clamped to 100; values outside the range are clamped, not rejected. |
| q | string | – | Free-text search over name and description. |
| x402 | string | – | The earlier name for `x402_declared`, kept because it is published and a caller sending it wants the same rows. Prefer `x402_declared`, whose name says what it reads. Sending both uses `x402_declared… |
| x402_declared | string | – | Set to `true` to keep only agents whose own ERC-8004 registration card declares x402 support (`x402Support: true`). This is the agent's CLAIM ABOUT ITSELF, copied out of a document its owner wrote, a… |
No output schema declared.
No examples provided.
list_capabilities The capability catalogue ~226
Every job the catalog is grouped by, with the canonical request and response each provider of that job is mapped onto — which is what lets an agent swap one endpoint for another without changing its code. Static: no market figures here, because each one costs its own catalog walk. Ask `/unified/{slug}` for a capability's offers and going rate. Send `fields=compact` when you are only choosing a capability: the full response carries both IO schemas for all of them. Wraps GET /v0/unified. Access: no API key required. Returns: - capabilities: Slug, name, group, priced unit and — on `fields=full` — summary and the canonical input/output fields. - count: How many capabilities the registry defines. - fields: Which shape was served: `full` or `compact`. - note: Where the market figures for one capability live.
| Name | Type | Req | Description |
|---|---|---|---|
| fields | string | – | `compact` returns slug, name, group and unit only — enough to pick a capability, without 34 pairs of IO schemas in the payload. |
No output schema declared.
No examples provided.
list_entity_settlements Settlements for one wallet ~517
Settlements where this wallet is either the payer or the payee, newest first. Walkable deeply in time order: `(payer, block_time desc)` and `(payee, block_time desc)` cover it, so page N costs what page 1 does and a wallet's whole history can be paged for velocity or trend. Wraps GET /v0/entities/{wallet}/settlements. Access: requires an API key (Authorization: Bearer rh_live_… or x-api-key). Returns: - wallet: The wallet queried, lowercased. - settlements: Settlement rows, newest first, decorated with resolved display names. Each row also carries `is_self_payment` (payer = payee, annotated rather than only excluded — a third of the feed can be self-payment) and `evidence`: `{ verified, method, probability, tier }`. `verified` is THREE-VALUED — `true` a named facilitator relayed it, `false` examined with no EIP-3009 marker, and `null` gasless and authorized but NOT ESTABLISHED as x402, which is not the same as disproven. `tier` is `proven` | `probable` | `unproven` | `not_x402` | `ungraded`. - next_before: Cursor for the next page, or `null`. - meta: The chain served and `as_of`. On a non-empty page `meta` also carries `page_self_payments`, `page_self_payment_usd`, `page_gross_usd` and `page_organic_usd`. All four are THIS PAGE only, as the names say: they are not site-wide figures and summing them across pages is not a total.
| Name | Type | Req | Description |
|---|---|---|---|
| before | string | – | Opaque cursor from a previous response's `next_before`. It encodes the whole sort key, tiebreaker included, so a page boundary inside a group of rows sharing a timestamp does not skip the rest. Do no… |
| limit | integer | – | Rows to return. Clamped to 100; values outside the range are clamped, not rejected. |
| wallet | string | yes | An EVM address (`0x` + 40 hex digits; case-insensitive, lowercased before lookup) or a Solana address (base58; case-sensitive, used exactly as given). An address the index has not observed answers `c… |
No output schema declared.
No examples provided.
list_facilitators Relayers, per chain ~358
The facilitators seen relaying settlements, with their known relayer wallets. Paged: this used to return up to 200 rows unpaged, most of their columns null. Null-valued columns are omitted from each row. Wraps GET /v0/facilitators. Access: requires an API key (Authorization: Bearer rh_live_… or x-api-key). Returns: - chain: The chain served — this deployment's default when none was named. - facilitators: Facilitator rows, busiest first. Null-valued fields are omitted. - next_offset: Offset for the next page, or `null`. - meta: The chain served and `as_of`. On an EMPTY list it also carries `dataset_last_written_at`, `dataset_row_count` and any `warnings` (e.g. `endpoints_catalog_stale`) — so a zero can be read as a quiet market or a stalled ingest rather than guessed at.
| Name | Type | Req | Description |
|---|---|---|---|
| chain | string | – | CAIP-2 chain id. Defaults to the chain this deployment indexes (`eip155:8453` in production, `eip155:84532` on staging) — the same default every endpoint on this API uses. A chain the index does not… |
| enriched_only | string | – | Keep only relayers whose nonce and gas balance have been read. A row without `enriched_at` has nothing populated but its address. |
| limit | integer | – | Rows to return. Clamped to 200; values outside the range are clamped, not rejected. |
| offset | integer | – | Rows to skip. Use the returned `next_offset`. |
No output schema declared.
No examples provided.
list_flows Live flow of funds ~423
The newest settlements across every indexed chain, payer to payee. This is the same feed the `/flows` page renders. Wraps GET /v0/flows. Access: requires an API key (Authorization: Bearer rh_live_… or x-api-key). Returns: - flows: Settlement rows, newest first, decorated with resolved display names. Each row also carries `is_self_payment` (payer = payee, annotated rather than only excluded — a third of the feed can be self-payment) and `evidence`: `{ verified, method, probability, tier }`. `verified` is THREE-VALUED — `true` a named facilitator relayed it, `false` examined with no EIP-3009 marker, and `null` gasless and authorized but NOT ESTABLISHED as x402, which is not the same as disproven. `tier` is `proven` | `probable` | `unproven` | `not_x402` | `ungraded`. - next_before: Cursor for the next page, or `null` at the end of the list. - meta: The chain served and `as_of`. On a non-empty page `meta` also carries `page_self_payments`, `page_self_payment_usd`, `page_gross_usd` and `page_organic_usd`. All four are THIS PAGE only, as the names say: they are not site-wide figures and summing them across pages is not a total. On an EMPTY list it instead carries `dataset_last_written_at`, `dataset_row_count` and any `warnings`.
| Name | Type | Req | Description |
|---|---|---|---|
| before | string | – | Opaque cursor from a previous response's `next_before`. It encodes the whole sort key, tiebreaker included, so a page boundary inside a group of rows sharing a timestamp does not skip the rest. Do no… |
| limit | integer | – | Rows to return. Clamped to 100; values outside the range are clamped, not rejected. |
No output schema declared.
No examples provided.
list_services Indexed x402 service directory ~303
The x402 service catalog, ordered by observed 30-day call volume. A listing is a claim; the observed columns are evidence — prefer `is_live` with non-zero `l30_unique_payers`. Note the path stays `/v0/endpoints` although the human page moved to `/services`; renaming it would break published integrations. Wraps GET /v0/endpoints. Access: no API key required. Returns: - endpoints: Catalog rows with price, network, payTo, liveness and observed demand. - next_offset: Offset for the next page, or `null` when this page was the last. - meta: The chain served and `as_of`. On an EMPTY list it also carries `dataset_last_written_at`, `dataset_row_count` and any `warnings` (e.g. `endpoints_catalog_stale`) — so a zero can be read as a quiet market or a stalled ingest rather than guessed at.
| Name | Type | Req | Description |
|---|---|---|---|
| fields | string | – | `compact` returns name, resource, price, network, payTo and liveness only — no description, icon or tags — which is roughly a third of the payload. |
| limit | integer | – | Rows to return. Clamped to 200; values outside the range are clamped, not rejected. |
| offset | integer | – | Rows to skip. Use the returned `next_offset`. |
| q | string | – | Free-text search over service name, description and resource URL. |
No output schema declared.
No examples provided.
list_transactions Global settlement feed ~603
Every indexed settlement, newest first, filterable by how confidently it is known to be an x402 payment. Wraps GET /v0/transactions. Access: requires an API key (Authorization: Bearer rh_live_… or x-api-key). Returns: - transactions: Settlement rows, newest first. Each row also carries `is_self_payment` (payer = payee, annotated rather than only excluded — a third of the feed can be self-payment) and `evidence`: `{ verified, method, probability, tier }`. `verified` is THREE-VALUED — `true` a named facilitator relayed it, `false` examined with no EIP-3009 marker, and `null` gasless and authorized but NOT ESTABLISHED as x402, which is not the same as disproven. `tier` is `proven` | `probable` | `unproven` | `not_x402` | `ungraded`. - next_before: Cursor for the next page, or `null`. Minted from the rows READ, not the rows shown, so `exclude_self_payments` cannot end the walk early. - meta: The chain served and `as_of`. On a non-empty page `meta` also carries `page_self_payments`, `page_self_payment_usd`, `page_gross_usd` and `page_organic_usd`. All four are THIS PAGE only, as the names say: they are not site-wide figures and summing them across pages is not a total. `self_payments_excluded` is set when the page was filtered.
| Name | Type | Req | Description |
|---|---|---|---|
| before | string | – | Opaque cursor from a previous response's `next_before`. It encodes the whole sort key, tiebreaker included, so a page boundary inside a group of rows sharing a timestamp does not skip the rest. Do no… |
| exclude_self_payments | string | – | Set to `true` to drop rows where payer = payee. Off by default: a feed is a record of what happened and a wallet paying itself did happen, so the rows are ANNOTATED (`is_self_payment`) rather than hi… |
| limit | integer | – | Rows to return. Clamped to 100; values outside the range are clamped, not rejected. |
| min_probability | number | – | Keep only rows at or above this x402 confidence. `1.0` is proven by a named facilitator having relayed it; `0.05` is a bare transfer to a catalogued address. Read `evidence` on the row rather than th… |
No output schema declared.
No examples provided.
list_wallets Every address the index has seen ~245
All settling wallets, filterable by the role they were seen in. Wraps GET /v0/wallets. Access: requires an API key (Authorization: Bearer rh_live_… or x-api-key). Returns: - wallets: Wallet rows with role and last seen. - next_before: Cursor for the next page, or `null`. - meta: The chain served and `as_of`. On an EMPTY list it also carries `dataset_last_written_at`, `dataset_row_count` and any `warnings` (e.g. `endpoints_catalog_stale`) — so a zero can be read as a quiet market or a stalled ingest rather than guessed at.
| Name | Type | Req | Description |
|---|---|---|---|
| before | string | – | Opaque cursor from a previous response's `next_before`. It encodes the whole sort key, tiebreaker included, so a page boundary inside a group of rows sharing a timestamp does not skip the rest. Do no… |
| limit | integer | – | Rows to return. Clamped to 100; values outside the range are clamped, not rejected. |
| role | string | – | Restrict to one observed role. |
No output schema declared.
No examples provided.
recommend_capability_offers Shortlist endpoints for a capability ~342
A ranked shortlist of endpoints that do this job, under criteria you choose and the response echoes back. Every term is something the endpoint publishes about itself — its listed price against the going rate, and its own reported demand. Roundhouse does not endorse any provider, and there is no cross-capability ranking. Only confident matches are ever recommended. Wraps GET /v0/unified/{slug}/recommend. Access: no API key required. Returns: - capability: The registry entry for the job being shortlisted. - criteria: Your criteria, echoed — a recommendation whose basis is invisible is an opinion. - price: The capability's going rate, so each candidate's index has context. - candidates: Ranked endpoints, each with `reasons` for where it placed. - considered: How many confident offers were ranked before filters. - excluded: How many were dropped, by which filter. - truncated: True when the candidate read hit its cap. - note: What the ranking is and is not — Roundhouse endorses no provider.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Rows to return. Clamped to 25; values outside the range are clamped, not rejected. |
| live | boolean | – | Only endpoints answering when last probed. |
| max_price | number | – | Hard ceiling in USDC per call. Endpoints with no published price are excluded when set. |
| model | string | – | Require the endpoint to name this model family (inference capabilities only). |
| prefer | string | – | What to weight: cheapest, most-used, or an even split. |
| slug | string | yes | Capability slug, from `/v0/unified`. |
No output schema declared.
No examples provided.
run_sql Read-only SQL over the public dataset ~556
One `SELECT` (or `WITH`) over the public data-layer tables. Enforced in the database, not the worker: a read-only transaction as a role that can see only those tables, a statement timeout set by the TIER, and a hard 300-row cap. No semicolons, no comments, no multi-statement. Priced by the time it takes: one Query Unit per started 5 seconds, floor of 1 — so a query that answers quickly costs 1, which is what every query cost before this was metered. `tier` buys the ceiling (`standard` 15s, `extended` 60s and a paid plan); the tier maximum is HELD when the call starts and the unused part released the moment the duration is known, so `usage.units_charged` on the response is the settled figure. Call `get_account` for the tier table, or send `explain_only` to be quoted without running or paying for anything. Wraps POST /v0/sql. Access: an organization API key on any plan, metered against that organization’s Query Unit balance at 1 unit per started 5 seconds of query time. A paid plan buys the longer 60-second tier, not the route. A trial key belongs to no organization and is refused with the x402 price of one query instead of being served. Returns: - rows: Result rows. - row_count: Number of rows returned. - duration_ms: Server-side execution time. This is what the call is priced on. - authenticated: Whether a key was accepted. - tier: The CREDENTIAL: `anonymous`, `trial`, or an organization tier. - sql_tier: The QUERY: which ceiling this run was given and priced at. A separate field from `tier`, which has always meant the credential. - quote: What the query was quoted at before it ran: the tier's ceiling and price bounds, plus the planner's own `planner_cost` and `plan_rows`. The planner figures are ADVISORY — arbitrary units, uncalibrated against this schema — and never charge anything; settlement is from measured duration, which needs no calibration to be right. - usage: What this call cost and what is left. `units_charged` is SETTLED, not the hold: the tier maxi…
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Rows to return. Clamped to 300. |
| sql | string | yes | A single read-only SELECT (or WITH) statement over the public dataset. No semicolons, no comments, no platform internals. Row cap 300. |
No output schema declared.
No examples provided.
How do I install the Roundhouse MCP server?
Roundhouse is a hosted endpoint at https://api.roundhouseai.io/v0/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · api.roundhouseai.io
claude mcp add --transport http io-roundhouseai-roundhouse 'https://api.roundhouseai.io/v0/mcp'
What is the Roundhouse MCP server?
Roundhouse is an MCP server listed in the public MCP registry as io.roundhouseai/roundhouse. Read-only analytics on x402 agent payments and ERC-8004 agent identity, with SQL. This page covers its hosted endpoint (https://api.roundhouseai.io/v0/mcp).
Is the Roundhouse MCP server safe to use?
Roundhouse scores 66 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Roundhouse MCP server expose?
Roundhouse exposes 17 tools: get_account, list_flows, list_transactions, list_entity_settlements, get_agent, and 12 more. Their descriptions and schemas cost roughly 8,513 tokens of context every time the server is loaded.
Does the Roundhouse MCP server require authentication?
No. We connected to Roundhouse without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Roundhouse MCP server still maintained?
Roundhouse is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.