{
  "markdown": "# mcp-change-order\n\n<!-- mirror-seo:start -->\n\n**MCP server for change orders and contract variations.** Change orders against a quote or a work order, with the running contract value derived from what the client approved.\n\nWorks with Claude Desktop, Claude Code, Cursor and any Model Context Protocol client. Runs on your own machine, or hosted with no install.\n\n## Install\n\n**Hosted, nothing to install.** Get a token from <https://mcp.zovo.one/mcp/connect> (the connect page) or <https://mcp.zovo.one/mcp/token> (the same token as JSON); a free anonymous one is issued on the spot and a Pro key works the same way. Then point an MCP client at `https://mcp.zovo.one/mcp/change-order` over streamable-http and send the token as `Authorization: Bearer <token>`.\n\nIf your client cannot set headers, put the token in the path instead: `https://mcp.zovo.one/mcp/change-order/t/<token>`. Both forms work. The bare URL with no token answers 401 on `tools/call`, so the token is not optional.\n\n**Claude Desktop, one click.** Download `change-order.mcpb` from the [latest release](https://github.com/theluckystrike/mcp-servers/releases/latest) and double-click it.\n\n**From source.** The mirror is self-contained: every `@theluckystrike/*` dependency is vendored, so a fresh clone builds with no extra setup.\n\n```sh\ngit clone https://github.com/theluckystrike/mcp-change-order.git\ncd mcp-change-order\nnpm install && npm run build\n```\n\nThen point your client at the built entry point:\n\n```json\n{\n  \"mcpServers\": {\n    \"change-order\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/mcp-change-order/dist/index.js\"]\n    }\n  }\n}\n```\n\n> `@theluckystrike/mcp-change-order` is **not published on npm yet**, so an `npx -y @theluckystrike/mcp-change-order` command will fail. The three paths above are the working ones and each is exercised by CI.\n\n![change-order demo](https://raw.githubusercontent.com/theluckystrike/mcp-servers/main/assets/demo-change-order.gif)\n\nRead-only mirror of [mcp-servers/servers/change-order](https://github.com/theluckystrike/mcp-servers/tree/main/servers/change-order). See [MIRROR.md](MIRROR.md).\n\n<!-- mirror-seo:end -->\n\nChange orders against a quote or a work order, kept the way a variation is kept on site:\nwhat was added, what was taken out and what changed, each with a reason and a date, sent to\nthe client, and answered. The running contract value is the original plus the deltas the\nclient has APPROVED; what they have not answered yet is shown as pending and never added in.\nOnce a change order is approved, the delta comes back as `invoice_create`-ready items in\nMAJOR units and `quote_create`-ready items in MINOR units, in one call, with the scale\nprinted against each.\n\nNo delta is stored. A change order holds its lines and its status history; the delta, the\nrunning value and the VAT are derived on every call, with the invoice server's own\narithmetic. Nothing is invented: the first change order against a reference states the\noriginal contract value once, every later one inherits it, and a different figure is\nrefused by name.\n\n## Install\n\n\n**One-click (.mcpb):** download `change-order.mcpb` from the latest release and double-click it in Claude Desktop:\nhttps://github.com/theluckystrike/mcp-servers/releases/latest\n\n**Hosted, no install:** point a URL-based client at `https://mcp.zovo.one/mcp/change-order`. `GET https://mcp.zovo.one/mcp/connect` mints a token and prints a ready URL.\n\nnpm publish for `@theluckystrike/mcp-change-order` is pending, so the `npx` line below returns 404 today.\n\n### Claude Desktop\n\n`~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or\n`%APPDATA%\\Claude\\claude_desktop_config.json` (Windows):\n\n```json\n{\n  \"mcpServers\": {\n    \"change-order\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@theluckystrike/mcp-change-order\"]\n    }\n  }\n}\n```\n\n### Claude Code\n\n```sh\nclaude mcp add change-order -- npx -y @theluckystrike/mcp-change-order\n```\n\n### Cursor\n\n`~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project), same entry as Claude Desktop.\n\n## Tools\n\n| Tool | What it does |\n| --- | --- |\n| `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 |\n| `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 |\n| `change_order_status` | Move it along: draft to sent, sent to approved or rejected, draft or sent to void, each step dated |\n| `change_order_get` | One change order in full: every line with its delta, the VAT, the history and the running value of the reference |\n| `change_order_list` | Change orders by reference, status, client and date range, with approved and pending deltas per currency |\n| `change_order_delete` | Delete an empty draft raised by mistake. Free on every tier |\n| `contract_value` | The running value of one reference: original, approved delta, current value, pending delta held apart |\n| `change_order_document` | The change order as a plain-text document for the client to approve |\n| `change_order_invoice_payload` | The approved delta as `invoice_create` items (MAJOR units) and `quote_create` items (MINOR units) |\n| `license_status` / `license_activate` | Free or Pro, and where to upgrade |\n\n## Free vs Pro\n\n| | Free | Pro |\n| --- | --- | --- |\n| Open change orders (draft and sent) | 5 | unlimited |\n| Lines per change order | 200 | 200 |\n| Raise, line, move, get, list, delete | yes | yes |\n| Running contract value | yes | yes |\n| Change order document | no | yes |\n| Invoice-ready delta payload, both scales | no | yes |\n\nThe cap counts OPEN change orders, the ones the client has not answered, not the ones you\nhave ever raised. Approving, rejecting or voiding one frees its slot, and so does\n`change_order_delete` on a draft with no lines; all of those are free on every tier, because\na way back that only a Pro key can reach is not a way back.\n\nGet Pro: https://mcp.zovo.one/buy/change-order (one-time $19, lifetime), or all servers for\n$39: https://mcp.zovo.one/buy/bundle\n\n## The status machine\n\n`draft` to `sent`; `sent` to `approved` or `rejected`; `draft` or `sent` to `void`.\nApproved, rejected and void are final. A draft cannot be approved directly: approval is the\nclient's answer to something they were sent. Lines are added only while a change order is a\ndraft; a sent one that needs another line is voided and raised again, so the client's\napproval always refers to what they were sent. Every step carries its own date, and a step\ndated before the last one is refused.\n\n## Where the money comes from\n\nThis server keeps no arithmetic of its own. `computeTotals`, `currencyDecimals`,\n`formatMoney` and `roundHalfUp` are imported from `@theluckystrike/mcp-invoice/lib`, the\ncorrupt-store quarantine from `@theluckystrike/mcp-timezone/lib`, the timezone-aware\n\"today\" from `@theluckystrike/mcp-quotes/lib`. The VAT rate, the currency and the business\nname come from the shared business profile that `business_set` in the invoice server writes.\nNothing is written outside this server's own directory, and no sibling store is opened.\n\n## The measured insight\n\n**A changed line is two items, not one, because one net item shows the customer nothing\nthey can check.** A line that goes from 3 x EUR 450.00 to 5 x EUR 420.00 is worth +EUR\n750.00, and the tempting payload is one item of quantity 1 at EUR 750.00. The customer\ncannot reproduce that figure from anything on the change order they signed. The payload\nthis server emits is a reversal, -3 x EUR 450.00, and the revised line, 5 x EUR 420.00;\neach reproduces on a calculator, and `computeTotals` over both is the same +EUR 750.00,\nbecause the invoice server's `roundHalfUp` is symmetric in sign. The same rule carries a\nremoval as a negative quantity at the unit price it was booked at, which `invoice_create`\naccepts. The unit suite re-runs the invoice server's own `computeTotals` over the payload\nas returned and asserts the four item values and the three totals, then feeds the\n`quote_create` items into the same engine as though their MINOR figure were MAJOR and\nasserts the net is exactly 100x, so the day someone \"simplifies\" the payload to one net\nitem, or moves a field between the two scales, the build says so instead of the customer.\n\n## Privacy\n\nAll data stays on your machine, in `${XDG_DATA_HOME:-~/.local/share}/mcp-servers/change-order/`.\nNothing is sent anywhere. There is no account and no API key. License keys are verified\noffline. This server reads one file it does not own, the shared business profile, and\nwrites into no store but its own.\n\nBuilt by theluckystrike. https://github.com/theluckystrike\n",
  "bytes": 8726,
  "sha": "80f0d1c7117e8f98bded0aa8c6ab2514f800ab7417820ee13dd2001111d56c90",
  "repo_slug": "theluckystrike/mcp-change-order",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_theluckystrike_mcp_change_order_d8da39b6/readme"
}