{
  "markdown": "# xrpldashboard\n\nPublic XRPL analytics with a built-in truth-audit system.\nLive at **[xrpldashboard.com](https://xrpldashboard.com)**.\n\n## What this is\n\nThree things make this repo different from \"another blockchain dashboard\":\n\n1. **Every headline number has a claim record.** `CLAIMS.yaml` enumerates the public numeric claims across `/rlusd`, `/whales`, `/coverage`, and `/analytics`, each tied to its source function and freshness contract. `scripts/claims_check.sh` runs before pushes.\n2. **A four-layer audit catches stale numbers before readers do.** See [`docs/TRUTH_AUDIT_DESIGN.md`](docs/TRUTH_AUDIT_DESIGN.md). Retro-tested against the last nine real incidents: **9 of 9 caught.** The first live catch (an RLUSD partial-day bug) surfaced within hours instead of the 53 days it had previously gone unnoticed.\n3. **Daily signed snapshots.** Ed25519-signed, Merkle-chained. `/signed-snapshots` and `.well-known/snapshots/<date>.json` let anyone verify a number as-of a date without trusting the site.\n\nQuick links: [`/methodology`](https://xrpldashboard.com/methodology) · [`/signed-snapshots`](https://xrpldashboard.com/signed-snapshots) · [`docs/TRUTH_AUDIT_DESIGN.md`](docs/TRUTH_AUDIT_DESIGN.md)\n\n## Agent tier (MCP)\n\n[![Listed on Anthropic MCP Registry](https://img.shields.io/badge/MCP-Anthropic%20Registry-blue)](https://registry.modelcontextprotocol.io/v0/servers?search=xrpldashboard)\n[![Smithery listed](https://img.shields.io/badge/Smithery-listed-6a5acd)](https://smithery.ai/servers/xrpldashboard/xrpldashboard)\n\nLive public MCP endpoint: **`https://mcp.xrpldashboard.com/mcp`** — streamable-HTTP, protocol version 2025-06-18, no auth. Fifteen read-only tools over XRPL and the on-XRPL RLUSD supply, every response wrapped in a proof-annotation envelope with `source`, `as_of`, `freshness_contract`, and a `claims_ref` back to [`/claims`](https://xrpldashboard.com/claims). Public beta through 2026-09.\n\nConnect in 60 seconds — copy-paste config for Claude Desktop or any MCP client:\n\n```json\n{\n  \"mcpServers\": {\n    \"xrpldashboard\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote@latest\",\n        \"https://mcp.xrpldashboard.com/mcp?ref=readme\"\n      ]\n    }\n  }\n}\n```\n\nOr add it as a Custom Connector in Claude Desktop → Settings → Connectors with URL `https://mcp.xrpldashboard.com/mcp` and auth `None`. Full onboarding page (three sample prompts, honest limits, 429 shape): [`/connect`](https://xrpldashboard.com/connect#connect-in-60-seconds).\n\n- **Session rate limit:** 600 tool calls / hour / session, enforced live (HTTP 429 + `Retry-After` on breach). See [`mcp_session_rate_limit.py`](mcp_session_rate_limit.py).\n- **Discovery manifest:** [`/.well-known/agents.json`](https://xrpldashboard.com/.well-known/agents.json) · [`/llms.txt`](https://xrpldashboard.com/llms.txt) · [`/openapi.json`](https://xrpldashboard.com/openapi.json).\n- **Verifiable moat:** `get_signed_snapshot` + `verify_snapshot_signature` — pin the Ed25519 pubkey at [`/.well-known/snapshots/pubkey.pem`](https://xrpldashboard.com/.well-known/snapshots/pubkey.pem) and verify a day's snapshot without trusting us.\n- **Backing infra:** our own rippled full-history node (Ubuntu box in Indiana → Cloudflare Tunnel), source at [`mcp_server.py`](mcp_server.py) and `mcp_tools_*.py`.\n\nDesign doc: [`docs/AGENT_TIER_DESIGN.md`](docs/AGENT_TIER_DESIGN.md).\n\n## Pages\n\n37 public pages, organized as:\n\n- **Money flow:** `/whales`, `/pools`, `/tokens`, `/token/<id>`, `/mpts`, `/mpt/<id>`, `/rlusd`, `/lending`\n- **Institutional & regulatory:** `/institutional`, `/regulation`, `/rwa`, `/credentials`, `/amendments`, `/sidechain`\n- **Coverage & audit:** `/coverage`, `/methodology`, `/signed-snapshots`, `/verify`, `/walker-health`, `/health`\n- **Reader tools:** `/check`, `/wallet/<id>`, `/network`, `/learn`, `/price-data`, `/help/already-sent-money`\n- **Trust & meta:** `/about`, `/security`, `/privacy`, `/terms`, `/subprocessors`, `/contact`\n\n## Architecture\n\n- **Web:** Flask 3.1 + Jinja2 + Flask-Babel (i18n) + Flask-Limiter, deployed on Render, fronted by Cloudflare.\n- **Data:** Neon Postgres (single shared DB across web + walkers).\n- **Ingest:** 29 background services under launchd — 23 ingest walkers and canaries, plus 4 backup and 2 snapshot-signing jobs. Each walker writes to `walker_health`; `/walker-health` surfaces stalls.\n- **XRPL client:** `xrpl-py 4.5.0` with a local-first cascade to public rippled nodes; silent-failover attempts logged to `walker_node_fallback` so we can audit reliability rather than hope.\n- **Signing:** Ed25519 via `cryptography` (see `signed_snapshot.py`).\n\n## The truth-audit system (why this repo may be reusable)\n\nMost public dashboards trust their own writes. This one doesn't. Four layers, working together:\n\n- **Layer 1 — walker health.** `walker_health` rows + `/walker-health` page. Catches \"the number stopped moving because the writer died.\"\n- **Layer 2 — plausibility rules.** Continuous checks like \"24h net-change should not equal zero for 53 days.\" Catches \"the number is moving in the DB but the query is wrong.\"\n- **Layer 3 — external cross-check.** Third-party comparisons (e.g., independent Ethereum RPCs for RLUSD supply, CoinGecko for XRP price) surface disagreement on the same measurement.\n- **Layer 4 — claims manifest.** `CLAIMS.yaml` + `scripts/claims_check.sh`. Every headline number is enumerated with its source function and freshness contract; the checker exits non-zero on drift.\n\nFull design and the 9-of-9 retro-test are in [`docs/TRUTH_AUDIT_DESIGN.md`](docs/TRUTH_AUDIT_DESIGN.md).\n\nIf you're building a public-data project and want the pattern, the design doc is written to be lifted.\n\n## Running locally\n\n**What runs in five minutes:** the Flask web app against a copy of the schema. Enough to click through pages and see the UI.\n\n**What does not run in five minutes:** the full site, because a live dashboard needs the walker fleet ingesting from XRPL against Neon Postgres. Standing up the walkers is a real operations task, not a `docker compose up`.\n\nQuickstart (web app only):\n\n```bash\npython3 -m venv venv && source venv/bin/activate\npip install -r requirements.txt\ncp .env.example .env      # then fill in DATABASE_URL, FLASK_SECRET_KEY, etc.\npython app.py             # http://localhost:5001\n```\n\nFor the full ingest setup, see [`docs/TRUTH_AUDIT_DESIGN.md`](docs/TRUTH_AUDIT_DESIGN.md) and the `launchd/` plists (which are the author's local install — forkers will want to path-adjust).\n\n## Independence\n\nxrpldashboard is not operated by Ripple, the XRPL Foundation, or any exchange. No paid placements. No affiliate links on labeling or metric surfaces.\n\n## Funding\n\nDevelopment is self-funded, with support from community grant programs where they align with the mission (public-goods data infrastructure for XRPL).\n\n## Contributing\n\nIssues and PRs welcome. If you're touching a page that renders a headline number, add or update the corresponding entry in `CLAIMS.yaml`; `scripts/claims_check.sh` will remind you.\n\n## License\n\nMIT. See [`LICENSE`](LICENSE).\n\n## Disclaimer\n\nxrpldashboard reports on-chain data and public regulatory information. Nothing on the site or in this repo is financial, legal, or investment advice.\n",
  "bytes": 7223,
  "sha": "504cf6a510b04f2251fd35adf1de6a396af6abc2c754b2e7acb3cef267441771",
  "repo_slug": "enkryptedx/xrpldashboard",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_xrpldashboard_xrpldashboard_mcp_4b003408/readme"
}