All servers · Buy Pro $19 · Source · Claude Desktop bundle (.mcpb)
Job orders for trades and field work, kept the way a job card is kept. Raise a work order
against a client (the same client record your invoices use), give it a site address, the
date it was asked for, what the job is and how urgent. Log what the job actually used as it
goes: labour as hours at a rate, parts as a quantity at a unit cost with an optional markup.
Move it along one step at a time, draft to scheduled to in progress to done to invoiced,
each step stamped with its date and a note. When it is finished, hand the customer a
completion report with the hours, the materials, the totals and a sign-off block, and take
the invoice payload straight to invoice_create without retyping a single figure.
Nothing is invented and nothing is stored twice: the value, the hours, the materials and the VAT are derived from the lines on every call, and the invoice payload's unit prices are already the billed units, so the invoice reproduces the work order to the minor unit.
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or
%APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"work-order": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-work-order"]
}
}
}
claude mcp add work-order -- npx -y @theluckystrike/mcp-work-order
~/.cursor/mcp.json (global) or .cursor/mcp.json (project), same entry as Claude Desktop.
| Tool | What it does |
|---|---|
work_order_create |
Raise a job order and return its WO-YYYY-NNNN number: client, site address, requested date, description, priority |
work_order_add_line |
Add one line: parts with a quantity and a unit cost in minor units and an optional markup percent, or labour with hours and an hourly rate |
work_order_status |
Move it one step: draft, scheduled, in_progress, done, invoiced, stamping the date and a note |
work_order_get |
One work order in full: every line with its billed unit, the hours, the materials, net and VAT, and the status history |
work_order_list |
List work orders by status, by client and by requested-date range |
work_order_delete |
Delete a work order raised by mistake. Draft with no lines only. Free on every tier |
completion_report_text |
The completion report as plain text, ready to paste into an email |
completion_report_pdf |
The completion report as an A4 PDF, with the sign-off block |
work_order_invoice_payload |
An invoice_create-ready payload from the lines, with VAT at the shared profile rate |
work_orders_report |
The whole board: work orders per status, hours logged this month, unbilled value per currency |
license_status / license_activate |
Free or Pro, and where to upgrade |
| Free | Pro | |
|---|---|---|
| Open work orders | 5 | unlimited |
| Lines per work order | 200 | 200 |
| Raise, log, move, list, delete | yes | yes |
| Completion report (text) | yes | yes |
| Completion report (PDF) | no | yes |
| Invoice payload | no | yes |
| Board report | no | yes |
The cap counts OPEN work orders (draft, scheduled, in progress), not the ones you have ever
raised, so finishing a job frees its slot. So does work_order_delete on a draft that has
no lines, which is free on every tier: a way back that only a Pro key can reach is not a way
back.
Get Pro: https://mcp.zovo.one/buy/work-order (one-time $19, lifetime), or all servers for $39: https://mcp.zovo.one/buy/bundle Or the nineteen-server bundle for $39.
This server keeps no arithmetic of its own. computeTotals, currencyDecimals,
formatMoney and roundHalfUp are imported from @theluckystrike/mcp-invoice/lib, the A4
renderer from @theluckystrike/mcp-billing-docs/lib, the corrupt-store quarantine from
@theluckystrike/mcp-timezone/lib. The VAT rate, the currency and the business name come
from the shared business profile that business_set in the invoice server writes; the
client comes from that server's client records. Nothing is written outside this server's own
directory.
A markup belongs on the unit cost, not on the line total, and one minor unit is what says
so. Seven parts at EUR 12.99 with 15 percent on top is EUR 14.94 a unit and EUR 104.58 on
the line. Marking up the line total instead is round(9093 * 1.15) = 10,457 minor units, a
cent less. Both look like the same sum, and only one of them is the figure the customer will
be billed: the invoice server rounds the unit price to the minor unit first and multiplies
(its D-R24 basis), so a work order that quotes the line-total figure quotes a number its own
invoice cannot reproduce. The gap appears on every line whose marked-up unit does not land on
a whole cent, it never nets out across lines because it is a rounding direction and not an
error, and it is invisible in a spreadsheet check because both bases add up correctly. The
unit suite asserts the 1-unit gap explicitly, so a change of basis fails the build instead of
quietly re-pricing every job on the board.
All data stays on your machine, in ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/work-order/.
Nothing is sent anywhere. There is no account and no API key. License keys are verified
offline. This server reads one sibling file, the invoice server's clients.json, and writes
into no store but its own.
Built by theluckystrike. https://github.com/theluckystrike
Three prompts that scored 3 of 3, measured in round 35, 2026-09-06. Paste one in as it is written.
We are a one-van refrigeration outfit, Nova Cooling. Harbour Cafe just called: their walk-in is not holding temperature. Site is 12 Quay Street. They asked today, 2 March 2026, and it is urgent. Raise the job and tell me plainly how this thing keeps a job card.
Paste this into Claude with the server connected.
What it did, measured in round 35, 2026-09-06: This is the exact point round 33 lost on petty-cash, and it is won here.
Log what the job used. Two labour entries at 85.00 an hour: 3.5 hours on 8 March and 1.25 hours the same day. Parts: seven thermostats at 12.99 each with 15 percent markup, and two fan motors at 45.00 each with no markup.
Paste this into Claude with the server connected.
What it did, measured in round 35, 2026-09-06: It converted 85.00 an hour and 12.99 each into the server's minor units without being told the unit, and it reported the BILLED unit of 14.94 rather than the cost, which is the number the customer sees.
What is that job worth so far? Break out the hours, the labour, the materials and the VAT, and show me what we are actually charging per thermostat.
Paste this into Claude with the server connected.
What it did, measured in round 35, 2026-09-06: The zero VAT is real and is the empty-store lane doing its job: there is no shared business profile, so vat_rate_source is none rather than a rate the server invented.
On the free tier for this path: Five OPEN work orders, which is a one-van trade, and 200 lines each on every tier. The cap counts open jobs (draft, scheduled, in progress) rather than jobs ever raised, so finishing one frees its slot, and work_order_delete on a draft with no lines is free on every tier because a way back that only a Pro key can reach is not a way back. The text completion report is free: handing the customer what was done is the thing the job was for. A byte-identical work order is refused BEFORE the cap is consulted, so the refusal names the id already stored rather than selling an upgrade, and burns neither a slot nor a WO number.
Exact config path, entry and caveats: Claude Desktop · Claude Code · Cursor · VS Code · Windsurf · Cline · Claude.ai and Claude Desktop connectors · all clients
How to track billable hours inside Claude Code and Cursor · Create an invoice PDF from a chat message with an MCP server · Ask questions about an Excel or CSV file from Cursor or Claude · Watch a product price with Claude and get told when it drops · What the free tier includes and what Pro adds · Log expenses and mileage in Claude, split VAT, rebill to an invoice · Convert currencies in Claude with real ECB rates, no API key · Generate Word proposals and contracts from a chat message · Find a meeting time across time zones without doing the arithmetic · Write a resume and a cover letter from chat, without inventing anything · Bill a retainer on a schedule without a billing SaaS · Assemble a contract from your own clause library, in chat · Connect MCP servers to Claude.ai, Claude Desktop, Cursor and VS Code without installing anything · Merge, split and stamp PDFs from chat, and why some come back as glyph numbers · Read a .ics calendar in Claude: free and busy, conflicts, and billable meetings · Run a kanban board in Claude, with time tracking on the same task · Resize, compress and watermark images from a chat message · Categorize and reconcile a bank CSV export from chat · Send a quote from chat, then turn the yes into an invoice · Put a SEPA payment QR code on an invoice from chat · Zip and unzip archives safely from Claude or Cursor · Client deposits and retainers from chat, applied to your real invoices · Fixed assets and depreciation from chat, on the rates the tax authorities publish · Per diem and travel allowances from chat, on the rate tables the tax authorities publish · One double-entry ledger out of every server you already run · Loan and lease schedules from chat, closing exactly on zero · Work orders and job cards from chat, and why the markup goes on the unit cost · A petty cash float from chat, and why the cheque is not the sum of the vouchers · Client statements and payment chasers from chat, aged as at any date you name · Credit notes and purchase orders from chat, against your real invoices · One install, every server: the office-suite bundle · Close a month in chat: invoice, credit note, retainer, bank reconciliation, statement · All guides