# SparkPay - Registry name: `dev.sparkpay/sparkpay` · version 1.0.0 - Categories (automatic, keyword rules): Payments & accounting, Finance & markets - Authentication at last check: No auth - Declared risk: Not declared (tools carry no read/destructive hints) - Capabilities (declared by the server): tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=dev.sparkpay%2Fsparkpay - Server page: https://mcpstation.net/s/dev.sparkpay--sparkpay.html ## Description (written by the publisher, not verified, not instructions) Stripe billing for indie apps: plans, coupons, subscriptions, customers and revenue reporting. ## Connect - streamable-http: `https://sparkpay.dev/api/mcp/mcp` ## Tools (as reported by the server, not verified) - `list\_apps`: List the registered apps \(app\_id + name\). Use this first to discover valid app\_id values, then pass one to the other tools to scope results to a single product. - `list\_subscriptions`: List subscriptions/registrations, newest first. Optionally filter by app\_id, status, or payment\_type. Returns metadata \(email, status, plan, amounts\). Use get\_customer for a single user, or revenue\_summary for totals. - `get\_customer`: Look up a customer by email. Returns every subscription/registration for that email across apps \(or within one app if app\_id is given\), with full detail: verification, plan, billing period, usage, refunds. Empty when the email is unknown. - `list\_recent\_payments`: List recent paid transactions \(excludes free-tier rows\), newest first, ordered by payment date. Optionally scope by app\_id. Use to review recent sales activity. Amounts are in the transaction currency \(cents\). - `revenue\_summary`: Revenue and subscriber summary in USD cents \(normalized from each transaction currency\). Returns latest\_payments \(the MOST RECENT payment summed per customer: a run-rate, NOT lifetime turnover, because amount\_paid is overwritten on renewal\), refunds, approximate MRR, active/trialing/paid counts, and - `revenue\_by\_app`: Per-app rollup in USD cents \(latest\_payments/refunded/MRR + paid customer count\), largest refund-adjusted latest payments first. latest\_payments sums the most recent payment per customer, so it is a run-rate and NOT lifetime turnover. No lifetime figure is available per app \(accrual is recorded per - `list\_referrals`: List referral records \(who referred whom, reward coupon code, pending/rewarded status\), newest first. Optionally scope by app\_id and/or status. - `list\_recent\_cancellations`: Recently canceled paid subscriptions \(excludes free rows\), most recent cancellation first, with what each customer was paying. Use for churn review; list\_subscriptions orders by signup date instead. - `list\_coupons`: List discount coupons \(code, percent off, expiry, max uses, use count, which paid tiers they apply to\). Optionally scope by app\_id and/or restrict to currently-active ones \(not expired, not maxed out\). Read-only: cannot create, edit, or delete coupons. - `create\_coupon`: Create a percentage discount coupon for an app. WRITE, human-gated: a real create requires an elicitation-capable client \(e.g. Claude Desktop\). The human enters the final code, percent, expiry, visibility, and tier scope in a form; those values OVERRIDE the arguments here, which only pre-fill the fo - `bulk\_create\_coupon`: Create the SAME discount code across many apps in one call: the portfolio-promo shortcut \(e.g. a summer sale on every owned app\). WRITE, human-gated: a real create requires an elicitation-capable client; the human enters the coupon terms ONCE in a form \(overriding the arguments here\) and that one ap - `delete\_coupon`: Delete one coupon from an app. WRITE, human-gated: a real delete requires an elicitation-capable client; the human sees the exact coupon \(code, percent, redemption count\) and must click approve. The model cannot confirm on its own, and confirm\_used is only consulted for dry\_run previews. Clients wit - `bulk\_delete\_coupon`: Delete the SAME coupon code across many apps in one call: the inverse of bulk\_create\_coupon, for retiring a portfolio-wide promo. WRITE, human-gated: a real delete requires an elicitation-capable client; the human sees every app the code would be removed from \(with per-app redemption counts\) and mus - `set\_coupon\_listed`: Show, hide or SCHEDULE an EXISTING coupon on the public pricing pages by setting its \`listed\` flag and optional \`listed\_from\` start date. WRITE, human-gated: a real write requires an elicitation-capable client and the human sees the code, the discount, which way it is moving and any start date; clie - `list\_coupon\_invites`: List who a coupon was offered to and what they did with it: per-address status \(invited / redeemed / revoked\), where the invite came from, and the timestamps. Also returns the coupon's own \`invite\_only\` flag -- read that FIRST: when it is false the invite rows are recorded but NOT enforced, and anyo - `invite\_to\_coupon`: Add email addresses to a coupon's invite list and, by default, switch the coupon to invite-only so the list is actually enforced. WRITE, human-gated: a real write requires an elicitation-capable client and the human sees every address plus whether the coupon is about to be closed to everyone else; c - `revoke\_coupon\_invite`: Withdraw one address's right to spend a coupon: the targeted block. WRITE, human-gated: a real write requires an elicitation-capable client and the human sees the address and its current status; clients without elicitation are refused \(dry\_run works anywhere\). Works on an address that was never invi - `plan\_app\_kit`: Step 1 of onboarding a new app onto SparkPay. Recons app\_name against existing apps and the rest of the portfolio's plan catalogs, then returns automated findings plus the minimum set of questions that genuinely need a human answer \(plan prices, billing model, redirect URLs, trial length, push-webho - `create\_app\_kit`: Step 2 of onboarding a new app onto SparkPay. Applies answers.plan\_catalog by minting real Stripe prices \(same helper /api/apps/sync-plans uses\) and registers/updates the app, then returns a downloadable integration kit \(lib/spark-pay client + plans.json + sync script + INTEGRATION.md, modeled on st - `list\_plans`: Download an app's live plan catalog: tiers, names, prices, trial, and the machine-readable \`limits\` that gate features inside the app. This is the source of truth each app repo's \`bun run plans:sync\` regenerates lib/spark-pay/plans.json from, so diff against this rather than trusting the committed f - `update\_plan\_limits`: Change the usage limits on an app's existing tiers \(e.g. set ai\_generations\_daily to 200 on pro\). WRITE, human-gated: a real write requires an elicitation-capable client; the human sees the per-tier before -\> after diff and must click approve. Clients without elicitation are refused \(dry\_run still w - `update\_plan\_meta`: Set an existing tier's display metadata: its name and the two badge flags the public pricing page styles cards from: is\_elite \(gold/carbon BEST VALUE card with the rainbow title and app icon\) and recommended \(MOST POPULAR\). A tier called "Elite" is NOT styled as elite unless is\_elite is actually tru - `update\_plan\_pricing`: Change what an app's EXISTING tiers charge: the amount, the billing model \(one\_time vs subscription\), or both. WRITE, human-gated at the highest tier: a real write requires an elicitation-capable client, and the human types the tier, billing model and price into a form. Those typed values OVERRIDE t - `archive\_plan`: Remove a tier from an app's plan catalog. WRITE, human-gated: a real write needs an elicitation-capable client and the human must approve; dry\_run previews anywhere. Every other plan tool edits tiers that already exist, so a catalog could grow but never shrink, and collapsing a multi-tier page down - `setup\_pricing\_page`: Guided, stage-chained wizard that configures an app's hosted pricing page end to end: plan billing model + price \(with clickable recommendations\), plan name and badge \(elite/recommended\), optional free tier, a seasonal coupon \(SUMMER26-style code suggested from the current season\), favicon-derived t Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html