Skip to main content
Glama

Cancel invoice

cancel_invoice
Destructive

Cancel a DRAFT invoice (status → Cancelled). Irreversible. Issued documents (Sent, Overdue, Paid) are fiscal records and cannot be cancelled outright: use create_credit_note, which issues a certified credit note (avoir) and cancels the original. Call with confirm:true to act; otherwise returns a preview.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
reasonNoCancellation reason, appended to the internal notes (max 500 characters).
confirmNoMust be true to cancel. Omit/false to preview only.
invoice_idYesThe draft invoice UUID to cancel.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idNoInvoice UUID.
noteNoNext-step guidance, present on preview responses.
typeNoDocument type: invoice, credit_note, provision or quote.
notesNoNotes printed on the document.
statusNoDocument status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired.
paid_atNoPayment timestamp (ISO 8601), null while unpaid.
previewNoTrue when the call was a preview (confirm omitted or false): nothing was changed.
sent_atNoIssue timestamp (ISO 8601), null while Draft.
currencyNoISO 4217 currency code (EUR, USD, GBP or CHF).
due_dateNoDue date, YYYY-MM-DD.
matter_idNoMatter (dossier) UUID, null when unassigned.
net_totalNoTotal excl. VAT, in the document currency.
tax_totalNoVAT amount, in the document currency.
amount_dueNoGross total minus applied provisions, null when not computed.
company_idNoClient company UUID.
created_atNoCreation timestamp (ISO 8601).
issue_dateNoIssue date, YYYY-MM-DD.
updated_atNoLast update timestamp (ISO 8601).
gross_totalNoTotal incl. VAT, in the document currency.
valid_untilNoQuote validity limit, YYYY-MM-DD; null for other types.
vat_scenarioNoFiscal scenario frozen at creation (e.g. domestic, eu_b2b_reverse_charge).
would_cancelNoInvoice that would be cancelled (preview only).
payment_termsNoPayment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt.
advances_totalNoSum of provisions applied, in the document currency.
created_sourceNoOrigin of the document: manual (app) or mcp (agent).
credit_note_idNoCredit note UUID that cancelled this invoice.
internal_notesNoPrivate notes, never printed.
invoice_numberNoHuman-readable document number.
invopop_statusNoFiscal certification status from the provider, null before issuance.
source_quote_idNoQuote UUID this invoice was converted from.
delivery_channelNoDelivery channel: Email, e-Invoice or Manual.
replaces_invoice_idNoOriginal invoice UUID when this is a rectificative.
replaced_by_invoice_idNoRectificative UUID when this invoice was rectified.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / invoice_id / description
      Previous value: -"The invoice UUID to cancel (not Paid)."New value: +"The draft invoice UUID to cancel."
  2. Changed3 schema fields changed
    • addedInput schema / properties / invoice_id / description
      Added value: +"The invoice UUID to cancel (not Paid)."
    • addedInput schema / properties / reason / description
      Added value: +"Cancellation reason, appended to the internal notes (max 500 characters)."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "advances_total": {
      +      "description": "Sum of provisions applied, in the document currency.",
      +      "type": "number"
      +    },
      +    "amount_due": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Gross total minus applied provisions, null when not computed."
      +    },
      +    "company_id": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Client company UUID."
      +    },
      +    "created_at": {
      +      "description": "Creation timestamp (ISO 8601).",
      +      "type": "string"
      +    },
      +    "created_source": {
      +      "description": "Origin of the document: manual (app) or mcp (agent).",
      +      "type": "string"
      +    },
      +    "credit_note_id": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Credit note UUID that cancelled this invoice."
      +    },
      +    "currency": {
      +      "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).",
      +      "type": "string"
      +    },
      +    "delivery_channel": {
      +      "description": "Delivery channel: Email, e-Invoice or Manual.",
      +      "type": "string"
      +    },
      +    "due_date": {
      +      "description": "Due date, YYYY-MM-DD.",
      +      "type": "string"
      +    },
      +    "gross_total": {
      +      "description": "Total incl. VAT, in the document currency.",
      +      "type": "number"
      +    },
      +    "id": {
      +      "description": "Invoice UUID.",
      +      "type": "string"
      +    },
      +    "internal_notes": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Private notes, never printed."
      +    },
      +    "invoice_number": {
      +      "description": "Human-readable document number.",
      +      "type": "string"
      +    },
      +    "invopop_status": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Fiscal certification status from the provider, null before issuance."
      +    },
      +    "issue_date": {
      +      "description": "Issue date, YYYY-MM-DD.",
      +      "type": "string"
      +    },
      +    "matter_id": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Matter (dossier) UUID, null when unassigned."
      +    },
      +    "net_total": {
      +      "description": "Total excl. VAT, in the document currency.",
      +      "type": "number"
      +    },
      +    "note": {
      +      "description": "Next-step guidance, present on preview responses.",
      +      "type": "string"
      +    },
      +    "notes": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Notes printed on the document."
      +    },
      +    "paid_at": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Payment timestamp (ISO 8601), null while unpaid."
      +    },
      +    "payment_terms": {
      +      "description": "Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt.",
      +      "type": "string"
      +    },
      +    "preview": {
      +      "description": "True when the call was a preview (confirm omitted or false): nothing was changed.",
      +      "type": "boolean"
      +    },
      +    "replaced_by_invoice_id": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Rectificative UUID when this invoice was rectified."
      +    },
      +    "replaces_invoice_id": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Original invoice UUID when this is a rectificative."
      +    },
      +    "sent_at": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Issue timestamp (ISO 8601), null while Draft."
      +    },
      +    "source_quote_id": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Quote UUID this invoice was converted from."
      +    },
      +    "status": {
      +      "description": "Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired.",
      +      "type": "string"
      +    },
      +    "tax_total": {
      +      "description": "VAT amount, in the document currency.",
      +      "type": "number"
      +    },
      +    "type": {
      +      "description": "Document type: invoice, credit_note, provision or quote.",
      +      "type": "string"
      +    },
      +    "updated_at": {
      +      "description": "Last update timestamp (ISO 8601).",
      +      "type": "string"
      +    },
      +    "valid_until": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Quote validity limit, YYYY-MM-DD; null for other types."
      +    },
      +    "vat_scenario": {
      +      "description": "Fiscal scenario frozen at creation (e.g. domestic, eu_b2b_reverse_charge).",
      +      "type": "string"
      +    },
      +    "would_cancel": {
      +      "additionalProperties": false,
      +      "description": "Invoice that would be cancelled (preview only).",
      +      "properties": {
      +        "gross_total": {
      +          "description": "Total incl. VAT, in the document currency.",
      +          "type": "number"
      +        },
      +        "id": {
      +          "description": "Document UUID.",
      +          "type": "string"
      +        },
      +        "invoice_number": {
      +          "description": "Human-readable document number.",
      +          "type": "string"
      +        },
      +        "status": {
      +          "description": "Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "id",
      +        "invoice_number",
      +        "status",
      +        "gross_total"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive, but the description adds critical behavioral context: the cancellation is irreversible, only draft invoices are eligible, issued documents are fiscal records, and calling without confirm:true only returns a preview. This meaningfully extends the structured annotation data and prevents misuse.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loads the core purpose and irreversibility, and then covers exclusions and invocation requirements in a few tight sentences. There is no filler or repetition; every sentence contributes essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with an output schema and annotations, the description covers all necessary behavioral context: scope, irreversibility, when not to use it, and the confirm flag semantics. No important operational detail is missing for an agent to decide and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents invoice_id, reason, and confirm. The description reinforces the confirm parameter's preview/act behavior but does not add significant information beyond what the schema provides, making the baseline score of 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action ('Cancel'), the target resource ('a DRAFT invoice'), and the resulting status ('Cancelled'). It distinguishes itself from create_credit_note by explicitly limiting cancellation to draft invoices and by stating that issued documents cannot be cancelled through this tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: use it only for draft invoices. It names the alternative create_credit_note for issued documents and explains the confirm:true preview/action pattern, leaving no ambiguity about invocation behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.