View Categories

How to Query Stripe Data with Claude / Cursor via MCP (Stripe MCP Server Setup)

33 min read

MCP SERVER STRIPE

Query Stripe data with Claude or Cursor via the Stripe MCP server.

A 5-minute stripe mcp setup that lets your AI tool ask plain-English questions about your customers, subscriptions, charges, invoices, and refunds. The Query Streams agent caches the Stripe API into a local DuckDB SQL surface, so the LLM sees real tables instead of REST endpoints — and Schema Intelligence handles the Stripe-isms (money columns in cents, livemode filtering, status enums, metadata flattening) so the SQL is right on the first try.

Read-only by construction One key, every connector Cents-aware SQL Bring your own AI tool

Query Streams is a secure, real-time data integration platform that brings every database and SaaS API in your account into Claude, Cursor, ChatGPT, and Grok — through a single MCP key with no firewall changes. This guide walks through the stripe mcp path specifically, so your AI tool can answer plain-English questions about customers, subscriptions, charges, invoices, and refunds without you exporting CSVs out of the Stripe Dashboard or chaining REST API pagination calls in a script. The Network Agent pulls Stripe API data into a local DuckDB cache, so the LLM sees clean SQL surfaces (customers, subscriptions, charges, invoices, refunds, payouts) instead of raw REST endpoints — with money columns flagged as currency_minor_unit_usd so the AI divides amounts by 100 automatically and never reports a $1,234.56 charge as “$123,456”. Learn more at QueryStreams.com and sign up for free to start asking your AI tool real Stripe questions.

What the Query Streams Stripe MCP server gives you

Stripe ships an excellent first-party AI surface — the Stripe Agent Toolkit — which gives AI agents read+write function-call wrappers around the Stripe REST API for actions like creating customers, generating Checkout sessions, issuing refunds, and cancelling subscriptions. That’s the right tool when the AI needs to do things on Stripe’s side. The Query Streams stripe mcp server solves a different problem entirely: a read-only analytics surface over your Stripe data, exposed as SQL, with the same audit trail and multi-connector reach that every other Query Streams MCP connector ships. Other open-source Stripe MCP wrappers we see on GitHub also exist — most of them push raw Stripe REST or pagination cursors at the LLM, no SQL surface, no cents-aware semantics, no read-only enforcement. Query Streams gives you one key, every connector, full audit trail, the agent normalises Stripe API responses into SQL surfaces, and the AI tool never holds your Stripe API keys.

Zero inbound firewall holes

The Network Agent opens a single outbound encrypted cloud link to Query Streams. Your AI client connects to the cloud, never to your Stripe account or your network. No port to open, no IP to allowlist, no VPN, no Stripe API key in the AI client config.

One key, every connector

The same MCP key reaches Stripe alongside every other database and SaaS API your account has connected. Add a HubSpot or PostgreSQL connector tomorrow and the AI tool sees it next to your Stripe data without re-keying — cross-connector joins like “match Stripe customers to CRM contacts” become a single SELECT.

Schema Intelligence baked in

The AI sees AI-curated descriptions, semantic types (currency in cents, status enums, livemode flagging, metadata flattening), sample values, and discovered foreign keys for every Stripe table — not just REST endpoint shapes. It writes accurate SQL the first try, including the amount / 100.0 conversion and the livemode = true filter that bare-schema LLMs miss.

Read-only by construction

Even a hallucinating LLM can’t issue a refund, cancel a subscription, create a Checkout session, or update a customer through Query Streams MCP. The Network Agent rejects anything that isn’t SELECT, WITH, or EXPLAIN before it reaches the cached Stripe tables — and Stripe write operations are never exposed to the MCP surface in the first place.

Per-key rate limits

Default 60 requests per minute and 10 execute calls per minute, configurable per key. A runaway AI tool-call loop hits a token bucket, not your Stripe API rate limit, your daily request quota, or your Stripe Connect platform throughput budget.

How it works without opening firewall ports

The Query Streams Network Agent installs once on any machine with internet access (the Stripe API is reachable from anywhere) and holds a single outbound TLS cloud link — nothing inbound, nothing exposed. What’s specific to Stripe: when a question comes in, the agent paginates the Stripe REST endpoints under the hood and caches the responses in a local DuckDB so the LLM sees clean SQL surfaces — customers, subscriptions, subscription_items, charges, invoices, refunds, payouts, prices, products — instead of REST envelopes. The AI tool never sees your Stripe restricted API key, your Stripe Connect account id, or any customer payment data. how the outbound-only agent link works →

AI Client

Cursor, Claude,
ChatGPT, Grok

QS MCP Server

Streamable HTTP
X-MCP-Key auth

Network Agent

On your network
Cloud link out

Stripe API

read-only DuckDB
cache, SQL surface

No inbound port required — the agent dials out, never the other way around

The MCP key you give Cursor or Claude is scoped (read / analyze / execute), revocable at any time, and rate-limited per-key. The AI tool calls these MCP tools to do its work:

querystreams-mcp · tool catalog
qs_list_organizationsread
Returns the org bound to the calling key.
qs_list_agentsread
Lists Network Agents and online state.
qs_list_connectorsread
Lists data connectors (one entry per database server or API).
qs_get_connector_schemaread
Returns the cached Stripe tables and columns the AI can query (customers, subscriptions, charges, invoices, refunds, payouts, prices, products), with Schema Intelligence enrichment when available.
qs_profile_tableanalyze
Sample values, distributions, enum detection, semantic types — on demand.
qs_list_saved_queriesread
Pre-built parameterized SQL templates the team trusts. The AI runs them without ever seeing the SQL.
qs_run_saved_queryexecute
Executes a saved query by pattern_key with optional parameter overrides.
qs_run_queryexecute
Executes a SELECT against a connector. Read-only validator runs at the agent, before the database sees the SQL.

Why Schema Intelligence makes Query Streams MCP different

Most “MCP for Stripe” servers in the open-source landscape hand your AI tool the same REST resource reference Stripe publishes for developers — or worse, the raw information_schema of whatever cache they keep. Field names. Data types. Maybe a primary key. The LLM is left to guess that amount needs to be divided by 100 because Stripe stores money in cents, that livemode = false rows are test charges that should be filtered out of revenue, that subscriptions.status is an enum of trialing / active / past_due / canceled / unpaid / incomplete, or that created needs to be cast through DuckDB’s timestamp helpers. That’s why the first SQL most LLMs write against a bare Stripe schema is wrong — not because the LLM is bad, but because it doesn’t have the data it needs to be right (and reporting “$1,234,567,890 of MRR” because nobody divided by 100 is the kind of mistake that becomes a screenshot in your finance team’s slack).

Query Streams MCP returns that same cached Stripe schema enriched with what we call Schema Intelligence (SI) — AI-curated metadata that’s generated by running profiling queries against your actual Stripe data before the AI client ever asks. When SI is enabled on the Stripe connector, every schema tool the AI calls (qs_get_connector_schema, qs_get_table_schema, qs_profile_table, qs_get_relationships) returns the bare cached schema plus six layers of curated knowledge. The LLM stops guessing.

To make this concrete, here is what the AI client gets back from a single qs_get_table_schema call against the Stripe connector’s charges table — the central transactional table that drives 90% of revenue questions — first without Schema Intelligence, then with it.

Without Schema Intelligence data_source: captured_schema
// what the LLM sees == TABLE: charges == Columns: – id varchar NOT NULL – customer varchar – amount bigint NOT NULL – currency varchar(3) – status varchar(20) – livemode boolean NOT NULL – created timestamp NOT NULL – payment_method varchar – description text – metadata json Indexes: ix_created, ix_customer Foreign Keys: (none declared in cache) si_recommendation: state: “not_run” what_youre_missing_for_this_call: – amount semantic type (currency in cents) – status / currency / livemode enum value lists – Sample values + business domain tagging – Table and column descriptions – AI-discovered relationships across cached Stripe tables
With Schema Intelligence data_source: schema_intelligence
// what the LLM sees == TABLE: charges [FACT, domain:finance] == “Stripe charge records. amount is in the currency’s smallest unit (cents for USD). Filter livemode = true for production data; livemode = false rows are test charges.” ai_analyzed_at: 2026-05-05 · ~284,612 rows Columns: – id varchar identifier Sample: “ch_3OfX8aLkdIwHu7ix…” – customer varchar identifier FK -> customers.id (97%, conf 0.99) Sample: “cus_QxAbCdEfGh…” – amount bigint currency_minor_unit_usd ⚠ divide by 100 to get USD Sample: 4900 (= $49.00), 9999 (= $99.99) – currency varchar(3) status_code (enum) usd (89%) | eur (8%) | gbp (3%) – status varchar(20) status_code (enum) succeeded (92%) | pending (5%) | failed (3%) – livemode boolean flag (production filter) ⚠ filter livemode = true for production true (production) | false (test data) – created timestamp timestamp_iso Sample: 2026-05-05 16:23, 2026-05-05 14:11 – metadata json key_value_flattened Discovered keys: order_id, plan_tier, source

The six layers Schema Intelligence adds

Each layer addresses a specific class of question the LLM would otherwise have to guess at. SI is opt-in per (connector, database) pair and runs as a one-time profiling pass against your data — it does not change your schema, does not write to your database, and refreshes incrementally when your schema changes.

AI-curated descriptions

Plain-English purpose for every database, schema, table, and column — generated once, refreshed when your schema changes. Confidence-scored; user-authored descriptions always win.

charges: “Stripe charge records;
amount is in cents (1.00 USD = 100).”

Table classifications

Each table tagged FACT (transactional events), DIM (descriptive reference), or LOOKUP (small code maps), plus a business domain — finance, sales, marketing, hr, support, and 14 more.

charges [FACT, domain:finance]
customers [DIM, domain:finance]

Semantic types per column

Eighteen types — currency, currency_minor_unit_usd, email, date_iso, status_code, percentage, ranking_position, identifier, url, and more. The AI generates dialect-correct SQL appropriate to each type, including the amount / 100.0 conversion no bare-schema LLM gets right.

amount: currency_minor_unit_usd
created: timestamp_iso · status: status_code

Sample values from real data

Random rows surfaced to the LLM so it recognises patterns no schema can show — Stripe object id prefixes (ch_, cus_, sub_, in_), formatting conventions, encoded values, and the actual shape of your customer descriptions.

charges.id: [“ch_3OfX8aLkdIwHu7ix”, “ch_3OfWg9LkdIwHu7ix”, “ch_3OfWVnLkdIwHu7ix”]

Enum detection with distributions

Low-cardinality columns (50 or fewer distinct values, at most 5% of rows unique) mapped to their full value list with row counts. The AI never guesses casing or spelling on Stripe enums.

subscriptions.status: trialing (12%) | active (78%) | past_due (4%) | canceled (5%) | unpaid (1%)

Implicit foreign-key discovery

Cross-table data overlap analysis finds joins that aren’t declared as DDL constraints. Stored alongside formal FKs with confidence scores, returned by qs_get_relationships.

charges.customer -> customers.id
(97% overlap, conf 0.99)

Same prompt, different SQL

The proof is in the SQL the AI tool actually writes. Same Cursor session, same Claude model, same prompt — “Which customers spent the most in the last 30 days, with charge count, only successful production charges?” Without Schema Intelligence the LLM has to guess. With it, the LLM knows the amount is in cents, the status enum needs filtering, livemode = true is the production filter, and the customer FK lets it join customers for human-readable email.

Without Schema Intelligence
— LLM’s first attempt against bare schema: SELECT customer, SUM(amount) AS revenue, COUNT(*) AS charge_count FROM charges WHERE created >= ‘2026-04-06’ GROUP BY customer ORDER BY revenue DESC LIMIT 10 revenue reported as “$1,234,567” — off by 100x amount stored in cents (100 = $1.00) no livemode filter — includes test charges no status filter — includes pending + failed shows raw cus_xxx ids, no email join
With Schema Intelligence
— LLM’s first attempt with SI enabled: SELECT c.email AS customer_email, SUM(ch.amount) / 100.0 AS revenue_usd, COUNT(*) AS charge_count FROM charges ch JOIN customers c ON ch.customer = c.id WHERE ch.created >= NOW() – INTERVAL 30 DAY AND ch.status = ‘succeeded’ AND ch.livemode = true GROUP BY c.email ORDER BY revenue_usd DESC LIMIT 10 10 rows. Correct first try. amount saw semantic type = currency_minor_unit_usd status filtered to enum value ‘succeeded’ livemode = true filters out test charges FK to customers.id surfaced human-readable email
Don’t want to run Schema Intelligence? MCP still works. Without SI, schema tools return bare metadata (types, primary keys, formal foreign keys, indexes) and every degraded response carries an si_recommendation block telling the AI exactly what it’s missing — including a one-call option to enable SI mid-conversation via qs_request_si_analysis. Your AI client can offer to trigger an SI run on the spot (“would you like me to enable Schema Intelligence on this database first? It runs through your Network Agent in the background and will dramatically improve my answers”). Run time scales with table count: a Stripe connector typically has 12–15 cached tables and completes in 5–10 minutes; if you also have a large enterprise database with 1,500+ tables connected, that one alone can take 45–60 minutes for a full scan. Subsequent refreshes after schema changes are incremental and much faster than the first run. Schema Intelligence is opt-in. We just don’t think you’ll want to opt out.

Query Streams MCP vs the Stripe Agent Toolkit

Stripe ships the Stripe Agent Toolkit — an official set of function-call wrappers around the Stripe REST API designed for LangChain, the OpenAI Agents SDK, the Vercel AI SDK, and similar agent frameworks. It’s read+write by design: an AI agent with Agent Toolkit access can customers.create, subscriptions.cancel, refunds.create, checkout.sessions.create, and so on. That’s exactly the right shape when the AI is supposed to act on Stripe state — a support assistant that issues refunds, an onboarding bot that creates Checkout links, a sales agent that updates customer metadata. Query Streams MCP solves a different problem: a read-only analytics surface over Stripe data exposed as SQL. The two tools answer different questions. Here’s how they compare across the dimensions that actually matter when an AI tool reaches into Stripe data.

Dimension Query Streams Stripe MCP Stripe Agent Toolkit
Read or write Read-only by construction Read+Write by design
Mutation safety Agent-layer hardcoded READONLY_VIOLATION validator on every dispatched call Whatever the agent prompt and framework guardrails allow
Multi-connector reach Yes — Stripe + Postgres + Snowflake + HubSpot + Shopify under one MCP key Stripe-only
Cross-connector joins Yes — e.g. join Stripe customers to your CRM contacts to your product database users in one SELECT No
Saved queries (LLM never sees SQL) Yes via qs_list_saved_queries + qs_run_saved_query N/A
Audit trail event_logs per call: org / user / key / scope / latency / SQL fingerprint / error Whatever your LangChain / OpenAI Agent SDK logging captures
Schema metadata served to LLM AI-curated descriptions, semantic types like currency_minor_unit_usd, enum value lists, AI-discovered relationships, sample values Stripe REST-API spec only
Use case fit Analytics, finance reports, customer-support context lookup, compliance audits Action-taking assistants, support bots that issue refunds, onboarding flows that create Checkout sessions

They’re complementary, not competitive. Many orgs use both — Query Streams MCP for the data side (the AI reads Stripe analytics, joins them to CRM and product data, generates reports), the Stripe Agent Toolkit for the action side (the AI issues refunds, cancels subscriptions, creates Checkout links). The decision is per-tool and per-AI-agent, not per-org. Some teams gate the Agent Toolkit behind manual approval workflows + Query Streams MCP behind unrestricted analytics access — the read-only nature makes it safe to grant freely. If you’re standing up an AI assistant that needs to do things on Stripe, use the Stripe Agent Toolkit. If you’re standing up an AI assistant that needs to understand what’s happening on Stripe (and ideally also see your Postgres, your Snowflake, your HubSpot, your Shopify in the same conversation), use Query Streams MCP. Most mature deployments have both.

Nova AI

MCP not for you? Try Nova AI instead.

Skip MCP entirely and ask Stripe questions like “what’s our MRR trend over the last 12 months?” or “which subscriptions are at-risk in the next 30 days?” straight from the Query Streams portal — no config files, same Network Agent and Schema Intelligence underneath.

Meet Nova AI

Prerequisites

Before you start, make sure you have:

  1. A free Query Streams account at my.querystreams.com.
  2. The Query Streams Network Agent installed on a machine with internet access — see Download the Query Streams Agent. The Stripe API is reachable from anywhere, so the agent doesn’t need to live on a specific network.
  3. A Stripe connector configured against the agent — see the existing API Connector Setup guides for Stripe pairing. Use a Stripe restricted API key (recommended) so you can scope the agent’s read access to specific resources (e.g. read on charges / subscriptions / customers / invoices, no access to balance / payouts / accounts if you don’t need them). The agent holds the Stripe API key; the AI tool never touches it.
  4. Any MCP-capable AI client. We’ll show Cursor, Claude Desktop, ChatGPT, and Grok in this guide; if you use Windsurf, Zed, Continue, Cline, VS Code Copilot, Codex, or Goose, the config block is essentially the same.
  5. Five minutes.
You only set up the agent once. The same agent that powers Query Streams’ Excel and Google Sheets add-ons, the web Query Builder, and Nova AI also serves MCP. Adding MCP to an existing Query Streams account is just generating a key — the agent and connectors are already running.
1

Generate an MCP key

From the /mcp page in Query Streams, mint a key with the scopes you want.

2

Drop it into your AI client

One JSON snippet for Cursor, Claude, ChatGPT, or Grok. Same key everywhere.

3

Ask a question

“What’s our MRR by month?” — the AI calls the right tools, you get the answer.

Step 1: Generate an MCP key in Query Streams

Sign in to Query Streams and open the MCP page (or sign in first at my.querystreams.com and click MCP in the left navigation). Click Generate key, give the key a recognizable name (something like cursor-laptop or claude-desktop), and pick the scopes you want this key to have:

  • read — the AI can browse connectors and read schema. Required for everything else.
  • analyze — the AI can profile tables and discover relationships (sample values, distributions, semantic types). Optional but strongly recommended for finance work, where understanding the shape of your charge / subscription / invoice data and metric semantics (cents-aware money columns, status enums, livemode flagging) matters.
  • execute — the AI can actually run SQL. Without this, the AI is read-only against schema metadata only.

For a typical “let Claude analyse my Stripe data” workflow, all three scopes are appropriate. For a key you’re handing to a teammate or a less-trusted client, drop execute and let them browse only. You can revoke any key at any time from the same page; the AI client will see MCP_KEY_REVOKED on its next call and stop working immediately. There’s no propagation delay.

Copy the key now — Query Streams shows it once, then stores only a hash. If you lose it, generate a new one. The key looks like qsmcp_ followed by 48 random characters and is what your AI client sends in the X-MCP-Key request header.

Step 2: Add Query Streams MCP to your AI client

The configuration is the same shape across every MCP-capable client — an MCP server entry pointing at https://mcp.querystreams.com with your key in the X-MCP-Key header. Pick your client below.

Cursor
Cursor ~/.cursor/mcp.json
// Edit ~/.cursor/mcp.json
{
  "mcpServers": {
    "querystreams": {
      "url": "https://mcp.querystreams.com",
      "headers": {
        "X-MCP-Key": "qsmcp_PASTE_KEY_HERE"
      }
    }
  }
}
Claude Desktop
Claude Desktop claude_desktop_config.json
// Settings → Developer → Edit Config
{
  "mcpServers": {
    "querystreams": {
      "url": "https://mcp.querystreams.com",
      "headers": {
        "X-MCP-Key": "qsmcp_PASTE_KEY_HERE"
      }
    }
  }
}
ChatGPT
ChatGPT Apps & Connectors
// Settings → Apps & Connectors → Add MCP
Server URL  https://mcp.querystreams.com
Auth header X-MCP-Key
Header value qsmcp_PASTE_KEY_HERE

// Requires a paid ChatGPT plan
// (Plus / Pro / Team / Enterprise).
Grok
Grok Remote MCP Tools
// Grok → Settings → Tools
{
  "mcp_servers": [{
    "name": "querystreams",
    "url": "https://mcp.querystreams.com",
    "auth_header": "X-MCP-Key",
    "auth_value": "qsmcp_..."
  }]
}

Restart your AI client. On its next start it will discover the eight Query Streams MCP tools listed above and surface them in its tool palette. In Cursor and Claude Desktop you can verify by typing “list connectors” — the AI should call qs_list_connectors and return your Stripe connector (along with anything else you have configured, including additional Stripe Connect platforms if you’ve paired multiple accounts).

Step 3: Ask the AI a Stripe question

You don’t write SQL — the AI does. You ask a question, the AI picks the right MCP tool, the agent runs the query against your cached Stripe data, and the answer comes back as text plus tables. Three example prompts to try first:

“What’s our MRR by month over the last 12 months and which customer cohort is driving the recent growth?”
MRR Trend
The AI will call qs_get_connector_schema to discover the cached Stripe tables, then qs_run_query with a SELECT that joins subscriptions -> subscription_items -> prices to compute MRR per active subscription, divides any cents-stored amounts by 100, normalises monthly / yearly / weekly intervals to a per-month figure, filters livemode = true and subscriptions.status IN ('active', 'trialing'), and groups by DATE_TRUNC('month', subscriptions.created). You’ll get the trend table inline plus a written interpretation — which acquisition cohort grew, which is contracting, and a follow-up offer like “want me to break this down by plan tier?” Schema Intelligence’s enum detection guided the AI to pick the right subscription-status filter; without SI, the LLM might have included past_due and canceled and overstated current MRR.
“Show me churn rate over the last 6 months, segmented by subscription tier.”
Churn by Tier
The AI joins subscriptions -> prices -> products to bucket subscriptions by tier (the products.name or prices.nickname column), then computes the cancellation count and the cohort-active denominator per month using the Stripe-canonical churn formula. Below the table the AI typically annotates which tiers are leaking customers fastest and proposes a follow-up: “want me to look at expansion vs contraction MRR by tier in the same window?” Schema Intelligence’s enum detection on subscriptions.status ensures the AI distinguishes canceled from unpaid and from incomplete_expired — three different reasons a subscription ends, with very different finance implications.
“List customers whose next invoice exceeds $5,000 and whose payment method is expiring in the next 30 days.”
Renewal Risk
A finance-style join across subscriptions, upcoming_invoices (or the invoices table for the next renewal cycle), customers, and payment_methods. The AI applies the cents-aware filter amount > 500000 (i.e. $5,000 in cents), parses the card.exp_month / card.exp_year against the next 30 days, and joins back to customers.email for human-readable output. Schema Intelligence’s currency_minor_unit_usd semantic type drives the right cents threshold automatically. The AI will usually propose a follow-up: “want me to draft an outreach list with the customer email and account-manager assignment so the success team can reach out before renewal?”

The first time the AI calls a tool, your client may pop up a confirmation prompt asking you to approve the tool call — that’s MCP’s standard consent flow, not anything Query Streams adds. Approve once and the AI proceeds with the rest of the conversation freely. You can revisit the consent at any time in your client’s settings.

Honest billing notice: MCP usage is charged on uncompressed bytes

Query Streams’ Excel add-in, Google Sheets add-on, web Query Builder, and Nova AI all run over our compressed cloud link — we measure and bill compressedBytes against your data realm. The MCP transport (Streamable HTTP per the official MCP spec) does not reliably support compression end-to-end across every client and intermediate proxy, so we measure and bill uncompressedBytes for MCP traffic.

  • What this means: a 1.5 MB Stripe analytics query (12 months of charges + customers + subscriptions joined) costs ~1.5 MB of your data realm when fetched via MCP, vs. ~200–350 KB via Excel / Sheets / Nova / the Query Builder. Stripe data is heavy on enums (status, currency, livemode), timestamps, and free-form metadata strings — so LZ4 compression over the cloud link typically achieves 7–9x reduction on the other transports. Same data, different transport, different billable size.
  • What this isn’t: a markup or a punishment for using MCP. We pass through actual bytes shipped. The other clients are cheaper because compression works reliably on those transports; we don’t punish you for the protocol choice, but we have to be transparent about the cost shape.
  • What you can do: for very large recurring exports (e.g. multi-year customer + charge + invoice cross-tabs), prefer the Excel / Sheets / Nova path. For interactive AI tool calls (the typical 100–5,000 row Stripe analytics aggregate that fits in an LLM context), MCP is the right choice and the cost difference is in cents. The DuckDB cache also deduplicates repeated Stripe API calls so you don’t burn Stripe rate-limit budget twice for the same lookup.

Frequently asked questions

Do I need to open ports or run a VPN to use this? +
No inbound rules, port-forwarding, NAT punchthrough, or VPN. The Network Agent makes one outbound TLS connection (port 443) and your AI client reaches https://mcp.querystreams.com from the public internet — if outbound HTTPS works on the agent host, MCP works. See how the outbound-only connection works →
Which AI tools can I use with Query Streams MCP? +
Any client that speaks the open Model Context Protocol — Claude Desktop, Claude Code, Cursor, ChatGPT (paid), Grok, Gemini CLI, Windsurf, Zed, and 500+ more. Bring your own AI tool; you don’t have to switch. Full list of supported AI clients →
Can I revoke an MCP key? +
Yes — three independent kill-switches (per-key from the /mcp page, per-org via plan settings, and platform-level), none of which need a database password rotation or agent restart. More on MCP key security →
How is MCP usage billed against my data realm? +
MCP execute calls deduct from the same data-realm budget your Excel, Google Sheets, web Query Builder, and Nova AI usage already draws on — one consumption budget across every access method. The size measured for MCP differs. The other clients run over our compressed cloud link (we bill compressedBytes); MCP runs over Streamable HTTP, which doesn’t reliably support compression end-to-end through every client and proxy, so we bill uncompressedBytes. A 1.5 MB Stripe analytics aggregate returned to Excel typically costs ~200–350 KB of your data realm (Stripe data with repeated status enums + currency labels + livemode booleans compresses 7–9x via LZ4); the same 1.5 MB result returned to Cursor over MCP costs ~1.5 MB. We’re transparent about it because we’d rather you know up front than be surprised at the end of the billing cycle.
Does Query Streams MCP work with Stripe restricted API keys, Stripe Connect platforms, and historical data older than the standard API window? +
Yes — on all three. Stripe restricted API keys are the recommended auth method for the agent. You can scope the key to read-only on specific resources (e.g. read on charges / subscriptions / customers / invoices, no access to balance / payouts / accounts) and the agent’s read-only validator enforces SQL-side restrictions on top, so the AI tool is doubly contained. Standard Stripe API keys work too but with broader scope. Stripe Connect platforms are supported — the agent connects to your platform account and uses the Stripe-Account header for connected-account queries; each connected account can be a separate Query Streams connector if you want LLM-side disambiguation (“show me revenue on connected account acct_xxx“), or you can keep them merged for cross-account analytics. Historical data beyond Stripe’s standard 90-day API window is preserved in the agent’s DuckDB cache: once the agent has fetched a record, it persists locally; you can query historical charges / customers / subscriptions even after Stripe’s API rolls them off the live response. The agent’s cache freshness policy is configurable per resource (e.g. refresh subscriptions every hour, refresh charges every 5 minutes, refresh customers daily) so you control the tradeoff between freshness and Stripe API quota burn.
How does this differ from running an open-source Stripe MCP server myself? +
A direct Stripe MCP server (community projects on GitHub do exist, mostly thin REST wrappers around the Stripe API) is one MCP per data source — and most of them dump raw REST resources or pagination cursors at the LLM, no SQL surface, no cents-aware semantics layer, no livemode filtering hint. To get Claude reading from Stripe + your PostgreSQL + your HubSpot CRM + your Snowflake warehouse you’d need four MCP servers configured separately in every AI client, each with its own credentials, each with its own scope model, each with its own audit story. Query Streams MCP is one key reaching every connector your account has paired, and the agent normalises Stripe API responses into clean SQL surfaces with currency_minor_unit_usd semantic typing baked in (so the LLM divides by 100 automatically). You also pick up Schema Intelligence, agent-layer read-only enforcement, per-key rate limits, audit trail in event_logs, and the same data-realm billing pipeline you already use — none of which a direct MCP gives you.
What happens if the AI tries to write or delete data? +
It’s rejected at the agent before the cached Stripe data sees the SQL. Every qs_run_query call is parsed by a hardcoded read-only validator that allows only SELECT, WITH, and EXPLAIN statements; anything else returns READONLY_VIOLATION and never reaches the cached Stripe tables. The validator runs in the agent process, not in the cloud, so a compromised cloud surface couldn’t bypass it. There’s a second layer of safety on top: Stripe write operations (creating refunds, cancelling subscriptions, updating customers, generating Checkout sessions) are simply not exposed to the MCP surface in the first place — the agent only ever issues read-shaped REST calls to the Stripe API. So even if the validator were somehow bypassed, the LLM has nothing it could call to mutate your Stripe state. (If you do want an AI agent that takes actions on Stripe, that’s the Stripe Agent Toolkit’s job, covered in the comparison section above.)
Can I see what the AI actually asked? +
Yes. Every MCP tool call writes a row to event_logs with the org, user, key, scope, latency, and result code. The org-admin can answer “who used MCP last week, which connector, and what did they ask?” with a single query. Note that we log the tool name and metadata, not the SQL text or returned rows — those flow through the cloud link and never land in cloud logs. Stripe’s own dashboard shows API request logs from the agent’s perspective (calls made by the agent’s restricted API key), so for Stripe data the combination is: the agent’s event_logs in your Query Streams account tells you what the AI asked and when; the Stripe Dashboard’s “Developers → Logs” tab tells you what API calls the agent fanned out as a result. Together they give a complete audit trail of every AI-initiated read on your Stripe data, suitable for SOC 2 / PCI / finance-team review.
Do I have to run Schema Intelligence to use Query Streams MCP? +
No — Schema Intelligence is opt-in per (connector, database) pair, and MCP works fine without it. The AI gets bare schema (types, primary keys, formal foreign keys, indexes) and writes basic queries. With SI enabled, the AI gets six additional layers of curated metadata: (1) AI-curated descriptions on every database, table, and column; (2) table classifications (FACT for transactional events, DIM for descriptive reference, LOOKUP for small code maps) plus a business domain tag (finance, sales, marketing, hr, support, and 14 more); (3) a semantic type on every column (currency, currency_minor_unit_usd, email, date_iso, status_code, percentage, identifier, url, person_name, and 9 more) that drives dialect-correct SQL generation; (4) sample values from your real data so the LLM recognises patterns no schema can show (Stripe id prefixes, metadata key shape, customer description conventions); (5) enum detection with full value distributions for low-cardinality columns; and (6) AI-discovered foreign keys based on cross-table data overlap, surfaced through qs_get_relationships. Without SI, every schema-tool response also carries an si_recommendation block listing exactly what’s missing for the call — the AI can read this and offer to trigger SI mid-conversation via qs_request_si_analysis. Run time scales with table count: a Stripe connector typically completes in 5–10 minutes (12–15 cached tables); a typical mid-size database on the same agent (a few hundred tables) finishes in 15–25 minutes; a large enterprise database with 1,500+ tables can take 45–60 minutes for a full scan. SI runs through your Network Agent against your data (never in the cloud), never writes to your database, never changes your schema, and refreshes incrementally when your schema changes — so subsequent runs after you add or alter tables are much faster than the first one. The end-to-end effect: with SI enabled, your AI client writes correct SQL on the first try far more often than it does against any “MCP for X” server that just hands the LLM information_schema.
What if I add another connector later, like HubSpot or PostgreSQL? +
Nothing changes on the AI client side — the same key reaches the new connector the moment the agent pairs it (qs_list_connectors picks it up automatically), so one config block buys your whole account, present and future. Cross-connector joins like “match Stripe customer ids to HubSpot contacts and find paying customers who haven’t logged in for 30 days” then work in a single query. Why one key covers every connector →
Do I have to set up MCP just to chat with my Stripe data? +
No — Nova AI is built into the Query Streams portal and works against every connector (Stripe included) with no MCP setup or config files. Use Nova to chat with your Stripe data inside Query Streams; use MCP when you want your own AI client (Claude, Cursor, ChatGPT, …) to reach Stripe alongside whatever else it does — same agent, same connectors, same Schema Intelligence underneath. Learn more about Nova AI →
Why use Query Streams MCP for Stripe data if Stripe ships the Agent Toolkit? +
Two completely different problem shapes. The Stripe Agent Toolkit is an official function-call wrapper for AI agents to perform Stripe actions — create customers, cancel subscriptions, issue refunds, generate Checkout sessions, update metadata, and so on. It’s read+write by design and exactly the right tool when the AI is supposed to act on Stripe state. Query Streams MCP is a read-only analytics surface over Stripe data — the LLM can SELECT from charges / subscriptions / invoices / customers / refunds / etc. via SQL, but cannot mutate Stripe state. Three concrete reasons to prefer Query Streams for analytics-shaped use cases: (1) Read-only by construction. A hallucinating LLM with Agent Toolkit access can theoretically issue a refund, cancel a subscription, or create a Stripe Checkout link with incorrect parameters — the prompt and framework guardrails are the only line of defence. With Query Streams MCP, the agent’s hardcoded read-only validator returns READONLY_VIOLATION for any non-SELECT / non-WITH / non-EXPLAIN statement — the LLM physically cannot mutate Stripe state, no matter how creatively prompted. (2) Multi-connector single key. A single Query Streams MCP key gives Claude / Cursor / ChatGPT / Grok access to your Stripe data AND your Postgres + your Snowflake + your HubSpot + your Shopify, all queryable in the same conversation with cross-connector joins (“match Stripe customer ids to my CRM contacts and show me which paid customers haven’t logged into the product in 30 days“). The Agent Toolkit only sees Stripe. (3) Audit trail. Every Query Streams MCP call writes a row to event_logs with org / user / key / scope / latency / SQL fingerprint / error code. Compliance and finance teams can answer “who queried Stripe data last week, what did they ask for, and how much returned?” with a single query. Agent Toolkit logging depends on whatever your LangChain / OpenAI Agent SDK / Vercel AI SDK setup captures; the discipline is on you. Use the Agent Toolkit when the AI needs to perform Stripe actions (assistant bots that issue refunds, onboarding flows that create Checkout sessions, support bots that update customer metadata) and you’ve audited the agent’s behaviour. Use Query Streams MCP when the AI is doing analytics, finance reporting, customer-support context lookup, compliance audits, or anything else that’s strictly read-side. Many orgs use both, scoped to different AI agents.

Get started

Connect your AI tool to your Stripe data in five minutes.

One MCP key reaches Stripe, every database, and every other API connector in your Query Streams account — with full audit trail, per-key rate limits, restricted-API-key auth, Stripe Connect support, and zero firewall changes. Read-only by construction; the Stripe Agent Toolkit covers the action side. Claude, Cursor, ChatGPT, and Grok all work out of the box.

Related guides: Download the Query Streams Agent | API Connector Setup | All MCP Server guides | Nova AI text-to-SQL

Category: MCP Server

Tags: mcp, claude, cursor, stripe, api-connector, payments, saas-metrics, mrr, stripe-agent-toolkit, read-only-mcp

Meta Description: Query Stripe with Claude or Cursor via MCP. Read-only SQL surface, cents-aware semantics, restricted API keys, no firewall changes. Free.

Updated on June 16, 2026

Powered by BetterDocs