Job cards for trades and field service: hours and materials per job, open to invoiced.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <Pro license key or anonymous token from GET https://mcp.zovo.one/mcp/token>
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Open a job card for a job your crew is taking on and return its JC-YYYY-NNNN number: the client, the site, what the job is, the currency and when it is scheduled. Free tier: 10 active cards; archiving a finished job frees its slot.
Where the job is, e.g. 14 Nowa Street, flat 3
Who the job is for, e.g. Kowalski bathroom refit, or Acme Ltd
ISO code the rates and prices are in
What the job is, e.g. Replace the consumer unit and certify
The date the crew is due on site, YYYY-MM-DD. May be in the future; it is a plan, not a log
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Open a job card for a job your crew is taking on and return its JC-YYYY-NNNN number: the client, the site, what the job is, the currency and when it is scheduled. Free tier: 10 active cards; archiving a finished job frees its slot.
| Argument | Type | Description |
|---|---|---|
| note | string | |
| site* | string | Where the job is, e.g. 14 Nowa Street, flat 3 |
| client* | string | Who the job is for, e.g. Kowalski bathroom refit, or Acme Ltd |
| currency* | string | ISO code the rates and prices are in |
| description* | string | What the job is, e.g. Replace the consumer unit and certify |
| scheduled_date | string | The date the crew is due on site, YYYY-MM-DD. May be in the future; it is a plan, not a log |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"client",
"site",
"description",
"currency"
],
"properties": {
"note": {
"type": "string",
"maxLength": 2000
},
"site": {
"type": "string",
"maxLength": 400,
"description": "Where the job is, e.g. 14 Nowa Street, flat 3"
},
"client": {
"type": "string",
"maxLength": 200,
"description": "Who the job is for, e.g. Kowalski bathroom refit, or Acme Ltd"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "ISO code the rates and prices are in"
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "What the job is, e.g. Replace the consumer unit and certify"
},
"scheduled_date": {
"type": "string",
"maxLength": 10,
"description": "The date the crew is due on site, YYYY-MM-DD. May be in the future; it is a plan, not a log"
}
},
"additionalProperties": false
}Delete a job card entered by mistake. One with labor or materials logged is refused, naming what it holds, because deleting it would lose the record of work done: archive it instead. The JC number is never reissued.
| Argument | Type | Description |
|---|---|---|
| card* | string | The job card id, e.g. JC-2026-0003, or the client name when only one card has it |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"card"
],
"properties": {
"card": {
"type": "string",
"maxLength": 200,
"description": "The job card id, e.g. JC-2026-0003, or the client name when only one card has it"
}
},
"additionalProperties": false
}Read one job card in full by JC number or client: every labor entry and every material used, the hours per worker, and the running totals -- labor, materials and grand total -- as integer cents with formatted amounts. Reads only.
| Argument | Type | Description |
|---|---|---|
| card* | string | The job card id, e.g. JC-2026-0003, or the client name when only one card has it |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"card"
],
"properties": {
"card": {
"type": "string",
"maxLength": 200,
"description": "The job card id, e.g. JC-2026-0003, or the client name when only one card has it"
}
},
"additionalProperties": false
}List job cards newest first: client, site, status, hours logged, and the labor, materials and grand totals in cents. Filter by status and by client. Totals are kept per currency, never mixed.
| Argument | Type | Description |
|---|---|---|
| client | string | Only cards whose client contains this text, case-insensitive |
| status | string | Only cards at this status: open, in_progress, done, invoiced, archived |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"client": {
"type": "string",
"maxLength": 200,
"description": "Only cards whose client contains this text, case-insensitive"
},
"status": {
"type": "string",
"maxLength": 20,
"description": "Only cards at this status: open, in_progress, done, invoiced, archived"
}
},
"additionalProperties": false
}Log hours worked on a job card: who did the work, the day, the hours and the hourly rate in whole cents, with a note on what was done. The line value is hours times rate, rounded half-up to the cent, fixed the moment it is logged.
| Argument | Type | Description |
|---|---|---|
| card* | string | The job card id, e.g. JC-2026-0003, or the client name when only one card has it |
| date* | string | The day the work was done, YYYY-MM-DD. A future date is refused |
| note | string | What was done, e.g. First fix, kitchen ring main |
| hours* | number | Hours worked, to the hundredth, e.g. 7.5 or 3.25. One entry is one worker's day at most |
| worker* | string | Who did the work, e.g. Anna |
| rate_cents* | integer | The hourly rate in whole cents. 4500 is 45.00 an hour |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"card",
"worker",
"date",
"hours",
"rate_cents"
],
"properties": {
"card": {
"type": "string",
"maxLength": 200,
"description": "The job card id, e.g. JC-2026-0003, or the client name when only one card has it"
},
"date": {
"type": "string",
"maxLength": 10,
"description": "The day the work was done, YYYY-MM-DD. A future date is refused"
},
"note": {
"type": "string",
"maxLength": 2000,
"description": "What was done, e.g. First fix, kitchen ring main"
},
"hours": {
"type": "number",
"maximum": 24,
"description": "Hours worked, to the hundredth, e.g. 7.5 or 3.25. One entry is one worker's day at most",
"exclusiveMinimum": 0
},
"worker": {
"type": "string",
"maxLength": 200,
"description": "Who did the work, e.g. Anna"
},
"rate_cents": {
"type": "integer",
"maximum": 100000000000000,
"minimum": 0,
"description": "The hourly rate in whole cents. 4500 is 45.00 an hour"
}
},
"additionalProperties": false
}Log materials used on a job card: the item, the day it went in, the quantity and the unit cost in whole cents. The line value is quantity times unit cost, rounded half-up to the cent, fixed the moment it is logged.
| Argument | Type | Description |
|---|---|---|
| qty* | number | How many, to the thousandth, e.g. 2 or 0.5 |
| card* | string | The job card id, e.g. JC-2026-0003, or the client name when only one card has it |
| date* | string | The day it went in, YYYY-MM-DD. A future date is refused |
| item* | string | What went into the job, e.g. Copper pipe 15mm, or Consumer unit 10-way |
| note | string | |
| unit_cost_cents* | integer | What one costs in whole cents. 1299 is 12.99 |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"card",
"item",
"date",
"qty",
"unit_cost_cents"
],
"properties": {
"qty": {
"type": "number",
"maximum": 1000000,
"description": "How many, to the thousandth, e.g. 2 or 0.5",
"exclusiveMinimum": 0
},
"card": {
"type": "string",
"maxLength": 200,
"description": "The job card id, e.g. JC-2026-0003, or the client name when only one card has it"
},
"date": {
"type": "string",
"maxLength": 10,
"description": "The day it went in, YYYY-MM-DD. A future date is refused"
},
"item": {
"type": "string",
"maxLength": 200,
"description": "What went into the job, e.g. Copper pipe 15mm, or Consumer unit 10-way"
},
"note": {
"type": "string",
"maxLength": 2000
},
"unit_cost_cents": {
"type": "integer",
"maximum": 100000000000000,
"minimum": 0,
"description": "What one costs in whole cents. 1299 is 12.99"
}
},
"additionalProperties": false
}Render a job card ready to print and hand to the client: the labor, the materials, the totals and a signature line for client sign-off. Markdown, or self-contained HTML that needs nothing from the network. Writes nothing.
| Argument | Type | Description |
|---|---|---|
| card* | string | The job card id, e.g. JC-2026-0003, or the client name when only one card has it |
| format | string | markdown (default) or html. The HTML carries its own styling and references nothing external |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"card"
],
"properties": {
"card": {
"type": "string",
"maxLength": 200,
"description": "The job card id, e.g. JC-2026-0003, or the client name when only one card has it"
},
"format": {
"enum": [
"markdown",
"html"
],
"type": "string",
"description": "markdown (default) or html. The HTML carries its own styling and references nothing external"
}
},
"additionalProperties": false
}Hours and value for a day or a week: the job cards touched, the hours per worker, and the labor, materials and total value, kept per currency. A week runs Monday to Sunday. Touched means a labor or material entry dated inside the window.
| Argument | Type | Description |
|---|---|---|
| date | string | A date inside the window, YYYY-MM-DD. Default today |
| span | string | day (default) is the date itself; week is the Monday to Sunday containing it |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"date": {
"type": "string",
"maxLength": 10,
"description": "A date inside the window, YYYY-MM-DD. Default today"
},
"span": {
"enum": [
"day",
"week"
],
"type": "string",
"description": "day (default) is the date itself; week is the Monday to Sunday containing it"
}
},
"additionalProperties": false
}Move one job card exactly one step: open, in_progress, done, invoiced, archived, stamping the date and an optional note into its history. A skipped or backwards step is refused and nothing is written. Archiving a finished job frees a free-tier slot.
| Argument | Type | Description |
|---|---|---|
| card* | string | The job card id, e.g. JC-2026-0003, or the client name when only one card has it |
| date | string | The date to stamp the step with, YYYY-MM-DD. Default today |
| note | string | |
| status* | string | The next step for this card: open, in_progress, done, invoiced, archived. in-progress is accepted too |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"card",
"status"
],
"properties": {
"card": {
"type": "string",
"maxLength": 200,
"description": "The job card id, e.g. JC-2026-0003, or the client name when only one card has it"
},
"date": {
"type": "string",
"maxLength": 10,
"description": "The date to stamp the step with, YYYY-MM-DD. Default today"
},
"note": {
"type": "string",
"maxLength": 2000
},
"status": {
"type": "string",
"maxLength": 20,
"description": "The next step for this card: open, in_progress, done, invoiced, archived. in-progress is accepted too"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| key* | string | License key from checkout, MCPL1.<payload>.<signature> |
{
"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
}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.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}