All servers · Buy Pro $19 · Source · Claude Desktop bundle (.mcpb)
Change orders against a quote or a work order, kept the way a variation is kept on site:
what was added, what was taken out and what changed, each with a reason and a date, sent to
the client, and answered. The running contract value is the original plus the deltas the
client has APPROVED; what they have not answered yet is shown as pending and never added in.
Once a change order is approved, the delta comes back as invoice_create-ready items in
MAJOR units and quote_create-ready items in MINOR units, in one call, with the scale
printed against each.
No delta is stored. A change order holds its lines and its status history; the delta, the running value and the VAT are derived on every call, with the invoice server's own arithmetic. Nothing is invented: the first change order against a reference states the original contract value once, every later one inherits it, and a different figure is refused by name.
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or
%APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"change-order": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-change-order"]
}
}
}
claude mcp add change-order -- npx -y @theluckystrike/mcp-change-order
~/.cursor/mcp.json (global) or .cursor/mcp.json (project), same entry as Claude Desktop.
| Tool | What it does |
|---|---|
change_order_create |
Raise a change order against a quote or work order: reference, client, title, date, and the original contract value on the first one |
change_order_add_line |
Add an added, removed or changed line to a draft, with its quantity, unit price in minor units, reason and date |
change_order_status |
Move it along: draft to sent, sent to approved or rejected, draft or sent to void, each step dated |
change_order_get |
One change order in full: every line with its delta, the VAT, the history and the running value of the reference |
change_order_list |
Change orders by reference, status, client and date range, with approved and pending deltas per currency |
change_order_delete |
Delete an empty draft raised by mistake. Free on every tier |
contract_value |
The running value of one reference: original, approved delta, current value, pending delta held apart |
change_order_document |
The change order as a plain-text document for the client to approve |
change_order_invoice_payload |
The approved delta as invoice_create items (MAJOR units) and quote_create items (MINOR units) |
license_status / license_activate |
Free or Pro, and where to upgrade |
| Free | Pro | |
|---|---|---|
| Open change orders (draft and sent) | 5 | unlimited |
| Lines per change order | 200 | 200 |
| Raise, line, move, get, list, delete | yes | yes |
| Running contract value | yes | yes |
| Change order document | no | yes |
| Invoice-ready delta payload, both scales | no | yes |
The cap counts OPEN change orders, the ones the client has not answered, not the ones you
have ever raised. Approving, rejecting or voiding one frees its slot, and so does
change_order_delete on a draft with no lines; all of those are free on every tier, because
a way back that only a Pro key can reach is not a way back.
Get Pro: https://mcp.zovo.one/buy/change-order (one-time $19, lifetime), or all servers for $39: https://mcp.zovo.one/buy/bundle Or the nineteen-server bundle for $39.
draft to sent; sent to approved or rejected; draft or sent to void.
Approved, rejected and void are final. A draft cannot be approved directly: approval is the
client's answer to something they were sent. Lines are added only while a change order is a
draft; a sent one that needs another line is voided and raised again, so the client's
approval always refers to what they were sent. Every step carries its own date, and a step
dated before the last one is refused.
This server keeps no arithmetic of its own. computeTotals, currencyDecimals,
formatMoney and roundHalfUp are imported from @theluckystrike/mcp-invoice/lib, the
corrupt-store quarantine from @theluckystrike/mcp-timezone/lib, the timezone-aware
"today" from @theluckystrike/mcp-quotes/lib. The VAT rate, the currency and the business
name come from the shared business profile that business_set in the invoice server writes.
Nothing is written outside this server's own directory, and no sibling store is opened.
A changed line is two items, not one, because one net item shows the customer nothing
they can check. A line that goes from 3 x EUR 450.00 to 5 x EUR 420.00 is worth +EUR
750.00, and the tempting payload is one item of quantity 1 at EUR 750.00. The customer
cannot reproduce that figure from anything on the change order they signed. The payload
this server emits is a reversal, -3 x EUR 450.00, and the revised line, 5 x EUR 420.00;
each reproduces on a calculator, and computeTotals over both is the same +EUR 750.00,
because the invoice server's roundHalfUp is symmetric in sign. The same rule carries a
removal as a negative quantity at the unit price it was booked at, which invoice_create
accepts. The unit suite re-runs the invoice server's own computeTotals over the payload
as returned and asserts the four item values and the three totals, then feeds the
quote_create items into the same engine as though their MINOR figure were MAJOR and
asserts the net is exactly 100x, so the day someone "simplifies" the payload to one net
item, or moves a field between the two scales, the build says so instead of the customer.
All data stays on your machine, in ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/change-order/.
Nothing is sent anywhere. There is no account and no API key. License keys are verified
offline. This server reads one file it does not own, the shared business profile, and
writes into no store but its own.
Built by theluckystrike. https://github.com/theluckystrike
One prompt that scored 3 of 3, measured in round 39, 2026-09-06. Paste it in as it is written.
We are Kestrel Electrical, a two-man electrical firm. Everything is in EUR with 23% VAT on every line. Raise a change order against our quote Q-2026-0031 for the Bright Bakery rewire. The quote was worth EUR 8,400.00 net before any changes. Two things changed on site, both agreed on 4 September 2026: we added 6 extra double sockets at EUR 45.00 each because the owner wants more counter outlets, and the downlights line changed from 12 at EUR 38.00 to 16 at EUR 35.00 because the ceiling plan grew and we agreed a lower unit price for the bigger run. Put both on the change order with those reasons and tell me what is on file.
Paste this into Claude with the server connected.
What it did, measured in round 39, 2026-09-06: Five tool calls, every argument in minor units without being told the unit, tax_rate 23 on both lines, and a changed line written as was 12 x 38.00 to 16 x 35.00 rather than as one net item.
On the free tier for this path: Five OPEN change orders, draft and sent, and 200 lines each on every tier. The cap counts the ones the client has not answered rather than the ones ever raised, so approving, rejecting or voiding one frees its slot, and change_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. contract_value is free on every tier: the running value is the thing the change orders exist to answer, and withholding it would withhold the record. A byte-identical change 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 CO 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 · Price lists and rate cards from chat, and the 100x scale gap between the invoice and the quote · Change orders and the running contract value from chat, and why a changed line is two items · 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