stripe-billing-ops-mcp
Reads GitHub repository activity, including commits, to support invoicing and work-based billing workflows.
Reads and sends Gmail messages for billing workflows such as failed-payment follow-ups, receipt filing, vendor invoice intake, plan changes, and SaaS spend audits.
Connects to Google via OAuth to enable workflows across Google Calendar, Gmail, Google Drive, Google Docs, and Google Sheets.
Reads Google Calendar events, such as client meetings, to generate invoice line items and billing summaries.
Creates and manages Google Docs for outputs such as investor update drafts.
Stores and organizes files in Google Drive, such as receipts and vendor invoice PDFs.
Reads and writes Google Sheets for revenue tracking, payout reconciliation, expense logging, vendor invoice approval, bulk refunds, and price lists.
Reads Linear issues and project progress to draft investor updates and track work.
Creates and updates Notion pages, such as price change FAQs and related documentation.
Retrieves Shopify order and fulfillment data to assemble dispute evidence and proof of delivery.
Sends Slack notifications and approval requests to account owners, budget owners, and teams.
Provides Stripe billing operations: invoices, payments, subscriptions, payouts, disputes, refunds, prices, fees, and customer revenue data.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@stripe-billing-ops-mcp chase failed payments from last week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Stripe Billing Ops
Invoices from real work, failed-payment follow-ups, revenue sheets and dispute evidence.
An MCP server with 14 workflows across Google Calendar, GitHub, Stripe, Gmail, Slack, Google Sheets, Shopify, Google Drive, Linear, Google Docs and Notion. Each workflow is a prompt your agent runs as a slash command, over the 37 tools it needs and no others.
uv tool install https://github.com/r28ai/stripe-billing-ops-mcp/releases/download/v0.1.0/stripe_billing_ops_mcp-0.1.0-py3-none-any.whl
claude mcp add billing -- stripe-billing-ops-mcpIt installs with uv from this repository's release, with no git and nothing to build; nothing but Charter and the libraries it uses comes from PyPI. To update, run the install line from the latest release. If a desktop app cannot find stripe-billing-ops-mcp, give it the full path from which stripe-billing-ops-mcp (where stripe-billing-ops-mcp on Windows).
Then ask your agent to connect your apps, or run /mcp__billing__setup.
Connect your apps
Ask the agent to connect one ("connect Linear"). It tells you where to get that app's key and the command that stores it, and the next call works, with no restart. The agent never asks for a key in the chat.
Or connect everything this server uses from a terminal:
stripe-billing-ops-mcp login # each app in turn
stripe-billing-ops-mcp login github # just one
stripe-billing-ops-mcp status # what is connectedTokens and keys go to your operating system's keychain (macOS Keychain, Windows Credential Manager, the Secret Service on Linux), and are checked with one read-only call to the app's own API before they are kept. Every key, token and OAuth client is yours: we register no app with any of these services, and nothing passes through a server of ours, because there isn't one.
App | How it connects | Or set |
Browser sign-in, over your own OAuth client (make one). |
| |
GitHub | Your own key (get one), entered once. |
|
Stripe | Your own key (get one), entered once. |
|
Slack | Your own key (get one), entered once. A bot token from your own Slack app, which the guide sets up in about three minutes. |
|
Shopify | Your own key (get one), entered once. |
|
Linear | Your own key (get one), entered once. |
|
Notion | Your own key (get one), entered once. Then share the pages it should see with the integration. |
|
A variable set in your client's config always wins over the keychain.
Related MCP server: Subotiz MCP
Workflows
Workflow | What you get | Apps |
Freelancer invoice from the week's work | Client meetings and commits become line items and a sent invoice. | Google Calendar, GitHub, Stripe |
Failed payment follow-up | Past-due invoices get a human email and the account owner is told. | Stripe, Gmail, Slack |
Revenue sheet | MRR, new, churned and fees appended daily to the sheet finance already uses. | Stripe, Google Sheets |
Payout reconciliation | Each payout broken into the charges, refunds and fees inside it. | Stripe, Google Sheets |
Dispute evidence pack | Correspondence and fulfillment proof assembled and submitted before the deadline. | Stripe, Gmail, Shopify |
Receipts → Drive and the expense sheet | Every receipt filed and logged without forwarding emails to anyone. | Gmail, Google Drive, Google Sheets |
Vendor invoice inbox → approval | Bills land in a sheet with the PDF and an approval request to the budget owner. | Gmail, Google Drive, Google Sheets, Slack |
Plan change by email | 'Please move us to annual' handled from the email, with confirmation drafted. | Gmail, Stripe |
Investor update draft | Numbers from billing and progress from the tracker, in your template. | Stripe, Linear, Google Docs, Gmail |
Price change rollout | New price created, affected customers listed and notice drafted, with an FAQ page. | Stripe, Gmail, Notion |
Platform fee report | Fees per connected account per month, for marketplaces on Connect. | Stripe, Google Sheets |
SaaS spend audit | Every recurring vendor charge in the inbox, with an owner asked to justify it. | Gmail, Google Sheets, Slack |
Bulk refunds from a sheet | A list of affected orders after an incident, refunded and marked row by row. | Google Sheets, Stripe |
Price list from a sheet | The pricing sheet the team agreed on becomes the products Stripe sells. | Google Sheets, Stripe |
Every prompt takes one optional argument, details: the repo, team, channel, customer or date range you mean, so the agent does not have to ask. In Claude Code, put it in quotes, or only its first word arrives:
/mcp__billing__freelancer_invoice_from_the_week_s_work "client Acme, repo acme/site, last week"Reads run without asking. Before anything that creates, sends, changes or deletes, the prompt tells the agent to show you the call and wait.
0 of the 14 workflows need no Google or Granola credential.
Other clients
Claude Desktop: install uv if you have not, since Claude Desktop starts the server with it, then open the .mcpb from the latest release. Claude asks for any keys in its own settings and keeps them in your keychain. The first start takes a few seconds longer, while uv installs it.
VS Code (.vscode/mcp.json): VS Code asks for each key the first time the server starts and stores it securely. Leave out any you stored with login.
{
"inputs": [
{
"type": "promptString",
"id": "google-client-secret",
"description": "Google: OAuth client secret",
"password": true
},
{
"type": "promptString",
"id": "github-token",
"description": "GitHub: Personal access token",
"password": true
},
{
"type": "promptString",
"id": "stripe-api-key",
"description": "Stripe: Secret or restricted key",
"password": true
},
{
"type": "promptString",
"id": "slack-bot-token",
"description": "Slack: Bot token (xoxb-\u2026)",
"password": true
},
{
"type": "promptString",
"id": "shopify-client-secret",
"description": "Shopify: App client secret",
"password": true
},
{
"type": "promptString",
"id": "linear-api-key",
"description": "Linear: Personal API key",
"password": true
},
{
"type": "promptString",
"id": "notion-api-key",
"description": "Notion: Integration secret (ntn_\u2026)",
"password": true
}
],
"servers": {
"billing": {
"type": "stdio",
"command": "stripe-billing-ops-mcp",
"env": {
"GOOGLE_CLIENT_SECRET": "${input:google-client-secret}",
"GITHUB_TOKEN": "${input:github-token}",
"STRIPE_API_KEY": "${input:stripe-api-key}",
"SLACK_BOT_TOKEN": "${input:slack-bot-token}",
"SHOPIFY_CLIENT_SECRET": "${input:shopify-client-secret}",
"LINEAR_API_KEY": "${input:linear-api-key}",
"NOTION_API_KEY": "${input:notion-api-key}",
"GOOGLE_CLIENT_ID": "",
"SHOPIFY_SHOP": "",
"SHOPIFY_CLIENT_ID": ""
}
}
}
}Cursor (.cursor/mcp.json) starts it the same way:
{
"mcpServers": {
"billing": {
"command": "stripe-billing-ops-mcp"
}
}
}Codex (~/.codex/config.toml) starts a turn without waiting for a server unless it is required, and then the agent has none of its tools. required = true makes the session wait for it, and startup_readiness = "catalog" waits for its tool list rather than just its connection:
[mcp_servers.billing]
command = "stripe-billing-ops-mcp"
required = true
startup_readiness = "catalog"
startup_timeout_sec = 30Name the server billing. A host builds each tool's name from that key, and a longer one can push a tool past the 64 characters a function name allows.
Built with Charter
Every tool here is a Charter declaration: a Pydantic schema saying where each field goes on the wire. Charter's runtime builds the request, attaches and refreshes the credential, and trims the response before the model reads it. It runs in your process, with no proxy and no telemetry.
The 37 tool schemas come to 32,273 tokens.
The same tools work in your own agent, without MCP:
from charter.adapters.openai import to_openai_tools
from charter_packs_mcp import FAMILIES
tools = FAMILIES["finance"].tools()
definitions = to_openai_tools(tools) # or charter.adapters.langchainNeed an API that isn't here? Write a pack: your coding agent writes the declarations, and Charter's conformance suite checks them.
Google Calendar:
gcalendar_events_listGitHub:
github_search_commitsStripe:
stripe_invoice_items_create,stripe_invoices_create,stripe_invoices_send,stripe_invoices_list,stripe_customers_retrieve,stripe_subscriptions_list,stripe_balance_transactions_list,stripe_payouts_list,stripe_disputes_list,stripe_disputes_retrieve,stripe_disputes_update,stripe_customers_list,stripe_subscriptions_update,stripe_balance_retrieve,stripe_prices_create,stripe_accounts_list,stripe_application_fees_list,stripe_charges_list,stripe_refunds_create,stripe_products_createGmail:
gmail_drafts_create,gmail_threads_list,gmail_messages_list,gmail_messages_attachments_get,gmail_threads_getSlack:
slack_chat_post_message,slack_users_listGoogle Sheets:
gsheets_spreadsheets_values_append,gsheets_spreadsheets_values_update,gsheets_spreadsheets_values_getShopify:
shopify_order_getGoogle Drive:
gdrive_files_createLinear:
linear_projects_listGoogle Docs:
gdocs_documents_createNotion:
notion_pages_create
License
Apache 2.0.
Available Tools
39 toolsconnectA
Connect one app this server uses. For an app that issues keys, says where to get one and the terminal command that stores it. For Google, once the user's own OAuth client is set, starts the browser sign-in and returns at once: the user approves in the browser and the next call works. To see which apps are connected, call connection_status. Never ask the user for a key in the chat.
Inputs: app (required).
connection_statusARead-only
See which apps this server is connected to, and how to connect each one that is not. Changes nothing.
Inputs: no named parameters.
gcalendar_events_listCRead-onlyIdempotent
List events matching a given search filter.
Inputs: calendarId (required), q, iCalUID, orderBy, +14 more.
gdocs_documents_createA
Create a blank document with a title. Only the title is honoured — the document is created empty. To add content, call this and then documents_batch_update with the returned documentId.
Inputs: body.
gdrive_files_createA
Create a file's metadata: a folder (mimeType application/vnd.google-apps.folder), a Google Doc / Sheet / Slide, or an empty blob. Media upload is not expressed here. parents takes at most one folder ID.
Inputs: file (required), ocrLanguage, includeLabels, supportsAllDrives, +4 more.
github_search_commitsARead-onlyIdempotent
Search commits by message, author or date across GitHub — 'repo:owner/name fix flaky test'. The way to find where a change was introduced. Rate limited to 30 requests per minute.
Inputs: q (required), page, sort, order, +1 more.
gmail_drafts_createC
Save an email draft to Gmail.
Inputs: body (required), userId.
gmail_messages_attachments_getARead-onlyIdempotent
Read one attachment, by the attachmentId messages_get or threads_get lists. A text file comes back as text; a binary one is reported, not decoded.
Inputs: id (required), messageId (required), userId.
gmail_messages_listCRead-onlyIdempotent
List messages in the user's mailbox.
Inputs: q, userId, labelIds, pageToken, +2 more.
gmail_threads_getCRead-onlyIdempotent
Read a Gmail thread.
Inputs: id (required), format, userId, metadataHeaders.
gmail_threads_listCRead-onlyIdempotent
List Gmail threads.
Inputs: q, userId, labelIds, pageToken, +2 more.
gsheets_spreadsheets_values_appendC
Appends values to a spreadsheet.
Inputs: range (required), valueRange (required), spreadsheetId (required), valueInputOption (required), +4 more.
gsheets_spreadsheets_values_getCRead-onlyIdempotent
Returns a range of values from a spreadsheet.
Inputs: range (required), spreadsheetId (required), majorDimension, valueRenderOption, +1 more.
gsheets_spreadsheets_values_updateC
Sets values in a range of a spreadsheet.
Inputs: range (required), valueRange (required), spreadsheetId (required), valueInputOption (required), +3 more.
linear_projects_listBRead-onlyIdempotent
List projects in the workspace, with their status and progress.
Inputs: variables.
notion_pages_createA
Create a page — as a subpage of another page, or as a row of a database by giving its data_source_id as the parent. Content comes as a markdown string Notion parses into blocks, or from a template: one or the other, never both.
Inputs: body (required), filterProperties.
shopify_order_getARead-onlyIdempotent
Get one order with its line items, shipping address and totals. Takes a global ID (gid://shopify/Order/...), which orders_list returns.
Inputs: variables (required).
slack_chat_post_messageA
Send a message to a Slack channel, private group, or DM. Provide text for a plain message; set thread_ts to reply inside an existing thread.
Inputs: channel (required), text, parse, blocks, +13 more.
slack_users_listARead-onlyIdempotent
List members of the workspace. Use this to resolve a person's name to the user ID that Slack mentions and filters expect.
Inputs: limit, cursor, teamId, includeLocale.
stripe_accounts_listARead-onlyIdempotent
List the connected accounts on this platform. Empty if you are not a platform.
Inputs: limit, created, endingBefore, startingAfter.
stripe_application_fees_listCRead-onlyIdempotent
List the platform fees collected from connected accounts.
Inputs: limit, charge, created, endingBefore, +1 more.
stripe_balance_retrieveBRead-onlyIdempotent
Retrieve the current account balance.
Inputs: no named parameters.
stripe_balance_transactions_listARead-onlyIdempotent
List every movement across the Stripe balance: charges, refunds, fees and payouts. For accounting, reporting_category on each result groups them better than type does.
Inputs: type, limit, payout, source, +4 more.
stripe_charges_listBRead-onlyIdempotent
List charges, most recently created first.
Inputs: limit, customer, endingBefore, paymentIntent, +1 more.
stripe_customers_listARead-onlyIdempotent
List customers, most recently created first. Filter by email to find one.
Inputs: email, limit, endingBefore, startingAfter.
stripe_customers_retrieveBRead-onlyIdempotent
Retrieve a single customer by ID.
Inputs: customer (required).
stripe_disputes_listARead-onlyIdempotent
List disputes, most recently created first. Stripe has no status filter here, so check status on the results.
Inputs: limit, charge, created, endingBefore, +2 more.
stripe_disputes_retrieveARead-onlyIdempotent
Retrieve a dispute by ID. evidence_details.due_by is the deadline; evidence submitted after it is wasted.
Inputs: dispute (required).
stripe_disputes_updateA
Add evidence to a dispute. Writing any evidence field submits every evidence field to the bank unless submit is false, and submission cannot be undone. Set submit to false to stage it for review first.
Inputs: dispute (required), submit, evidence, metadata.
stripe_invoice_items_createA
Add a line to an invoice. Name an existing price as pricing.price, or give an amount directly. Without invoice the line waits for the customer's next subscription invoice.
Inputs: customer (required), amount, period, invoice, +11 more.
stripe_invoices_createA
Create a draft invoice for a customer. It bills nothing until finalised, so this is the safe half of invoicing.
Inputs: customer (required), footer, dueDate, currency, +11 more.
stripe_invoices_listARead-onlyIdempotent
List invoices, most recently created first. Filter by customer, subscription, status or collection method.
Inputs: limit, status, created, customer, +4 more.
stripe_invoices_sendA
Email an invoice to the customer outside the normal schedule. Test mode sends nothing but still emits the event.
Inputs: invoice (required).
stripe_payouts_listBRead-onlyIdempotent
List payouts to your own bank account or card, most recently created first.
Inputs: limit, status, created, arrivalDate, +3 more.
stripe_prices_createB
Create a price for a product. Include recurring for a subscription price, omit it for a one-off.
Inputs: product (required), currency (required), active, metadata, +5 more.
stripe_products_createA
Create a product. Prices attach to it separately.
Inputs: name (required), url, active, images, +2 more.
stripe_refunds_createA
Refund a charge. Provide either charge or payment_intent. Omit amount to refund the full sum.
Inputs: amount, charge, reason, metadata, +1 more.
stripe_subscriptions_listBRead-onlyIdempotent
List subscriptions. Filter by customer or status.
Inputs: limit, price, status, customer, +2 more.
stripe_subscriptions_updateA
Update a subscription. Parameters not provided are left unchanged. To change an item send its id; omitting the id adds a new item instead.
Inputs: subscription (required), items, cancelAt, metadata, +11 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 39 tools
Tools are mostly distinguishable by service, resource, and action, with clear separation between Stripe billing operations and the other app integrations. Minor ambiguity exists within similar Google Sheets value operations and between Stripe balance retrieval vs. balance transaction listing, but descriptions help resolve these.
Most tools follow a consistent service_resource_action snake_case pattern, e.g. stripe_invoices_send, gmail_threads_list, gsheets_spreadsheets_values_append. The meta tools connect and connection_status break the pattern, and a few singular/plural choices vary, but the convention is still highly readable.
39 tools is heavy for a server named stripe-billing-ops-mcp, especially since many are one-off tools across unrelated apps like GitHub, Slack, Notion, and Shopify. The set sprawls beyond a focused billing-ops surface and many tools do not feel like they earn their place.
The surface has significant gaps: shopify_order_get references an orders_list tool that is absent, gmail_messages_attachments_get references messages_get, and gdocs_documents_create references documents_batch_update. Several integrations expose only list or create operations, and Stripe itself lacks core lifecycle operations such as customer create/update, subscription create/cancel, and payment intent handling.
Maintenance
Related MCP Connectors
Create invoices, clients, and Stripe payment links from any agent. 7 tools. No email or deletes.
Hand off repetitive finance and ops work to cloud agents or people.
Receipt ingestion, Gmail capture, expense analysis, and reviewed reports for AI-agent workflows.
Quote-to-cash tools: parse invoices and POs, match POs to invoices, collection emails, billing math.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents and human operators to manage Stripe payment operations, SaaS billing, subscriptions, refunds with safety caps, and Austrian/EU tax compliance including VAT and BAO record retention.1MIT

Subotiz MCPofficial
AlicenseNot gradedqualityDmaintenanceEnables AI agents to manage subscriptions, usage-based billing, payments, refunds, tax compliance, and invoicing to drive revenue growth.1MIT- AlicenseBqualityBmaintenanceRuns 20 slash-command workflows across Google Calendar, Gmail, Linear, Slack, Granola, Google Docs, GitHub, Stripe, Notion, Google Forms, Sheets and Drive to produce morning briefs, meeting prep, action items assigned to owners and weekly updates. Reads proceed without asking, while anything that creates, sends, changes or deletes is shown for approval first.471Apache 2.0
- AlicenseBqualityBmaintenanceEnables freelancers and agencies to run eight back-office workflows across Stripe, Google Drive, Linear, Google Calendar, Gmail, GitHub, Google Docs, Granola, Google Sheets and Firecrawl, covering client onboarding, invoices from calendar and commits, status reports, scope-creep detection, site audits and overdue invoice chasers. Reads run freely, while anything that creates, sends, changes or deletes is shown for approval first, with credentials kept in your own OS keychain and no proxying through any third-party server.28Apache 2.0