All servers · Buy Pro $19 · Source · Claude Desktop bundle (.mcpb)
Dated deliverables against a quote, a work order or a change order. Each one carries what
is being handed over, the day it is due, its value in minor units, and a status that moves
planned to in progress to delivered to accepted, every step with the day it actually
happened. late_report then answers the only question anybody asks about a schedule: what
has slipped, as at a date you name. Once the client has signed something off, the accepted
milestones come 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.
Late is not a status here, it is a reading. A stored "late" flag is a fact about the afternoon somebody last ran the report, and it keeps being reported long after the work lands. So nothing derived is stored: a deliverable holds its due date, its value and its dated history, and the current status, the delivered date, the acceptance note, the lateness and every total are worked out on the call, against the date you passed.
One-click (.mcpb): download delivery-schedule.mcpb from the latest release and double-click it in Claude Desktop:
https://github.com/theluckystrike/mcp-servers/releases/latest
Hosted, no install: point a URL-based client at https://mcp.zovo.one/mcp/delivery-schedule. GET https://mcp.zovo.one/mcp/connect mints a token and prints a ready URL.
npm publish for @theluckystrike/mcp-delivery-schedule is pending, so the npx line below returns 404 today.
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or
%APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"delivery-schedule": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-delivery-schedule"]
}
}
}
claude mcp add delivery-schedule -- npx -y @theluckystrike/mcp-delivery-schedule
~/.cursor/mcp.json (global) or .cursor/mcp.json (project), same entry as Claude Desktop.
| Tool | What it does |
|---|---|
delivery_schedule_create |
Open a schedule against a quote, work order or change order: the reference, its own date, the client, a title |
deliverable_add |
Add one dated deliverable: what it is, the day it is due, and its value in minor units when it is separately priced |
deliverable_status |
Record a dated move: in progress, delivered, and accepted with the client's acceptance note |
deliverable_delete |
Delete a deliverable added by mistake, while it is still planned and has nothing recorded against it |
delivery_schedule_get |
One schedule in full as at a date, with every deliverable's status, dates, value and lateness |
delivery_schedule_list |
Schedules by client, reference and whether the job is finished, with the counts as at a date |
delivery_schedule_delete |
Delete an empty schedule opened by mistake. Free on every tier |
late_report |
What is late as at a date you name, worst first, with the value at risk per currency |
delivery_schedule_document |
The schedule as a plain-text document for the client, with a sign-off block |
milestone_payload |
The accepted milestones 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 schedules (a job with anything not yet accepted) | 3 | unlimited |
| Deliverables per schedule | 200 | 200 |
| Open, add, move, get, list, delete | yes | yes |
| What is late, as at any date | yes | yes |
| Delivery schedule document | no | yes |
| Milestone invoice payload, both scales | no | yes |
The cap counts OPEN schedules, the jobs that still owe something, not the jobs you have
ever run. Accepting the last deliverable completes a schedule and frees its slot without
deleting the record, and delivery_schedule_delete clears an empty one; both 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/delivery-schedule (one-time $19, lifetime), or all servers for $39: https://mcp.zovo.one/buy/bundle Or the nineteen-server bundle for $39.
planned to in_progress or straight to delivered; delivered to accepted. Accepted
is final, and nothing moves back: work the client sent back is a new deliverable with its
own due date, so the record keeps both the miss and the fix. Accepting something that was
never delivered is refused by name, because acceptance is the client's answer to a
handover and a deliverable accepted on a day nothing was handed over has no delivered date
to bill from. Every move carries the day it actually happened, and a move dated before the
reference document's own date, or before the previous move, is refused so the history reads
as a timeline.
A deliverable is late once as_of is PAST its due date and it has not been delivered by
then. One due on as_of itself is due_today, not late, which is the same rule the
statement server ages an invoice by. A deliverable that was delivered is delivered_late
or delivered_on_time by comparing its delivered date with its due date, which is a fact
that no longer moves. Every comparison is between two YYYY-MM-DD strings and every day
count is the difference of two UTC midnights, so the answer is the same on a laptop in
Warsaw and a server in Auckland.
Two readings of the same store, four days apart, differ on purpose:
late_report as_of 2026-04-22 D02 is LATE by 2 days, nothing has been delivered late
late_report as_of 2026-05-05 D02 was DELIVERED LATE by 4 days, D03 is now LATE by 4 days
A deliverable with no value_minor is not worth zero. It is one whose price was never
stated here, usually because the job is a lump sum, and adding it in as zero would
understate every total with nothing on the page to say so. It is counted apart wherever a
total is printed, and milestone_payload lists it under excluded.accepted_but_unpriced
rather than billing it. Nothing here invents a price.
This server keeps no arithmetic of its own. computeTotals, currencyDecimals,
formatMoney and daysBetween 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.
The same deliverable is late, on time and not yet due depending only on the date you ask about, so storing the answer is storing the day somebody asked. D02 in the worked example is due 2026-04-20 and was delivered 2026-04-24. Read at 2026-04-22 it is late by two days with no delivered date at all, even though the store already holds one dated 04-24. Read at 2026-05-01 it is delivered late by four days. Read at 2026-04-19 it is not yet due. One store, three answers, all correct. The unit suite asserts all three from one unchanged sandbox, and a separate suite replays every call under four timezones fourteen hours apart and asserts the responses are byte-identical, so the day somebody reads the report on a laptop that travelled cannot move a client's deadline.
All data stays on your machine, in
${XDG_DATA_HOME:-~/.local/share}/mcp-servers/delivery-schedule/. 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
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 · MCP server not showing up in Claude Desktop: the six checks that find it · Where is claude_desktop_config.json, and what goes in it · claude mcp add: every flag, and the scope that silently loses your server · MCP servers on Windows: spawn npx ENOENT, backslashes and the PATH · Installing these MCP servers when npx does not work yet · Cursor MCP setup: mcp.json, the required type field, and where the servers appear · Which MCP servers work with no network at all · Invoicing an EU client with reverse charge, from a chat message · Quote, deposit, invoice, statement: the whole cycle in one conversation · Is this project making money? Hours against costs, without a spreadsheet · Building a tax year pack for your accountant from chat · Keeping a mileage log in chat, with the rate you actually claim · Reconciling a bank CSV against what you invoiced and spent · Rebilling client expenses, with a markup and the VAT handled honestly · Chasing an unpaid invoice: aging, then the letter · Pricing a job from a rate card, and what to do when the scope changes · Working out your hourly rate from what you actually billed · Converting CSV to xlsx and back without opening Excel · Asking a spreadsheet questions in plain language · Merging a folder of receipts into one PDF from chat · Splitting one big scan into separate documents · Sending a month of paperwork as one archive, safely · MCP servers in VS Code: the one-word mistake that breaks every config · MCP servers in Windsurf and Cline: two defaults that waste an afternoon · Local MCP server or hosted URL: which one, and what you give up · What these 30 MCP servers actually do on the free tier · Choosing an MCP server for invoicing: the seven questions worth asking · When you need an MCP server, and when a prompt is enough · All guides