Revenue intelligence and growth research for SaaS and AI products.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Compare 2-5 companies side by side on MRR, the 30-day amount, business model, economic basis, pricing, acquisition channels, target customer and positioning. Free: no account needed and no reads spent. Every cell carries a status: comparable, partial (e.g. stale, or captured prose rather than a normalised field), not_available (missing stays empty, never 0) or different_basis (the set mixes economic bases, so the amounts must not be ranked against each other). No cell is inferred and no company is ranked.
2-5 report slugs, e.g. ["postiz", "cometly"]. Get them from search_reports or list_reports; a slug that is not a published report is reported as not found.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http reports https://moneypeel.com/mcp
Compare 2-5 companies side by side on MRR, the 30-day amount, business model, economic basis, pricing, acquisition channels, target customer and positioning. Free: no account needed and no reads spent. Every cell carries a status: comparable, partial (e.g. stale, or captured prose rather than a normalised field), not_available (missing stays empty, never 0) or different_basis (the set mixes economic bases, so the amounts must not be ranked against each other). No cell is inferred and no company is ranked.
| Argument | Type | Description |
|---|---|---|
| slugs* | array | 2-5 report slugs, e.g. ["postiz", "cometly"]. Get them from search_reports or list_reports; a slug that is not a published report is reported as not found. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slugs"
],
"properties": {
"slugs": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 5,
"minItems": 2,
"description": "2-5 report slugs, e.g. [\"postiz\", \"cometly\"]. Get them from search_reports or list_reports; a slug that is not a published report is reported as not found."
}
}
}Read one published report as Markdown: positioning, marketing, growth plays, social, timeline and takeaways. Requires a connected MoneyPeel account. **This call is metered**: each successful read spends one read from the monthly allowance, a single chapter costs the same one read, and reading the same report again spends another. Free accounts get 2 reads per UTC month. Screen with search_reports / list_reports first — they cost nothing — and read only the reports the user actually needs; a failed lookup or a not_found never spends a read. The 'billing.readCharged' field in the result states whether this call spent one (0 means it was a retry inside the idempotency window). The response also carries a source block (URL, evidence type, data dates, freshness) to cite.
| Argument | Type | Description |
|---|---|---|
| lang | string | Report language; defaults to zh. |
| slug* | string | Report slug, e.g. "chatbase". |
| chapter | integer | Read just this chapter (1-6) instead of the whole report. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug"
],
"properties": {
"lang": {
"enum": [
"zh",
"en"
],
"type": "string",
"description": "Report language; defaults to zh."
},
"slug": {
"type": "string",
"minLength": 1,
"description": "Report slug, e.g. \"chatbase\"."
},
"chapter": {
"type": "integer",
"maximum": 6,
"minimum": 1,
"description": "Read just this chapter (1-6) instead of the whole report."
}
}
}Remaining reads for the connected account: plan, period, monthly and daily allowance, and the UTC reset time. Free — call it before reading a batch, but do not call it before every read.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Browse the public library, highest revenue first. No account needed, no reads spent, bounded pages. Each row carries the same public summary fields as search. Returns a `nextCursor` while more reports exist.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many reports to list (default 10). |
| cursor | string | `nextCursor` from a previous page. |
| sortBy | string | Defaults to revenue (the 30-day amount, highest first). `growth` ranks by the move, same source and order as https://moneypeel.com/revenue?by=growth&window=7d. |
| growthWindow | string | Window for sortBy=growth; defaults to 7d. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "How many reports to list (default 10)."
},
"cursor": {
"type": "string",
"description": "`nextCursor` from a previous page."
},
"sortBy": {
"enum": [
"revenue",
"growth"
],
"type": "string",
"description": "Defaults to revenue (the 30-day amount, highest first). `growth` ranks by the move, same source and order as https://moneypeel.com/revenue?by=growth&window=7d."
},
"growthWindow": {
"enum": [
"7d",
"30d"
],
"type": "string",
"description": "Window for sortBy=growth; defaults to 7d."
}
}
}Rank revenue or MRR moves over an explicit window. Free: no account needed and no reads spent. Every row carries baseline, start, end, absolute change, percentage, dataPoints, windowStart/windowEnd (null when the figure is source-reported rather than observed daily), growth kind, the economic basis and the metric-level evidence type. Rows come from the same public growth board as https://moneypeel.com/revenue?by=growth, so the sample is the board gate, not the whole catalogue. Percentages are never returned without their base; stale rows are marked and can be filtered out. MRR has no 7-day series: metric=mrr works with window=30d only.
| Argument | Type | Description |
|---|---|---|
| sort | string | Default absolute (largest USD change first). consistency ranks steady growth above a one-day spike; percentage ranks by percentage points and still returns the base. |
| limit | integer | How many signals to return (default 5, max 10). |
| cursor | string | nextCursor from a previous growth search, to read the next page. |
| market | array | Card market label(s), exact match, same field search_reports filters on. |
| metric | string | Which metric the move is measured on (default revenue_30d). MRR and the 30-day amount are never mixed in one ranking. |
| window | string | Window the move is measured over (default 7d). 7d is rebuilt from the daily series; 30d moves are source-reported, so their window dates are null. |
Search public revenue reports by keyword and/or structured filters. No account needed, no reads spent. Pass "query" for text (name, domain, description) and/or filters such as minMrr or businessModel; at least one of the two is required — to browse the library instead, use list_reports. A filter on a missing value excludes the row (a null MRR is not $0). Each row carries mrr, revenue30d, business model, metric-level evidence type, a revenue snapshot date, revenue freshness, a dataQuality flag, a public preview link and the metered full-report link — often enough to answer without reading a report. When dataQuality.status is "needs_review", quote the caveat before the numbers. When revenueEligibleForRanking is false the amount is stale and must not be cited as current. Structured filters: businessModel, minMrr / maxMrr, minRevenue30d / maxRevenue30d, revenueFreshness, market, economicBasis, basisDetermination, dataQualityStatus, evidenceType, plus sortBy (revenue, mrr, name, growth) and growthWindow. `evidenceType` keeps a row only when every figure it reports (MRR and/or the 30-day amount) carries one of the requested metric-level types; a missing figure is skipped rather than counted as `unknown`. Only the parameters listed in this schema exist — do not invent others. Returns a `nextCursor` when more matches exist; a cursor from an earlier query or filter set is rejected with invalid_cursor rather than silently reused.
| Argument | Type | Description |
|---|---|---|
| lang | string | Description language; defaults to zh. |
| limit | integer | How many matches to return (default 5, max 10). |
| query | string | Product name, domain, or keyword. |
| cursor | string |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 11, 2026.
| freshness | string | current = the amount may be quoted as current; stale = the source flagged it. Omit for both. |
| minBaseline | number | Only rows whose comparison base is at least this (USD). |
| businessModel | array | Business-model labels to include, exact match. |
| minDataPoints | integer | Only rows backed by at least this many observations (14 for a 7d daily series, 2 for a source-reported 30d figure). |
| minAbsoluteIncrease | number | Only rows whose absolute change is at least this (USD; may be negative). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"sort": {
"enum": [
"absolute",
"percentage",
"consistency"
],
"type": "string",
"description": "Default absolute (largest USD change first). consistency ranks steady growth above a one-day spike; percentage ranks by percentage points and still returns the base."
},
"limit": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "How many signals to return (default 5, max 10)."
},
"cursor": {
"type": "string",
"description": "nextCursor from a previous growth search, to read the next page."
},
"market": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 10,
"description": "Card market label(s), exact match, same field search_reports filters on."
},
"metric": {
"enum": [
"mrr",
"revenue_30d"
],
"type": "string",
"description": "Which metric the move is measured on (default revenue_30d). MRR and the 30-day amount are never mixed in one ranking."
},
"window": {
"enum": [
"7d",
"30d"
],
"type": "string",
"description": "Window the move is measured over (default 7d). 7d is rebuilt from the daily series; 30d moves are source-reported, so their window dates are null."
},
"freshness": {
"enum": [
"current",
"stale"
],
"type": "string",
"description": "current = the amount may be quoted as current; stale = the source flagged it. Omit for both."
},
"minBaseline": {
"type": "number",
"minimum": 0,
"description": "Only rows whose comparison base is at least this (USD)."
},
"businessModel": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 10,
"description": "Business-model labels to include, exact match."
},
"minDataPoints": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Only rows backed by at least this many observations (14 for a 7d daily series, 2 for a source-reported 30d figure)."
},
"minAbsoluteIncrease": {
"type": "number",
"description": "Only rows whose absolute change is at least this (USD; may be negative)."
}
}
}| `nextCursor` from a previous search, to read the next page. |
| market | array | Card market label(s), exact match: "AI", "SaaS", "Marketing", "Mobile Apps"… Unknown labels match nothing. |
| maxMrr | number | Only rows with mrr <= this (USD). |
| minMrr | number | Only rows with mrr >= this (USD). Rows without an MRR are excluded, not treated as 0. |
| sortBy | string | Sort field; defaults to revenue (the 30-day amount). `growth` ranks by the move over `growthWindow`, using the same rows and order as https://moneypeel.com/revenue?by=growth&window=7d — rows with no daily series, or below the board gate, are not ranked. `economicBasis` orders by the economic-basis enum (subscription_charges first, unknown last), then by the 30-day amount; stale rows stay behind current ones in every order. |
| evidenceType | array | Metric-level evidence. A row qualifies only when every figure it reports (MRR and/or the 30-day amount) has one of these types: provider_reported = the source stamped a sync time and named the payment provider; unknown = it did not. A figure the row does not report is skipped, not treated as evidence, and a row with no figures matches nothing. |
| growthWindow | string | Window for sortBy=growth; defaults to 7d (the board default). 30d compares the source-reported 30-day amount with its previous value. |
| businessModel | array | Business-model labels to include, e.g. ["Subscription","Marketplace Fee"]. Exact match against the card label; unknown labels match nothing. |
| economicBasis | array | What the money is, using the same enum the rows return in revenueBasis.economicBasis. Combine with other filters freely. |
| maxRevenue30d | number | Only rows with revenue30d <= this (USD). |
| minRevenue30d | number | Only rows with revenue30d >= this (USD). Rows without a 30-day amount are excluded. |
| sortDirection | string | Defaults to desc for revenue and mrr, asc for name. |
| revenueFreshness | string | current = the revenue may be quoted as a current figure; stale = the source flagged it. Omit for both. |
| dataQualityStatus | array | Row-level caveat: ok = quotable; needs_review = say why before quoting; not_applicable = MRR is not a meaningful measure for the model. |
| basisDetermination | array | How the economic basis was settled: a person read the evidence, it was inferred from the pricing model, a provider line item settled it (no row today), or nothing did. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"lang": {
"enum": [
"zh",
"en"
],
"type": "string",
"description": "Description language; defaults to zh."
},
"limit": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "How many matches to return (default 5, max 10)."
},
"query": {
"type": "string",
"minLength": 1,
"description": "Product name, domain, or keyword."
},
"cursor": {
"type": "string",
"description": "`nextCursor` from a previous search, to read the next page."
},
"market": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 10,
"description": "Card market label(s), exact match: \"AI\", \"SaaS\", \"Marketing\", \"Mobile Apps\"… Unknown labels match nothing."
},
"maxMrr": {
"type": "number",
"minimum": 0,
"description": "Only rows with mrr <= this (USD)."
},
"minMrr": {
"type": "number",
"minimum": 0,
"description": "Only rows with mrr >= this (USD). Rows without an MRR are excluded, not treated as 0."
},
"sortBy": {
"enum": [
"revenue",
"mrr",
"name",
"growth",
"economicBasis"
],
"type": "string",
"description": "Sort field; defaults to revenue (the 30-day amount). `growth` ranks by the move over `growthWindow`, using the same rows and order as https://moneypeel.com/revenue?by=growth&window=7d — rows with no daily series, or below the board gate, are not ranked. `economicBasis` orders by the economic-basis enum (subscription_charges first, unknown last), then by the 30-day amount; stale rows stay behind current ones in every order."
},
"evidenceType": {
"type": "array",
"items": {
"enum": [
"provider_reported",
"unknown"
],
"type": "string"
},
"maxItems": 2,
"description": "Metric-level evidence. A row qualifies only when every figure it reports (MRR and/or the 30-day amount) has one of these types: provider_reported = the source stamped a sync time and named the payment provider; unknown = it did not. A figure the row does not report is skipped, not treated as evidence, and a row with no figures matches nothing."
},
"growthWindow": {
"enum": [
"7d",
"30d"
],
"type": "string",
"description": "Window for sortBy=growth; defaults to 7d (the board default). 30d compares the source-reported 30-day amount with its previous value."
},
"businessModel": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 10,
"description": "Business-model labels to include, e.g. [\"Subscription\",\"Marketplace Fee\"]. Exact match against the card label; unknown labels match nothing."
},
"economicBasis": {
"type": "array",
"items": {
"enum": [
"subscription_charges",
"usage_charges",
"service_billings",
"platform_fee_revenue",
"marketplace_gmv",
"gross_payment_volume",
"merchant_sales",
"one_time_sales",
"unknown"
],
"type": "string"
},
"maxItems": 9,
"description": "What the money is, using the same enum the rows return in revenueBasis.economicBasis. Combine with other filters freely."
},
"maxRevenue30d": {
"type": "number",
"minimum": 0,
"description": "Only rows with revenue30d <= this (USD)."
},
"minRevenue30d": {
"type": "number",
"minimum": 0,
"description": "Only rows with revenue30d >= this (USD). Rows without a 30-day amount are excluded."
},
"sortDirection": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Defaults to desc for revenue and mrr, asc for name."
},
"revenueFreshness": {
"enum": [
"current",
"stale"
],
"type": "string",
"description": "current = the revenue may be quoted as a current figure; stale = the source flagged it. Omit for both."
},
"dataQualityStatus": {
"type": "array",
"items": {
"enum": [
"ok",
"needs_review",
"not_applicable"
],
"type": "string"
},
"maxItems": 3,
"description": "Row-level caveat: ok = quotable; needs_review = say why before quoting; not_applicable = MRR is not a meaningful measure for the model."
},
"basisDetermination": {
"type": "array",
"items": {
"enum": [
"human_reviewed",
"pricing_model_inferred",
"provider_line_item_verified",
"unknown"
],
"type": "string"
},
"maxItems": 4,
"description": "How the economic basis was settled: a person read the evidence, it was inferred from the pricing model, a provider line item settled it (no row today), or nothing did."
}
}
}