ChurnLens

Buyer-side SaaS due-diligence maths: NRR, GRR, revenue concentration, zombie MRR, LTV:CAC.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
98%
Naming quality
93%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains URL to non-standard domainin get_scoring_bands

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~992Tokens (tool definitions)
~1.3 KBTypical response size
Moderate attention impact (0.78% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "churnlens": {
      "url": "https://churnlens.site/api/mcp"
    }
  }
}

Remote endpoints

https://churnlens.site/api/mcpstreamable-http

What it can do

Tool inventory

Tools (6)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢calculate_churn_rate(starting_mrr, expansion_mrr, contraction_mrr, churned_mrr)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "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)."
    },
    "churned_mrr": {
      "type": "number",
      "description": "MRR lost to full cancellations."
    }
  },
  "required": [
    "starting_mrr"
  ]
}
🟢analyze_revenue_concentration(customer_mrrs, top_n, whale_threshold_pct)

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?

Input Schema

{
  "type": "object",
  "properties": {
    "customer_mrrs": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Per-customer MRR values. Order does not matter."
    },
    "top_n": {
      "type": "number",
      "description": "How many top customers to aggregate for the top-N share. Default 5."
    },
    "whale_threshold_pct": {
      "type": "number",
      "description": "Revenue share above which a customer counts as a whale. Default 25."
    }
  },
  "required": [
    "customer_mrrs"
  ]
}
⚪detect_zombie_mrr(accounts, threshold_days)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "accounts": {
      "type": "array",
      "description": "One entry per paying account.",
      "items": {
        "type": "object",
        "properties": {
          "customer": {
            "type": "string"
          },
          "mrr": {
            "type": "number"
          },
          "days_since_last_activity": {
            "type": "number"
          }
        },
        "required": [
          "mrr",
          "days_since_last_activity"
        ]
      }
    },
    "threshold_days": {
      "type": "number",
      "description": "Days of inactivity before an account counts as dormant. Default 90."
    }
  },
  "required": [
    "accounts"
  ]
}
⚪score_saas_health(monthly_churn_rate_pct, nrr_pct, top_customer_share_pct, ltv_to_cac_ratio, annual_plan_share_pct)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "monthly_churn_rate_pct": {
      "type": "number",
      "description": "Monthly revenue churn, as a percentage (5 means 5%)."
    },
    "nrr_pct": {
      "type": "number",
      "description": "Net revenue retention, as a percentage."
    },
    "top_customer_share_pct": {
      "type": "number",
      "description": "Largest single customer's share of revenue, 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."
    }
  },
  "required": [
    "monthly_churn_rate_pct",
    "nrr_pct",
    "top_customer_share_pct",
    "ltv_to_cac_ratio",
    "annual_plan_share_pct"
  ]
}
🟢calculate_ltv(arpa, monthly_churn_rate_pct, gross_margin_pct, cac)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "arpa": {
      "type": "number",
      "description": "Average revenue per account, per month."
    },
    "monthly_churn_rate_pct": {
      "type": "number",
      "description": "Monthly churn, as a percentage."
    },
    "gross_margin_pct": {
      "type": "number",
      "description": "Gross margin percentage. Defaults to 100, which gives lifetime revenue."
    },
    "cac": {
      "type": "number",
      "description": "Customer acquisition cost. Optional — supply it to get the ratio and payback."
    }
  },
  "required": [
    "arpa",
    "monthly_churn_rate_pct"
  ]
}
🟢get_scoring_bands(metric)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "metric": {
      "type": "string",
      "description": "Which band set to return: 'nrr', 'concentration', 'health', or omit for all.",
      "enum": [
        "nrr",
        "concentration",
        "health"
      ]
    }
  }
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded6 tools
verifiedversion not recorded6 tools
verifiedversion not recorded6 tools
verifiedversion not recorded6 tools
verifiedversion not recorded6 tools
verifiedversion not recorded6 tools