Credit notes against your invoices and purchase orders to suppliers, with VAT and A4 PDFs.
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.
Over a date range: what was credited back per currency and against how many invoices, what is still on order per currency, and every open order past its delivery date with days late. Pro; the list tools are free.
YYYY-MM-DD, latest document date to count
YYYY-MM-DD, earliest document date to count
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Over a date range: what was credited back per currency and against how many invoices, what is still on order per currency, and every open order past its delivery date with days late. Pro; the list tools are free.
| Argument | Type | Description |
|---|---|---|
| to | string | YYYY-MM-DD, latest document date to count |
| from | string | YYYY-MM-DD, earliest document date to count |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"to": {
"type": "string",
"description": "YYYY-MM-DD, latest document date to count"
},
"from": {
"type": "string",
"description": "YYYY-MM-DD, earliest document date to count"
}
},
"additionalProperties": false
}Credit one invoice: the whole invoice, a GROSS amount_minor split over its VAT rates, or named lines. Amounts store negative, reusing the invoice's own rates. Free: 5 a month. Send it with credit_note_text.
| Argument | Type | Description |
|---|---|---|
| lines | array | Credit only these invoice lines. Leave out with amount_minor for a full credit note |
| notes | string | Free text printed under the totals |
| reason* | string | Why the money is being given back, e.g. "returned goods" or "billed twice". Printed on the document |
| invoice* | string | The invoice number to credit, e.g. INV-2026-0001 |
| issue_date | string | YYYY-MM-DD, defaults to today in your business profile's timezone |
| amount_minor | integer | Credit this GROSS amount, VAT included, in minor units. Split across the invoice's VAT rates in proportion to each rate's share of the total |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"invoice",
"reason"
],
"properties": {
"lines": {
"type": "array",
"items": {
"type": "object",
"required": [
"line"
],
"properties": {
"line": {
"type": "integer",
"description": "1-based position of the line on the invoice, as shown by invoice_get",
"exclusiveMinimum": 0
},
"quantity": {
"type": "number",
"maximum": 1000000000000,
"minimum": -1000000000000,
"description": "Credit only this many units. Defaults to the whole line",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"maxItems": 200,
"minItems": 1,
"description": "Credit only these invoice lines. Leave out with amount_minor for a full credit note"
},
"notes": {
"type": "string",
"maxLength": 10000,
"description": "Free text printed under the totals"
},
"reason": {
"type": "string",
"maxLength": 1000,
"minLength": 1,
"description": "Why the money is being given back, e.g. \"returned goods\" or \"billed twice\". Printed on the document"
},
"invoice": {
"type": "string",
"minLength": 1,
"description": "The invoice number to credit, e.g. INV-2026-0001"
},
"issue_date": {
"type": "string",
"description": "YYYY-MM-DD, defaults to today in your business profile's timezone"
},
"amount_minor": {
"type": "integer",
"maximum": 1000000000000,
"description": "Credit this GROSS amount, VAT included, in minor units. Split across the invoice's VAT rates in proportion to each rate's share of the total",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}Remove one credit note never posted to its invoice and never rendered, freeing that month's slot; the invoice becomes creditable again. One with a dependent is refused: issue a fresh note to reverse a sent one.
| Argument | Type | Description |
|---|---|---|
| id* | string | Credit note id such as CN-2026-0001, or an exact client name |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Credit note id such as CN-2026-0001, or an exact client name"
}
},
"additionalProperties": false
}Return one credit note in full by id or exact client name: every negated line, VAT lines, totals, the reason, and the invoice number and date it reverses. Reads only. Use credit_note_list for the ids.
| Argument | Type | Description |
|---|---|---|
| id* | string | Credit note id such as CN-2026-0001, or an exact client name |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Credit note id such as CN-2026-0001, or an exact client name"
}
},
"additionalProperties": false
}List credit notes newest first: id, invoice, client, basis, reason, currency and the NEGATIVE total, with the amount credited per currency. Filter by invoice, client or issue date range.
| Argument | Type | Description |
|---|---|---|
| to | string | YYYY-MM-DD, latest issue date |
| from | string | YYYY-MM-DD, earliest issue date |
| client | string | Only credit notes for clients whose name contains this text |
| invoice | string | Only credit notes issued against this invoice number |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"to": {
"type": "string",
"description": "YYYY-MM-DD, latest issue date"
},
"from": {
"type": "string",
"description": "YYYY-MM-DD, earliest issue date"
},
"client": {
"type": "string",
"description": "Only credit notes for clients whose name contains this text"
},
"invoice": {
"type": "string",
"description": "Only credit notes issued against this invoice number"
}
},
"additionalProperties": false
}Call this tool to render one credit note as an A4 print-ready document and return a download link valid for one hour: the invoice layout titled CREDIT NOTE, with the invoice it reverses. Pro.
| Argument | Type | Description |
|---|---|---|
| id* | string | Credit note id such as CN-2026-0001 |
| out_path | string | Name for the downloaded file, e.g. acme-credit. Defaults to the document id; the document comes back as a download link valid for one hour |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Credit note id such as CN-2026-0001"
},
"out_path": {
"type": "string",
"description": "Name for the downloaded file, e.g. acme-credit. Defaults to the document id; the document comes back as a download link valid for one hour"
}
},
"additionalProperties": false
}Turn a credit note into a plain-text summary to paste into an email: the negated line table, VAT lines, total, reason, and what now comes off the invoice. Also a .txt download link valid one hour. Free; credit_note_pdf writes the A4 document.
| Argument | Type | Description |
|---|---|---|
| id* | string | Credit note id such as CN-2026-0001 |
| greeting | string | Opening line, default "Hello" plus the client name |
| sign_off | string | Closing line, default your business name from the shared profile |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Credit note id such as CN-2026-0001"
},
"greeting": {
"type": "string",
"description": "Opening line, default \"Hello\" plus the client name"
},
"sign_off": {
"type": "string",
"description": "Closing line, default your business name from the shared profile"
}
},
"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": {}
}Raise a purchase order to a supplier from items and return its PO number and totals. unit_price is in MAJOR units; currency, VAT and the buyer block come from the shared profile. Free: 5 documents a calendar month.
| Argument | Type | Description |
|---|---|---|
| items* | array | What is being ordered |
| notes | string | Free text printed under the totals, e.g. delivery address or terms |
| currency | string | Defaults to your business default currency |
| supplier* | string | Supplier name or client id. A name the invoice server already knows brings its address, email and VAT id onto the order |
| tax_rate | number | VAT percent for lines with no rate of their own. Defaults to the business default |
| issue_date | string | YYYY-MM-DD, defaults to today in your business profile's timezone |
| supplier_email | string | Only if the user gave it; otherwise the stored client's email is used |
| supplier_vat_id | string | Supplier VAT / tax registration id |
Remove one purchase order with nothing received and never rendered, freeing that month's slot. One with a receipt is refused, naming it. The PO number is never reissued. purchase_order_receive logs arrivals.
| Argument | Type | Description |
|---|---|---|
| id* | string | Purchase order id such as PO-2026-0001, or an exact supplier name |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Purchase order id such as PO-2026-0001, or an exact supplier name"
}
},
"additionalProperties": false
}Return one purchase order in full by id or exact supplier name: buyer and supplier blocks, every line with unit price and VAT, totals, the delivery date, status and every receipt with its date and note.
| Argument | Type | Description |
|---|---|---|
| id* | string | Purchase order id such as PO-2026-0001, or an exact supplier name |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Purchase order id such as PO-2026-0001, or an exact supplier name"
}
},
"additionalProperties": false
}List purchase orders newest first: id, supplier, order and expected delivery dates, status open, partially_received or received, currency, total and received date. Filter by status, supplier or date range.
| Argument | Type | Description |
|---|---|---|
| to | string | YYYY-MM-DD, latest order date |
| from | string | YYYY-MM-DD, earliest order date |
| status | string | Default "all" |
| supplier | string | Only orders to suppliers whose name contains this text |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"to": {
"type": "string",
"description": "YYYY-MM-DD, latest order date"
},
"from": {
"type": "string",
"description": "YYYY-MM-DD, earliest order date"
},
"status": {
"enum": [
"open",
"partially_received",
"received",
"all"
],
"type": "string",
"description": "Default \"all\""
},
"supplier": {
"type": "string",
"description": "Only orders to suppliers whose name contains this text"
}
},
"additionalProperties": false
}Call this tool to render one purchase order as an A4 print-ready document and return a download link valid for one hour: the invoice layout titled PURCHASE ORDER, with the buyer and supplier. Pro.
| Argument | Type | Description |
|---|---|---|
| id* | string | Purchase order id such as PO-2026-0001 |
| out_path | string | Name for the downloaded file, e.g. acme-credit. Defaults to the document id; the document comes back as a download link valid for one hour |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Purchase order id such as PO-2026-0001"
},
"out_path": {
"type": "string",
"description": "Name for the downloaded file, e.g. acme-credit. Defaults to the document id; the document comes back as a download link valid for one hour"
}
},
"additionalProperties": false
}Record that an order arrived. partial keeps it open and can be repeated, each receipt kept with its date and note; a full receipt closes it. An order already received, or a date before the order date, is refused.
| Argument | Type | Description |
|---|---|---|
| id* | string | Purchase order id such as PO-2026-0001 |
| date | string | YYYY-MM-DD, defaults to today |
| note | string | What arrived, e.g. "8 of 10 units, 2 back-ordered" |
| partial | boolean | True when only some of the order arrived. The order stays open and can be received again. Default false |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Purchase order id such as PO-2026-0001"
},
"date": {
"type": "string",
"description": "YYYY-MM-DD, defaults to today"
},
"note": {
"type": "string",
"maxLength": 10000,
"description": "What arrived, e.g. \"8 of 10 units, 2 back-ordered\""
},
"partial": {
"type": "boolean",
"description": "True when only some of the order arrived. The order stays open and can be received again. Default false"
}
},
"additionalProperties": false
}Turn a purchase order into a plain-text order to paste into an email: the line table, VAT lines, total, and a line asking the supplier to deliver by the date and quote the PO number. Also a .txt download link valid one hour. Free on every tier.
| Argument | Type | Description |
|---|---|---|
| id* | string | Purchase order id such as PO-2026-0001 |
| greeting | string | Opening line, default "Hello" plus the supplier name |
| sign_off | string | Closing line, default your business name from the shared profile |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Purchase order id such as PO-2026-0001"
},
"greeting": {
"type": "string",
"description": "Opening line, default \"Hello\" plus the supplier name"
},
"sign_off": {
"type": "string",
"description": "Closing line, default your business name from the shared profile"
}
},
"additionalProperties": false
}| discount_percent |
| number |
| Discount applied to every line, in percent |
| supplier_address | string | Postal address for the SUPPLIER block, newlines allowed |
| expected_delivery_date | string | YYYY-MM-DD, when the goods or work are due |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"supplier",
"items"
],
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"description",
"quantity",
"unit_price_minor"
],
"properties": {
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Only to state the line's currency; every line on one document must agree"
},
"quantity": {
"type": "number",
"maximum": 1000000000000,
"minimum": -1000000000000,
"description": "Units ordered, must be greater than zero",
"exclusiveMinimum": 0
},
"tax_rate": {
"type": "number",
"maximum": 1000,
"minimum": 0,
"description": "VAT percent for this line, overrides the business default"
},
"description": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "every line needs a description, 500 characters or fewer"
},
"unit_price_minor": {
"type": "integer",
"maximum": 1000000000000,
"minimum": 0,
"description": "Price per unit in MINOR units: 9000 = 90.00 EUR, 90 = JPY 90. Never a decimal"
}
},
"additionalProperties": false
},
"maxItems": 200,
"minItems": 1,
"description": "What is being ordered"
},
"notes": {
"type": "string",
"maxLength": 10000,
"description": "Free text printed under the totals, e.g. delivery address or terms"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Defaults to your business default currency"
},
"supplier": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Supplier name or client id. A name the invoice server already knows brings its address, email and VAT id onto the order"
},
"tax_rate": {
"type": "number",
"maximum": 1000,
"minimum": 0,
"description": "VAT percent for lines with no rate of their own. Defaults to the business default"
},
"issue_date": {
"type": "string",
"description": "YYYY-MM-DD, defaults to today in your business profile's timezone"
},
"supplier_email": {
"type": "string",
"maxLength": 320,
"description": "Only if the user gave it; otherwise the stored client's email is used"
},
"supplier_vat_id": {
"type": "string",
"maxLength": 64,
"description": "Supplier VAT / tax registration id"
},
"discount_percent": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Discount applied to every line, in percent"
},
"supplier_address": {
"type": "string",
"maxLength": 2000,
"description": "Postal address for the SUPPLIER block, newlines allowed"
},
"expected_delivery_date": {
"type": "string",
"description": "YYYY-MM-DD, when the goods or work are due"
}
},
"additionalProperties": false
}