Buyer-side SaaS due-diligence maths: NRR, GRR, revenue concentration, zombie MRR, LTV:CAC.
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.
Assess 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?
Per-customer MRR values. Order does not matter.
How many top customers to aggregate for the top-N share. Default 5.
Revenue share above which a customer counts as a whale. Default 25.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Assess 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?
| Argument | Type | Description |
|---|---|---|
| top_n | number | How many top customers to aggregate for the top-N share. Default 5. |
| customer_mrrs* | array | Per-customer MRR values. Order does not matter. |
| whale_threshold_pct | number | Revenue share above which a customer counts as a whale. Default 25. |
{
"type": "object",
"required": [
"customer_mrrs"
],
"properties": {
"top_n": {
"type": "number",
"description": "How many top customers to aggregate for the top-N share. Default 5."
},
"customer_mrrs": {
"type": "array",
"items": {
"type": "number"
},
"description": "Per-customer MRR values. Order does not matter."
},
"whale_threshold_pct": {
"type": "number",
"description": "Revenue share above which a customer counts as a whale. Default 25."
}
}
}Calculate 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.
| Argument | Type | Description |
|---|---|---|
| churned_mrr | number | MRR lost to full cancellations. |
| starting_mrr* | number | MRR at the start of the period, in any single currency unit. |
| 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). |
{
"type": "object",
"required": [
"starting_mrr"
],
"properties": {
"churned_mrr": {
"type": "number",
"description": "MRR lost to full cancellations."
},
"starting_mrr": {
"type": "number",
"description": "MRR at the start of the period, in any single currency unit."
},
"expansion_mrr": {
"type": "number",
"description": "MRR gained from upgrades and expansion within the existing base. Excludes new customers."
},
"contraction_mrr": {
"type": "number",
"description": "MRR lost to downgrades (customer retained)."
}
}
}Calculate 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.
| Argument | Type | Description |
|---|---|---|
| cac | number | Customer acquisition cost. Optional — supply it to get the ratio and payback. |
| arpa* | number | Average revenue per account, per month. |
| gross_margin_pct | number | Gross margin percentage. Defaults to 100, which gives lifetime revenue. |
| monthly_churn_rate_pct* | number | Monthly churn, as a percentage. |
{
"type": "object",
"required": [
"arpa",
"monthly_churn_rate_pct"
],
"properties": {
"cac": {
"type": "number",
"description": "Customer acquisition cost. Optional — supply it to get the ratio and payback."
},
"arpa": {
"type": "number",
"description": "Average revenue per account, per month."
},
"gross_margin_pct": {
"type": "number",
"description": "Gross margin percentage. Defaults to 100, which gives lifetime revenue."
},
"monthly_churn_rate_pct": {
"type": "number",
"description": "Monthly churn, as a percentage."
}
}
}Identify 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.
| Argument | Type | Description |
|---|---|---|
| accounts* | array | One entry per paying account. |
| threshold_days | number | Days of inactivity before an account counts as dormant. Default 90. |
{
"type": "object",
"required": [
"accounts"
],
"properties": {
"accounts": {
"type": "array",
"items": {
"type": "object",
"required": [
"mrr",
"days_since_last_activity"
],
"properties": {
"mrr": {
"type": "number"
},
"customer": {
"type": "string"
},
"days_since_last_activity": {
"type": "number"
}
}
},
"description": "One entry per paying account."
},
"threshold_days": {
"type": "number",
"description": "Days of inactivity before an account counts as dormant. Default 90."
}
}
}Return 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.
| Argument | Type | Description |
|---|---|---|
| metric | string | Which band set to return: 'nrr', 'concentration', 'health', or omit for all. |
{
"type": "object",
"properties": {
"metric": {
"enum": [
"nrr",
"concentration",
"health"
],
"type": "string",
"description": "Which band set to return: 'nrr', 'concentration', 'health', or omit for all."
}
}
}Score 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.
| Argument | Type | Description |
|---|---|---|
| nrr_pct* | number | Net revenue retention, as a percentage. |
| ltv_to_cac_ratio* | number | Lifetime value divided by customer acquisition cost. |
| annual_plan_share_pct* | number | Share of revenue on annual contracts, as a percentage. |
| monthly_churn_rate_pct* | number | Monthly revenue churn, as a percentage (5 means 5%). |
| top_customer_share_pct* | number | Largest single customer's share of revenue, as a percentage. |
{
"type": "object",
"required": [
"monthly_churn_rate_pct",
"nrr_pct",
"top_customer_share_pct",
"ltv_to_cac_ratio",
"annual_plan_share_pct"
],
"properties": {
"nrr_pct": {
"type": "number",
"description": "Net revenue retention, as a percentage."
},
"ltv_to_cac_ratio": {
"type": "number",
"description": "Lifetime value divided by customer acquisition cost."
},
"annual_plan_share_pct": {
"type": "number",
"description": "Share of revenue on annual contracts, as a percentage."
},
"monthly_churn_rate_pct": {
"type": "number",
"description": "Monthly revenue churn, as a percentage (5 means 5%)."
},
"top_customer_share_pct": {
"type": "number",
"description": "Largest single customer's share of revenue, as a percentage."
}
}
}