We Built 102 MCP Tools for Invoicing — Here's the Full Schema
We shipped 102 first-party MCP tools — likely the most MCP-complete invoicing platform on the market. Here's every tool, the architecture, and three bugs to avoid.
We Built 102 MCP Tools for Invoicing — Here's the Full Schema
Most invoicing platforms have zero MCP tools. InvoiceCave has 102.
Over the last few weeks I shipped, in eight phases, what's likely the most MCP-complete invoicing surface on the market — every action you can take in our dashboard is now a single AI prompt away. Claude Desktop, Claude Code, Cursor, or any spec-compliant MCP client can drive the entire billing workflow in plain English.
This post breaks down what the tools actually are, what's behind the architecture, and the three bugs we hit along the way.
The bottom line: who has MCP, and how big
| Vendor | Official MCP? | Tool count |
|---|---|---|
| InvoiceCave | ✅ First-party | 102 |
| QuickBooks (Intuit) | ✅ First-party | 144 |
| Xero | ✅ Semi-official | ~50 |
| Stripe | ✅ First-party | ~19 |
| Zoho Books / Billing | ✅ First-party | Connector-based |
| FreshBooks | ❌ None | — |
| Wave | ❌ None | — |
| Bill.com | ❌ None | — |
| Invoice Ninja | ❌ None | — |
Among pure-play invoicing SaaS, we're #1 by a wide margin. QuickBooks ships more tools but it's a full ERP — most of those 144 tools have nothing to do with invoicing (HR, payroll, advanced inventory, etc.).
What the 102 tools actually do
Every tool maps to a real action a small business takes:
Invoices (12 tools)
list_invoices, get_invoice, create_invoice (with template + payment-method selection + tax-rate IDs + catalog item linking), update_invoice, delete_invoice, send_invoice, email_invoice, get_invoice_link, get_pdf_link, plus full line-item operations: add_line_item, update_line_item, remove_line_item. And invoice-extras: duplicate_invoice, create_credit_note, create_deposit_invoice (e.g., "50% upfront for Acme's parent invoice").
Customers (7 tools)
Full CRUD plus billing/shipping addresses, payment terms, tax IDs, and generate_customer_portal_link so Claude can issue a public portal URL for any customer in one prompt.
Quotes (10 tools)
Entire pre-sale workflow: list_quotes, get_quote, create_quote, update_quote, delete_quote, send_quote, email_quote, get_quote_link, get_quote_pdf_link, and convert_quote_to_invoice.
Recurring billing (11 tools)
For both invoices and payment profiles: create, update, delete, pause, resume, plus generate_recurring_invoice_now to fire one immediately. "Set up a $2,500/month retainer for Globex starting January 1" works literally.
Expenses (9 tools)
list_expenses, get_expense, create_expense, update_expense, delete_expense, plus category management. Expenses auto-deduct from the chosen bank account balance, reverse on delete.
Reports (5 tools)
get_aging_report (AR aging buckets), get_revenue_report (invoiced/collected/outstanding by period), get_profit_loss (accrual + cash basis, by currency), get_balance_sheet, get_cashflow_report. All compute aggregations server-side from Prisma — no separate report API.
Accounting (8 tools)
Full chart of accounts: create_account, update_account, delete_account, seed_chart_of_accounts (39 standard accounts), create_journal_entry (validates double-entry), post_journal_entry, void_journal_entry, get_account_balance.
Org settings (11 tools)
get_org_settings, update_org_settings (whitelisted writable fields), set_org_default_template, full tax-rate management (add_tax_rate, update_tax_rate, delete_tax_rate, list_tax_rates), set_reminder_settings, set_late_fee_settings, apply_late_fee, send_reminder.
Plus
- Bank accounts (5), Payments + Payment methods (8), Notifications & email logs (3), Integration status (1).
Full catalog with example prompts for every tool: /mcp/tools
Public manifest: /api/mcp/manifest (no auth required — perfect for AI clients to evaluate before connecting).
Architecture — what's actually behind it
The whole MCP layer is two files:
src/app/api/mcp/[transport]/route.ts— registers all 102server.tool(name, description, zodSchema, handler)blocks via@vercel/mcp-adapter(which re-exportsmcp-handler).src/lib/mcp-tools.ts—executeTool(name, args, orgId, userContext)switch that dispatches to actual business logic. Every write also goes through the audit log so MCP-driven changes are traceable per tool, per org, per AI assistant.
Auth: bearer-token in the Authorization header. Each token is scoped to a single InvoiceCave organization. Rate-limited per-IP and per-org separately. Revocable from /dashboard/settings/security in one click.
Org context propagation: AsyncLocalStorage<McpContext> wraps the MCP handler so every tool inside the registration callback can call getOrgId() / getUserContext() without explicit threading.
Plan enforcement: tools that are gated (recurring invoices, recurring payments, accounting writes) check getOrgPlan(orgId) + getPlanLimits(planId) and return string error messages — no dashboard redirects, no 403s, just clean JSON the AI can show the user.
Three bugs I hit (so you don't have to)
1. mcp-handler@1.0.7 reuses a single stateless transport
This was the worst one. @vercel/mcp-adapter@1.0.0 ships mcp-handler@1.0.7, which creates one shared StreamableHTTPServerTransport at module load and reuses it across all requests in a warm Lambda.
@modelcontextprotocol/sdk@1.26 added a guard:
if (!this.sessionIdGenerator && this._hasHandledRequest) {
throw new Error('Stateless transport cannot be reused across requests. Create a new transport per request.');
}
Result: first request after cold-start works, every subsequent request returns HTTP 500 with empty body. Looked protocol-version-specific because we'd test 2024-11-05 first (cold) → success, then 2025-06-18 (warm) → fail.
Fix: pin mcp-handler to 1.1.0 via npm overrides:
"overrides": {
"@vercel/mcp-adapter": { "mcp-handler": "1.1.0" },
"mcp-handler": "1.1.0"
}
1.1.0 creates a fresh transport per request (and a fresh McpServer) — exactly what stateless serverless needs.
2. GitHub→Vercel auto-deploy was silently broken
We pushed commit after commit, but production was 6 hours stale. vercel ls --prod revealed the mismatch. Fix: vercel --prod from local. Long-term: investigate the GitHub integration in Vercel dashboard.
3. The "Crawled — currently not indexed" trap
Unrelated to MCP, but worth flagging if you're building a SaaS with AI-generated blog content: if your blog cross-links to non-existent slugs (AI hallucinations), Google flags the crawl as low-quality and drops the whole domain into "Crawled — currently not indexed" purgatory. Audit every internal link before you publish.
Try it
Free tier — no credit card.
# Claude Code (terminal)
claude mcp add invoicecave --transport http \
https://www.invoicecave.com/api/mcp/mcp \
--header "Authorization: Bearer ic_your_api_key"
Then prompt:
"Set up a $2,500/month retainer for Acme Corp starting January 1, payable via Wise EUR, and email the first invoice now."
And it does.
Browse all 102 tools → · Setup guides →
Related reading
- InvoiceCave MCP — 102 tools for Claude, Cursor & AI agents — connect any MCP-compatible AI client and run your billing in plain English.
- Use InvoiceCave in Claude Desktop — 30-second setup guide.
- Invoice from Claude Desktop in 30 Seconds (Full MCP Setup Guide)
- The Ultimate Guide to Recurring Invoices: How to Set Them Up
- How to Set Freelance Rates in 2026: The No-BS Guide
Ready to simplify your invoicing?
Create professional invoices in seconds. Free to start.
Get Started Free