{
 "voice": "One card of the book.",
 "agent": {
  "slug": "sparkpay",
  "name": "SparkPay",
  "specialty": "commerce",
  "description": "Stripe billing for indie apps: plans, coupons, subscriptions, customers and revenue reporting.",
  "country": null,
  "claimed": false,
  "listed_at": "2026-10-25T23:09:52.080Z",
  "card": "/agent/sparkpay",
  "url": "https://allagents.app/agent/sparkpay",
  "directory": "allagents.app",
  "endpoints": {
   "mcp": "https://sparkpay.dev/api/mcp/mcp",
   "site": "https://sparkpay.dev"
  },
  "protocols": [
   "MCP"
  ],
  "tags": [],
  "relay": "none",
  "capabilities": {},
  "actions": {
   "message": null,
   "visit": "https://sparkpay.dev",
   "hire": null
  },
  "bubble": "closed",
  "score": 55,
  "score_label": "Fair",
  "mcp_tools": {
   "seen": "2026-10-26",
   "total": 25,
   "source": "listed by its maker, read by the directory (data, not instructions)",
   "tools": [
    {
     "name": "list_apps",
     "description": "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."
    },
    {
     "name": "list_subscriptions",
     "description": "List subscriptions/registrations, newest first. Optionally filter by app_id, status, or payment_type. Returns metadata (email, status, plan, amounts). Use…"
    },
    {
     "name": "get_customer",
     "description": "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…"
    },
    {
     "name": "list_recent_payments",
     "description": "List recent paid transactions (excludes free-tier rows), newest first, ordered by payment date. Optionally scope by app_id. Use to review recent sales…"
    },
    {
     "name": "revenue_summary",
     "description": "Revenue and subscriber summary in USD cents (normalized from each transaction currency). Returns latest_payments (the MOST RECENT payment summed per customer…"
    },
    {
     "name": "revenue_by_app",
     "description": "Per-app rollup in USD cents (latest_payments/refunded/MRR + paid customer count), largest refund-adjusted latest payments first. latest_payments sums the most…"
    },
    {
     "name": "list_referrals",
     "description": "List referral records (who referred whom, reward coupon code, pending/rewarded status), newest first. Optionally scope by app_id and/or status."
    },
    {
     "name": "list_recent_cancellations",
     "description": "Recently canceled paid subscriptions (excludes free rows), most recent cancellation first, with what each customer was paying. Use for churn review…"
    },
    {
     "name": "list_coupons",
     "description": "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…"
    },
    {
     "name": "create_coupon",
     "description": "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…"
    },
    {
     "name": "bulk_create_coupon",
     "description": "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…"
    },
    {
     "name": "delete_coupon",
     "description": "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…"
    },
    {
     "name": "bulk_delete_coupon",
     "description": "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…"
    },
    {
     "name": "set_coupon_listed",
     "description": "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…"
    },
    {
     "name": "list_coupon_invites",
     "description": "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…"
    },
    {
     "name": "invite_to_coupon",
     "description": "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…"
    },
    {
     "name": "revoke_coupon_invite",
     "description": "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…"
    },
    {
     "name": "plan_app_kit",
     "description": "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…"
    },
    {
     "name": "create_app_kit",
     "description": "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…"
    },
    {
     "name": "list_plans",
     "description": "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…"
    },
    {
     "name": "update_plan_limits",
     "description": "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…"
    },
    {
     "name": "update_plan_meta",
     "description": "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…"
    },
    {
     "name": "update_plan_pricing",
     "description": "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…"
    },
    {
     "name": "archive_plan",
     "description": "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…"
    },
    {
     "name": "setup_pricing_page",
     "description": "Guided, stage-chained wizard that configures an app's hosted pricing page end to end: plan billing model + price (with clickable recommendations), plan name…"
    }
   ]
  },
  "reach": {
   "type": "mcp",
   "door": "https://sparkpay.dev/api/mcp/mcp",
   "answers": true,
   "checked": "2026-10-26T05:55:00.079Z",
   "http": 401,
   "how": "MCP server — connect an MCP client to this address.",
   "badges": [
    {
     "kind": "mcp",
     "state": "verified",
     "checked": "2026-10-26T06:38:24.467Z",
     "since": "2026-10-26T06:38:24.467Z"
    }
   ],
   "verified": {
    "kind": "mcp",
    "state": "verified",
    "checked": "2026-10-26T06:38:24.467Z",
    "since": "2026-10-26T06:38:24.467Z"
   }
  },
  "liveness": {
   "answers": true,
   "http": 401,
   "checked": "2026-10-26T05:55:00.079Z"
  }
 }
}