ChurnLens
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Buyer-side SaaS due-diligence maths: NRR, GRR, revenue concentration, zombie MRR, LTV:CAC.
| Author | io.github.kindrat86 |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 2394 ms |
| Last measured | 2026-10-26 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"ChurnLens": {
"url": "https://churnlens.site/api/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (6)
calculate_churn_rateCalculate net revenue retention (NRR), gross revenue retention (GRR), revenue churn and implied customer lifetime from one period's MRR movements. Also reports the NRR-minus-GRR spread, which reveals how much churn is being masked by expansion revenue.
Parameters:
starting_mrr(required) — number — MRR at the start of the period, in any single currency unit.churned_mrr— number — MRR lost to full cancellations.expansion_mrr— number — MRR gained from upgrades and expansion within the existing base. Excludes new customers.contraction_mrr— number — MRR lost to downgrades (customer retained).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
analyze_revenue_concentrationAssess customer concentration risk across a book of revenue using the Herfindahl-Hirschman Index (HHI), top-N share and whale detection. Answers the question every acquirer asks first: how much revenue walks out with one logo?
Parameters:
customer_mrrs(required) — array — Per-customer MRR values. Order does not matter.top_n— number — How many top customers to aggregate for the top-N share. Default 5.whale_threshold_pct— number — Revenue share above which a customer counts as a whale. Default 25.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
detect_zombie_mrrIdentify dormant-but-paying accounts — revenue that still counts in MRR but whose customers have stopped showing up. Zombie revenue is one renewal notice from cancelling and is invisible to standard revenue dashboards.
Parameters:
accounts(required) — array — One entry per paying account.threshold_days— number — Days of inactivity before an account counts as dormant. Default 90.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
score_saas_healthScore a SaaS business 0-100 across five dimensions — retention, growth, concentration, efficiency and durability — and return the composite. Every mapping is published, so the score can be reconstructed by hand.
Parameters:
monthly_churn_rate_pct(required) — number — Monthly revenue churn, as a percentage (5 means 5%).nrr_pct(required) — number — Net revenue retention, as a percentage.top_customer_share_pct(required) — number — Largest single customer's share of revenue, as a percentage.ltv_to_cac_ratio(required) — number — Lifetime value divided by customer acquisition cost.annual_plan_share_pct(required) — number — Share of revenue on annual contracts, as a percentage.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
calculate_ltvCalculate gross-margin-adjusted customer lifetime value, the LTV:CAC ratio and CAC payback in months. Omitting gross margin yields lifetime revenue rather than lifetime value — usually a third of the number.
Parameters:
arpa(required) — number — Average revenue per account, per month.monthly_churn_rate_pct(required) — number — Monthly churn, as a percentage.cac— number — Customer acquisition cost. Optional — supply it to get the ratio and payback.gross_margin_pct— number — Gross margin percentage. Defaults to 100, which gives lifetime revenue.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_scoring_bandsReturn the scoring thresholds ChurnLens applies to NRR, revenue concentration and the composite health score. These are bands, not measured benchmark data — the sourced benchmark figures are cited at https://churnlens.site/benchmarks.
Parameters:
metric— string — Which band set to return: 'nrr', 'concentration', 'health', or omit for all.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.