Skip to main content

Use RetentionCheck inside your AI

Install our MCP server and analyze churn from Claude, Cursor, Zed, or any MCP-compatible agent.

Stays local

Stripe keys and DB URLs live in your MCP config. Your data never touches our servers.

Pulls from your stack

Stripe, Postgres, MySQL, or pasted text. No middleware, no CSV exports, no integration sprint.

Built for agents

Claude reasons over structured churn output and stays inside your editor, no context switch.

Not using an AI agent? Try the web app, no install.

Install in 30 seconds

Claude Code
claude mcp add retentioncheck, npx -y @retentioncheck/mcp-server
Claude Desktop (claude_desktop_config.json)
{
  "mcpServers": {
    "retentioncheck": {
      "command": "npx",
      "args": ["-y", "@retentioncheck/mcp-server"],
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-...",
        "STRIPE_SECRET_KEY": "rk_live_...",
        "POSTGRES_URL": "postgres://ro_user:pass@host:5432/db?sslmode=require",
        "MYSQL_URL": "mysql://ro_user:pass@host:3306/db?ssl=true"
      }
    }
  }
}
Cursor (.cursor/mcp.json)
{
  "mcpServers": {
    "retentioncheck": {
      "command": "npx",
      "args": ["-y", "@retentioncheck/mcp-server"]
    }
  }
}

What it can do

analyze_churn

Pass any cancellation feedback (text or file path) and get back ranked churn insights with severity, confidence, quotes, and recommendations.

analyze_stripe_churn

Pulls canceled subscriptions directly from Stripe , no middleware, no DB hookup. Includes plan, MRR, sub age, and voluntary vs. involuntary context. Defaults to last 90 days.

analyze_sql_churn

Pulls canceled subscriptions directly from Postgres or MySQL. You describe your schema in plain args (table, reason column, MRR column, etc.) and the tool generates a safe read-only SELECT. Zero middleware.

get_example_analysis

Returns a pre-computed example so you can see the output shape before running your own data.

Connect Stripe (Recommended)

Or: paste a Stripe key directly

Alternatively, add a restricted Stripe key to unlock analyze_stripe_churn. Everything runs locally on your machine, your key never touches our servers.

  1. Open Stripe → API keys → Create restricted key.
  2. Grant read-only access to these resources only:
Restricted key permissions
Subscriptions: Read
Customers: Read
Prices: Read
  1. Copy the resulting rk_live_… key into the env block of your Claude Desktop config (see install section above).
  2. Restart your MCP client.
  3. Ask Claude: “Analyze my churn from Stripe for the last 60 days.”

Connect your database (optional)

Don't use Stripe? Point analyze_sql_churn at a read-only user on your Postgres or MySQL database. Works with any schema, you describe your column names in the tool call and the tool generates a safe parameterized SELECT internally. Your credentials never touch our servers and never enter the LLM context.

Step 1, create a read-only DB user

This is the single most important safety step. Even if everything else fails, a SELECT-only user on one table cannot cause damage.

Postgres
-- Postgres: create a read-only user
CREATE USER retentioncheck_readonly WITH PASSWORD 'use-a-strong-password';
GRANT CONNECT ON DATABASE your_db TO retentioncheck_readonly;
GRANT USAGE ON SCHEMA public TO retentioncheck_readonly;
GRANT SELECT ON subscriptions TO retentioncheck_readonly;
-- Then use: postgres://retentioncheck_readonly:pass@host:5432/your_db?sslmode=require
MySQL
-- MySQL: create a read-only user
CREATE USER 'retentioncheck_readonly'@'%' IDENTIFIED BY 'use-a-strong-password';
GRANT SELECT ON your_db.subscriptions TO 'retentioncheck_readonly'@'%';
FLUSH PRIVILEGES;
-- Then use: mysql://retentioncheck_readonly:pass@host:3306/your_db?ssl=true

Step 2, add the connection URL to your MCP config

Add POSTGRES_URL or MYSQL_URL (or both) to the env block of your Claude Desktop / Cursor / Zed config (see the install section above).

Step 3, ask Claude

“Analyze my churn from Postgres. Table is subscriptions, cancellation timestamp is cancelled_at, reason is in cancel_reason, monthly revenue is in mrr_cents (cents), filter by status = 'cancelled'.”

Safety: the tool hard-caps results at 500 rows, applies a 15-second statement timeout, validates every table and column name against an allowlist, parameterizes all literal values, and runs three small probe queries to detect schema mismatches so you get actionable errors instead of silent empty output.

Example: real prompt, real output

You ask Claude

“Analyze the feedback in ./cancellations.csv and tell me the top churn drivers.”

Claude invokes analyze_churn → returns
{
  "churn_health_score": 58,
  "churn_health_grade": "C",
  "summary": "Pricing complaints dominate (42% of cancellations) with a
  secondary cluster around missing Slack integration. Both are
  fixable within one sprint.",
  "priority_action": "Audit the $99/mo tier, 12 of 40 cancels
  specifically cite it as \"too expensive for what you get\".",
  "insights": [
    {
      "reason": "Price too high for value delivered",
      "count": 17,
      "percentage": 42.5,
      "severity": "critical",
      "confidence": 92,
      "examples": ["Can't justify $99/mo for what we use"],
      "recommendation": "Test a $79/mo entry tier for 2 weeks."
    },
    {
      "reason": "Missing Slack integration",
      "count": 9,
      "percentage": 22.5,
      "severity": "high",
      "confidence": 88,
      "examples": ["Our team lives in Slack, this doesn't fit"],
      "recommendation": "Ship the Slack webhook, 1-week spike."
    }
  ]
}

Claude can then reason about this structured output, “which insight is most actionable this sprint?”, without leaving your editor.

Want API access for your CS platform or CRM?

Email bcfecomllc@gmail.com , launching soon.