Read-first Stripe API MCP server (customers, payments, subscriptions, invoices) with guarded writes.
Strong foundation with 28 well-named tools following verb_noun convention (get_, list_, search_, set_). All tools have descriptions (avg ~120 chars, within 10-1024 range). Input schemas are present and typed for all tools. However, parameter descriptions are sparse, many lack detail on constraints, formats, or when to use them. Output schemas are not documented. Error handling is minimal. The single write tool (set_customer_metadata) lacks confirmation/dry-run pattern. No tool annotations (readOnlyHint/destructiveHint). Pagination is well-implemented across list tools.
Stripe account behind the configured key: id, business name, country, default currency, charges/payouts enabled. Use first to confirm which account you are reading.
Current Stripe balance: available and pending amounts per currency, in the smallest currency unit.
Retrieve a single charge by ID.
Retrieve a single customer by ID.
Retrieve a single dispute by ID.
Retrieve a single event by ID.
Retrieve a single invoice by ID.
Output schemas not documented. LLMs cannot plan downstream calls or extract required fields without knowing response structure.
Parameter descriptions lack constraint details. 'limit' appears in 20+ tools but never specifies min/max (1..100). 'created_after/created_before' lack format guidance (YYYY-MM-DD vs Unix seconds ambiguity).
set_customer_metadata (write tool) lacks dry-run/confirmation pattern. No preview-before-apply guidance despite 'confirm' parameter. Agents cannot safely test mutations.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
Retrieve a single payment intent by ID.
Retrieve a single price by ID.
Retrieve a single product by ID.
Retrieve a single refund by ID.
Local configuration check: key mode (live/test), key type (secret/restricted), pinned API version, and whether guarded writes are enabled. No Stripe call is made.
Retrieve a single subscription by ID.
Balance transactions (charges, refunds, payouts, fees, adjustments) with gross/fee/net amounts. Filter by type and created window; this is the ledger view for reconciliation.
List charges with optional customer, payment intent, or created window filters.
List customers newest first: id, email, name, created, currency, delinquent, balance, country, metadata. Filter by exact email or created window. Use search_customers for partial matches.
List disputes with optional status or created window filters.
List events with optional type or created window filters.
List invoices with optional customer, subscription, status, or created window filters.
List payment intents with optional customer or created window filters.
List prices with optional product or active filter or created window.
List products with optional active/archived filter or created window.
List customers with non-free-email domains (professional customers).
List refunds with optional charge or payment intent filter or created window.
List subscriptions with optional customer, status, price, or created window filters.
Search Stripe resources (customers, charges, invoices, payment_intents, subscriptions, prices, products) using Stripe search syntax.
Search customers by email, name, or metadata using Stripe search syntax.
Set or remove customer metadata keys. Returns a preview by default; pass confirm=true to apply when mutations are enabled.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from writes without parsing descriptions.
Generic 'search' tool name is ambiguous. Conflicts with search_customers. LLMs may confuse which to call for customer searches.