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