BizDesk MCP
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., "@BizDesk MCP who still owes me money? show me the overdue invoices"
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.
BizDesk MCP
Give Claude a small-business back office. BizDesk is an MCP server that lets Claude (or any MCP client, such as Cursor) manage clients, quotes, invoices, payments and reports, and export invoices as PDFs. Your data stays in one SQLite file on your own computer.
"Who still owes me money?" · "Quote Maple Street Dental for two after-hours deep cleans at $185 each." · "They accepted. Invoice it and log a $200 card deposit." · "Write a firm reminder for the oldest overdue invoice." · "How did September compare with August?"
![]()
Real output from scripts/demo_session.py, which drives the actual server over stdio with the fictional demo data. The full request and response log is in docs/demo-session.md.
What it does
Area | Tools |
Business profile |
|
Clients |
|
Quotes |
|
Invoices |
|
Payments |
|
Reports |
|
Follow-up |
|
Documents |
|
Audit |
|
There are also resources (bizdesk://profile, bizdesk://reports/overdue, bizdesk://documents/{number} as Markdown) and prompts (month_end_review, quote_new_job) that walk Claude through common jobs.
Related MCP server: MCP Invoice Maker
Quick start
You need uv (it installs Python for you).
1. Try it with demo data (optional; a fictional cleaning company with 5 clients and 7 invoices):
uvx --from git+https://github.com/bikashnayak36331-pixel/bizdesk-mcp bizdesk-mcp --db ~/BizDesk/demo.db --seed-demo2. Connect it to your MCP client.
Settings → Developer → Edit Config, then add the server (also in examples/claude_desktop_config.json):
{
"mcpServers": {
"bizdesk": {
"command": "uvx",
"args": ["--from", "git+https://github.com/bikashnayak36331-pixel/bizdesk-mcp", "bizdesk-mcp"],
"env": { "BIZDESK_DB": "~/BizDesk/bizdesk.db", "BIZDESK_OUTPUT_DIR": "~/BizDesk/pdfs" }
}
}
}Restart Claude Desktop. To try the demo data, point BIZDESK_DB at ~/BizDesk/demo.db.
claude mcp add bizdesk -e BIZDESK_DB=$HOME/BizDesk/bizdesk.db -- \
uvx --from git+https://github.com/bikashnayak36331-pixel/bizdesk-mcp bizdesk-mcp
claude mcp list # should show: bizdesk ... ✓ ConnectedUse the same command and args as above (see examples/cursor_mcp.json).
To run it as a web service instead of a local process (Streamable HTTP):
bizdesk-mcp --transport streamable-http --host 127.0.0.1 --port 8000 # endpoint: http://127.0.0.1:8000/mcpThis mode has no login of its own, so keep it on localhost or put it behind your own authentication.
Settings
Flag | Environment variable | Default | Meaning |
|
|
| The SQLite file holding all data |
|
|
| Where |
|
| off | Allow looking but not changing (good for an accountant or a shared view) |
|
|
| |
| Load the fictional demo data into an empty database, then exit |
How it works
flowchart LR
U[You] -->|plain English| C[Claude / Cursor / any MCP client]
C -->|MCP tools, resources, prompts| S[bizdesk-mcp server]
S --> L[Business rules<br/>money in cents · validation · read-only guard]
L --> DB[(SQLite file<br/>clients · quotes · invoices · payments · audit log)]
L --> PDF[PDF invoices<br/>ReportLab]server.py: MCP layer (tools, resources, prompts), built on the official MCP Python SDK v2 (MCPServer).service.py: business rules. Every change runs in a database transaction, so a failure leaves nothing half-written.money.py: exact maths. Amounts are stored as integer cents and quantities as thousandths, with half-up rounding done once per line.store.py: SQLite schema and the audit log.pdf.py: invoice and quote PDFs.
Design choices
Your data stays local. Nothing leaves your machine. BizDesk makes no network calls and never sends email; reminders are drafts for you to send.
Mistakes come back as clear tool errors that Claude can fix and retry, for example "Payment of $5,000.00 is more than the balance due ($893.85) on INV-0004".
Tool hints: read-only tools are marked
readOnlyHintandvoid_invoiceis markeddestructiveHint, so clients can ask before risky actions.Invoice numbers (
INV-0001,Q-0001) are never reused or skipped, even if a write fails.Draft invoices don't count as revenue or as overdue until you mark them sent.
Development
git clone https://github.com/bikashnayak36331-pixel/bizdesk-mcp && cd bizdesk-mcp
uv venv && uv pip install -e ".[dev]"
pytest # 49 tests: unit, PDF content, in-process MCP client, stdio and HTTP transports
ruff check . && ruff format --check .
python scripts/demo_session.py # re-record docs/demo-session.* and the PDF imagesNeed a custom version?
The same pattern connects Claude to your own systems: a CRM, a booking database, a Google Sheet, Shopify, Stripe or QuickBooks, or an internal API, with the tools and guard-rails your team needs. Open an issue or contact me through my GitHub profile.
Credits
Built by Bikash Nayak, using Claude (Anthropic) as a coding assistant. Released under the MIT License.
Available Tools
21 toolsadd_clientB
Add a new client. Returns the client with its id.
Inputs: name (required), email, notes, phone, +2 more. Returns: object
convert_quote_to_invoiceA
Mark a quote as accepted and create the matching invoice (same items and tax).
Inputs: quote_number (required), due_in_days. Returns: object
create_invoiceA
Create a draft invoice. Use mark_invoice_sent once it has gone to the client.
Inputs: items (required), client_id (required), notes, tax_rate, +2 more. Returns: object
create_quoteC
Create a quote (estimate) for a client. Totals and tax are calculated for you.
Inputs: items (required), client_id (required), notes, tax_rate, +1 more. Returns: object
draft_payment_reminderARead-only
Write a payment-reminder email for an unpaid invoice. Draft only: nothing is sent.
Inputs: invoice_number (required), tone. Returns: object
export_pdfBRead-only
Save a quote or invoice as a PDF file and return where it was saved.
Inputs: number (required). Returns: object
find_clientsBRead-only
Search clients and see what each has been invoiced, has paid and still owes.
Inputs: limit, query. Returns: result
get_business_profileARead-only
Show the business profile used on quotes and invoices (name, currency, tax rate, terms).
Inputs: no named parameters. Returns: object
get_clientBRead-only
Full details and balances for one client.
Inputs: client_id (required). Returns: object
get_documentARead-only
Everything about one quote or invoice: items, totals, payments, balance, overdue days.
Inputs: number (required). Returns: object
list_invoicesARead-only
List invoices, newest first, optionally filtered by status, client or overdue.
Inputs: limit, status, client_id, overdue_only. Returns: result
list_quotesCRead-only
List quotes, newest first.
Inputs: limit, status, client_id. Returns: result
mark_invoice_sentA
Record that an invoice was sent to the client (it then counts towards overdue reports).
Inputs: invoice_number (required). Returns: object
overdue_reportARead-only
Who owes money past the due date, grouped by how late (1-30, 31-60, 61-90, 90+ days).
Inputs: as_of. Returns: object
recent_activityBRead-only
The audit log: what changed, and when.
Inputs: limit. Returns: result
record_paymentB
Record money received against an invoice. Overpayments are refused.
Inputs: amount (required), invoice_number (required), method, paid_on, +1 more. Returns: object
revenue_reportBRead-only
Invoiced vs collected by month (drafts and voids excluded), money still outstanding, top clients.
Inputs: end, start. Returns: object
set_quote_statusC
Record that a quote was sent, accepted or declined.
Inputs: status (required), quote_number (required). Returns: object
update_business_profileA
Change business details. Only the fields you pass are changed.
Inputs: email, phone, tax_id, address, +6 more. Returns: object
update_clientB
Change a client's details. Only the fields you pass are changed.
Inputs: client_id (required), name, email, notes, +3 more. Returns: object
void_invoiceADestructive
Cancel an invoice that has no payments. The record is kept with the reason.
Inputs: reason (required), invoice_number (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 21 tools
Most tools target distinct resource/action pairs, and descriptions clarify boundaries such as find_clients vs get_client and list_invoices vs get_document. Minor potential confusion exists around create_quote/create_invoice/convert_quote_to_invoice and quote/invoice status operations, but overlaps are limited.
All names use snake_case and most follow a verb_noun pattern, but a few are noun-only (overdue_report, revenue_report, recent_activity), and verbs are mixed (add vs create, find vs get/list). Still readable and mostly predictable.
With 21 tools, the surface is at the heavy end of the 16–25 range. Most tools map to real invoicing operations, but the set feels larger than ideal and some adjacent operations could be consolidated.
Core workflows for clients, quotes, invoices, payments, reports and profile settings are covered. However there is no update_invoice or update_quote operation, and no delete/deactivate path for clients or quotes, forcing awkward void-or-recreate workarounds for corrections.
Maintenance
Related MCP Connectors
Create, send and track invoices from a conversation in Claude, ChatGPT or any MCP client that supports OAuth. Draft an invoice from one sentence or from last month's invoice for the same client, finalize it, email it to your client and send payment reminders for overdue ones. See revenue by month and by client, download PDFs and e-invoices (ZUGFeRD, XRechnung), and export DATEV packages for your tax advisor. Invoices follow the tax rules of 25 countries, including reverse charge and the small-business VAT exemption. New invoices are drafts, and nothing is emailed until you ask. Pay per invoice with no subscription: the first invoice is free.
Create PDF invoices from your AI chat: clients, numbering, VAT, overdue reports. All data is local.
Create PDF invoices from your AI chat: clients, numbering, VAT, overdue reports. All data is local.
Make PDF invoices from your AI chat: clients, numbering, VAT, overdue reports. All data is local.
Related MCP Servers
- FlicenseBqualityDmaintenanceA customer and product management MCP server using SQLite. It enables Claude Desktop users to manage client and product data through natural language interactions.91-
- AlicenseNot gradedqualityDmaintenanceA local-first MCP server for creating PDF invoices from SQLite data, supporting client management and invoice generation.MIT
- AlicenseNot gradedqualityDmaintenanceDouble-entry accounting MCP server for Claude Desktop. Supports accounts, transactions, ledgers, profit & loss, balance sheet, IVA summary, and QIF export using SQLite.MIT

InvoiceFlash MCPofficial
FlicenseNot gradedqualityDmaintenanceRead-only MCP server that connects to an InvoiceFlash MySQL database, exposing clients, invoices, and quotes as tools for natural language querying via Claude Desktop or Claude Code.-