MCP-Server

recurring-invoice-scheduler-subscription-billing-due-reminders

io.github.theluckystrike/recurring-invoice-scheduler-subscription-billing-due-reminders
Business & Betrieb Finanzen & Investieren Öffentlich und erreichbar MCP 2026-07-28

Was dieses MCP kann

Creates and manages recurring invoice schedules, generates due invoices and PDFs, and forecasts invoiced revenue.

forecast
Revenue forecast
Expected invoiced revenue per calendar month per currency from active schedules. Invoiced and skipped periods are excluded and paused schedules listed apart. Free: 3 months; Pro: up to 120.
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'months': {'type': 'integer', 'maximum': 120, 'minimum': 1, 'description': 'Months ahead including this one, default 12'}}, 'additionalProperties': False}
invoice_generate_due
Generate the invoices that are due
Create a real invoice in the invoice server for every schedule occurrence on or before as_of that has not been invoiced yet, and render each PDF. Returns what was created, what was skipped and what is still due.
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'as_of': {'type': 'string', 'description': 'YYYY-MM-DD, defaults to today. Every occurrence on or before this date that has not been invoiced is billed. Idempotent: one invoice per schedule per period, keyed by the occurrence date, so running it twice creates nothing the second time'}, 'dry_run': {'type': 'boolean', 'description': 'List what would be created without creating anything. Default false. One run creates at most 60 invoices, oldest period first'}, 'schedule_id': {'type': 'string', 'description': 'Only this schedule. Free and unlimited on every tier'}}, 'additionalProperties': False}
license_activate
Activate license
Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['key'], 'properties': {'key': {'type': 'string', 'description': 'License key from checkout, MCPL1.<payload>.<signature>'}}, 'additionalProperties': False}
license_status
License status
Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
schedule_create
Create a recurring invoice schedule
Define a repeating invoice: a client, the line items, how often to bill, and when it starts and ends. Returns the schedule id, a summary and its next dates. Nothing is invoiced until invoice_generate_due runs.
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['client', 'items', 'every', 'start_date'], 'properties': {'every': {'anyOf': [{'enum': ['weekly', 'monthly', 'quarterly', 'yearly'], 'type': 'string'}, {'type': 'object', 'required': ['days'], 'properties': {'days': {'type': 'integer', 'maximum': 3650, 'minimum': 1}}, 'additionalProperties': False}], 'description': 'How often to bill: "weekly", "monthly", "quarterly", "yearly", or {days: 10}. Month steps keep the start date\'s day of month and clamp it to shorter months, so a schedule starting on the 31st bills on the 28th/29th in February and back on the 31st in March'}, 'items': {'type': 'array', 'items': {'type': 'object', 'required': ['description', 'quantity', 'unit_price'], 'properties': {'quantity': {'type': 'number', 'maximum': 1000000000000, 'minimum': -1000000000000, 'description': 'Hours, units or 1 for a flat fee'}, 'tax_rate': {'type': 'number', 'maximum': 1000, 'minimum': -100, 'description': 'VAT percent for this line, overrides the business default'}, 'unit_price': {'type': 'number', 'maximum': 1000000000000, 'minimum': -1000000000000, 'description': 'Price per unit in major units, e.g. 90 for 90 EUR'}, 'description': {'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 200, 'minItems': 1, 'description': 'The line items billed every period'}, 'notes': {'type': 'string', 'description': 'Free text printed under the totals of every generated invoice'}, 'client': {'type': 'string', 'description': 'Client name or id, as in the invoice server. Unknown names are created on the first generated invoice'}, 'currency': {'type': 'string', 'pattern': '^[A-Za-z]{3}$', 'description': 'Defaults to your business default currency'}, 'due_days': {'type': 'integer', 'description': 'Days until each invoice is due, defaults to your payment terms'}, 'end_date': {'type': 'string', 'description': 'YYYY-MM-DD, INCLUSIVE: an occurrence landing exactly on it is still generated'}, 'tax_note': {'type': 'string', 'description': "Why this schedule bills the tax it bills, e.g. 'Reverse charge: VAT accounted for by the recipient, art. 196 Directive 2006/112/EC'. It is printed under the totals of EVERY invoice this schedule generates, so a 0% retainer carries its reason on the document instead of only in the chat"}, 'anchor_day': {'type': 'integer', 'maximum': 31, 'minimum': 1, 'description': "Pro: bill on this day of month instead of the start date's day. 31 means the last day of every month"}, 'start_date': {'type': 'string', 'description': 'YYYY-MM-DD. The first invoice falls on this date, and for weekly/monthly/quarterly/yearly steps its day of month is the billing day for every later period'}, 'end_of_month': {'type': 'boolean', 'description': 'Pro: always bill on the last day of the month'}, 'auto_generate': {'type': 'boolean', 'description': 'Marks the schedule for the monthly_billing_run prompt. Default false. Nothing runs in the background either way: invoices are created only when invoice_generate_due is called'}}, 'additionalProperties': False}
schedule_delete
Delete a schedule
Delete one schedule permanently. Invoices already generated stay in the invoice server and the history is kept. Re-creating it gives a NEW id, so its old periods count as unbilled. schedule_pause is reversible.
Destruktiv
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Schedule id, or a client name. Deletion is permanent; re-creating the same schedule afterwards gives it a NEW id, so its old periods count as unbilled again'}}, 'additionalProperties': False}
schedule_get
Get one schedule
Return one schedule in full by id or client: items, cadence, dates, due days, anchor rules, notes, per-period amount, next due date and how many invoices it generated. schedule_history is the log.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Schedule id, or a client name'}}, 'additionalProperties': False}
schedule_history
Schedule history
The audit log for one schedule id, oldest first: period, invoice number, issue and due dates, amount, PDF path, and whether that invoice is unpaid, paid, skipped or since deleted. schedule_list finds the id. Pro.
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string'}}, 'additionalProperties': False}
schedule_list
List schedules
List schedules: id, client, cadence, per-period amount and currency, start and end dates, status, next due date and auto_generate. Filter by status; a paused schedule reports no next due date.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'status': {'enum': ['active', 'paused'], 'type': 'string'}}, 'additionalProperties': False}
schedule_pause
Pause a schedule
Stop one schedule generating invoices without deleting it; invoice_generate_due and forecast skip it. Its periods keep falling due and resuming back-bills them, so use schedule_skip to drop just one.
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string'}}, 'additionalProperties': False}
schedule_resume
Resume a schedule
Make a paused schedule active again. Every period missed while it was paused is still due and the next invoice_generate_due creates them all. Refused when it would pass the free tier's 3 active.
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string'}}, 'additionalProperties': False}
schedule_skip
Skip one period
Close ONE occurrence for good without pausing the schedule, reporting what will not be billed. period must be a real occurrence of it. An invoiced period is refused; undo reopens a skip.
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id', 'period'], 'properties': {'id': {'type': 'string', 'description': 'Schedule id, or a client name'}, 'undo': {'type': 'boolean', 'description': 'Remove a previous skip so the period becomes due again. Works only on a period that has not been invoiced. Default false'}, 'period': {'type': 'string', 'description': 'The occurrence date to skip, YYYY-MM-DD, exactly as it appears in schedule_upcoming or forecast. This is the answer to "pause this client for October": schedule_pause stops the whole schedule and a resumed schedule still back-bills the periods it missed, whereas a skipped period is closed for good'}}, 'additionalProperties': False}
schedule_upcoming
What falls due soon
Table every occurrence of every ACTIVE schedule due in the next N days (30 default), with its amount and the invoice due date, plus a total per currency. Free lists the first 3 in your horizon.
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'days': {'type': 'integer', 'maximum': 3650, 'minimum': 1, 'description': 'Days ahead, default 30. The free tier honours the horizon you ask for and lists the first 3 occurrences in it; Pro lists them all'}}, 'additionalProperties': False}
schedule_update
Update a schedule
Change one schedule by id: client, items, currency, cadence, dates, due_days, notes or auto_generate. Only the fields you pass change. Periods already invoiced are never re-issued, so a new amount applies to future ones.
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string'}, 'every': {'anyOf': [{'enum': ['weekly', 'monthly', 'quarterly', 'yearly'], 'type': 'string'}, {'type': 'object', 'required': ['days'], 'properties': {'days': {'type': 'integer', 'maximum': 3650, 'minimum': 1}}, 'additionalProperties': False}], 'description': 'How often to bill: "weekly", "monthly", "quarterly", "yearly", or {days: 10}. Month steps keep the start date\'s day of month and clamp it to shorter months, so a schedule starting on the 31st bills on the 28th/29th in February and back on the 31st in March'}, 'items': {'type': 'array', 'items': {'type': 'object', 'required': ['description', 'quantity', 'unit_price'], 'properties': {'quantity': {'type': 'number', 'maximum': 1000000000000, 'minimum': -1000000000000, 'description': 'Hours, units or 1 for a flat fee'}, 'tax_rate': {'type': 'number', 'maximum': 1000, 'minimum': -100, 'description': 'VAT percent for this line, overrides the business default'}, 'unit_price': {'type': 'number', 'maximum': 1000000000000, 'minimum': -1000000000000, 'description': 'Price per unit in major units, e.g. 90 for 90 EUR'}, 'description': {'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 200, 'minItems': 1}, 'notes': {'type': 'string'}, 'client': {'type': 'string'}, 'currency': {'type': 'string', 'pattern': '^[A-Za-z]{3}$'}, 'due_days': {'type': 'integer'}, 'end_date': {'type': ['string', 'null'], 'description': 'null clears the end date'}, 'tax_note': {'type': 'string', 'description': 'Replace the tax reason carried onto every future generated invoice. Pass an empty string to clear it'}, 'anchor_day': {'anyOf': [{'type': 'integer', 'maximum': 31, 'minimum': 1}, {'type': 'null'}], 'description': 'Pro'}, 'start_date': {'type': 'string'}, 'end_of_month': {'type': 'boolean', 'description': 'Pro'}, 'auto_generate': {'type': 'boolean'}}, 'additionalProperties': False}
Geändert
license_activate
21. September 2026 02:56
Geändert
license_status
21. September 2026 02:56
Geändert
forecast
21. September 2026 02:56
Geändert
schedule_history
21. September 2026 02:56
Geändert
invoice_generate_due
21. September 2026 02:56
Geändert
schedule_upcoming
21. September 2026 02:56
Geändert
schedule_skip
21. September 2026 02:56
Geändert
schedule_delete
21. September 2026 02:56
Geändert
schedule_resume
21. September 2026 02:56
Geändert
schedule_pause
21. September 2026 02:56
Geändert
schedule_update
21. September 2026 02:56
Geändert
schedule_get
21. September 2026 02:56
Geändert
schedule_list
21. September 2026 02:56
Geändert
schedule_create
21. September 2026 02:56
Hinzugefügt
license_activate
17. September 2026 12:52
Hinzugefügt
license_status
17. September 2026 12:52
Hinzugefügt
forecast
17. September 2026 12:52
Hinzugefügt
schedule_history
17. September 2026 12:52
Hinzugefügt
invoice_generate_due
17. September 2026 12:52
Hinzugefügt
schedule_upcoming
17. September 2026 12:52
Hinzugefügt
schedule_skip
17. September 2026 12:52
Hinzugefügt
schedule_delete
17. September 2026 12:52
Hinzugefügt
schedule_resume
17. September 2026 12:52
Hinzugefügt
schedule_pause
17. September 2026 12:52
Hinzugefügt
schedule_update
17. September 2026 12:52
Hinzugefügt
schedule_get
17. September 2026 12:52
Hinzugefügt
schedule_list
17. September 2026 12:52
Hinzugefügt
schedule_create
17. September 2026 12:52