OpenChainBench

Live, neutral benchmarks for public RPC latency, oracles, bridges, perp DEX, and prediction markets.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
77%
Naming quality
100%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • HIGHTool poisoning patterns detected
  • LOWTool description contains role marker that could confuse chat modelsin get_benchmark

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,681Tokens (tool definitions)
~1.7 KBTypical response size
Moderate attention impact (1.31% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "openchainbench": {
      "url": "https://openchainbench.com/api/mcp/mcp"
    }
  }
}

Remote endpoints

https://openchainbench.com/api/mcp/mcpstreamable-http

What it can do

Tool inventory

Tools (3)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢list_benchmarks

Returns a flat index of every published OpenChainBench benchmark with its current headline value, leader, category, units, and citation URL. Call this first when the user asks a discovery question like "what benchmarks does OpenChainBench have?" or "compare crypto aggregators". Then use `get_benchmark` for the specific slug(s) the answer needs. Returns one line per bench: { slug, title, category, metric, unit, value, leader, headline, url, asOf } Drafts are filtered out: only live benchmarks appear.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_benchmark(slug, chain, region, tier)

Returns full detail for one benchmark, ready to cite verbatim: • rankings (every provider sorted by p50) • sparkline (24h trend, 72 points) • headline sentence + paste-ready citation quote • methodology bullets + source-code URL + canonical pageUrl + OG image URL Pass `chain` and/or `region` to scope the result to a sub-slice when the benchmark declares those dimensions (e.g. aggregator-head-lag exposes chain=base|bnb|solana, region=us-east|eu-west|ap-southeast). Both args are optional; omit them for the global aggregate. Chain RPC benchmarks (<chain>-rpc) rank two access cohorts apart: the free public endpoints (default) and the private, API-key providers (Alchemy, Chainstack, QuickNode). The default response carries both under `cohorts`; pass tier="keyed" to get the private cohort as the main record (rankings, quote, pageUrl). Never compare a public row with a private row: they are measured on different endpoints and cadences. Example usage: • User: "who's the fastest crypto data aggregator on Base?" → get_benchmark({ slug: "aggregator-head-lag", chain: "base" }) • User: "how much does it cost to bridge $300 cross-chain?" → get_benchmark({ slug: "bridge-fee" }) • User: "fastest Base RPC with an API key, Alchemy or QuickNode?" → get_benchmark({ slug: "base-rpc", tier: "keyed" }) Drafts return { error: "unknown_slug" }. Cite the returned `pageUrl` and use `quote` as the attribution line in your answer.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "pattern": "^[a-z0-9][a-z0-9-]{0,79}$",
      "description": "Benchmark slug from list_benchmarks. e.g. 'aggregator-head-lag', 'bridge-quote-latency', 'l1-finality'."
    },
    "chain": {
      "description": "Optional chain filter, e.g. 'base', 'solana', 'bnb'. Only honored when the bench declares chain dimensions.",
      "type": "string",
      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$"
    },
    "region": {
      "description": "Optional region filter, e.g. 'us-east', 'eu-west', 'ap-southeast'. Only honored when the bench declares region dimensions.",
      "type": "string",
      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$"
    },
    "tier": {
      "description": "Optional access cohort on chain RPC benchmarks: 'public' (default, free no-key endpoints) or 'keyed' (private, API-key providers). Only honored when the bench declares tier dimensions.",
      "type": "string",
      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$"
    }
  },
  "required": [
    "slug"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢query_prom(query, windowSec, steps)

Direct PromQL passthrough for advanced questions that don't map cleanly to `list_benchmarks` / `get_benchmark`, e.g. "what was Mobula's p50 head-lag yesterday at 14:00 UTC" or "plot bridge fees over the last hour". Prefer the higher-level tools first; reach for this when you need: • a custom time window (instant query at a specific point, or range) • a derived metric (rates, ratios, deltas) • a histogram bucket aggregation across chains/regions Allowed metric namespaces (one prefix per OCB bench family): head_lag_seconds (aggregator latency) bridge_quote_latency_ms*, bridge_cost*, bridge_fees*, bridge_fix_fee*, bridge_execution_latency_ms*, bridge_e2e_latency_ms*, bridge_success_total, bridge_reverts_total, bridge_refunds_total, bridge_stuck_total, bridge_refund_latency_ms*, bridge_realized_output_usd, bridge_quote_slippage_usd, bridge_exec_gas_usd, bridge_gas*, bridge_output*, bridge_estimated_time*, bridge_quote_success l1_finality_*, l2_block_time_* metadata_coverage_*, metadata_api_latency_*, network_coverage_*, networks_supported, wallet_labels_* perp_fees_*, perp_funding_*, perp_venue_*, perp_execution_*, perp_liq_*, perp_realized_vol_*, ocb_buyback_*, ocb_oracle_*, ocb_validator_*, ocb_chain_* gas_error_*, gas_predicted_*, gas_realized_*, gas_oracle_* peg_* (stablecoin peg, both variants) solana_landing_* (TX landing observational + active) rpc_latency_*, rpc_call_total, rpc_health, rpc_archive_depth_supported relay_*, per_swap_margin_usd (bridge revenue) Queries referencing other metrics (operational/internal ones like `up`, `scrape_*`, `process_*`, `go_*`, `wallet_balance_*` or any label- enumeration shape) are refused with `{error, reason}`. Example: instant p50 over 1h for Mobula head-lag on Base: query_prom({ query: "quantile_over_time(0.5, head_lag_seconds{aggregator=\"mobula\",chain=\"base\"}[1h]) * 1000" }) Example: 7-day sparkline of average bridge fees: query_prom({ query: "avg_over_time(bridge_fees_percent[1d])", windowSec: 604800, steps: 168 }) Returns: `{ query, value }` for instant queries, `{ query, windowSec, series }` for range.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000,
      "description": "PromQL expression referencing published benchmark metric prefixes only. Function names, label keys, and quoted label values are fine; bare metric names must be allowlisted."
    },
    "windowSec": {
      "description": "If set, run a range query over the last N seconds (max 7 days = 604800). Omit for an instant query.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 604800
    },
    "steps": {
      "description": "Number of samples for a range query (2 to 360). Default 60. Step duration = windowSec / steps.",
      "type": "integer",
      "minimum": 2,
      "maximum": 360
    }
  },
  "required": [
    "query"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded3 tools
verifiedversion not recorded3 tools
verifiedversion not recorded3 tools