purchase-order

Purchase orders for suppliers: VAT line items, a delivery date, an A4 PDF, mark received.

Should I use this

Quality & Safety

A
Description quality
99%
Schema completeness
94%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,360Tokens (tool definitions)
~1.5 KBTypical response size
Significant attention impact (2.63% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "purchase-order": {
      "command": "uvx",
      "args": [
        "https://github.com/theluckystrike/mcp-servers/releases/download/v0.21.0/billing-docs.mcpb"
      ]
    }
  }
}

Runnable packages

mcpbhttps://github.com/theluckystrike/mcp-servers/releases/download/v0.21.0/billing-docs.mcpb0.21.0stdio
mcpbhttps://github.com/theluckystrike/mcp-servers/releases/download/v0.22.0/billing-docs.mcpb0.22.0stdio

Remote endpoints

https://mcp.zovo.one/mcp/purchase-orderstreamable-http

What it can do

Tool inventory

Tools (16)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟡credit_note_create(invoice, reason, amount_minor, lines, issue_date, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "invoice": {
      "type": "string",
      "minLength": 1,
      "description": "The invoice number to credit, e.g. INV-2026-0001"
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 1000,
      "description": "Why the money is being given back, e.g. \"returned goods\" or \"billed twice\". Printed on the document"
    },
    "amount_minor": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "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"
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "line": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "description": "1-based position of the line on the invoice, as shown by invoice_get"
          },
          "quantity": {
            "type": "number",
            "minimum": -1000000000000,
            "maximum": 1000000000000,
            "exclusiveMinimum": 0,
            "description": "Credit only this many units. Defaults to the whole line"
          }
        },
        "required": [
          "line"
        ],
        "additionalProperties": false
      },
      "minItems": 1,
      "maxItems": 200,
      "description": "Credit only these invoice lines. Leave out with amount_minor for a full credit note"
    },
    "issue_date": {
      "type": "string",
      "description": "YYYY-MM-DD, defaults to today in your business profile's timezone"
    },
    "notes": {
      "type": "string",
      "maxLength": 10000,
      "description": "Free text printed under the totals"
    }
  },
  "required": [
    "invoice",
    "reason"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢credit_note_list(invoice, client, from, to)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "invoice": {
      "type": "string",
      "description": "Only credit notes issued against this invoice number"
    },
    "client": {
      "type": "string",
      "description": "Only credit notes for clients whose name contains this text"
    },
    "from": {
      "type": "string",
      "description": "YYYY-MM-DD, earliest issue date"
    },
    "to": {
      "type": "string",
      "description": "YYYY-MM-DD, latest issue date"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢credit_note_get(id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Credit note id such as CN-2026-0001, or an exact client name"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢credit_note_pdf(id, out_path)

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.

Input Schema

{
  "type": "object",
  "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"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢credit_note_text(id, greeting, sign_off)

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.

Input Schema

{
  "type": "object",
  "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"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴credit_note_delete(id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Credit note id such as CN-2026-0001, or an exact client name"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡purchase_order_create(supplier, items, currency, expected_delivery_date, issue_date, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "supplier": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Supplier name or client id. A name the invoice server already knows brings its address, email and VAT id onto the order"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "description": "every line needs a description, 500 characters or fewer"
          },
          "quantity": {
            "type": "number",
            "minimum": -1000000000000,
            "maximum": 1000000000000,
            "exclusiveMinimum": 0,
            "description": "Units ordered, must be greater than zero"
          },
          "unit_price_minor": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000000000000,
            "description": "Price per unit in MINOR units: 9000 = 90.00 EUR, 90 = JPY 90. Never a decimal"
          },
          "tax_rate": {
            "type": "number",
            "minimum": 0,
            "maximum": 1000,
            "description": "VAT percent for this line, overrides the business default"
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Za-z]{3}$",
            "description": "Only to state the line's currency; every line on one document must agree"
          }
        },
        "required": [
          "description",
          "quantity",
          "unit_price_minor"
        ],
        "additionalProperties": false
      },
      "minItems": 1,
      "maxItems": 200,
      "description": "What is being ordered"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "Defaults to your business default currency"
    },
    "expected_delivery_date": {
      "type": "string",
      "description": "YYYY-MM-DD, when the goods or work are due"
    },
    "issue_date": {
      "type": "string",
      "description": "YYYY-MM-DD, defaults to today in your business profile's timezone"
    },
    "discount_percent": {
      "type": "number",
      "minimum": 0,
      "maximum": 100,
      "description": "Discount applied to every line, in percent"
    },
    "tax_rate": {
      "type": "number",
      "minimum": 0,
      "maximum": 1000,
      "description": "VAT percent for lines with no rate of their own. Defaults to the business default"
    },
    "notes": {
      "type": "string",
      "maxLength": 10000,
      "description": "Free text printed under the totals, e.g. delivery address or terms"
    },
    "supplier_email": {
      "type": "string",
      "maxLength": 320,
      "description": "Only if the user gave it; otherwise the stored client's email is used"
    },
    "supplier_address": {
      "type": "string",
      "maxLength": 2000,
      "description": "Postal address for the SUPPLIER block, newlines allowed"
    },
    "supplier_vat_id": {
      "type": "string",
      "maxLength": 64,
      "description": "Supplier VAT / tax registration id"
    }
  },
  "required": [
    "supplier",
    "items"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢purchase_order_list(status, supplier, from, to)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "open",
        "partially_received",
        "received",
        "all"
      ],
      "description": "Default \"all\""
    },
    "supplier": {
      "type": "string",
      "description": "Only orders to suppliers whose name contains this text"
    },
    "from": {
      "type": "string",
      "description": "YYYY-MM-DD, earliest order date"
    },
    "to": {
      "type": "string",
      "description": "YYYY-MM-DD, latest order date"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢purchase_order_get(id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Purchase order id such as PO-2026-0001, or an exact supplier name"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢purchase_order_pdf(id, out_path)

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.

Input Schema

{
  "type": "object",
  "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"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢purchase_order_text(id, greeting, sign_off)

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.

Input Schema

{
  "type": "object",
  "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"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪purchase_order_receive(id, partial, date, note)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Purchase order id such as PO-2026-0001"
    },
    "partial": {
      "type": "boolean",
      "description": "True when only some of the order arrived. The order stays open and can be received again. Default false"
    },
    "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\""
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴purchase_order_delete(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.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Purchase order id such as PO-2026-0001, or an exact supplier name"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢billing_docs_report(from, to)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "description": "YYYY-MM-DD, earliest document date to count"
    },
    "to": {
      "type": "string",
      "description": "YYYY-MM-DD, latest document date to count"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢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.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪license_activate(key)

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",
  "properties": {
    "key": {
      "type": "string",
      "description": "License key from checkout, MCPL1.<payload>.<signature>"
    }
  },
  "required": [
    "key"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded16 tools
verifiedversion not recorded16 tools