MCP Server

maintenance-log

io.github.theluckystrike/maintenance-log
Business & Operations Public & reachable MCP 2026-07-28

What this MCP does

Maintains an equipment asset register with service logs, costs, due-date reporting, and CSV or Markdown exports.

asset_add
Add an asset to the register
Add one piece of equipment to the maintenance register: its name, its serial or asset tag, where it lives, and the currency its costs are in. Returns the AST-YYYY-NNNN id. Free tier: 3 assets; logging work on the assets you have is never metered.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['name'], 'properties': {'tag': {'type': 'string', 'maxLength': 200, 'description': 'The serial number or asset tag, e.g. SN-88-4412. Unique across the register: a second asset with the same tag is refused'}, 'name': {'type': 'string', 'maxLength': 200, 'description': 'What the asset is called, e.g. Lathe, Combi boiler, Van 2, or Studio camera A'}, 'notes': {'type': 'string', 'maxLength': 2000, 'description': 'Anything worth keeping with the asset, e.g. Model, warranty end, supplier'}, 'currency': {'type': 'string', 'pattern': '^[A-Za-z]{3}$', 'description': 'ISO code the costs are in. Default USD'}, 'location': {'type': 'string', 'maxLength': 400, 'description': 'Where the asset lives, e.g. Workshop bay 2, or 14 Nowa Street, flat 3'}}, 'additionalProperties': False}
asset_history
Read one asset's log and total spend
Read one asset in full by id, tag or name: every log entry in chronological order, the total spend as integer cents with a formatted amount, the last service date, and the next-due date the asset currently lives under. Reads only.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['asset'], 'properties': {'asset': {'type': 'string', 'maxLength': 200, 'description': 'The asset id, e.g. AST-2026-0003, its serial or asset tag, or its name when only one asset has it'}}, 'additionalProperties': False}
asset_remove
Remove an asset from the register
Remove an asset entered by mistake or sold off. One that carries a maintenance log is refused unless confirm is true, naming what would be lost, because removing it loses the record of work done. The AST number is never reissued.
Destructive
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['asset'], 'properties': {'asset': {'type': 'string', 'maxLength': 200, 'description': 'The asset id, e.g. AST-2026-0003, its serial or asset tag, or its name when only one asset has it'}, 'confirm': {'type': 'boolean', 'description': 'Pass true to remove an asset that carries a maintenance log. The log goes with it; this cannot be undone'}}, '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.
Input schema
{'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.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
maintenance_due
Report what is overdue and what is coming due
The due report across every asset: what is overdue and by how many days, what falls due within the next N days (default 30), what is scheduled later, and what has no schedule at all. Computed from the stored next-due dates against today, at call time. Pro feature.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'within_days': {'type': 'integer', 'maximum': 3650, 'minimum': 0, 'description': 'How far ahead to look, in days. Default 30'}}, 'additionalProperties': False}
maintenance_export
Export the log as CSV or Markdown
Export maintenance entries dated inside a range. CSV (free): one row per entry, ready for a spreadsheet. Markdown (Pro): one section per asset with its entries, total spend and next due date, ready to paste into notes or a report. Writes nothing.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'to': {'type': 'string', 'maxLength': 10, 'description': 'Only entries dated on or before this, YYYY-MM-DD. Default: no upper bound'}, 'from': {'type': 'string', 'maxLength': 10, 'description': 'Only entries dated on or after this, YYYY-MM-DD. Default: no lower bound'}, 'format': {'enum': ['csv', 'markdown'], 'type': 'string', 'description': 'csv (default) or markdown. Markdown summaries are a Pro feature'}}, 'additionalProperties': False}
maintenance_log
Log maintenance on an asset
Log work done on an asset: the day, what was done, the cost in whole cents, who did it, and when the next service falls due -- as a date (next_due) or as an interval in days (interval_days), never both. A repair that sets no schedule takes neither. A future work date is refused.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['asset', 'date', 'work'], 'properties': {'date': {'type': 'string', 'maxLength': 10, 'description': 'The day the work was done, YYYY-MM-DD. A future date is refused'}, 'work': {'type': 'string', 'maxLength': 2000, 'description': 'What was done, e.g. Oil and filter change, or Annual boiler service'}, 'asset': {'type': 'string', 'maxLength': 200, 'description': 'The asset id, e.g. AST-2026-0003, its serial or asset tag, or its name when only one asset has it'}, 'next_due': {'type': 'string', 'maxLength': 10, 'description': 'The date the next service falls due, YYYY-MM-DD. Pass either this or interval_days, not both'}, 'cost_cents': {'type': 'integer', 'maximum': 100000000000000, 'minimum': 0, 'description': 'What the work cost in whole cents. 12000 is 120.00. Default 0, for in-house work'}, 'technician': {'type': 'string', 'maxLength': 200, 'description': 'Who did the work, e.g. Anna, or Acme Heating Ltd'}, 'interval_days': {'type': 'integer', 'maximum': 36500, 'minimum': 1, 'description': 'Days after the work date the next service falls due, e.g. 90 for quarterly. Turned into a date once, at log time'}}, 'additionalProperties': False}
Changed
license_activate
Sept. 22, 2026, 2:40 a.m.
Changed
license_status
Sept. 22, 2026, 2:40 a.m.
Changed
asset_remove
Sept. 22, 2026, 2:40 a.m.
Changed
maintenance_export
Sept. 22, 2026, 2:40 a.m.
Changed
asset_history
Sept. 22, 2026, 2:40 a.m.
Changed
maintenance_due
Sept. 22, 2026, 2:40 a.m.
Changed
maintenance_log
Sept. 22, 2026, 2:40 a.m.
Changed
asset_add
Sept. 22, 2026, 2:40 a.m.
Added
license_activate
Sept. 18, 2026, 2:40 a.m.
Added
license_status
Sept. 18, 2026, 2:40 a.m.
Added
asset_remove
Sept. 18, 2026, 2:40 a.m.
Added
maintenance_export
Sept. 18, 2026, 2:40 a.m.
Added
asset_history
Sept. 18, 2026, 2:40 a.m.
Added
maintenance_due
Sept. 18, 2026, 2:40 a.m.
Added
maintenance_log
Sept. 18, 2026, 2:40 a.m.
Added
asset_add
Sept. 18, 2026, 2:40 a.m.