Skip to main content
Glama

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.

CI Python MCP SDK License

"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?"

A recorded BizDesk session: clients, overdue report, reminder draft, quote, invoice, payment, revenue report and PDF export

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

get_business_profile, update_business_profile (name, address, currency, tax rate, payment terms, how to pay)

Clients

add_client, find_clients, get_client, update_client, with invoiced / paid / outstanding totals per client

Quotes

create_quote, list_quotes, set_quote_status, convert_quote_to_invoice

Invoices

create_invoice, get_document, list_invoices (filter by status, client, overdue), mark_invoice_sent, void_invoice

Payments

record_payment (part payments, with overpayments refused)

Reports

overdue_report (aged 1-30 / 31-60 / 61-90 / 90+ days), revenue_report (invoiced vs collected by month, top clients)

Follow-up

draft_payment_reminder: friendly, firm or final email text. It never sends anything.

Documents

export_pdf: a clean PDF of any quote or invoice

Audit

recent_activity: every change, with a timestamp

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-demo

2. 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 ... ✓ Connected

Use 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/mcp

This 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

--db PATH

BIZDESK_DB

~/.bizdesk/bizdesk.db

The SQLite file holding all data

--output-dir DIR

BIZDESK_OUTPUT_DIR

~/.bizdesk/pdfs

Where export_pdf saves files

--read-only

BIZDESK_READ_ONLY=1

off

Allow looking but not changing (good for an accountant or a shared view)

--transport

stdio

stdio or streamable-http

--seed-demo

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 readOnlyHint and void_invoice is marked destructiveHint, 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 images

Need 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 tools
add_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_reminderA
Read-only

Write a payment-reminder email for an unpaid invoice. Draft only: nothing is sent.

Inputs: invoice_number (required), tone. Returns: object

export_pdfB
Read-only

Save a quote or invoice as a PDF file and return where it was saved.

Inputs: number (required). Returns: object

find_clientsB
Read-only

Search clients and see what each has been invoiced, has paid and still owes.

Inputs: limit, query. Returns: result

get_business_profileA
Read-only

Show the business profile used on quotes and invoices (name, currency, tax rate, terms).

Inputs: no named parameters. Returns: object

get_clientB
Read-only

Full details and balances for one client.

Inputs: client_id (required). Returns: object

get_documentA
Read-only

Everything about one quote or invoice: items, totals, payments, balance, overdue days.

Inputs: number (required). Returns: object

list_invoicesA
Read-only

List invoices, newest first, optionally filtered by status, client or overdue.

Inputs: limit, status, client_id, overdue_only. Returns: result

list_quotesC
Read-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_reportA
Read-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_activityB
Read-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_reportB
Read-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_invoiceA
Destructive

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

    B3.2/5.0

    Scored across 21 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count3/5

    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.

    Completeness3/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      B
      quality
      D
      maintenance
      A customer and product management MCP server using SQLite. It enables Claude Desktop users to manage client and product data through natural language interactions.
      9
      1
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      A local-first MCP server for creating PDF invoices from SQLite data, supporting client management and invoice generation.
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Double-entry accounting MCP server for Claude Desktop. Supports accounts, transactions, ledgers, profit & loss, balance sheet, IVA summary, and QIF export using SQLite.
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      Read-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.
      -