MRR Ledger
by mrrledger.com · remote · no sign-in to list tools · v1.7.0 · published by com.mrrledger
Sourced, dated revenue data on real AI-agent businesses: leaderboard, profiles, growth, lessons.
17 tools: 3 change things and 14 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things3Claude Code: ask: see these tools
- Only reads14Claude Code: allow: see these tools
3 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http mrrledger https://mrrledger.com/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "search_businesses" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "search_businesses" says "search": a word for reading.
- Warnbuy_api_pass
The server marks "buy_api_pass" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"idempotentHint":false,"openWorldHint":false}; The description's first verb is "return": a word for reading.
- Warnwatch_revenue
The server marks "watch_revenue" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The description's first verb is "return": a word for reading.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
17 tools
Changes things 3Claude Code: ask
buy_api_passReturns an expiring MRR Ledger API key {api_key (shown once), plan, days, expires_at, requests_per_day}.1 finding
Why it is in this group
- The description's first verb is "return": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "buy_api_pass" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"idempotentHint":false,"openWorldHint":false}; The description's first verb is "return": a word for reading.
Description, as the server wrote it Returns an expiring MRR Ledger API key {api_key (shown once), plan, days, expires_at, requests_per_day}. Paid via x402 (USDC on Base): hobby 1 day $0.50, hobby 30 days $9, builder 30 days $19 (+ CSV export, 5 watches), team 30 days $79 (+ JSONL export, 20 watches). Unpaid call = free preview + terms; retry with params._meta["x402/payment"]. Example: {"plan":"hobby","days":1} -> free preview + terms for $0.50; the paid retry returns the key.
Annotations the server declares
- readOnlyHint: false
- idempotentHint: false
- openWorldHint: false
search_businessesSTART HERE.1 finding
Why it is in this group
- The name "search_businesses" says "search": a word for reading.
- The description's first verb is "start": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "search_businesses" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "search_businesses" says "search": a word for reading.
Description, as the server wrote it START HERE. Returns AI-agent businesses with sourced, dated revenue: briefs (slug, name, category, tier, one_liner, annualized_revenue_usd, basis, confidence, url_profile) + total + next page. Example: {"query":"support","limit":3} -> 3 customer-support agents with their sourced revenue. Empty query = all, highest revenue first; filters category, tier, verified_only; limit max 50, offset/cursor. Next: get_business {"slug"}. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: Search businesses (start here)
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
watch_revenueReturns a watch_id + secret (shown once): we POST a signed webhook (MRL-Signature = HMAC-SHA256(secret, t + "." + body)) whenever a watched business gets a new or revised revenue f…1 finding
Why it is in this group
- The description's first verb is "return": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "watch_revenue" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The description's first verb is "return": a word for reading.
Description, as the server wrote it Returns a watch_id + secret (shown once): we POST a signed webhook (MRL-Signature = HMAC-SHA256(secret, t + "." + body)) whenever a watched business gets a new or revised revenue figure. Paid via x402 (USDC on Base): $1 per business per 30 days (max $5), $5 for all; included with Builder/Team keys (X-API-Key). Unpaid call = free preview of the latest real changes + terms; retry with params._meta["x402/payment"]. Example: {"slugs":["cursor"],"webhook_url":"https://example.com/hook"} -> free preview + terms for $1; the paid retry returns the watch.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
Only reads 14Claude Code: allow
benchmark_businessReturns your rank among fresh same-category MRR peers: rank of N, N, basis, verification date, peer caveat + 1 comparable (no growth numbers yet; your MRR is never stored).No findings
Why it is in this group
- The description's first verb is "return": a word for reading.
Description, as the server wrote it Returns your rank among fresh same-category MRR peers: rank of N, N, basis, verification date, peer caveat + 1 comparable (no growth numbers yet; your MRR is never stored). Example: {"category":"customer-support","mrr":2000} -> your rank among the customer-support MRR peers + 1 comparable. Cost: free (100 calls/day without a key). Full answer (percentile where 10+ peers, 5 sourced comparables): $0.05 via x402 (full: true for the terms), or included with Builder/Team/Pro keys and a $9 Category Report token (report_token).
Annotations the server declares
- title: Benchmark your MRR against category peers
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
compare_businessesReturns two businesses side by side (tier, category, annualized revenue + basis, pricing model, founded, top lessons, growth) and a diff with the revenue ratio.No findings
Why it is in this group
- The name "compare_businesses" says "compare": a word for reading.
Description, as the server wrote it Returns two businesses side by side (tier, category, annualized revenue + basis, pricing model, founded, top lessons, growth) and a diff with the revenue ratio. Example: {"a":"cursor","b":"lovable"} -> Cursor vs Lovable with the revenue ratio. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: Compare two businesses
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
export_datasetReturns the whole dataset in one call: format "csv" ($0.25 USDC via x402; every sourced figure, one row each, with source_url) or "jsonl" ($0.50; one full record per business); opt…No findings
Why it is in this group
- The description's first verb is "return": a word for reading.
Description, as the server wrote it Returns the whole dataset in one call: format "csv" ($0.25 USDC via x402; every sourced figure, one row each, with source_url) or "jsonl" ($0.50; one full record per business); optional slug = one business, same price. Included with Builder (csv) and Team (csv + jsonl) keys. Unpaid call = free preview of real rows + terms; retry with params._meta["x402/payment"]. Example: {"format":"csv"} -> free preview + terms for $0.25; the paid retry returns the CSV.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_businessReturns one business's full sourced record: every dated revenue figure (label, value, as_of, source_url), what it does, model, tier, lessons, growth series, related businesses.No findings
Why it is in this group
- The name "get_business" says "get": a word for reading.
Description, as the server wrote it Returns one business's full sourced record: every dated revenue figure (label, value, as_of, source_url), what it does, model, tier, lessons, growth series, related businesses. Example: {"slug":"cursor"} -> Cursor with every figure and its source. Unknown slug -> isError. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: Get one business profile
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_categoryReturns one category: count, median annualized revenue (overall, by tier) and members with rank and revenue.No findings
Why it is in this group
- The name "get_category" says "get": a word for reading.
Description, as the server wrote it Returns one category: count, median annualized revenue (overall, by tier) and members with rank and revenue. Example: {"slug":"customer-support"} -> the customer-support agents with their revenue. Unknown slug -> isError. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: Get one category
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_growthReturns one business's dated revenue series, oldest first (as_of, annualized_usd, label, value_usd, source_url; MRR x12).No findings
Why it is in this group
- The name "get_growth" says "get": a word for reading.
Description, as the server wrote it Returns one business's dated revenue series, oldest first (as_of, annualized_usd, label, value_usd, source_url; MRR x12). Example: {"slug":"lovable"} -> Lovable's dated ARR points with sources. Unknown slug -> isError. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: Revenue over time (one business)
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_tagReturns one tag: count, median annualized revenue and members with rank and revenue.No findings
Why it is in this group
- The name "get_tag" says "get": a word for reading.
Description, as the server wrote it Returns one tag: count, median annualized revenue and members with rank and revenue. Example: {"slug":"trustmrr"} -> every business tagged trustmrr. Unknown slug -> isError. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: Get one tag
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
hub_statsReturns dataset totals: business, ranked and lesson counts, counts per category and tier, median annualized revenue, payment-verified share, latest change date.No findings
Why it is in this group
- The description's first verb is "return": a word for reading.
Description, as the server wrote it Returns dataset totals: business, ranked and lesson counts, counts per category and tier, median annualized revenue, payment-verified share, latest change date. Example: {} -> {business_count, ranked_count, median_annualized_usd, ...}. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: Dataset totals and medians
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
leaderboardReturns businesses ranked by latest sourced annualized revenue, highest first (briefs as in search_businesses); filters category, verified_only, limit (max 50).No findings
Why it is in this group
- The description's first verb is "return": a word for reading.
Description, as the server wrote it Returns businesses ranked by latest sourced annualized revenue, highest first (briefs as in search_businesses); filters category, verified_only, limit (max 50). Example: {"category":"coding-agents","limit":5} -> the top 5 coding agents by revenue. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: Revenue leaderboard (ranked)
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_categoriesReturns every category with count, median annualized revenue and members (slug, name, rank, revenue).No findings
Why it is in this group
- The name "list_categories" says "list": a word for reading.
Description, as the server wrote it Returns every category with count, median annualized revenue and members (slug, name, rank, revenue). Example: {"limit":3} -> the first 3 categories with their members. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: List categories with members
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_tagsReturns every tag with count, median annualized revenue and members, most used first.No findings
Why it is in this group
- The name "list_tags" says "list": a word for reading.
Description, as the server wrote it Returns every tag with count, median annualized revenue and members, most used first. Example: {"limit":10} -> the 10 most-used tags. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: List tags with members
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
search_lessonsReturns builder lessons from every business, each with its business and themes; filter by query and/or theme, limit (max 50).No findings
Why it is in this group
- The name "search_lessons" says "search": a word for reading.
Description, as the server wrote it Returns builder lessons from every business, each with its business and themes; filter by query and/or theme, limit (max 50). Example: {"theme":"pricing","limit":5} -> 5 pricing lessons and their businesses. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: Search builder lessons
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
todays_featureReturns today's featured business (rotates daily): one full profile, same shape as get_business.No findings
Why it is in this group
- The description's first verb is "return": a word for reading.
Description, as the server wrote it Returns today's featured business (rotates daily): one full profile, same shape as get_business. Example: {} -> one business record. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: Today's featured business
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
whats_newReturns the change log, newest first: businesses added and figures added, revised, re-dated or removed, each with source_url; filters since (YYYY-MM-DD), slug, kind, limit (max 100…No findings
Why it is in this group
- The description's first verb is "return": a word for reading.
Description, as the server wrote it Returns the change log, newest first: businesses added and figures added, revised, re-dated or removed, each with source_url; filters since (YYYY-MM-DD), slug, kind, limit (max 100). Example: {"since":"2026-10-14"} -> every change since Oct 14, 2026. Cost: free (100 calls/day without a key). Past 100/day: $0.005 per call via x402 (no signup).
Annotations the server declares
- title: What changed in the data
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.7.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http mrrledger https://mrrledger.com/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__mrrledger__get_business",
"mcp__mrrledger__leaderboard",
"mcp__mrrledger__benchmark_business",
"mcp__mrrledger__compare_businesses",
"mcp__mrrledger__get_growth",
"mcp__mrrledger__whats_new",
"mcp__mrrledger__get_category",
"mcp__mrrledger__list_categories",
"mcp__mrrledger__search_lessons",
"mcp__mrrledger__hub_stats",
"mcp__mrrledger__todays_feature",
"mcp__mrrledger__get_tag",
"mcp__mrrledger__list_tags",
"mcp__mrrledger__export_dataset"
],
"ask": [
"mcp__mrrledger__search_businesses",
"mcp__mrrledger__buy_api_pass",
"mcp__mrrledger__watch_revenue"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as mrrledger. Review it before you use it.