AI Automation

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.

Hammad Shahzad May 4, 2026 6 min read

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

VendorOfficial MCP?Tool count
InvoiceCave✅ First-party102
QuickBooks (Intuit)✅ First-party144
Xero✅ Semi-official~50
Stripe✅ First-party~19
Zoho Books / Billing✅ First-partyConnector-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:

  1. src/app/api/mcp/[transport]/route.ts — registers all 102 server.tool(name, description, zodSchema, handler) blocks via @vercel/mcp-adapter (which re-exports mcp-handler).
  2. src/lib/mcp-tools.tsexecuteTool(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 →


mcpclaudeai-invoicingarchitecture

Ready to simplify your invoicing?

Create professional invoices in seconds. Free to start.

Get Started Free

Related Articles