Kema Invoice
Server Details
Compliant invoicing for freelancers: create, issue and track invoices from your AI agent.
Glama couldn't complete the latest health check. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
- Status
- Unhealthy
- Uptime
- 75.0% over 21 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- Kema-Studio/kema-invoice-mcp
- GitHub Stars
- 0
- Server Listing
- Kema Invoice MCP connector
TDQS
Scored across 41 tools
Each tool targets a distinct resource-action pair (quotes, invoices, provisions, companies, profiles, settings, activity). Overlapping tools like cancel_invoice vs create_credit_note are clearly distinguished by status context, and specialized tools like rectify_invoice and reorder_invoice_items have unambiguous purposes.
All tools follow a consistent lowercase snake_case verb_noun pattern (e.g., create_invoice, list_companies, mark_invoice_paid). Even compound verbs like apply_provisions_to_invoice and list_available_provisions follow the same convention, with no mixed styles.
At 41 tools, the surface is large and exceeds the typical well-scoped range. While each tool covers a distinct aspect of invoicing, the count is heavy and may overwhelm agents; many operations could be consolidated (e.g., combined update/upsert for profiles, or grouped item operations).
The tool surface covers the full lifecycle for quotes (create, send, accept, reject, convert), invoices (create, issue, update, delete, cancel, credit note, rectify, mark paid, PDF, rectification chain), provisions (create, send, mark paid, apply), companies (CRUD), client profiles (get/upsert/delete), and supporting features (settings, revenue, activity, import). No obvious gaps exist for the stated domain.
Available Tools
41 toolsaccept_quoteAccept quoteADestructiveInspect
Mark a Sent quote as Accepted by the client. Follow up with convert_quote_to_invoice to bill it.
| Name | Required | Description | Default |
|---|---|---|---|
| quote_id | Yes | The Sent quote UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Quote UUID. |
| type | Yes | Document type: invoice, credit_note, provision or quote. |
| status | Yes | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| currency | Yes | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | Yes | Due date, YYYY-MM-DD. |
| net_total | Yes | Total excl. VAT, in the document currency. |
| tax_total | Yes | VAT amount, in the document currency. |
| issue_date | Yes | Issue date, YYYY-MM-DD. |
| gross_total | Yes | Total incl. VAT, in the document currency. |
| valid_until | Yes | Validity limit, YYYY-MM-DD. |
| invoice_number | Yes | Quote number (own series). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation already indicates destructiveHint=true and readOnlyHint=false. The description adds that it changes the quote's state to Accepted, which aligns with the destructive nature. This transparency is sufficient and consistent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no redundant information. It directly states the action and the recommended follow-up, making it highly efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and the simplicity of the operation, the description provides all necessary context for an agent to understand when and how to use the tool. It also names the related sibling tool for the next step, completing the workflow context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single required parameter quote_id is fully described in the schema as 'The Sent quote UUID.' No additional clarification is needed, and the parameter is straightforward and unambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: marking a Sent quote as Accepted. It also distinguishes it from sibling tools by referencing the follow-up convert_quote_to_invoice, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs when to use this tool (after a quote is sent and client accepts) and provides a direct next step (convert_quote_to_invoice). This gives clear guidance and routes the agent to the correct sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_invoice_itemAdd line item (draft)AInspect
Add a line item to a Draft invoice. Totals are recalculated automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| quantity | No | Quantity billed. Required for 'item' lines. | |
| tax_rate | No | OMIT - do NOT ask the user for a VAT rate. VAT is determined server-side by strict fiscal rules (default rate + automatic 0% for reverse-charge/export scenarios). Only set when the user explicitly states a rate, as a percent (0-100). | |
| line_type | No | Line kind: 'item' (billable, needs quantity and unit_price), 'section' (visual header) or 'description' (text-only sub-line). Defaults to 'item'. | |
| invoice_id | Yes | The Draft invoice UUID. | |
| unit_price | No | Unit price excl. VAT, in the invoice currency. Required for 'item' lines. | |
| description | Yes | Line text printed on the invoice (1-500 characters). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Line item UUID. |
| quantity | Yes | Quantity, null for section/description lines. |
| tax_rate | Yes | VAT rate in percent, null for non-item lines. |
| line_type | Yes | Line kind: item, section or description. |
| created_at | Yes | Creation timestamp (ISO 8601). |
| invoice_id | Yes | Parent invoice UUID. |
| line_total | Yes | Line total incl. VAT, null for non-item lines. |
| product_id | Yes | Linked product UUID, if any. |
| unit_price | Yes | Unit price excl. VAT, null for non-item lines. |
| updated_at | Yes | Last update timestamp (ISO 8601). |
| description | Yes | Line text. |
| tax_rate_key | Yes | VAT rate key (e.g. standard, reduced), null for non-item lines. |
| display_order | Yes | 0-based position on the document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that totals are recalculated automatically, adding some behavioral context beyond the annotations. It does not contradict the readOnlyHint=false or destructiveHint=false annotations, but could mention rejection behavior for non-Draft invoices.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The tool description is concise and front-loaded with the action and target. Parameter descriptions are informative without being bloated or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description and parameter metadata cover the operation well for a simple add-item workflow, including the Draft-invoice constraint and automatic recalculation. It does not explain error conditions, but an output schema exists so return details are not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Every parameter has a meaningful description, including conditional requirements (e.g., quantity and unit_price required for 'item' lines), enum semantics for line_type, and explicit guidance on tax_rate. This adds substantial clarity beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action ('Add a line item') and the target resource ('a Draft invoice'), distinguishing it from sibling tools like update_invoice_item, delete_invoice_item, and reorder_invoice_items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is only for Draft invoices and mentions automatic total recalculation, but it does not explicitly contrast with alternative tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_provisions_to_invoiceApply provisions to invoiceAInspect
Deduct one or more PAID provisions from a DRAFT final invoice of the same client (and of the same matter when one is attached). Updates the invoice's advances_total and amount_due. Reversible while the invoice is still Draft (remove_provision_from_invoice).
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | The Draft final invoice UUID. | |
| provision_ids | Yes | Paid provision UUIDs to apply (use list_available_provisions). |
Output Schema
| Name | Required | Description |
|---|---|---|
| amount_due | Yes | Gross total minus applied provisions, in the document currency. |
| advances_total | Yes | Sum of provisions now applied to the invoice, in the document currency. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the main side effects (updates advances_total and amount_due) and reversibility, which is helpful given the sparse annotations. It does not mention edge cases like duplicate applications or invalid invoice state, but the core behavior is transparent enough for correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, using three short sentences that cover purpose, effect, and reversibility without redundant wording. It is well-structured and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential invocation context: prerequisites (DRAFT, PAID, same client/matter), the effect on invoice totals, and the reversal path. With input schema coverage at 100% and an output schema present, no critical information is missing for correct use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully described in the schema: invoice_id is clearly identified as the Draft final invoice UUID, and provision_ids is described as Paid provision UUIDs with a direct pointer to list_available_provisions. No additional parameter explanation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (deduct provisions), the target (DRAFT final invoice), the constraints (PAID provisions, same client/matter), and the effect (updates advances_total and amount_due). It also distinguishes itself from the sibling remove_provision_from_invoice by explicitly naming it as the reversal operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage conditions: apply only PAID provisions to a DRAFT final invoice of the same client/matter. It also references list_available_provisions as the source for provision IDs and notes the operation is reversible via remove_provision_from_invoice, giving the agent sufficient guidance on when and how to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_invoiceCancel invoiceADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Cancellation reason, appended to the internal notes (max 500 characters). | |
| confirm | No | Must be true to cancel. Omit/false to preview only. | |
| invoice_id | Yes | The draft invoice UUID to cancel. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Invoice UUID. |
| note | No | Next-step guidance, present on preview responses. |
| type | No | Document type: invoice, credit_note, provision or quote. |
| notes | No | Notes printed on the document. |
| status | No | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| paid_at | No | Payment timestamp (ISO 8601), null while unpaid. |
| preview | No | True when the call was a preview (confirm omitted or false): nothing was changed. |
| sent_at | No | Issue timestamp (ISO 8601), null while Draft. |
| currency | No | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | No | Due date, YYYY-MM-DD. |
| matter_id | No | Matter (dossier) UUID, null when unassigned. |
| net_total | No | Total excl. VAT, in the document currency. |
| tax_total | No | VAT amount, in the document currency. |
| amount_due | No | Gross total minus applied provisions, null when not computed. |
| company_id | No | Client company UUID. |
| created_at | No | Creation timestamp (ISO 8601). |
| issue_date | No | Issue date, YYYY-MM-DD. |
| updated_at | No | Last update timestamp (ISO 8601). |
| gross_total | No | Total incl. VAT, in the document currency. |
| valid_until | No | Quote validity limit, YYYY-MM-DD; null for other types. |
| vat_scenario | No | Fiscal scenario frozen at creation (e.g. domestic, eu_b2b_reverse_charge). |
| would_cancel | No | Invoice that would be cancelled (preview only). |
| payment_terms | No | Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt. |
| advances_total | No | Sum of provisions applied, in the document currency. |
| created_source | No | Origin of the document: manual (app) or mcp (agent). |
| credit_note_id | No | Credit note UUID that cancelled this invoice. |
| internal_notes | No | Private notes, never printed. |
| invoice_number | No | Human-readable document number. |
| invopop_status | No | Fiscal certification status from the provider, null before issuance. |
| source_quote_id | No | Quote UUID this invoice was converted from. |
| delivery_channel | No | Delivery channel: Email, e-Invoice or Manual. |
| replaces_invoice_id | No | Original invoice UUID when this is a rectificative. |
| replaced_by_invoice_id | No | Rectificative UUID when this invoice was rectified. |
TDQS
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.
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.
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.
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.
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.
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.
check_certification_statusCheck certification status (maintenance)AInspect
Maintenance tool: refresh an issued document's fiscal certification state from the certification provider and reconcile it into the database. Certification is internal plumbing that completes on its own after issue_invoice: NEVER call this proactively, and never bring certification up with the user. Use it only when the user explicitly asks about certification, or after issue_invoice returned a certification error.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | The issued invoice UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| certification_code | Yes | Certification code returned by the provider, null until certified. |
| certification_status | No | Reconciled certification status: processing, certified or error. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: it performs an external provider refresh, reconciles into the database, is 'internal plumbing,' and normally completes automatically after issue_invoice. It also warns against proactive use and user-facing mention, which is critical behavioral guidance not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with 'Maintenance tool' and immediately states the purpose. Every sentence earns its place: purpose, internal plumbing context, explicit prohibitions, and exact usage conditions. There is no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single well-documented parameter, existing output schema, and annotations, the description is complete. It covers what the tool does, when to use it, when not to use it, and the context of normal operation (after issue_invoice), leaving no required guidance missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with invoice_id described as 'The issued invoice UUID.' The description does not add additional parameter-level detail beyond contextualizing it as the issued document whose certification is refreshed. This meets the baseline for full schema coverage but adds no extra semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'refresh an issued document's fiscal certification state from the certification provider and reconcile it into the database.' It clearly labels the tool as a maintenance tool and distinguishes it from normal business operations like issue_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is explicit and thorough: 'NEVER call this proactively, and never bring certification up with the user. Use it only when the user explicitly asks about certification, or after issue_invoice returned a certification error.' It names the related sibling (issue_invoice) and gives precise conditions for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_quote_to_invoiceConvert quote to invoiceAInspect
Create a new Draft invoice from an Accepted quote (line items copied, source_quote_id set for traceability). The invoice then follows the normal lifecycle (issue_invoice to make it legally binding). Call with confirm:true to apply; without it, returns a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to convert. Omit/false to preview only. | |
| quote_id | Yes | The Accepted quote UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Quote UUID. |
| note | No | Next-step guidance, present on preview responses. |
| type | No | Document type: invoice, credit_note, provision or quote. |
| status | No | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| preview | No | True when the call was a preview (confirm omitted or false): nothing was changed. |
| currency | No | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | No | Due date, YYYY-MM-DD. |
| net_total | No | Total excl. VAT, in the document currency. |
| tax_total | No | VAT amount, in the document currency. |
| issue_date | No | Issue date, YYYY-MM-DD. |
| gross_total | No | Total incl. VAT, in the document currency. |
| valid_until | No | Validity limit, YYYY-MM-DD. |
| would_convert | No | Quote that would be converted (preview only). |
| invoice_number | No | Quote number (own series). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the write effect of creating an invoice, the preview mode when confirm is false, and the lifecycle context. This goes well beyond the minimal annotations and provides clear expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with three short sentences that front-load the core purpose and then add necessary usage nuance. No unnecessary words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter schema and the presence of an output schema, the description covers the necessary context: source state, conversion behavior, preview/apply distinction, and the follow-up lifecycle step.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes both parameters well, including the Accepted quote UUID and the confirm behavior. The description largely repeats these details rather than adding new parameter-specific meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a new Draft invoice from an Accepted quote, with line items copied and source_quote_id set for traceability. This distinguishes it from related tools like create_invoice or accept_quote.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It specifies the prerequisite of an Accepted quote and explains the confirm:true behavior for applying vs previewing. It also points to issue_invoice for the next lifecycle step, though it does not explicitly contrast with create_invoice or reject_quote.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_companyCreate companyAInspect
Create a customer company for the tenant. A VAT/tax id is required later to bill it as B2B.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City. | |
| name | Yes | Company display name. | |
| No | Billing email address. | ||
| phone | No | Phone number, any format. | |
| siren | No | French SIREN, 9 digits. | |
| tax_id | No | VAT number, e.g. FR12345678901. | |
| country | No | ISO 3166-1 alpha-2 country code, e.g. FR. | |
| website | No | Website URL, including the scheme (https://). | |
| postal_code | No | Postal code. | |
| street_address | No | Street address (number and street). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Company UUID. |
| name | Yes | Display name. |
| Yes | Billing email. | |
| siren | Yes | French SIREN (9 digits). |
| tax_id | Yes | VAT number. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds meaningful behavioral context by clarifying that a VAT/tax id is not needed at creation time but will be required later for B2B billing. This supplements the annotations and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with the primary purpose front-loaded. There is no redundant information or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple flat parameter structure and presence of an output schema, the description provides sufficient context for correct usage, including the notable tax_id timing caveat.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all 10 parameters with 100% coverage. The description adds extra meaning to the tax_id parameter by explaining that it is required later for B2B billing, which is not evident from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action ('create') and the resource ('customer company for the tenant'), distinguishing it from sibling tools like update_company, get_company, list_companies, and delete_company.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The verb 'create' implies when to use the tool, and the note about tax_id being required later for B2B billing provides useful context. However, it does not explicitly mention alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_credit_noteCreate credit note + cancel invoice (LEGALLY BINDING)ADestructiveInspect
Cancel a Sent or Paid invoice by issuing a credit note (avoir). The credit note is a legal fiscal document (fiscally certified when the original was certified) and is IMMUTABLE once created. IRREVERSIBLE. ALWAYS get the user's explicit approval before calling with confirm:true. Without confirm, returns a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to create the credit note. Omit/false to preview. | |
| invoice_id | Yes | The Sent/Paid invoice to cancel with a credit note. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Outcome summary (after confirm:true). |
| preview | No | True when the call was a preview (confirm omitted or false): nothing was changed. |
| warning | No | Irreversibility warning (preview only). |
| credit_note_id | No | UUID of the created credit note (after confirm:true). |
| would_cancel_with_credit_note | No | Invoice that would be cancelled by a credit note (preview only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the credit note is IMMUTABLE and IRREVERSIBLE, and that it is LEGALLY BINDING. This goes beyond the destructiveHint annotation by adding specific legal and fiscal implications, fully informing the agent of consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet comprehensive, using clear formatting and capitalization for key warnings. Every sentence serves a purpose—purpose, legality, immutability, and confirmation requirement—without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description correctly avoids describing return values. It covers the operational context (preview vs. execute), eligibility (Sent/Paid), and legal consequences, making the tool fully understandable in isolation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are described with meaningful detail: invoice_id specifies 'Sent/Paid invoice' (eligible states), and confirm explains that true triggers creation, while false/omitted yields preview. This adds actionable semantics beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: cancel a Sent or Paid invoice by issuing a credit note. It specifies the target resource (invoice) and the mechanism (credit note/avoir), leaving no ambiguity about the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs that explicit user approval is required before calling with confirm:true, and explains that without confirm it returns a preview. This gives clear when-to-use and when-not-to-use guidance, including the legal caveat.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_invoiceCreate invoice (draft)AInspect
Create an invoice for a company, with line items. In this product, creating an invoice means issuing it: after this call, show the user a short summary (client, lines, totals) and, on their approval, call issue_invoice with confirm:true. Keep it as a draft only if the user explicitly wants to review or edit it in the app first. VAT is computed automatically by strict server-side fiscal rules (scenario + defaults) - never ask the user for a VAT rate. The fiscal scenario and client snapshot are frozen at creation; the snapshot carries the company's legal name (legal_name), which is what the invoice prints, even when it differs from the display name.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Line items in display order (1-100). | |
| notes | No | Free text printed on the invoice (max 2000 characters). | |
| currency | No | ISO 4217 currency code. Defaults to EUR. | |
| due_date | Yes | Due date, YYYY-MM-DD, on or after issue_date. | |
| company_id | Yes | Customer company UUID (use list_companies to resolve). | |
| issue_date | Yes | Issue date, YYYY-MM-DD. | |
| payment_terms | No | Payment terms printed on the invoice. Defaults to the client profile or Net-30. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Invoice UUID. |
| type | Yes | Document type: invoice, credit_note, provision or quote. |
| notes | Yes | Notes printed on the document. |
| status | Yes | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| paid_at | Yes | Payment timestamp (ISO 8601), null while unpaid. |
| sent_at | Yes | Issue timestamp (ISO 8601), null while Draft. |
| currency | Yes | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | Yes | Due date, YYYY-MM-DD. |
| matter_id | Yes | Matter (dossier) UUID, null when unassigned. |
| net_total | Yes | Total excl. VAT, in the document currency. |
| tax_total | Yes | VAT amount, in the document currency. |
| amount_due | Yes | Gross total minus applied provisions, null when not computed. |
| company_id | Yes | Client company UUID. |
| created_at | Yes | Creation timestamp (ISO 8601). |
| issue_date | Yes | Issue date, YYYY-MM-DD. |
| updated_at | Yes | Last update timestamp (ISO 8601). |
| gross_total | Yes | Total incl. VAT, in the document currency. |
| valid_until | Yes | Quote validity limit, YYYY-MM-DD; null for other types. |
| vat_scenario | Yes | Fiscal scenario frozen at creation (e.g. domestic, eu_b2b_reverse_charge). |
| payment_terms | Yes | Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt. |
| advances_total | Yes | Sum of provisions applied, in the document currency. |
| created_source | Yes | Origin of the document: manual (app) or mcp (agent). |
| credit_note_id | Yes | Credit note UUID that cancelled this invoice. |
| internal_notes | Yes | Private notes, never printed. |
| invoice_number | Yes | Human-readable document number. |
| invopop_status | Yes | Fiscal certification status from the provider, null before issuance. |
| source_quote_id | Yes | Quote UUID this invoice was converted from. |
| delivery_channel | Yes | Delivery channel: Email, e-Invoice or Manual. |
| replaces_invoice_id | Yes | Original invoice UUID when this is a rectificative. |
| replaced_by_invoice_id | Yes | Rectificative UUID when this invoice was rectified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, destructiveHint=false), so the description carries the full burden. It discloses critical behavior: creation means issuance, drafts are opt-in, VAT is server-computed, and the fiscal scenario/client snapshot is frozen at creation with legal_name used for printing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and workflow, then adds dense but relevant caveats about drafts, VAT, and snapshot freezing. Every sentence earns its place with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 7-parameter schema, output schema, and many sibling tools, the description covers what an agent needs to call the tool correctly: the approval flow, draft condition, VAT rules, and snapshot semantics. Remaining details like date format and enums are already in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema, especially around tax_rate ('never ask the user for a VAT rate') and the legal_name snapshot behavior that affects what appears on the invoice.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('create an invoice for a company, with line items') and immediately clarifies the key product nuance: creating means issuing, with a draft only when explicitly requested. This distinguishes it from sibling tools like issue_invoice and create_quote.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit workflow guidance: show the user a summary after the call and call issue_invoice with confirm:true on approval, while keeping a draft only when the user wants to review/edit first. It also tells the agent what not to do: never ask for a VAT rate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_provisionCreate provision (Draft)AInspect
Create a provision document (avance sur honoraires, retainer) in Draft status for a company, optionally attached to a matter. NOT issued or certified - use send_provision for the legal issuance. VAT is computed automatically by strict server-side fiscal rules - never ask the user for a VAT rate. Provisions use their own PROV number series and, once paid, become a client credit deductible from the final invoice (apply_provisions_to_invoice).
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Line items in display order (1-100). | |
| notes | No | Free text printed on the provision (max 2000 characters). | |
| currency | No | ISO 4217 currency code. Defaults to EUR. | |
| due_date | Yes | Due date, YYYY-MM-DD, on or after issue_date. | |
| matter_id | No | Matter UUID to attach the retainer to; omit for a standalone retainer, which is the normal case in Kema Invoice. | |
| company_id | Yes | Customer company UUID (use list_companies to resolve). | |
| issue_date | Yes | Issue date, YYYY-MM-DD. | |
| payment_terms | No | Payment terms printed on the provision. Defaults to 'Due on Receipt'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Invoice UUID. |
| type | Yes | Document type: invoice, credit_note, provision or quote. |
| notes | Yes | Notes printed on the document. |
| status | Yes | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| paid_at | Yes | Payment timestamp (ISO 8601), null while unpaid. |
| sent_at | Yes | Issue timestamp (ISO 8601), null while Draft. |
| currency | Yes | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | Yes | Due date, YYYY-MM-DD. |
| matter_id | Yes | Matter (dossier) UUID, null when unassigned. |
| net_total | Yes | Total excl. VAT, in the document currency. |
| tax_total | Yes | VAT amount, in the document currency. |
| amount_due | Yes | Gross total minus applied provisions, null when not computed. |
| company_id | Yes | Client company UUID. |
| created_at | Yes | Creation timestamp (ISO 8601). |
| issue_date | Yes | Issue date, YYYY-MM-DD. |
| updated_at | Yes | Last update timestamp (ISO 8601). |
| gross_total | Yes | Total incl. VAT, in the document currency. |
| valid_until | Yes | Quote validity limit, YYYY-MM-DD; null for other types. |
| vat_scenario | Yes | Fiscal scenario frozen at creation (e.g. domestic, eu_b2b_reverse_charge). |
| payment_terms | Yes | Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt. |
| advances_total | Yes | Sum of provisions applied, in the document currency. |
| created_source | Yes | Origin of the document: manual (app) or mcp (agent). |
| credit_note_id | Yes | Credit note UUID that cancelled this invoice. |
| internal_notes | Yes | Private notes, never printed. |
| invoice_number | Yes | Human-readable document number. |
| invopop_status | Yes | Fiscal certification status from the provider, null before issuance. |
| source_quote_id | Yes | Quote UUID this invoice was converted from. |
| delivery_channel | Yes | Delivery channel: Email, e-Invoice or Manual. |
| replaces_invoice_id | Yes | Original invoice UUID when this is a rectificative. |
| replaced_by_invoice_id | Yes | Rectificative UUID when this invoice was rectified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false. The description adds meaningful behavioral context beyond those: VAT is computed server-side, provisions use their own number series, and once paid they become a client credit. This gives the agent insight into side effects and constraints not covered by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact paragraph with no redundancy. Each sentence adds a distinct piece of information: purpose, state, VAT rule, and number series. It is front-loaded with the core action and efficiently packs constraints without verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (8 params, 4 required, nested items), the description covers the full workflow context: draft creation, VAT handling, matter attachment, and relationship to sibling tools (send_provision, list_companies). Since an output schema exists, return values need not be explained. The description is complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers all parameters with descriptions, but the description adds extra semantics: tax_rate is explicitly flagged as 'OMIT - do NOT ask' with conditions for setting, and matter_id is noted as 'omit for a standalone retainer, normal case.' These go beyond the schema and improve parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool creates a provision document in Draft status for a company, optionally attached to a matter, and explicitly distinguishes it from sending (use send_provision). The verb 'Create' and resource 'provision' are specific, and the mention of 'NOT issued or certified' removes ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when NOT to use this tool (for issuing) and directs to send_provision. It also instructs the agent to never ask for a VAT rate, explaining when to set tax_rate (only when user explicitly states). These are clear, actionable instructions with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_quoteCreate quote (draft)AInspect
Create a Draft quote (devis) for a company. Quotes are not fiscal documents - no certification. Dates default server-side (issue today, due/valid +30 days). Requires a matter id (dossier) the quote belongs to.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Line items in display order (1-100). | |
| notes | No | Free text printed on the quote (max 2000 characters). | |
| currency | No | ISO 4217 currency code. Defaults to EUR. | |
| due_date | No | Due date, YYYY-MM-DD. Defaults to +30 days. | |
| matter_id | No | Optional matter (dossier) UUID the quote belongs to. | |
| company_id | Yes | The client company UUID. | |
| issue_date | No | Issue date, YYYY-MM-DD. Defaults to today. | |
| valid_until | No | Quote validity limit, YYYY-MM-DD. Defaults to +30 days. | |
| payment_terms | No | Payment terms printed on the quote. Defaults to Net-30. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Quote UUID. |
| type | Yes | Document type: invoice, credit_note, provision or quote. |
| status | Yes | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| currency | Yes | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | Yes | Due date, YYYY-MM-DD. |
| net_total | Yes | Total excl. VAT, in the document currency. |
| tax_total | Yes | VAT amount, in the document currency. |
| issue_date | Yes | Issue date, YYYY-MM-DD. |
| gross_total | Yes | Total incl. VAT, in the document currency. |
| valid_until | Yes | Validity limit, YYYY-MM-DD. |
| invoice_number | Yes | Quote number (own series). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses useful server-side defaults for issue/due/valid dates and the non-certification nature of quotes. However, it does not describe side effects, validation behavior, or the fact that the created quote remains a draft (beyond the title), and it contains an inaccurate 'requires a matter id' claim.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded, and contains no redundant wording. It conveys the most important facts in two sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, return values need not be explained, but the description omits guidance on related workflow steps (e.g., send/accept/convert) and contains a requirement contradiction with the schema. It is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all parameters in detail, and the description adds only default-date behavior. It incorrectly claims a matter id is required when the schema marks matter_id as optional, which undermines parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the core action clearly: 'Create a Draft quote (devis) for a company.' It also distinguishes quotes from fiscal documents, making the tool's purpose easy to understand.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives some guidance by noting the draft state and that quotes are not fiscal documents, but it does not explicitly contrast this with related sibling tools such as send_quote or convert_quote_to_invoice, nor does it state when to prefer this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_companyDelete companyADestructiveInspect
Soft-delete a client company. Blocked when contacts are still linked to it. Call with confirm:true to delete; without it, returns a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to delete. Omit/false to preview only. | |
| company_id | Yes | The company UUID to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Deleted company UUID (after confirm:true). |
| note | No | Next-step guidance, present on preview responses. |
| preview | No | True when the call was a preview (confirm omitted or false): nothing was changed. |
| would_delete | No | Company that would be deleted (preview only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds valuable behavior: it's a soft-delete (reversible), it has a two-phase preview/confirm flow, and it is blocked under certain conditions. This significantly exceeds what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, then the blocking condition and confirm behavior. Zero filler and each clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return format is covered. The description covers the essential behavioral details: soft-delete, blocking condition, and the preview/confirm mechanism. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters already have clear descriptions (company_id as UUID, confirm with its preview/delete semantics). The tool description adds no new parameter meaning beyond restating the confirm behavior, so it stays at the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'soft-delete' and identifies the resource as a 'client company', which immediately distinguishes it from other delete tools like delete_invoice. It also states the blocking condition (contacts linked), adding precision beyond a generic 'delete'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the prerequisite condition: deletion is blocked when contacts are still linked. This gives an agent guidance on when the operation will fail, though it doesn't explicitly name alternatives or contrast with other delete tools. The confirm:true requirement is also a clear usage guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_invoiceDelete invoice (draft)ADestructiveInspect
Soft-delete a Draft invoice. Irreversible from the user's view. Call with confirm:true to actually delete; without it, returns a preview of what would be deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to delete. Omit/false to preview only. | |
| invoice_id | Yes | The Draft invoice UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Deleted invoice UUID (after confirm:true). |
| note | No | Next-step guidance, present on preview responses. |
| preview | No | True when the call was a preview (confirm omitted or false): nothing was changed. |
| would_delete | No | Invoice that would be deleted (preview only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description reveals that the operation is 'Irreversible from the user's view' and details the confirmation step, providing additional transparency about the side effects and safety mechanism.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, using two sentences to convey the primary action, the specific condition (Draft), and the confirm behavior. It is well-structured and free of unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description gives sufficient context for the operation, including the preview behavior and irreversibility. It does not mention what happens for non-Draft invoices, but that is not essential for completing the task, and the output schema provides return information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters (invoice_id and confirm) have complete descriptions in the schema, covering their meanings and usage. The tool description does not add extra semantic detail beyond what is already provided in the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it soft-deletes a Draft invoice, specifying the exact verb and resource. This distinguishes it from sibling tools like cancel_invoice or delete_invoice_item, and the condition 'Draft' further narrows its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly mentions the condition 'Draft' and explains the preview vs. actual delete behavior via the confirm flag. While it doesn't directly compare to alternatives like cancel_invoice, the condition and behavior are sufficient for an agent to decide when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_invoice_client_profileDelete client billing profileADestructiveInspect
Remove a company's invoicing defaults (the company itself is untouched). Call with confirm:true to actually delete; without it, returns a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to delete. Omit/false to preview only. | |
| company_id | Yes | Company UUID whose billing profile is deleted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Next-step guidance, present on preview responses. |
| deleted | No | True once the profile is deleted (after confirm:true). |
| preview | No | True when the call was a preview (confirm omitted or false): nothing was changed. |
| company_id | No | Company UUID the profile belonged to (after confirm:true). |
| would_delete | No | Profile that would be deleted (preview only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructive nature is disclosed through annotations and reinforced by the description, which also clarifies that only the billing profile is affected and the company remains intact. The confirm flag behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no superfluous content. The essential information about destructive scope and confirmation requirement is delivered efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with a confirmation parameter, the description covers the action, the scope limitation, and the exact usage of the confirm flag. It is self-contained and sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully described in the schema, and the description adds crucial behavioral meaning to confirm by explaining the actual-delete vs preview distinction. This goes beyond the schema's basic 'Must be true to delete' explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool removes a company's invoicing defaults and explicitly notes the company itself is untouched, distinguishing it from delete_company. The verb and resource are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to call with confirm:true to actually delete and without it to preview, providing direct usage guidance for the key parameter. This leaves no ambiguity about how to invoke the destructive action safely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_invoice_itemDelete line item (draft)ADestructiveInspect
Remove a line item from a Draft invoice. Totals are recalculated automatically. Item ids come from get_invoice or add_invoice_item. Call with confirm:true to delete; without it, returns a preview of the item.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to delete. Omit/false to preview only. | |
| item_id | Yes | The line item UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Deleted line item UUID (after confirm:true). |
| note | No | Next-step guidance, present on preview responses. |
| preview | No | True when the call was a preview (confirm omitted or false): nothing was changed. |
| would_delete | No | Line item that would be deleted (preview only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the destructiveHint annotation by explaining that totals are recalculated automatically, that item IDs come from get_invoice/add_invoice_item, and that confirm:true is required for actual deletion while omission returns a preview.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and logically ordered: action, automatic side effect, ID source, and confirmation requirement. No redundant or vague wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the key workflow aspects including deletion guard and preview return, but does not explicitly state the success return shape or error scenarios, though the preview mention gives partial output context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully described in the schema, and the description adds practical context for item_id sourcing and the boolean confirm semantics (delete vs preview).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the specific action 'Remove a line item from a Draft invoice', identifies the source of item IDs, and explains the confirm/preview behavior, which distinguishes it from related invoice/item tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear conditions for use (Draft invoices only) and explains the confirm flag behavior, but does not explicitly contrast with sibling tools such as update_invoice_item or delete_invoice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_companyGet companyARead-onlyInspect
Fetch one customer company with the full billing-relevant record: legal identity, VAT/SIREN, address, contact details, and client profile classification.
| Name | Required | Description | Default |
|---|---|---|---|
| company_id | Yes | Company UUID (use list_companies to resolve). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Company UUID. |
| city | Yes | City. |
| name | Yes | Display name. |
| Yes | Billing email. | |
| phone | Yes | Phone number. |
| siren | Yes | French SIREN (9 digits). |
| state | Yes | State or region. |
| tax_id | Yes | VAT number. |
| country | Yes | ISO 3166-1 alpha-2 country code. |
| website | Yes | Website URL. |
| legal_name | Yes | Registered legal name, when different from name. |
| postal_code | Yes | Postal code. |
| account_type | Yes | CRM account type. |
| account_status | Yes | CRM account status. |
| client_profile | Yes | Client classification: pm (legal entity), pp_pro (sole trader) or consumer. |
| street_address | Yes | Street address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with the readOnlyHint annotation ('Fetch' implies no side effects) and openWorldHint=false. It discloses the scope of returned data, and no contradictions exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, front-loaded with the action and resource, and includes necessary details without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values are defined externally. The description lists key fields included, and for a read-only operation with a closed world hint, no additional context (like error cases or permissions) is necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter company_id has a helpful description including format (UUID) and a cross-reference to list_companies for resolution. This fully covers the required parameter with additional context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches one customer company, with a specific verb and resource. It lists the included data fields (legal identity, VAT/SIREN, etc.), distinguishing it from list_companies (multiple) and update_company (modify).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a single company by ID, and the parameter hint 'use list_companies to resolve' gives guidance. However, it does not explicitly contrast with list_companies or other retrieval tools, leaving some room for ambiguity in a large sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoiceGet invoiceARead-onlyInspect
Fetch a single invoice by id, including its line items, client, and totals. Returns null-shaped error if the invoice is not visible to the caller.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | The invoice UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Invoice UUID. |
| type | Yes | Document type: invoice, credit_note, provision or quote. |
| items | Yes | Line items in display order. |
| notes | Yes | Notes printed on the invoice. |
| status | Yes | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| company | Yes | Client company name, null when unknown. |
| paid_at | Yes | Payment timestamp (ISO 8601), null while unpaid. |
| currency | Yes | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | Yes | Due date, YYYY-MM-DD. |
| net_total | Yes | Total excl. VAT, in the document currency. |
| tax_total | Yes | VAT amount, in the document currency. |
| issue_date | Yes | Issue date, YYYY-MM-DD. |
| gross_total | Yes | Total incl. VAT, in the document currency. |
| payment_terms | Yes | Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt. |
| invoice_number | Yes | Human-readable invoice number. |
| certification_error | Yes | Last certification error message, null when none. |
| certification_status | Yes | Fiscal certification status (e.g. processing, certified, error), null before issuance. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds a useful behavioral detail: it returns a null-shaped error if the invoice is not visible to the caller, and it specifies the returned content (line items, client, totals). This goes beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that is front-loaded with the core action and scope, with no wasted words. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-id operation with an output schema present, the description covers the essential return content and error behavior. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the only parameter (invoice_id) is fully documented in the schema with its type and description. The tool description adds no additional meaning about the parameter, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Fetch), resource (a single invoice by id), and scope (including line items, client, and totals). It clearly distinguishes from siblings like list_invoices (plural) and get_invoice_pdf (PDF output).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you have an invoice id and want the full invoice object, but it does not explicitly mention alternatives or when not to use it. No sibling routing or exclusionary context is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoice_client_profileGet client billing profileARead-onlyInspect
Per-company invoicing defaults (payment terms, delivery channel, custom invoice prefix). Returns {profile: null} when the company has none - profiles are created lazily.
| Name | Required | Description | Default |
|---|---|---|---|
| company_id | Yes | Company UUID (use list_companies to resolve). |
Output Schema
| Name | Required | Description |
|---|---|---|
| profile | Yes | The company's billing profile, null when none exists yet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that profiles are created lazily and returns {profile: null} when none exists. This adds behavioral context that is not present in the annotations or schema, helping the agent anticipate edge cases without contradicting the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that front-loads the core purpose and then adds the null-return nuance in a second short sentence. There is no redundant information, and every phrase contributes to understanding the tool's behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only one parameter, a clear output schema, and the description covering the null case and lazy creation, the tool is fully specified for an agent to call correctly. The description adds essential context (lazy creation) that is not inferable from the schema or annotations, making it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage for company_id, including a description referencing list_companies for resolution. The description does not add any extra parameter-specific semantics beyond what the schema already documents, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves per-company invoicing defaults (payment terms, delivery channel, custom invoice prefix), which is specific and distinct from sibling tools like get_company or get_invoice. It also clarifies the return value when no profile exists, removing ambiguity about behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for reading invoicing defaults per company but does not explicitly contrast with alternatives such as upsert_invoice_client_profile or delete_invoice_client_profile. While the context suggests it is the read-only counterpart, the description lacks explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoice_pdfGet invoice PDF linkARead-onlyInspect
Return a temporary (1 hour) signed download URL for an invoice's PDF. Works for any document visible to the caller: imported invoices return their uploaded file; invoices issued in Kema Invoice (by the app or an agent) are rendered server-side with the workspace branding and, once certified, embed the Factur-X XML. Drafts render too (flagged is_draft: true) but are not legal documents yet.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | The invoice UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | Signed download URL, present when available is true. |
| reason | No | Why the PDF could not be produced and what to do next, present when available is false. |
| is_draft | Yes | True when the document is still a Draft: the PDF is a preview, not a legal document. |
| available | Yes | True when a download URL is returned; false only when the PDF could not be produced. |
| invoice_number | Yes | Document number, handy to name the downloaded file. |
| expires_in_seconds | No | Lifetime of the signed URL in seconds, present when available is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals no mutation, and the description adds meaningful behavioral details: server-side rendering, workspace branding, Factur-X embedding for certified invoices, draft behavior, and a 1-hour expiry. No side effects or auth details are mentioned, but the provided information is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise, information-dense sentences with no redundant content. Each sentence adds a distinct piece of value: the core return value, behavior by invoice type, and draft handling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers key edge cases (imported vs. issued, drafts, certification) and describes the output nature. Since an output schema is present, the lack of explicit return-value details is acceptable, though error conditions are not mentioned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter invoice_id is documented in the schema, and the description adds context about invoice visibility and applicability to drafts and issued documents. This makes the parameter's role clear beyond the minimal schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns a temporary signed download URL for an invoice PDF, with a specific action and resource. It distinguishes itself from get_invoice by focusing on the PDF artifact rather than invoice data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides situational guidance: works for any visible document, explains differing behavior for imported vs. issued invoices, and clarifies how drafts are handled. It does not explicitly compare to sibling get_invoice, but the context makes the appropriate use case clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rectification_linksGet rectification linksARead-onlyInspect
For one invoice, return the rectification chain: the original it replaces (if it is a rectificative) and/or the rectificative that replaced it (if it was rectified). Both null when the invoice is not part of a chain.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | The invoice UUID to inspect. |
Output Schema
| Name | Required | Description |
|---|---|---|
| replaces | Yes | Original invoice this one rectifies, null when not a rectificative. |
| replacedBy | Yes | Rectificative that superseded this invoice, null when not rectified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the key behavior of returning null for both fields when the invoice is not part of a chain, which goes beyond the readOnlyHint annotation. It does not mention error handling or edge cases, but for a simple read operation the null-return behavior is sufficient transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single well-structured sentence with no redundant words. It efficiently conveys the purpose and output conditions without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the output semantics (original and replacement links, with null behavior) but does not mention the output schema structure or error cases. Since the tool has an output schema (per context signals) that is not shown, the description leaves a small gap about the exact return format. Overall, it is mostly complete for a simple read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter invoice_id has a clear description ('The invoice UUID to inspect') and a precise format with a regex pattern. This fully explains the parameter's meaning and constraints, achieving 100% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: to return the rectification chain for a given invoice, explicitly defining the original and replacement links. This is unambiguous and distinct from sibling tools like rectify_invoice (which modifies) and get_invoice (which retrieves invoice details).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool returns and the conditions under which outputs are null, but it does not explicitly state when to use this tool versus alternatives. It implies usage when needing to inspect rectification links, but lacks direct guidance on when not to use it or which sibling would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_revenue_summaryGet revenue summaryARead-onlyInspect
Aggregate revenue figures: collected in the period (by payment date), current outstanding and overdue (point-in-time), documents issued in the period, draft count, and net credit-note effect. Defaults to the current month.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Period end (inclusive), YYYY-MM-DD. Defaults to today. | |
| from | No | Period start, YYYY-MM-DD. Defaults to the 1st of the current month. |
Output Schema
| Name | Required | Description |
|---|---|---|
| period | Yes | Period the collected/issued figures cover. |
| overdue | Yes | Amount currently due on Overdue invoices (point-in-time). |
| collected | Yes | Gross total of invoices paid within the period (by payment date). |
| draft_count | Yes | Current number of drafts. |
| outstanding | Yes | Amount currently due on Sent invoices (point-in-time). |
| currency_note | Yes | Caveat about amounts being summed across currencies. |
| invoice_count | Yes | Documents issued within the period, drafts excluded. |
| overdue_count | Yes | Number of Overdue invoices. |
| collected_count | Yes | Number of invoices paid within the period. |
| credit_note_total | Yes | Net effect of credit notes issued within the period (negative or zero). |
| outstanding_count | Yes | Number of Sent invoices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates the operation is safe, so the bar is lower. The description adds useful behavioral details beyond the annotation, such as the period applying to payment dates for collected figures and point-in-time evaluation for outstanding/overdue, and the default to the current month. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, forming two sentences with a colon-delimited list of metrics. It is efficient and avoids fluff, though the first sentence is dense with multiple comma-separated items, making it slightly harder to parse quickly than a more structured list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to detail return values. It covers the primary context: aggregate figures, the metrics included, and the default time period. It does not mention potential edge cases (e.g., empty periods, timezone handling), but these are not critical for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers both parameters with descriptions (period start/end, inclusive, defaults). The tool description adds context about how these parameters affect the different metrics (e.g., collected by payment date, outstanding point-in-time), which slightly enriches the parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool aggregates revenue figures and enumerates the specific metrics (collected, outstanding, overdue, documents issued, draft count, net credit-note effect). This distinguishes it from sibling tools like list_invoices or get_invoice, which return raw records rather than summaries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (for summary-level revenue metrics over a period) but does not explicitly mention alternatives or when not to use it. The context is clear enough from the aggregate nature and the default period, but it lacks explicit disambiguation from similar reporting tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_settingsGet settings (read-only)ARead-onlyInspect
Read-only snapshot of the tenant's invoicing settings: legal identity, fiscal country and regime, default VAT rate and payment terms, billing email, and the caller's UI language. Settings can only be CHANGED from the app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tax_id | Yes | Tenant VAT number. |
| legal_form | Yes | Legal form (e.g. SAS, SARL, EI). |
| legal_name | Yes | Registered legal name of the tenant. |
| tax_regime | Yes | VAT regime: normal or franchise_en_base. |
| tax_country | Yes | Fiscal country, ISO 3166-1 alpha-2. |
| display_name | Yes | Tenant display name. |
| billing_email | Yes | Email printed on documents. |
| preferred_language | Yes | Caller's UI language (ISO 639-1). |
| default_vat_rate_key | Yes | Default VAT rate key applied to new lines. |
| default_payment_terms | Yes | Default payment terms for new documents. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals no side effects, and the description reinforces this by repeating 'read-only' and adding that changes must happen in the app. No rate limits or auth details are given, but the annotation lowers the bar for additional behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no redundancy. It front-loads the read-only nature and then lists the included setting categories, providing maximum information in minimal space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete enough for a zero-parameter read-only tool: it names the resource (tenant invoicing settings) and the main content areas. It does not detail the output schema, but the absence of parameters and the clear snapshot framing make the behavior predictable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so no parameter-level documentation is needed. The baseline for zero-parameter tools is 4, and the description gives sufficient context about what the returned settings snapshot will contain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as retrieving a read-only snapshot of tenant invoicing settings and enumerates the specific categories included. The title further reinforces this by naming the operation and its read-only nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it—when a read-only view of settings is needed—and explicitly notes that settings can only be changed from the app, which directs users away from attempting modifications via the API. It does not explicitly contrast with sibling tools, but the unique scope makes misuse unlikely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_external_invoiceImport external invoiceAInspect
Import a historical/external invoice with its OWN invoice number (kept verbatim), totals, and status - no line items. Use for migrating past invoices issued outside Kema Invoice; NOT for creating new invoices (use create_invoice).
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Free text kept with the imported record (max 2000 characters). | |
| status | Yes | Status of the historical invoice as it stands today. | |
| currency | No | ISO 4217 currency code. Defaults to EUR. | |
| due_date | No | Due date, YYYY-MM-DD. Defaults to issue_date + 30 days. | |
| company_id | No | Client company UUID (use list_companies to resolve); null or omitted when unknown. | |
| issue_date | Yes | Original issue date, YYYY-MM-DD. | |
| net_amount | Yes | Total excl. VAT. | |
| tax_amount | No | VAT amount. Defaults to 0. | |
| gross_amount | No | Total incl. VAT. Defaults to net + tax. | |
| invoice_number | Yes | The external number, kept as-is. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Invoice UUID. |
| type | Yes | Document type: invoice, credit_note, provision or quote. |
| notes | Yes | Notes printed on the document. |
| status | Yes | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| paid_at | Yes | Payment timestamp (ISO 8601), null while unpaid. |
| sent_at | Yes | Issue timestamp (ISO 8601), null while Draft. |
| currency | Yes | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | Yes | Due date, YYYY-MM-DD. |
| matter_id | Yes | Matter (dossier) UUID, null when unassigned. |
| net_total | Yes | Total excl. VAT, in the document currency. |
| tax_total | Yes | VAT amount, in the document currency. |
| amount_due | Yes | Gross total minus applied provisions, null when not computed. |
| company_id | Yes | Client company UUID. |
| created_at | Yes | Creation timestamp (ISO 8601). |
| issue_date | Yes | Issue date, YYYY-MM-DD. |
| updated_at | Yes | Last update timestamp (ISO 8601). |
| gross_total | Yes | Total incl. VAT, in the document currency. |
| valid_until | Yes | Quote validity limit, YYYY-MM-DD; null for other types. |
| vat_scenario | Yes | Fiscal scenario frozen at creation (e.g. domestic, eu_b2b_reverse_charge). |
| payment_terms | Yes | Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt. |
| advances_total | Yes | Sum of provisions applied, in the document currency. |
| created_source | Yes | Origin of the document: manual (app) or mcp (agent). |
| credit_note_id | Yes | Credit note UUID that cancelled this invoice. |
| internal_notes | Yes | Private notes, never printed. |
| invoice_number | Yes | Human-readable document number. |
| invopop_status | Yes | Fiscal certification status from the provider, null before issuance. |
| source_quote_id | Yes | Quote UUID this invoice was converted from. |
| delivery_channel | Yes | Delivery channel: Email, e-Invoice or Manual. |
| replaces_invoice_id | Yes | Original invoice UUID when this is a rectificative. |
| replaced_by_invoice_id | Yes | Rectificative UUID when this invoice was rectified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate this is not read-only and not destructive. The description adds useful context about preserving the invoice number and excluding line items, though it does not detail write-specific side effects beyond the import intent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the core purpose, and immediately communicates key exclusions and the alternative tool. No unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the parameter schema fully documents each field and the description clarifies the migration use case and boundary with create_invoice, the tool is well contextualized. An output schema exists, so return-value details are not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 10 parameters are described in the schema with defaults, enums, and helpful hints such as 'use list_companies to resolve'. The tool description reinforces the overall purpose but adds little beyond the already high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Import'), a clear resource ('historical/external invoice'), and distinguishes it from create_invoice. It also clarifies the preservation of the external invoice number and the absence of line items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool ('for migrating past invoices issued outside Kema Invoice') and when not to use it ('NOT for creating new invoices'), including the alternative tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
issue_invoiceIssue invoice (LEGALLY BINDING)ADestructiveInspect
Issue a Draft invoice: the legal act of creating it (the product calls this 'Créer la facture'). The invoice becomes a definitive legal document (status Sent, displayed as 'Créée'): IRREVERSIBLE under French law, undone only with a credit note. ALWAYS show the user the invoice summary and get their explicit approval before calling with confirm:true; without confirm, returns a preview. Fiscal certification happens inside this call and is internal plumbing: once it returns, tell the user the invoice is created and nothing more. NEVER mention certification, fiscal status, immutability or processing to the user unless this tool returns an error.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to issue. Omit/false to preview the invoice that would be issued. | |
| invoice_id | Yes | The Draft invoice UUID to issue. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Invoice UUID. |
| note | No | What to tell the user (after confirm:true). |
| type | No | Document type: invoice, credit_note, provision or quote. |
| status | No | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| company | No | Client company name, null when unknown. |
| paid_at | No | Payment timestamp (ISO 8601), null while unpaid. |
| preview | No | True when the call was a preview (confirm omitted or false): nothing was changed. |
| warning | No | Irreversibility warning (preview only). |
| currency | No | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | No | Due date, YYYY-MM-DD. |
| issue_date | No | Issue date, YYYY-MM-DD. |
| gross_total | No | Total incl. VAT, in the document currency. |
| would_issue | No | Invoice that would be issued (preview only). |
| invoice_number | No | Human-readable invoice number. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true. The description adds crucial context beyond annotations: irreversibility under French law, status transition to Sent/Créée, fiscal certification being internal plumbing, and the mandated user communication pattern (what to tell the user, what never to mention). This is high-value behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and legal consequence, then the must-have workflow. Long sentences carry a lot, but every clause earns its place. Minor redundancy: 'IRREVERSIBLE' repeats destructiveHint, but it's substantive enough.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a destructive legal-action tool. Covers prerequisites (Draft state, approval), the confirm gate, side effects (status, certification), and post-call user communication strategy. Output schema exists, so return details need not be repeated. Nothing an agent needs to avoid a critical mistake is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and descriptions for both parameters are exact. The description adds a critical semantic layer—the confirm:true vs preview distinction is explained in the tool description, not just the schema, clarifying the safety-critical usage. Full value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific verb ('Issue'), the resource ('a Draft invoice'), and the legal effect with exact product terminology ('Créer la facture'), distinguishing it from sibling tools like create_invoice, cancel_invoice, or create_credit_note. Clear differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance: call after showing summary and getting explicit approval; use confirm:true to issue, omit for preview; maps directly to the schema. Though it doesn't enumerate alternatives, the workflow is precise. Could name siblings, but the condition is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_available_provisionsList available provisionsARead-onlyInspect
List PAID provisions (avances sur honoraires, retainers) that have not been applied to a final invoice yet - the deductible client credit. Without matter_id, lists the standalone retainers (no matter), which is the normal case in Kema Invoice; with matter_id, lists that matter's retainers. Use before apply_provisions_to_invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| matter_id | No | Matter (dossier) UUID to restrict to; omit to list standalone retainers, the normal case in Kema Invoice. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | Paid provisions not yet applied to an invoice (standalone, or of the given matter), most recently paid first. |
| total | Yes | Number of provisions returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the read-only nature, and the description's use of 'List' aligns with that. The description goes beyond annotations by explaining what 'available' means (not applied to final invoices), adding domain context. However, it does not explicitly state side-effect-free behavior, but that is implied and consistent with the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet informative, explaining both the resource and the parameter behavior in a few sentences. No redundant or vague wording; all sentences add value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single optional parameter and the existence of an output schema (not shown but implied), the description provides sufficient context to call the tool correctly. It covers the default case, the filter case, and the intended usage sequence. No missing critical information for a simple list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description covers matter_id fully, explaining its purpose (restrict to a matter) and the default when omitted. The description reinforces this by stating the normal case. 100% parameter coverage with meaningful explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('List') and the resource ('paid provisions' not yet applied to final invoices), and clarifies the domain meaning ('deductible client credit'). It also distinguishes the tool from siblings like apply_provisions_to_invoice by specifying the filter behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains the single optional parameter (matter_id) and its default behavior (standalone retainers, the normal case). It also directly advises to use this tool before apply_provisions_to_invoice, giving clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_companiesList companiesARead-onlyInspect
List the authenticated tenant's client companies (name, email, VAT/tax id, country). Useful to resolve a company id before other lookups.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | Client companies, sorted by name. |
| total | Yes | Number of companies returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true already establishes that this is a read-only operation. The description adds context about the scope ('authenticated tenant's client companies'), which is useful. No side effects or auth details are needed beyond what the annotation provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and well-structured. Two sentences cover purpose and usage without any unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for an agent to understand when and why to call this tool. It includes the output fields and the practical use case. Since an output schema exists, return value details are not required in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the baseline is 4. The description does not need to elaborate on parameters, and the mention of the output fields (name, email, VAT/tax id, country) indirectly clarifies what the list will contain, which is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List'), the resource ('client companies'), and includes the relevant fields. It also distinguishes itself from sibling tools like get_company by indicating its purpose of resolving a company ID before other lookups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a specific use case ('resolve a company id before other lookups'), which gives clear guidance on when to use it. It does not explicitly mention alternatives, but the primary context is well-communicated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_invoicesList invoicesARead-onlyInspect
List the authenticated tenant's invoices, most recent first. Supports filtering by status, document type, and a free-text search on invoice number or client name, plus pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number (default 1). | |
| type | No | Filter by document type. | |
| search | No | Free-text match on invoice number or client name. | |
| status | No | Filter by invoice status. | |
| per_page | No | Results per page (default 20, max 100). |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | 1-based page number returned. |
| items | Yes | Invoices of the requested page, most recent first. |
| total | Yes | Total number of matching documents. |
| per_page | Yes | Page size used. |
| total_pages | Yes | Total number of pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already communicates no side effects, and the description adds useful behavioral details such as default ordering, filtering options, and pagination. It does not describe the response format, but the output schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence that conveys the core purpose, ordering, filtering capabilities, and pagination. No redundant wording or unnecessary detail is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and full parameter descriptions, the description covers all necessary context: what is listed, the ordering, available filters, and pagination. No critical information is missing for an agent to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All five parameters have descriptions in the schema, so the baseline is met. The description summarizes filtering and pagination but does not add meaning beyond what each parameter's own description already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool lists invoices for the authenticated tenant, with a specific ordering (most recent first). The scope and resource type are unambiguous, and it is easily distinguished from sibling tools like get_invoice or list_companies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when a list of invoices is needed) but does not explicitly contrast it with alternatives like get_invoice for single records or other list tools. It gives no direct guidance on when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mcp_activityList MCP activityARead-onlyInspect
The tenant's recent agent activity log: one entry per successful MCP tool call (tool name, related invoice number when known, timestamp). Newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of entries to return (1-50). Default 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | Activity entries, newest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation covers side-effect transparency, and the description adds that only successful calls are logged. It does not mention error handling or edge cases, but the annotation suffices for this read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no redundant information. It efficiently conveys the tool's purpose and output format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only log tool, the description is complete: it explains what entries look like and the ordering (newest first). The output schema is present, so no additional context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, limit, is fully described in the schema with constraints (1-50) and a default (20). The schema coverage is 100%, providing complete semantic clarity for the caller.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: listing the tenant's recent agent activity log. It specifies the resource (MCP tool calls) and distinguishes it from sibling tools that perform other operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for auditing or reviewing agent actions, but does not explicitly state when to use it versus alternatives. Since no direct alternative exists among the sibling tools, the guidance is adequate but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_invoice_paidMark invoice paidAInspect
Mark a Sent or Overdue invoice as Paid. Optionally set the payment date (defaults to now).
| Name | Required | Description | Default |
|---|---|---|---|
| paid_at | No | Payment timestamp, ISO 8601 (e.g. 2026-09-07T10:00:00Z); defaults to now. | |
| invoice_id | Yes | The Sent or Overdue invoice UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Invoice UUID. |
| type | Yes | Document type: invoice, credit_note, provision or quote. |
| notes | Yes | Notes printed on the document. |
| status | Yes | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| paid_at | Yes | Payment timestamp (ISO 8601), null while unpaid. |
| sent_at | Yes | Issue timestamp (ISO 8601), null while Draft. |
| currency | Yes | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | Yes | Due date, YYYY-MM-DD. |
| matter_id | Yes | Matter (dossier) UUID, null when unassigned. |
| net_total | Yes | Total excl. VAT, in the document currency. |
| tax_total | Yes | VAT amount, in the document currency. |
| amount_due | Yes | Gross total minus applied provisions, null when not computed. |
| company_id | Yes | Client company UUID. |
| created_at | Yes | Creation timestamp (ISO 8601). |
| issue_date | Yes | Issue date, YYYY-MM-DD. |
| updated_at | Yes | Last update timestamp (ISO 8601). |
| gross_total | Yes | Total incl. VAT, in the document currency. |
| valid_until | Yes | Quote validity limit, YYYY-MM-DD; null for other types. |
| vat_scenario | Yes | Fiscal scenario frozen at creation (e.g. domestic, eu_b2b_reverse_charge). |
| payment_terms | Yes | Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt. |
| advances_total | Yes | Sum of provisions applied, in the document currency. |
| created_source | Yes | Origin of the document: manual (app) or mcp (agent). |
| credit_note_id | Yes | Credit note UUID that cancelled this invoice. |
| internal_notes | Yes | Private notes, never printed. |
| invoice_number | Yes | Human-readable document number. |
| invopop_status | Yes | Fiscal certification status from the provider, null before issuance. |
| source_quote_id | Yes | Quote UUID this invoice was converted from. |
| delivery_channel | Yes | Delivery channel: Email, e-Invoice or Manual. |
| replaces_invoice_id | Yes | Original invoice UUID when this is a rectificative. |
| replaced_by_invoice_id | Yes | Rectificative UUID when this invoice was rectified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint false, destructiveHint false), the description adds that the payment date defaults to now, but it does not disclose side effects such as idempotency, whether already-paid invoices error, or whether any related records are updated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no redundant phrasing, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple state-change tool, the description covers the essential intent and parameter semantics. It does not describe the return value or error conditions, but given the output schema exists and the action is straightforward, this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters have clear descriptions: invoice_id is identified as the Sent or Overdue invoice UUID, and paid_at includes format and default behavior. This fully compensates for the schema's technical patterns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Mark) and the target resource (a Sent or Overdue invoice as Paid). It distinguishes this from siblings like cancel_invoice or issue_invoice by specifying the state transition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (on Sent or Overdue invoices) but does not explicitly mention preconditions like verifying the current state or that it should not be used on already-paid invoices. It does clarify the optional payment date default.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_provision_paidMark provision paidAInspect
Mark an issued provision (status Sent/Overdue) as Paid. A paid provision becomes a client credit that can be deducted from that client's final invoice with apply_provisions_to_invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| paid_at | No | Payment timestamp (ISO 8601, e.g. 2026-09-07T10:00:00Z). Defaults to now. | |
| invoice_id | Yes | The Sent or Overdue provision UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Provision UUID. |
| matter | Yes | Matter (dossier) name, null when unknown. |
| status | Yes | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| company | Yes | Client company name, null when unknown. |
| paid_at | Yes | Payment timestamp (ISO 8601), null while unpaid. |
| currency | Yes | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | Yes | Due date, YYYY-MM-DD. |
| issue_date | Yes | Issue date, YYYY-MM-DD. |
| gross_total | Yes | Total incl. VAT, in the document currency. |
| invoice_number | Yes | Provision number (PROV series). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the main side effect (creates a client credit) and implies a write operation. It does not mention reversibility or other potential effects, but annotations are sparse (readOnly=false, destructive=false), so the description carries the burden and covers the key behavior well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two clear, tight sentences with no redundant wording. Efficiently conveys purpose, conditions, and consequence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter schema and the sibling context, the description is complete. It explains the outcome (credit) and the relationship to apply_provisions_to_invoice, leaving no ambiguity about the tool's role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds default behavior for paid_at (defaults to now) and identifies invoice_id as the provision UUID. The schema already provides detailed format and descriptions for both parameters, so the description adds marginal but useful context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action (mark as paid), the target (provision), the applicable statuses (Sent/Overdue), and the resulting effect (becomes client credit). Distinguishes it from sibling tools like mark_invoice_paid.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly defines when to use (for Sent/Overdue provisions) and explains the consequential credit that can be applied via apply_provisions_to_invoice. Provides enough context to select this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rectify_invoiceRectify invoiceAInspect
Create a rectifying invoice (facture rectificative) for a Sent or Paid invoice: a NEW Draft invoice pre-filled from the original (same client, copied line items unless overridden) and legally linked to it. The original is marked Rectified only when the rectificative is issued. Call with confirm:true to create; without it, returns a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | Replacement line items. Omit to copy the original's items. | |
| notes | No | Notes printed on the rectificative (max 2000 characters). Omit to copy the original's notes. | |
| confirm | No | Must be true to create the rectificative. Omit/false to preview. | |
| due_date | No | Due date, YYYY-MM-DD. Defaults from the original's payment terms. | |
| invoice_id | Yes | The original invoice to rectify. | |
| issue_date | No | Issue date, YYYY-MM-DD. Defaults to today. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Invoice UUID. |
| note | No | Next-step guidance, present on preview responses. |
| type | No | Document type: invoice, credit_note, provision or quote. |
| notes | No | Notes printed on the document. |
| status | No | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| paid_at | No | Payment timestamp (ISO 8601), null while unpaid. |
| preview | No | True when the call was a preview (confirm omitted or false): nothing was changed. |
| sent_at | No | Issue timestamp (ISO 8601), null while Draft. |
| currency | No | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | No | Due date, YYYY-MM-DD. |
| original | No | Invoice that would be rectified (preview only). |
| matter_id | No | Matter (dossier) UUID, null when unassigned. |
| net_total | No | Total excl. VAT, in the document currency. |
| tax_total | No | VAT amount, in the document currency. |
| amount_due | No | Gross total minus applied provisions, null when not computed. |
| company_id | No | Client company UUID. |
| created_at | No | Creation timestamp (ISO 8601). |
| issue_date | No | Issue date, YYYY-MM-DD. |
| updated_at | No | Last update timestamp (ISO 8601). |
| gross_total | No | Total incl. VAT, in the document currency. |
| valid_until | No | Quote validity limit, YYYY-MM-DD; null for other types. |
| vat_scenario | No | Fiscal scenario frozen at creation (e.g. domestic, eu_b2b_reverse_charge). |
| would_create | No | Outline of the rectificative that would be created (preview only). |
| payment_terms | No | Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt. |
| advances_total | No | Sum of provisions applied, in the document currency. |
| created_source | No | Origin of the document: manual (app) or mcp (agent). |
| credit_note_id | No | Credit note UUID that cancelled this invoice. |
| internal_notes | No | Private notes, never printed. |
| invoice_number | No | Human-readable document number. |
| invopop_status | No | Fiscal certification status from the provider, null before issuance. |
| source_quote_id | No | Quote UUID this invoice was converted from. |
| delivery_channel | No | Delivery channel: Email, e-Invoice or Manual. |
| replaces_invoice_id | No | Original invoice UUID when this is a rectificative. |
| replaced_by_invoice_id | No | Rectificative UUID when this invoice was rectified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the tool's mutation behavior (creates a new invoice, marks the original as Rectified only upon confirmation), the preview-vs-create distinction via the confirm parameter, and the server-side VAT determination. This goes beyond the sparse annotations (readOnlyHint false, destructiveHint false) to give a concrete picture of what happens when the tool is called.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is slightly long but each sentence carries essential operational or fiscal information. It front-loads the primary purpose and confirm semantics, then details parameters. No waste, but the repeated emphasis on VAT rules and defaults could be trimmed without losing critical guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists (per context signals), the description need not detail return values. It covers invocation, parameters, defaults, and side effects, leaving no significant gaps for an agent to call the tool correctly. Minor omission: it doesn't explicitly state the output format of the preview, but this is acceptable since the output schema is expected to cover it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Every parameter is described with meaningful details beyond the schema. For example, the tax_rate parameter explicitly warns 'OMIT - do NOT ask the user for a VAT rate' and explains server-side rules; line_type is explained with billable/visual/text distinctions; items and notes have default-copy behavior. This fully compensates for any schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a rectifying invoice for a Sent or Paid invoice, distinguishes it from other invoice operations by specifying it creates a NEW Draft pre-filled from the original, and explains the legal linkage and marking of the original. This is a specific verb+resource combination that leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use the tool (for rectifying sent/paid invoices) and the critical confirm behavior: 'Call with confirm:true to create; without it, returns a preview.' It also clarifies the effect on the original invoice, giving the agent clear guidance on invocation and expected consequences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reject_quoteReject quoteADestructiveInspect
Mark a Sent quote as Rejected by the client. This ends the quote's lifecycle. Call with confirm:true to apply; without it, returns a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to reject. Omit/false to preview only. | |
| quote_id | Yes | The Sent quote UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Quote UUID. |
| note | No | Next-step guidance, present on preview responses. |
| type | No | Document type: invoice, credit_note, provision or quote. |
| status | No | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| preview | No | True when the call was a preview (confirm omitted or false): nothing was changed. |
| currency | No | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | No | Due date, YYYY-MM-DD. |
| net_total | No | Total excl. VAT, in the document currency. |
| tax_total | No | VAT amount, in the document currency. |
| issue_date | No | Issue date, YYYY-MM-DD. |
| gross_total | No | Total incl. VAT, in the document currency. |
| valid_until | No | Validity limit, YYYY-MM-DD. |
| would_reject | No | Quote that would be rejected (preview only). |
| invoice_number | No | Quote number (own series). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description transparently reveals the destructive nature ('ends the quote's lifecycle') and the preview mechanism when confirm is false. This aligns with the destructiveHint annotation and adds meaningful behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no redundant or vague wording. Every sentence carries essential information about the action, effect, and confirm behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple parameter set (quote_id, confirm) plus output schema, the description sufficiently explains the purpose, effect, and preview mode. No additional context is needed to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already provides full descriptions for both parameters (quote_id: 'The Sent quote UUID'; confirm: 'Must be true to reject. Omit/false to preview only.'). The description repeats the confirm semantics without adding new detail, so no additional value beyond 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action ('Mark a Sent quote as Rejected') and the resource ('Sent quote'), with the consequential effect 'ends the quote's lifecycle'. It distinguishes from sibling actions like accept_quote by targeting rejection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage instructions for the confirm parameter ('Call with confirm:true to apply; without it, returns a preview'). It defines when to apply versus preview, though it does not explicitly compare to alternative quote-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_provision_from_invoiceRemove provision from invoiceAInspect
Detach a provision from a DRAFT final invoice and recalculate its advances_total / amount_due. The provision becomes available again for that matter.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | The Draft final invoice UUID. | |
| provision_id | Yes | The provision UUID to detach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| amount_due | Yes | Gross total minus applied provisions, in the document currency. |
| advances_total | Yes | Sum of provisions now applied to the invoice, in the document currency. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key side effects: recalculation of invoice totals and the provision becoming available for reuse. It does not mention error conditions or permission requirements, but given the simple nature of the operation and that annotations provide limited detail, the description covers the primary behavioral outcomes well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no redundant information. It directly states the action, the target, the restriction, and the result, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential context: the draft restriction, the calculation update, and the provision reuse. It does not specify the return value or handle non-draft cases, but for a straightforward operation these omissions are minor and the description is sufficiently complete for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters have clear descriptions in the input schema ('The Draft final invoice UUID' and 'The provision UUID to detach'), providing full coverage. The tool description does not add extra meaning beyond what the schema already conveys, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Detach a provision from a DRAFT final invoice' and the effect 'recalculate its advances_total / amount_due'. It distinguishes this from sibling tools like 'apply_provisions_to_invoice' by specifying the removal action and the draft-invoice constraint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for draft invoices only and notes that the provision becomes available again, but it does not explicitly contrast with alternatives or state when not to use it. This leaves some ambiguity for an agent deciding between removal and other invoice modification functions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_invoice_itemsReorder invoice itemsAInspect
Set the display order of an invoice's line items. Pass the full desired order: every item id with its 0-based display_order. Item ids come from get_invoice or add_invoice_item.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | The invoice UUID whose items are reordered. | |
| item_order | Yes | Full desired order: one entry per line item (1-200). |
Output Schema
| Name | Required | Description |
|---|---|---|
| reordered | Yes | True once the new order is saved. |
| invoice_id | Yes | The reordered invoice UUID. |
| items_count | Yes | Number of items whose position was set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals that the tool sets a new display order and that the order must be full ('every item id'). It does not mention validation behavior, error handling, or whether it replaces the entire order, but the core behavior is transparent. Annotations confirm it is a write operation (readOnlyHint false).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two clear sentences. It avoids redundancy and directly explains the action and key usage requirements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only two parameters, the description and schema together provide sufficient context for usage. The description explains how to obtain item IDs and the requirement for a full order. It could mention error conditions but is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides descriptions for both parameters and nested fields, achieving 100% schema coverage. The description adds semantic value by clarifying that the order must be complete and that item IDs should come from specific sources, going beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Set the display order of an invoice's line items.' It is specific and distinct from sibling tools like update_invoice_item or get_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage guidance: 'Pass the full desired order' and indicates where item IDs come from ('get_invoice or add_invoice_item'). It implies this is for reordering multiple items, though it does not explicitly contrast with updating individual items.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_provisionIssue provision (LEGALLY BINDING)ADestructiveInspect
Issue a Draft provision: the legal act of creating it. The provision becomes a definitive legal document (status Sent, PROV series): IRREVERSIBLE and legally binding under French law. ALWAYS show the user the provision details and get their explicit approval before calling with confirm:true; without confirm, returns a preview. Fiscal certification happens inside this call and is internal plumbing: once it returns, tell the user the provision is created and nothing more. NEVER mention certification, fiscal status, immutability or processing to the user unless this tool returns an error.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to issue. Omit/false to preview the provision that would be issued. | |
| invoice_id | Yes | The Draft provision UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Provision UUID. |
| note | No | What to tell the user (after confirm:true). |
| matter | No | Matter (dossier) name, null when unknown. |
| status | No | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| company | No | Client company name, null when unknown. |
| paid_at | No | Payment timestamp (ISO 8601), null while unpaid. |
| preview | No | True when the call was a preview (confirm omitted or false): nothing was changed. |
| currency | No | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | No | Due date, YYYY-MM-DD. |
| issue_date | No | Issue date, YYYY-MM-DD. |
| gross_total | No | Total incl. VAT, in the document currency. |
| would_issue | No | Provision that would be issued (preview only). |
| invoice_number | No | Provision number (PROV series). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations, disclosing irreversibility, legal binding under French law, the internal fiscal certification 'plumbing,' and the expectation to hide implementation details from the user. It also explains the preview behavior when confirm is not true. This is rich behavioral context with no contradiction to the destructiveHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but each sentence adds distinct value: purpose, legal consequence, approval step, preview behavior, and internal user-communication constraints. The emphasis via caps is purposeful, though some redundancy exists between 'IRREVERSIBLE' and the later prohibition on mentioning immutability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists wet and the annotations flag destructiveness, the description covers all essential operational context: what the tool does, how to preview, the irreversible consequence, and how to communicate results to the user. Nothing an agent needs to safely invoke this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents confirm and invoice_id with 100% coverage eslint. The description adds key semantics: confirm must be true to issue and otherwise returns a preview, which is essential for safe invocation. The invoice_id parameter is adequately described as 'The Draft provision UUID' in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Issue a Draft provision: the legal act of creating it.' It clarifies the effect (status Sent, PROV series) and distinguishes the tool from a mere draft creation by emphasizing finality. The title 'Issue provision (LEGALLY BINDING)' reinforces the unique act this tool performs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational guidance: always show details and get approval before calling with confirm:true, and use confirm:false/omitted to preview. It does not explicitly contrast with siblings like create_provision or apply_provisions_to_invoice, but the workflow guidance for this specific call is unambiguous and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_quoteSend quoteADestructiveInspect
Transition a Draft quote to Sent (the client-facing state). No certification is involved - quotes are commercial documents. French B2B validation (SIREN/VAT) applies when the tenant is French.
| Name | Required | Description | Default |
|---|---|---|---|
| quote_id | Yes | The Draft quote UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Quote UUID. |
| type | Yes | Document type: invoice, credit_note, provision or quote. |
| status | Yes | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| currency | Yes | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | Yes | Due date, YYYY-MM-DD. |
| net_total | Yes | Total excl. VAT, in the document currency. |
| tax_total | Yes | VAT amount, in the document currency. |
| issue_date | Yes | Issue date, YYYY-MM-DD. |
| gross_total | Yes | Total incl. VAT, in the document currency. |
| valid_until | Yes | Validity limit, YYYY-MM-DD. |
| invoice_number | Yes | Quote number (own series). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=true, so the description doesn't need to restate mutation. It adds useful context: no certification involved, and French B2B validation. However, it doesn't disclose potential side effects or reversibility beyond the state change. Given annotations cover the safety profile, the added context justifies a 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary action is front-loaded, and the validation note is concise. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema present, the description covers the key aspects: the state transition, the client-facing nature, the absence of certification, and the French validation condition. It's complete enough for an agent to call it correctly without additional details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – the quote_id parameter already has a clear description ('The Draft quote UUID.'). The tool description adds no extra parameter-level detail. Baseline 3 applies because the schema handles parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: 'Transition a Draft quote to Sent (the client-facing state).' It clearly identifies the resource (quote) and the state change, and adds a clarifying note that no certification is involved, distinguishing it from certification-related tools. It also mentions French B2B validation, which further specifies the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides some usage context (French validation applies when tenant is French) but does not explicitly differentiate from sibling tools like convert_quote_to_invoice or reject_quote. The when-to-use is implied (when you want to send a draft quote) but no alternatives are named or excluded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_companyUpdate companyAInspect
Update fields of an existing client company (name, contact info, address, VAT number, SIREN). Only provided fields change. Fixing the VAT number / SIREN / address here is often required before an invoice for this client can be certified.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | New city. | |
| name | No | New display name. | |
| No | New billing email address. | ||
| phone | No | New phone number, any format. | |
| siren | No | French SIREN, 9 digits. | |
| tax_id | No | VAT number, e.g. FR12345678901. | |
| country | No | ISO 3166-1 alpha-2 country code, e.g. FR. | |
| website | No | New website URL, including the scheme (https://). | |
| company_id | Yes | The company UUID to update. | |
| postal_code | No | New postal code. | |
| street_address | No | New street address (number and street). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Company UUID. |
| name | Yes | Display name. |
| Yes | Billing email. | |
| siren | Yes | French SIREN (9 digits). |
| tax_id | Yes | VAT number. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states 'Only provided fields change', which clarifies the partial update behavior. This goes beyond the annotations (readOnlyHint false, destructiveHint false) by explaining the update semantics. It does not mention potential side effects, but the core behavior is well described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, with no redundant information. It efficiently conveys the purpose, the partial update behavior, and a practical use case, making it well-structured and easy to absorb.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description includes all essential context: the action (update), the target (existing company), the fields involved, the partial update rule, and a real-world scenario (invoice certification). Combined with the full schema descriptions and annotations, nothing critical is missing for an agent to decide when and how to invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptions for all 11 parameters (100% coverage), so the parameter semantics are fully handled by the schema. The description mentions the key field categories but does not add meaning beyond what the schema already states, hence a baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing company and lists the specific fields (name, contact info, address, VAT number, SIREN). This distinguishes it from create_company, delete_company, and get_company, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool, especially noting that fixing VAT/SIREN/address is often required before invoice certification. It does not explicitly contrast with sibling tools, but the partial update behavior and use case provide strong practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_invoiceUpdate invoice (draft)AInspect
Update fields of a Draft invoice (dates, payment terms, notes, or reassign the company). Only Draft invoices can be modified - a Sent/certified invoice is immutable.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Notes printed on the invoice (max 2000 characters); null to clear. | |
| due_date | No | New due date, YYYY-MM-DD, on or after issue_date. | |
| company_id | No | Reassign the invoice to another company UUID (the client snapshot is rebuilt); null to detach. | |
| invoice_id | Yes | The Draft invoice UUID. | |
| issue_date | No | New issue date, YYYY-MM-DD. | |
| payment_terms | No | New payment terms printed on the invoice. | |
| internal_notes | No | Private notes never printed (max 2000 characters); null to clear. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Invoice UUID. |
| type | Yes | Document type: invoice, credit_note, provision or quote. |
| notes | Yes | Notes printed on the document. |
| status | Yes | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| paid_at | Yes | Payment timestamp (ISO 8601), null while unpaid. |
| sent_at | Yes | Issue timestamp (ISO 8601), null while Draft. |
| currency | Yes | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | Yes | Due date, YYYY-MM-DD. |
| matter_id | Yes | Matter (dossier) UUID, null when unassigned. |
| net_total | Yes | Total excl. VAT, in the document currency. |
| tax_total | Yes | VAT amount, in the document currency. |
| amount_due | Yes | Gross total minus applied provisions, null when not computed. |
| company_id | Yes | Client company UUID. |
| created_at | Yes | Creation timestamp (ISO 8601). |
| issue_date | Yes | Issue date, YYYY-MM-DD. |
| updated_at | Yes | Last update timestamp (ISO 8601). |
| gross_total | Yes | Total incl. VAT, in the document currency. |
| valid_until | Yes | Quote validity limit, YYYY-MM-DD; null for other types. |
| vat_scenario | Yes | Fiscal scenario frozen at creation (e.g. domestic, eu_b2b_reverse_charge). |
| payment_terms | Yes | Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt. |
| advances_total | Yes | Sum of provisions applied, in the document currency. |
| created_source | Yes | Origin of the document: manual (app) or mcp (agent). |
| credit_note_id | Yes | Credit note UUID that cancelled this invoice. |
| internal_notes | Yes | Private notes, never printed. |
| invoice_number | Yes | Human-readable document number. |
| invopop_status | Yes | Fiscal certification status from the provider, null before issuance. |
| source_quote_id | Yes | Quote UUID this invoice was converted from. |
| delivery_channel | Yes | Delivery channel: Email, e-Invoice or Manual. |
| replaces_invoice_id | Yes | Original invoice UUID when this is a rectificative. |
| replaced_by_invoice_id | Yes | Rectificative UUID when this invoice was rectified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description transparently indicates a write operation (update) and the constraint on Draft status. It does not contradict the annotations (readOnlyHint=false, destructiveHint=false), and the side effect of rebuilding the client snapshot is captured in the parameter description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, concise and directly to the point. It includes the essential scope and constraint without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists and all parameters are well-documented, the description covers the necessary context for correct usage. It communicates the key restriction (Draft-only) and the fields involved, which is sufficient for this straightforward update operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters are fully described in the schema with coverage at 100%, so the baseline is 3. The description adds only a brief summary of field types ('dates, payment terms, notes, or reassign the company') without providing additional meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Update', the resource 'invoice', and the specific scope 'Draft invoice'. It also lists the fields that can be updated, making it unambiguous and distinct from sibling tools like create_invoice or issue_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states that only Draft invoices can be modified and that Sent/certified invoices are immutable, providing a clear condition for when to use this tool. It does not explicitly compare to alternatives, but the scope is distinct enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_invoice_itemUpdate line item (draft)AInspect
Update a line item on a Draft invoice. Totals are recalculated automatically. Item ids come from get_invoice or add_invoice_item.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | The line item UUID. | |
| quantity | No | New quantity; null to clear (non-item lines). | |
| tax_rate | No | OMIT - VAT is determined server-side by fiscal rules; only set on explicit user request, as a percent (0-100). | |
| line_type | No | New line kind: 'item', 'section' or 'description'. | |
| unit_price | No | New unit price excl. VAT, in the invoice currency; null to clear (non-item lines). | |
| description | No | New line text (1-500 characters). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Line item UUID. |
| quantity | Yes | Quantity, null for section/description lines. |
| tax_rate | Yes | VAT rate in percent, null for non-item lines. |
| line_type | Yes | Line kind: item, section or description. |
| created_at | Yes | Creation timestamp (ISO 8601). |
| invoice_id | Yes | Parent invoice UUID. |
| line_total | Yes | Line total incl. VAT, null for non-item lines. |
| product_id | Yes | Linked product UUID, if any. |
| unit_price | Yes | Unit price excl. VAT, null for non-item lines. |
| updated_at | Yes | Last update timestamp (ISO 8601). |
| description | Yes | Line text. |
| tax_rate_key | Yes | VAT rate key (e.g. standard, reduced), null for non-item lines. |
| display_order | Yes | 0-based position on the document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutation (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds useful behavioral context by stating that totals are recalculated automatically, which is not derivable from the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary purpose and draft constraint are front-loaded, followed by the useful behavior note and id-source guidance. Every sentence contributes necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the full parameter schema, annotations, and output schema, the description is largely complete. It covers the draft restriction, automatic recalculation, and id source. It could mention that line_type can change to section/description, but the schema already documents this, so no critical gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema documents all parameters. The description adds value beyond the schema by explaining where item_id values come from, which directly helps the agent supply the required parameter correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update'), a specific resource ('line item on a Draft invoice'), and the draft constraint. This clearly distinguishes it from sibling tools like add_invoice_item, delete_invoice_item, and reorder_invoice_items without needing to inspect their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes the tool to Draft invoices and tells the agent where to obtain item ids (get_invoice or add_invoice_item). It does not explicitly enumerate when to prefer sibling tools like delete_invoice_item, but the draft-only scope and id-source guidance give a clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_invoice_matterReassign invoice matterAInspect
Attach or detach the matter (dossier) on an invoice. Purely organizational - allowed even after the invoice is Sent, but not on a Cancelled invoice. Pass matter_id null to detach.
| Name | Required | Description | Default |
|---|---|---|---|
| matter_id | Yes | Matter (dossier) UUID, or null to detach. | |
| invoice_id | Yes | The invoice UUID (any status except Cancelled). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Invoice UUID. |
| type | Yes | Document type: invoice, credit_note, provision or quote. |
| notes | Yes | Notes printed on the document. |
| status | Yes | Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired. |
| paid_at | Yes | Payment timestamp (ISO 8601), null while unpaid. |
| sent_at | Yes | Issue timestamp (ISO 8601), null while Draft. |
| currency | Yes | ISO 4217 currency code (EUR, USD, GBP or CHF). |
| due_date | Yes | Due date, YYYY-MM-DD. |
| matter_id | Yes | Matter (dossier) UUID, null when unassigned. |
| net_total | Yes | Total excl. VAT, in the document currency. |
| tax_total | Yes | VAT amount, in the document currency. |
| amount_due | Yes | Gross total minus applied provisions, null when not computed. |
| company_id | Yes | Client company UUID. |
| created_at | Yes | Creation timestamp (ISO 8601). |
| issue_date | Yes | Issue date, YYYY-MM-DD. |
| updated_at | Yes | Last update timestamp (ISO 8601). |
| gross_total | Yes | Total incl. VAT, in the document currency. |
| valid_until | Yes | Quote validity limit, YYYY-MM-DD; null for other types. |
| vat_scenario | Yes | Fiscal scenario frozen at creation (e.g. domestic, eu_b2b_reverse_charge). |
| payment_terms | Yes | Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt. |
| advances_total | Yes | Sum of provisions applied, in the document currency. |
| created_source | Yes | Origin of the document: manual (app) or mcp (agent). |
| credit_note_id | Yes | Credit note UUID that cancelled this invoice. |
| internal_notes | Yes | Private notes, never printed. |
| invoice_number | Yes | Human-readable document number. |
| invopop_status | Yes | Fiscal certification status from the provider, null before issuance. |
| source_quote_id | Yes | Quote UUID this invoice was converted from. |
| delivery_channel | Yes | Delivery channel: Email, e-Invoice or Manual. |
| replaces_invoice_id | Yes | Original invoice UUID when this is a rectificative. |
| replaced_by_invoice_id | Yes | Rectificative UUID when this invoice was rectified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states the operation is purely organizational and specifies status constraints. It also clarifies the null behavior for detaching, giving full transparency for expected outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, covering action, constraints, and detach semantics in two sentences without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Provides all necessary context for correct invocation: what it does, when allowed, and how to detach. Output schema exists, so not explaining return values is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters have detailed descriptions: invoice_id specifies the allowed statuses, and matter_id explains its UUID format and null usage. Schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: attach or detach the matter (dossier) on an invoice. It uses a specific verb and resource, distinguishing it from broader tools like update_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when the operation is allowed (even after Sent, not on Cancelled) and how to detach (pass null). This provides clear guidance on usage and constraints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_invoice_client_profileUpsert client billing profileAInspect
Create or update a company's invoicing defaults (payment terms, delivery channel, invoice prefix). These defaults pre-fill future invoices for that client.
| Name | Required | Description | Default |
|---|---|---|---|
| company_id | Yes | Company UUID (use list_companies to resolve). | |
| payment_terms | No | Default payment terms for this client's invoices. Defaults to Net-30 on creation. | |
| invoice_prefix | No | Custom invoice number prefix (max 10 chars, uppercase letters, digits and hyphens); null to use the tenant default. | |
| delivery_channel | No | How invoices reach this client: Email, e-Invoice or Manual. Defaults to Email on creation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Profile UUID. |
| company | Yes | Company name, null when not resolvable. |
| company_id | Yes | Company UUID. |
| payment_terms | Yes | Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt. |
| invoice_prefix | Yes | Custom invoice number prefix, null for the tenant default. |
| delivery_channel | Yes | Delivery channel: Email, e-Invoice or Manual. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations (readOnlyHint false, destructiveHint false) indicate a write but non-destructive operation; the description adds that these defaults 'pre-fill future invoices', revealing a persistent side effect beyond what the annotations convey. This is useful and consistent, though it does not mention idempotency or error outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, directly stating the action, object, and effect without unnecessary words. It is well-structured and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward upsert tool, the description covers purpose and a key side effect. It does not mention expected output or failure modes, but since an output schema exists (as indicated by context signals), that omission is acceptable. The description is sufficiently complete for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema descriptions cover 100% of parameters, so the baseline is 3. The description text only reiterates the field names without adding new meaning beyond what the schema already states (e.g., payment terms, delivery channel, invoice prefix). No additional clarifying details are provided in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the verb 'Create or update' and the resource 'company's invoicing defaults', listing the specific fields (payment terms, delivery channel, invoice prefix) and the purpose of pre-filling future invoices. This clearly distinguishes it from sibling tools like get_invoice_client_profile or delete_invoice_client_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used to set or modify billing defaults but does not explicitly state when to use it over alternatives (e.g., when to call this vs. get_invoice_client_profile). It lacks conditional guidance for the agent beyond the basic create/update semantics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- Changed
cancel_invoice1 field changed- changed
Input schema / properties / invoice_id / descriptionPrevious value: -"The invoice UUID to cancel (not Paid)."New value: +"The draft invoice UUID to cancel."
- Changed
issue_invoice5 fields changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true to issue + certify. Omit/false to preview the invoice that would be certified."New value: +"Must be true to issue. Omit/false to preview the invoice that would be issued." - removed
Output schema / properties / certification_statusRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Certification status right after submission (after confirm:true)." -} - changed
Output schema / properties / note / descriptionPrevious value: -"Outcome summary (after confirm:true)."New value: +"What to tell the user (after confirm:true)." - added
Output schema / properties / would_issueAdded value: +{ + "additionalProperties": false, + "description": "Invoice that would be issued (preview only).", + "properties": { + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Client company name, null when unknown." + }, + "currency": { + "description": "ISO 4217 currency code.", + "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": "Document UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Human-readable document number.", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "items": { + "description": "Line items that would be certified.", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Line text.", + "type": "string" + }, + "quantity": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Quantity, null for section/description lines." + }, + "tax_rate": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "VAT rate in percent, null for non-item lines." + }, + "unit_price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Unit price excl. VAT, null for non-item lines." + } + }, + "required": [ + "description", + "quantity", + "unit_price", + "tax_rate" + ], + "type": "object" + }, + "type": "array" + }, + "net_total": { + "description": "Total excl. VAT, in the document currency.", + "type": "number" + }, + "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" + } + }, + "required": [ + "id", + "invoice_number", + "status", + "gross_total", + "company", + "issue_date", + "due_date", + "net_total", + "tax_total", + "currency", + "items" + ], + "type": "object" +} - removed
Output schema / properties / would_issue_and_certifyRemoved value: -{ - "additionalProperties": false, - "description": "Invoice that would be issued and certified (preview only).", - "properties": { - "company": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Client company name, null when unknown." - }, - "currency": { - "description": "ISO 4217 currency code.", - "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": "Document UUID.", - "type": "string" - }, - "invoice_number": { - "description": "Human-readable document number.", - "type": "string" - }, - "issue_date": { - "description": "Issue date, YYYY-MM-DD.", - "type": "string" - }, - "items": { - "description": "Line items that would be certified.", - "items": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Line text.", - "type": "string" - }, - "quantity": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Quantity, null for section/description lines." - }, - "tax_rate": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "VAT rate in percent, null for non-item lines." - }, - "unit_price": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Unit price excl. VAT, null for non-item lines." - } - }, - "required": [ - "description", - "quantity", - "unit_price", - "tax_rate" - ], - "type": "object" - }, - "type": "array" - }, - "net_total": { - "description": "Total excl. VAT, in the document currency.", - "type": "number" - }, - "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" - } - }, - "required": [ - "id", - "invoice_number", - "status", - "gross_total", - "company", - "issue_date", - "due_date", - "net_total", - "tax_total", - "currency", - "items" - ], - "type": "object" -}
- Changed
send_provision4 fields changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true to issue + certify. Omit/false to preview the provision that would be certified."New value: +"Must be true to issue. Omit/false to preview the provision that would be issued." - changed
Output schema / properties / note / descriptionPrevious value: -"Next-step guidance, present on preview responses."New value: +"What to tell the user (after confirm:true)." - added
Output schema / properties / would_issueAdded value: +{ + "additionalProperties": false, + "description": "Provision that would be issued (preview only).", + "properties": { + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Client company name, null when unknown." + }, + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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": "Provision UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Provision number (PROV series).", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "matter": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Matter (dossier) name, null when unknown." + }, + "paid_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Payment timestamp (ISO 8601), null while unpaid." + }, + "status": { + "description": "Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired.", + "type": "string" + } + }, + "required": [ + "id", + "invoice_number", + "status", + "matter", + "company", + "issue_date", + "due_date", + "paid_at", + "currency", + "gross_total" + ], + "type": "object" +} - removed
Output schema / properties / would_issue_and_certifyRemoved value: -{ - "additionalProperties": false, - "description": "Provision that would be issued and certified (preview only).", - "properties": { - "company": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Client company name, null when unknown." - }, - "currency": { - "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", - "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": "Provision UUID.", - "type": "string" - }, - "invoice_number": { - "description": "Provision number (PROV series).", - "type": "string" - }, - "issue_date": { - "description": "Issue date, YYYY-MM-DD.", - "type": "string" - }, - "matter": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Matter (dossier) name, null when unknown." - }, - "paid_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Payment timestamp (ISO 8601), null while unpaid." - }, - "status": { - "description": "Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired.", - "type": "string" - } - }, - "required": [ - "id", - "invoice_number", - "status", - "matter", - "company", - "issue_date", - "due_date", - "paid_at", - "currency", - "gross_total" - ], - "type": "object" -}
4 tool updates
- Changed
create_provision2 fields changed- changed
Input schema / properties / matter_id / descriptionPrevious value: -"Matter (dossier) UUID - required for provisions."New value: +"Matter UUID to attach the retainer to; omit for a standalone retainer, which is the normal case in Kema Invoice." - changed
Input schema / requiredPrevious value: -[ - "company_id", - "matter_id", - "issue_date", - "due_date", - "items" -]New value: +[ + "company_id", + "issue_date", + "due_date", + "items" +]
- Changed
get_invoice3 fields changed- added
Output schema / properties / items / items / properties / display_orderAdded value: +{ + "description": "0-based position of the line on the document.", + "type": "number" +} - added
Output schema / properties / items / items / properties / idAdded value: +{ + "description": "Line item UUID, to pass to update_invoice_item, delete_invoice_item or reorder_invoice_items.", + "type": "string" +} - changed
Output schema / properties / items / items / requiredPrevious value: -[ - "description", - "line_type", - "quantity", - "unit_price", - "tax_rate", - "line_total" -]New value: +[ + "id", + "display_order", + "description", + "line_type", + "quantity", + "unit_price", + "tax_rate", + "line_total" +]
- Changed
get_invoice_pdf5 fields changed- changed
Output schema / properties / available / descriptionPrevious value: -"False when the invoice has no stored PDF."New value: +"True when a download URL is returned; false only when the PDF could not be produced." - added
Output schema / properties / invoice_numberAdded value: +{ + "description": "Document number, handy to name the downloaded file.", + "type": "string" +} - added
Output schema / properties / is_draftAdded value: +{ + "description": "True when the document is still a Draft: the PDF is a preview, not a legal document.", + "type": "boolean" +} - changed
Output schema / properties / reason / descriptionPrevious value: -"Why no PDF is available, present when available is false."New value: +"Why the PDF could not be produced and what to do next, present when available is false." - changed
Output schema / requiredPrevious value: -[ - "available" -]New value: +[ + "available", + "is_draft", + "invoice_number" +]
- Changed
list_available_provisions3 fields changed- changed
Input schema / properties / matter_id / descriptionPrevious value: -"The matter (dossier) UUID."New value: +"Matter (dossier) UUID to restrict to; omit to list standalone retainers, the normal case in Kema Invoice." - removed
Input schema / requiredRemoved value: -[ - "matter_id" -] - changed
Output schema / properties / items / descriptionPrevious value: -"Paid provisions of the matter not yet applied to an invoice, most recently paid first."New value: +"Paid provisions not yet applied to an invoice (standalone, or of the given matter), most recently paid first."
41 tool updates
- Changed
accept_quote2 fields changed- changed
Input schema / properties / quote_id / descriptionPrevious value: -"The quote UUID."New value: +"The Sent quote UUID." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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": "Quote UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Quote number (own series).", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "net_total": { + "description": "Total excl. VAT, in the document currency.", + "type": "number" + }, + "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" + }, + "valid_until": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Validity limit, YYYY-MM-DD." + } + }, + "required": [ + "id", + "invoice_number", + "type", + "status", + "issue_date", + "due_date", + "valid_until", + "currency", + "net_total", + "tax_total", + "gross_total" + ], + "type": "object" +}
- Changed
add_invoice_item7 fields changed- added
Input schema / properties / description / descriptionAdded value: +"Line text printed on the invoice (1-500 characters)." - added
Input schema / properties / invoice_id / descriptionAdded value: +"The Draft invoice UUID." - changed
Input schema / properties / line_type / descriptionPrevious value: -"Defaults to 'item'."New value: +"Line kind: 'item' (billable, needs quantity and unit_price), 'section' (visual header) or 'description' (text-only sub-line). Defaults to 'item'." - changed
Input schema / properties / quantity / descriptionPrevious value: -"Required for 'item' lines."New value: +"Quantity billed. Required for 'item' lines." - changed
Input schema / properties / tax_rate / descriptionPrevious value: -"OMIT — do NOT ask the user for a VAT rate. VAT is determined server-side by strict fiscal rules (default rate + automatic 0% for reverse-charge/export scenarios). Only set when the user explicitly states a rate."New value: +"OMIT - do NOT ask the user for a VAT rate. VAT is determined server-side by strict fiscal rules (default rate + automatic 0% for reverse-charge/export scenarios). Only set when the user explicitly states a rate, as a percent (0-100)." - changed
Input schema / properties / unit_price / descriptionPrevious value: -"Required for 'item' lines."New value: +"Unit price excl. VAT, in the invoice currency. Required for 'item' lines." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "created_at": { + "description": "Creation timestamp (ISO 8601).", + "type": "string" + }, + "description": { + "description": "Line text.", + "type": "string" + }, + "display_order": { + "description": "0-based position on the document.", + "type": "number" + }, + "id": { + "description": "Line item UUID.", + "type": "string" + }, + "invoice_id": { + "description": "Parent invoice UUID.", + "type": "string" + }, + "line_total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Line total incl. VAT, null for non-item lines." + }, + "line_type": { + "description": "Line kind: item, section or description.", + "type": "string" + }, + "product_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Linked product UUID, if any." + }, + "quantity": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Quantity, null for section/description lines." + }, + "tax_rate": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "VAT rate in percent, null for non-item lines." + }, + "tax_rate_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "VAT rate key (e.g. standard, reduced), null for non-item lines." + }, + "unit_price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Unit price excl. VAT, null for non-item lines." + }, + "updated_at": { + "description": "Last update timestamp (ISO 8601).", + "type": "string" + } + }, + "required": [ + "id", + "invoice_id", + "line_type", + "description", + "quantity", + "unit_price", + "tax_rate", + "tax_rate_key", + "line_total", + "display_order", + "product_id", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
apply_provisions_to_invoice1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "advances_total": { + "description": "Sum of provisions now applied to the invoice, in the document currency.", + "type": "number" + }, + "amount_due": { + "description": "Gross total minus applied provisions, in the document currency.", + "type": "number" + } + }, + "required": [ + "advances_total", + "amount_due" + ], + "type": "object" +}
- Changed
cancel_invoice3 fields changed- added
Input schema / properties / invoice_id / descriptionAdded value: +"The invoice UUID to cancel (not Paid)." - added
Input schema / properties / reason / descriptionAdded value: +"Cancellation reason, appended to the internal notes (max 500 characters)." - changed
Output 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" +}
- Changed
check_certification_status2 fields changed- added
Input schema / properties / invoice_id / descriptionAdded value: +"The issued invoice UUID." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "certification_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Certification code returned by the provider, null until certified." + }, + "certification_status": { + "description": "Reconciled certification status: processing, certified or error.", + "type": "string" + } + }, + "required": [ + "certification_code" + ], + "type": "object" +}
- Changed
convert_quote_to_invoice1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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": "Quote UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Quote number (own series).", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "net_total": { + "description": "Total excl. VAT, in the document currency.", + "type": "number" + }, + "note": { + "description": "Next-step guidance, present on preview responses.", + "type": "string" + }, + "preview": { + "description": "True when the call was a preview (confirm omitted or false): nothing was changed.", + "type": "boolean" + }, + "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" + }, + "valid_until": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Validity limit, YYYY-MM-DD." + }, + "would_convert": { + "additionalProperties": false, + "description": "Quote that would be converted (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" +}
- Changed
create_company10 fields changed- added
Input schema / properties / city / descriptionAdded value: +"City." - changed
Input schema / properties / country / descriptionPrevious value: -"ISO country, e.g. FR."New value: +"ISO 3166-1 alpha-2 country code, e.g. FR." - added
Input schema / properties / email / descriptionAdded value: +"Billing email address." - added
Input schema / properties / name / descriptionAdded value: +"Company display name." - added
Input schema / properties / phone / descriptionAdded value: +"Phone number, any format." - added
Input schema / properties / postal_code / descriptionAdded value: +"Postal code." - added
Input schema / properties / street_address / descriptionAdded value: +"Street address (number and street)." - changed
Input schema / properties / tax_id / descriptionPrevious value: -"VAT number."New value: +"VAT number, e.g. FR12345678901." - added
Input schema / properties / website / descriptionAdded value: +"Website URL, including the scheme (https://)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Billing email." + }, + "id": { + "description": "Company UUID.", + "type": "string" + }, + "name": { + "description": "Display name.", + "type": "string" + }, + "siren": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "French SIREN (9 digits)." + }, + "tax_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "VAT number." + } + }, + "required": [ + "id", + "name", + "email", + "tax_id", + "siren" + ], + "type": "object" +}
- Changed
create_credit_note1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "credit_note_id": { + "description": "UUID of the created credit note (after confirm:true).", + "type": "string" + }, + "note": { + "description": "Outcome summary (after confirm:true).", + "type": "string" + }, + "preview": { + "description": "True when the call was a preview (confirm omitted or false): nothing was changed.", + "type": "boolean" + }, + "warning": { + "description": "Irreversibility warning (preview only).", + "type": "string" + }, + "would_cancel_with_credit_note": { + "additionalProperties": false, + "description": "Invoice that would be cancelled by a credit note (preview only).", + "properties": { + "already_has_credit_note": { + "description": "True when a credit note already exists for this invoice.", + "type": "boolean" + }, + "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", + "already_has_credit_note" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
create_invoice10 fields changed- added
Input schema / properties / currency / descriptionAdded value: +"ISO 4217 currency code. Defaults to EUR." - added
Input schema / properties / items / descriptionAdded value: +"Line items in display order (1-100)." - added
Input schema / properties / items / items / properties / description / descriptionAdded value: +"Line text printed on the invoice (1-500 characters)." - changed
Input schema / properties / items / items / properties / line_type / descriptionPrevious value: -"Defaults to 'item'."New value: +"Line kind: 'item' (billable, needs quantity and unit_price), 'section' (visual header) or 'description' (text-only sub-line). Defaults to 'item'." - changed
Input schema / properties / items / items / properties / quantity / descriptionPrevious value: -"Required for 'item' lines."New value: +"Quantity billed. Required for 'item' lines." - changed
Input schema / properties / items / items / properties / tax_rate / descriptionPrevious value: -"OMIT — do NOT ask the user for a VAT rate. VAT is determined server-side by strict fiscal rules (default rate + automatic 0% for reverse-charge/export scenarios). Only set when the user explicitly states a rate."New value: +"OMIT - do NOT ask the user for a VAT rate. VAT is determined server-side by strict fiscal rules (default rate + automatic 0% for reverse-charge/export scenarios). Only set when the user explicitly states a rate, as a percent (0-100)." - changed
Input schema / properties / items / items / properties / unit_price / descriptionPrevious value: -"Required for 'item' lines."New value: +"Unit price excl. VAT, in the invoice currency. Required for 'item' lines." - added
Input schema / properties / notes / descriptionAdded value: +"Free text printed on the invoice (max 2000 characters)." - added
Input schema / properties / payment_terms / descriptionAdded value: +"Payment terms printed on the invoice. Defaults to the client profile or Net-30." - changed
Output 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" + }, + "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" + }, + "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" + } + }, + "required": [ + "id", + "invoice_number", + "type", + "status", + "company_id", + "matter_id", + "issue_date", + "due_date", + "valid_until", + "currency", + "payment_terms", + "delivery_channel", + "net_total", + "tax_total", + "gross_total", + "advances_total", + "amount_due", + "notes", + "internal_notes", + "paid_at", + "sent_at", + "invopop_status", + "vat_scenario", + "source_quote_id", + "replaces_invoice_id", + "replaced_by_invoice_id", + "credit_note_id", + "created_source", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
create_provision11 fields changed- added
Input schema / properties / currency / descriptionAdded value: +"ISO 4217 currency code. Defaults to EUR." - added
Input schema / properties / items / descriptionAdded value: +"Line items in display order (1-100)." - added
Input schema / properties / items / items / properties / description / descriptionAdded value: +"Line text printed on the provision (1-500 characters)." - changed
Input schema / properties / items / items / properties / line_type / descriptionPrevious value: -"Defaults to 'item'."New value: +"Line kind: 'item' (billable, needs quantity and unit_price), 'section' (visual header) or 'description' (text-only sub-line). Defaults to 'item'." - changed
Input schema / properties / items / items / properties / quantity / descriptionPrevious value: -"Required for 'item' lines."New value: +"Quantity. Required for 'item' lines." - changed
Input schema / properties / items / items / properties / tax_rate / descriptionPrevious value: -"OMIT — do NOT ask the user for a VAT rate. VAT is determined server-side by strict fiscal rules (default rate + automatic 0% for reverse-charge/export scenarios). Only set when the user explicitly states a rate."New value: +"OMIT - do NOT ask the user for a VAT rate. VAT is determined server-side by strict fiscal rules (default rate + automatic 0% for reverse-charge/export scenarios). Only set when the user explicitly states a rate, as a percent (0-100)." - changed
Input schema / properties / items / items / properties / unit_price / descriptionPrevious value: -"Required for 'item' lines."New value: +"Unit price excl. VAT, in the provision currency. Required for 'item' lines." - changed
Input schema / properties / matter_id / descriptionPrevious value: -"Matter (dossier) UUID — required for provisions."New value: +"Matter (dossier) UUID - required for provisions." - added
Input schema / properties / notes / descriptionAdded value: +"Free text printed on the provision (max 2000 characters)." - changed
Input schema / properties / payment_terms / descriptionPrevious value: -"Defaults to 'Due on Receipt'."New value: +"Payment terms printed on the provision. Defaults to 'Due on Receipt'." - changed
Output 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" + }, + "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" + }, + "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" + } + }, + "required": [ + "id", + "invoice_number", + "type", + "status", + "company_id", + "matter_id", + "issue_date", + "due_date", + "valid_until", + "currency", + "payment_terms", + "delivery_channel", + "net_total", + "tax_total", + "gross_total", + "advances_total", + "amount_due", + "notes", + "internal_notes", + "paid_at", + "sent_at", + "invopop_status", + "vat_scenario", + "source_quote_id", + "replaces_invoice_id", + "replaced_by_invoice_id", + "credit_note_id", + "created_source", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
create_quote14 fields changed- added
Input schema / properties / currency / descriptionAdded value: +"ISO 4217 currency code. Defaults to EUR." - changed
Input schema / properties / due_date / descriptionPrevious value: -"Defaults to +30 days."New value: +"Due date, YYYY-MM-DD. Defaults to +30 days." - changed
Input schema / properties / issue_date / descriptionPrevious value: -"Defaults to today."New value: +"Issue date, YYYY-MM-DD. Defaults to today." - added
Input schema / properties / items / descriptionAdded value: +"Line items in display order (1-100)." - added
Input schema / properties / items / items / properties / description / descriptionAdded value: +"Line text printed on the quote (1-500 characters)." - added
Input schema / properties / items / items / properties / display_order / descriptionAdded value: +"0-based position on the quote. Defaults to the array order." - changed
Input schema / properties / items / items / properties / line_type / descriptionPrevious value: -"Defaults to 'item'."New value: +"Line kind: 'item' (billable, needs quantity and unit_price), 'section' (visual header) or 'description' (text-only sub-line). Defaults to 'item'." - changed
Input schema / properties / items / items / properties / quantity / descriptionPrevious value: -"Required for 'item' lines."New value: +"Quantity. Required for 'item' lines." - changed
Input schema / properties / items / items / properties / tax_rate / descriptionPrevious value: -"VAT percent. Omit to use the tenant default — never ask the user."New value: +"VAT percent (0-100). Omit to use the tenant default - never ask the user." - changed
Input schema / properties / items / items / properties / unit_price / descriptionPrevious value: -"Required for 'item' lines."New value: +"Unit price excl. VAT, in the quote currency. Required for 'item' lines." - added
Input schema / properties / notes / descriptionAdded value: +"Free text printed on the quote (max 2000 characters)." - added
Input schema / properties / payment_terms / descriptionAdded value: +"Payment terms printed on the quote. Defaults to Net-30." - changed
Input schema / properties / valid_until / descriptionPrevious value: -"Quote validity limit. Defaults to +30 days."New value: +"Quote validity limit, YYYY-MM-DD. Defaults to +30 days." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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": "Quote UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Quote number (own series).", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "net_total": { + "description": "Total excl. VAT, in the document currency.", + "type": "number" + }, + "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" + }, + "valid_until": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Validity limit, YYYY-MM-DD." + } + }, + "required": [ + "id", + "invoice_number", + "type", + "status", + "issue_date", + "due_date", + "valid_until", + "currency", + "net_total", + "tax_total", + "gross_total" + ], + "type": "object" +}
- Changed
delete_company2 fields changed- added
Input schema / properties / company_id / descriptionAdded value: +"The company UUID to delete." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "id": { + "description": "Deleted company UUID (after confirm:true).", + "type": "string" + }, + "note": { + "description": "Next-step guidance, present on preview responses.", + "type": "string" + }, + "preview": { + "description": "True when the call was a preview (confirm omitted or false): nothing was changed.", + "type": "boolean" + }, + "would_delete": { + "additionalProperties": false, + "description": "Company that would be deleted (preview only).", + "properties": { + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Billing email." + }, + "id": { + "description": "Company UUID.", + "type": "string" + }, + "name": { + "description": "Display name.", + "type": "string" + }, + "tax_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "VAT number." + } + }, + "required": [ + "id", + "name", + "email", + "tax_id" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
delete_invoice2 fields changed- added
Input schema / properties / invoice_id / descriptionAdded value: +"The Draft invoice UUID." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "id": { + "description": "Deleted invoice UUID (after confirm:true).", + "type": "string" + }, + "note": { + "description": "Next-step guidance, present on preview responses.", + "type": "string" + }, + "preview": { + "description": "True when the call was a preview (confirm omitted or false): nothing was changed.", + "type": "boolean" + }, + "would_delete": { + "additionalProperties": false, + "description": "Invoice that would be deleted (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" +}
- Changed
delete_invoice_client_profile2 fields changed- added
Input schema / properties / company_id / descriptionAdded value: +"Company UUID whose billing profile is deleted." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "company_id": { + "description": "Company UUID the profile belonged to (after confirm:true).", + "type": "string" + }, + "deleted": { + "description": "True once the profile is deleted (after confirm:true).", + "type": "boolean" + }, + "note": { + "description": "Next-step guidance, present on preview responses.", + "type": "string" + }, + "preview": { + "description": "True when the call was a preview (confirm omitted or false): nothing was changed.", + "type": "boolean" + }, + "would_delete": { + "additionalProperties": false, + "description": "Profile that would be deleted (preview only).", + "properties": { + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Company name, null when not resolvable." + }, + "company_id": { + "description": "Company UUID.", + "type": "string" + }, + "delivery_channel": { + "description": "Delivery channel: Email, e-Invoice or Manual.", + "type": "string" + }, + "id": { + "description": "Profile UUID.", + "type": "string" + }, + "invoice_prefix": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Custom invoice number prefix, null for the tenant default." + }, + "payment_terms": { + "description": "Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt.", + "type": "string" + } + }, + "required": [ + "id", + "company_id", + "company", + "payment_terms", + "delivery_channel", + "invoice_prefix" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
delete_invoice_item2 fields changed- added
Input schema / properties / item_id / descriptionAdded value: +"The line item UUID." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "id": { + "description": "Deleted line item UUID (after confirm:true).", + "type": "string" + }, + "note": { + "description": "Next-step guidance, present on preview responses.", + "type": "string" + }, + "preview": { + "description": "True when the call was a preview (confirm omitted or false): nothing was changed.", + "type": "boolean" + }, + "would_delete": { + "additionalProperties": false, + "description": "Line item that would be deleted (preview only).", + "properties": { + "description": { + "description": "Line text.", + "type": "string" + }, + "id": { + "description": "Line item UUID.", + "type": "string" + }, + "invoice_id": { + "description": "Parent invoice UUID.", + "type": "string" + }, + "line_total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Line total incl. VAT, null for non-item lines." + }, + "quantity": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Quantity, null for section/description lines." + }, + "unit_price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Unit price excl. VAT, null for non-item lines." + } + }, + "required": [ + "id", + "description", + "quantity", + "unit_price", + "line_total", + "invoice_id" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
get_company1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "account_status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "CRM account status." + }, + "account_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "CRM account type." + }, + "city": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "City." + }, + "client_profile": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Client classification: pm (legal entity), pp_pro (sole trader) or consumer." + }, + "country": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "ISO 3166-1 alpha-2 country code." + }, + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Billing email." + }, + "id": { + "description": "Company UUID.", + "type": "string" + }, + "legal_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Registered legal name, when different from name." + }, + "name": { + "description": "Display name.", + "type": "string" + }, + "phone": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Phone number." + }, + "postal_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Postal code." + }, + "siren": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "French SIREN (9 digits)." + }, + "state": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "State or region." + }, + "street_address": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Street address." + }, + "tax_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "VAT number." + }, + "website": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Website URL." + } + }, + "required": [ + "id", + "name", + "email", + "tax_id", + "siren", + "country", + "client_profile", + "legal_name", + "phone", + "street_address", + "city", + "state", + "postal_code", + "website", + "account_type", + "account_status" + ], + "type": "object" +}
- Changed
get_invoice1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "certification_error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Last certification error message, null when none." + }, + "certification_status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Fiscal certification status (e.g. processing, certified, error), null before issuance." + }, + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Client company name, null when unknown." + }, + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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" + }, + "invoice_number": { + "description": "Human-readable invoice number.", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "items": { + "description": "Line items in display order.", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Line text.", + "type": "string" + }, + "line_total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Line total incl. VAT, null for non-item lines." + }, + "line_type": { + "description": "Line kind: item, section or description.", + "type": "string" + }, + "quantity": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Quantity, null for section/description lines." + }, + "tax_rate": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "VAT rate in percent, null for non-item lines." + }, + "unit_price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Unit price excl. VAT, null for non-item lines." + } + }, + "required": [ + "description", + "line_type", + "quantity", + "unit_price", + "tax_rate", + "line_total" + ], + "type": "object" + }, + "type": "array" + }, + "net_total": { + "description": "Total excl. VAT, in the document currency.", + "type": "number" + }, + "notes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Notes printed on the invoice." + }, + "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" + }, + "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" + } + }, + "required": [ + "id", + "invoice_number", + "type", + "status", + "issue_date", + "due_date", + "paid_at", + "currency", + "gross_total", + "company", + "net_total", + "tax_total", + "payment_terms", + "notes", + "certification_status", + "certification_error", + "items" + ], + "type": "object" +}
- Changed
get_invoice_client_profile2 fields changed- added
Input schema / properties / company_id / descriptionAdded value: +"Company UUID (use list_companies to resolve)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "profile": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Company name, null when not resolvable." + }, + "company_id": { + "description": "Company UUID.", + "type": "string" + }, + "delivery_channel": { + "description": "Delivery channel: Email, e-Invoice or Manual.", + "type": "string" + }, + "id": { + "description": "Profile UUID.", + "type": "string" + }, + "invoice_prefix": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Custom invoice number prefix, null for the tenant default." + }, + "payment_terms": { + "description": "Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt.", + "type": "string" + } + }, + "required": [ + "id", + "company_id", + "company", + "payment_terms", + "delivery_channel", + "invoice_prefix" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The company's billing profile, null when none exists yet." + } + }, + "required": [ + "profile" + ], + "type": "object" +}
- Changed
get_invoice_pdf1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "available": { + "description": "False when the invoice has no stored PDF.", + "type": "boolean" + }, + "expires_in_seconds": { + "description": "Lifetime of the signed URL in seconds, present when available is true.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "reason": { + "description": "Why no PDF is available, present when available is false.", + "type": "string" + }, + "url": { + "description": "Signed download URL, present when available is true.", + "type": "string" + } + }, + "required": [ + "available" + ], + "type": "object" +}
- Changed
get_rectification_links2 fields changed- added
Input schema / properties / invoice_id / descriptionAdded value: +"The invoice UUID to inspect." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "replacedBy": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "description": "Invoice UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Human-readable invoice number.", + "type": "string" + } + }, + "required": [ + "id", + "invoice_number" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Rectificative that superseded this invoice, null when not rectified." + }, + "replaces": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "description": "Invoice UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Human-readable invoice number.", + "type": "string" + } + }, + "required": [ + "id", + "invoice_number" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Original invoice this one rectifies, null when not a rectificative." + } + }, + "required": [ + "replaces", + "replacedBy" + ], + "type": "object" +}
- Changed
get_revenue_summary1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "collected": { + "description": "Gross total of invoices paid within the period (by payment date).", + "type": "number" + }, + "collected_count": { + "description": "Number of invoices paid within the period.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "credit_note_total": { + "description": "Net effect of credit notes issued within the period (negative or zero).", + "type": "number" + }, + "currency_note": { + "description": "Caveat about amounts being summed across currencies.", + "type": "string" + }, + "draft_count": { + "description": "Current number of drafts.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "invoice_count": { + "description": "Documents issued within the period, drafts excluded.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "outstanding": { + "description": "Amount currently due on Sent invoices (point-in-time).", + "type": "number" + }, + "outstanding_count": { + "description": "Number of Sent invoices.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "overdue": { + "description": "Amount currently due on Overdue invoices (point-in-time).", + "type": "number" + }, + "overdue_count": { + "description": "Number of Overdue invoices.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "period": { + "additionalProperties": false, + "description": "Period the collected/issued figures cover.", + "properties": { + "from": { + "description": "Period start, YYYY-MM-DD.", + "type": "string" + }, + "to": { + "description": "Period end (inclusive), YYYY-MM-DD.", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "period", + "collected", + "collected_count", + "outstanding", + "outstanding_count", + "overdue", + "overdue_count", + "invoice_count", + "draft_count", + "credit_note_total", + "currency_note" + ], + "type": "object" +}
- Changed
get_settings1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "billing_email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Email printed on documents." + }, + "default_payment_terms": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Default payment terms for new documents." + }, + "default_vat_rate_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Default VAT rate key applied to new lines." + }, + "display_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Tenant display name." + }, + "legal_form": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Legal form (e.g. SAS, SARL, EI)." + }, + "legal_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Registered legal name of the tenant." + }, + "preferred_language": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Caller's UI language (ISO 639-1)." + }, + "tax_country": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Fiscal country, ISO 3166-1 alpha-2." + }, + "tax_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Tenant VAT number." + }, + "tax_regime": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "VAT regime: normal or franchise_en_base." + } + }, + "required": [ + "legal_name", + "display_name", + "legal_form", + "tax_country", + "tax_id", + "tax_regime", + "default_vat_rate_key", + "default_payment_terms", + "billing_email", + "preferred_language" + ], + "type": "object" +}
- Changed
import_external_invoice9 fields changed- added
Input schema / properties / company_id / descriptionAdded value: +"Client company UUID (use list_companies to resolve); null or omitted when unknown." - added
Input schema / properties / currency / descriptionAdded value: +"ISO 4217 currency code. Defaults to EUR." - changed
Input schema / properties / due_date / descriptionPrevious value: -"Defaults to issue_date + 30 days."New value: +"Due date, YYYY-MM-DD. Defaults to issue_date + 30 days." - changed
Input schema / properties / gross_amount / descriptionPrevious value: -"Defaults to net + tax."New value: +"Total incl. VAT. Defaults to net + tax." - added
Input schema / properties / issue_date / descriptionAdded value: +"Original issue date, YYYY-MM-DD." - added
Input schema / properties / notes / descriptionAdded value: +"Free text kept with the imported record (max 2000 characters)." - added
Input schema / properties / status / descriptionAdded value: +"Status of the historical invoice as it stands today." - added
Input schema / properties / tax_amount / descriptionAdded value: +"VAT amount. Defaults to 0." - changed
Output 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" + }, + "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" + }, + "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" + } + }, + "required": [ + "id", + "invoice_number", + "type", + "status", + "company_id", + "matter_id", + "issue_date", + "due_date", + "valid_until", + "currency", + "payment_terms", + "delivery_channel", + "net_total", + "tax_total", + "gross_total", + "advances_total", + "amount_due", + "notes", + "internal_notes", + "paid_at", + "sent_at", + "invopop_status", + "vat_scenario", + "source_quote_id", + "replaces_invoice_id", + "replaced_by_invoice_id", + "credit_note_id", + "created_source", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
issue_invoice2 fields changed- added
Input schema / properties / invoice_id / descriptionAdded value: +"The Draft invoice UUID to issue." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "certification_status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Certification status right after submission (after confirm:true)." + }, + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Client company name, null when unknown." + }, + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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" + }, + "invoice_number": { + "description": "Human-readable invoice number.", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "note": { + "description": "Outcome summary (after confirm:true).", + "type": "string" + }, + "paid_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Payment timestamp (ISO 8601), null while unpaid." + }, + "preview": { + "description": "True when the call was a preview (confirm omitted or false): nothing was changed.", + "type": "boolean" + }, + "status": { + "description": "Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired.", + "type": "string" + }, + "type": { + "description": "Document type: invoice, credit_note, provision or quote.", + "type": "string" + }, + "warning": { + "description": "Irreversibility warning (preview only).", + "type": "string" + }, + "would_issue_and_certify": { + "additionalProperties": false, + "description": "Invoice that would be issued and certified (preview only).", + "properties": { + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Client company name, null when unknown." + }, + "currency": { + "description": "ISO 4217 currency code.", + "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": "Document UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Human-readable document number.", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "items": { + "description": "Line items that would be certified.", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Line text.", + "type": "string" + }, + "quantity": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Quantity, null for section/description lines." + }, + "tax_rate": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "VAT rate in percent, null for non-item lines." + }, + "unit_price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Unit price excl. VAT, null for non-item lines." + } + }, + "required": [ + "description", + "quantity", + "unit_price", + "tax_rate" + ], + "type": "object" + }, + "type": "array" + }, + "net_total": { + "description": "Total excl. VAT, in the document currency.", + "type": "number" + }, + "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" + } + }, + "required": [ + "id", + "invoice_number", + "status", + "gross_total", + "company", + "issue_date", + "due_date", + "net_total", + "tax_total", + "currency", + "items" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
list_available_provisions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "items": { + "description": "Paid provisions of the matter not yet applied to an invoice, most recently paid first.", + "items": { + "additionalProperties": false, + "properties": { + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Client company name, null when unknown." + }, + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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": "Provision UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Provision number (PROV series).", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "matter": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Matter (dossier) name, null when unknown." + }, + "paid_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Payment timestamp (ISO 8601), null while unpaid." + }, + "status": { + "description": "Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired.", + "type": "string" + } + }, + "required": [ + "id", + "invoice_number", + "status", + "matter", + "company", + "issue_date", + "due_date", + "paid_at", + "currency", + "gross_total" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "Number of provisions returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "items", + "total" + ], + "type": "object" +}
- Changed
list_companies1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "items": { + "description": "Client companies, sorted by name.", + "items": { + "additionalProperties": false, + "properties": { + "client_profile": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Client classification: pm (legal entity), pp_pro (sole trader) or consumer." + }, + "country": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "ISO 3166-1 alpha-2 country code." + }, + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Billing email." + }, + "id": { + "description": "Company UUID.", + "type": "string" + }, + "name": { + "description": "Display name.", + "type": "string" + }, + "siren": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "French SIREN (9 digits)." + }, + "tax_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "VAT number." + } + }, + "required": [ + "id", + "name", + "email", + "tax_id", + "siren", + "country", + "client_profile" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "Number of companies returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "items", + "total" + ], + "type": "object" +}
- Changed
list_invoices1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "items": { + "description": "Invoices of the requested page, most recent first.", + "items": { + "additionalProperties": false, + "properties": { + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Client company name, null when unknown." + }, + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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" + }, + "invoice_number": { + "description": "Human-readable invoice number.", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "paid_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Payment timestamp (ISO 8601), null while unpaid." + }, + "status": { + "description": "Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired.", + "type": "string" + }, + "type": { + "description": "Document type: invoice, credit_note, provision or quote.", + "type": "string" + } + }, + "required": [ + "id", + "invoice_number", + "type", + "status", + "issue_date", + "due_date", + "paid_at", + "currency", + "gross_total", + "company" + ], + "type": "object" + }, + "type": "array" + }, + "page": { + "description": "1-based page number returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "per_page": { + "description": "Page size used.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "total": { + "description": "Total number of matching documents.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "total_pages": { + "description": "Total number of pages.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "items", + "total", + "page", + "per_page", + "total_pages" + ], + "type": "object" +}
- Changed
list_mcp_activity2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Default 20."New value: +"Maximum number of entries to return (1-50). Default 20." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "items": { + "description": "Activity entries, newest first.", + "items": { + "additionalProperties": false, + "properties": { + "created_at": { + "description": "Call timestamp (ISO 8601).", + "type": "string" + }, + "invoice_number": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Related document number when the result carried one." + }, + "tool_name": { + "description": "MCP tool that was called.", + "type": "string" + } + }, + "required": [ + "tool_name", + "invoice_number", + "created_at" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "items" + ], + "type": "object" +}
- Changed
mark_invoice_paid3 fields changed- added
Input schema / properties / invoice_id / descriptionAdded value: +"The Sent or Overdue invoice UUID." - changed
Input schema / properties / paid_at / descriptionPrevious value: -"ISO datetime; defaults to now."New value: +"Payment timestamp, ISO 8601 (e.g. 2026-09-07T10:00:00Z); defaults to now." - changed
Output 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" + }, + "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" + }, + "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" + } + }, + "required": [ + "id", + "invoice_number", + "type", + "status", + "company_id", + "matter_id", + "issue_date", + "due_date", + "valid_until", + "currency", + "payment_terms", + "delivery_channel", + "net_total", + "tax_total", + "gross_total", + "advances_total", + "amount_due", + "notes", + "internal_notes", + "paid_at", + "sent_at", + "invopop_status", + "vat_scenario", + "source_quote_id", + "replaces_invoice_id", + "replaced_by_invoice_id", + "credit_note_id", + "created_source", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
mark_provision_paid3 fields changed- changed
Input schema / properties / invoice_id / descriptionPrevious value: -"The provision UUID."New value: +"The Sent or Overdue provision UUID." - changed
Input schema / properties / paid_at / descriptionPrevious value: -"Payment timestamp (ISO 8601). Defaults to now."New value: +"Payment timestamp (ISO 8601, e.g. 2026-09-07T10:00:00Z). Defaults to now." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Client company name, null when unknown." + }, + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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": "Provision UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Provision number (PROV series).", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "matter": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Matter (dossier) name, null when unknown." + }, + "paid_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Payment timestamp (ISO 8601), null while unpaid." + }, + "status": { + "description": "Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired.", + "type": "string" + } + }, + "required": [ + "id", + "invoice_number", + "status", + "matter", + "company", + "issue_date", + "due_date", + "paid_at", + "currency", + "gross_total" + ], + "type": "object" +}
- Changed
rectify_invoice9 fields changed- changed
Input schema / properties / due_date / descriptionPrevious value: -"Defaults from the original's payment terms."New value: +"Due date, YYYY-MM-DD. Defaults from the original's payment terms." - changed
Input schema / properties / issue_date / descriptionPrevious value: -"Defaults to today."New value: +"Issue date, YYYY-MM-DD. Defaults to today." - added
Input schema / properties / items / items / properties / description / descriptionAdded value: +"Line text printed on the invoice (1-500 characters)." - changed
Input schema / properties / items / items / properties / line_type / descriptionPrevious value: -"Defaults to 'item'."New value: +"Line kind: 'item' (billable, needs quantity and unit_price), 'section' (visual header) or 'description' (text-only sub-line). Defaults to 'item'." - changed
Input schema / properties / items / items / properties / quantity / descriptionPrevious value: -"Required for 'item' lines."New value: +"Quantity. Required for 'item' lines." - changed
Input schema / properties / items / items / properties / tax_rate / descriptionPrevious value: -"OMIT — do NOT ask the user for a VAT rate. VAT is determined server-side by strict fiscal rules. Only set when the user explicitly states a rate."New value: +"OMIT - do NOT ask the user for a VAT rate. VAT is determined server-side by strict fiscal rules. Only set when the user explicitly states a rate, as a percent (0-100)." - changed
Input schema / properties / items / items / properties / unit_price / descriptionPrevious value: -"Required for 'item' lines."New value: +"Unit price excl. VAT, in the invoice currency. Required for 'item' lines." - added
Input schema / properties / notes / descriptionAdded value: +"Notes printed on the rectificative (max 2000 characters). Omit to copy the original's notes." - changed
Output 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." + }, + "original": { + "additionalProperties": false, + "description": "Invoice that would be rectified (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" + }, + "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_create": { + "additionalProperties": false, + "description": "Outline of the rectificative that would be created (preview only).", + "properties": { + "company_id": { + "description": "Client company UUID carried over from the original.", + "type": "string" + }, + "items_count": { + "description": "Number of line items the rectificative would carry.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "items_source": { + "description": "Where the items come from: 'override' or 'copied from original'.", + "type": "string" + } + }, + "required": [ + "company_id", + "items_count", + "items_source" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
reject_quote2 fields changed- changed
Input schema / properties / quote_id / descriptionPrevious value: -"The quote UUID."New value: +"The Sent quote UUID." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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": "Quote UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Quote number (own series).", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "net_total": { + "description": "Total excl. VAT, in the document currency.", + "type": "number" + }, + "note": { + "description": "Next-step guidance, present on preview responses.", + "type": "string" + }, + "preview": { + "description": "True when the call was a preview (confirm omitted or false): nothing was changed.", + "type": "boolean" + }, + "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" + }, + "valid_until": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Validity limit, YYYY-MM-DD." + }, + "would_reject": { + "additionalProperties": false, + "description": "Quote that would be rejected (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" +}
- Changed
remove_provision_from_invoice1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "advances_total": { + "description": "Sum of provisions now applied to the invoice, in the document currency.", + "type": "number" + }, + "amount_due": { + "description": "Gross total minus applied provisions, in the document currency.", + "type": "number" + } + }, + "required": [ + "advances_total", + "amount_due" + ], + "type": "object" +}
- Changed
reorder_invoice_items5 fields changed- added
Input schema / properties / invoice_id / descriptionAdded value: +"The invoice UUID whose items are reordered." - added
Input schema / properties / item_order / descriptionAdded value: +"Full desired order: one entry per line item (1-200)." - added
Input schema / properties / item_order / items / properties / display_order / descriptionAdded value: +"New 0-based position of that item." - added
Input schema / properties / item_order / items / properties / id / descriptionAdded value: +"Line item UUID." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "invoice_id": { + "description": "The reordered invoice UUID.", + "type": "string" + }, + "items_count": { + "description": "Number of items whose position was set.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "reordered": { + "description": "True once the new order is saved.", + "type": "boolean" + } + }, + "required": [ + "reordered", + "invoice_id", + "items_count" + ], + "type": "object" +}
- Changed
send_provision2 fields changed- changed
Input schema / properties / invoice_id / descriptionPrevious value: -"The provision UUID."New value: +"The Draft provision UUID." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Client company name, null when unknown." + }, + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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": "Provision UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Provision number (PROV series).", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "matter": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Matter (dossier) name, null when unknown." + }, + "note": { + "description": "Next-step guidance, present on preview responses.", + "type": "string" + }, + "paid_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Payment timestamp (ISO 8601), null while unpaid." + }, + "preview": { + "description": "True when the call was a preview (confirm omitted or false): nothing was changed.", + "type": "boolean" + }, + "status": { + "description": "Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired.", + "type": "string" + }, + "would_issue_and_certify": { + "additionalProperties": false, + "description": "Provision that would be issued and certified (preview only).", + "properties": { + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Client company name, null when unknown." + }, + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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": "Provision UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Provision number (PROV series).", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "matter": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Matter (dossier) name, null when unknown." + }, + "paid_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Payment timestamp (ISO 8601), null while unpaid." + }, + "status": { + "description": "Document status: Draft, Sent, Paid, Overdue, Cancelled, Rectified, Accepted, Rejected or Expired.", + "type": "string" + } + }, + "required": [ + "id", + "invoice_number", + "status", + "matter", + "company", + "issue_date", + "due_date", + "paid_at", + "currency", + "gross_total" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
send_quote2 fields changed- changed
Input schema / properties / quote_id / descriptionPrevious value: -"The quote UUID."New value: +"The Draft quote UUID." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "currency": { + "description": "ISO 4217 currency code (EUR, USD, GBP or CHF).", + "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": "Quote UUID.", + "type": "string" + }, + "invoice_number": { + "description": "Quote number (own series).", + "type": "string" + }, + "issue_date": { + "description": "Issue date, YYYY-MM-DD.", + "type": "string" + }, + "net_total": { + "description": "Total excl. VAT, in the document currency.", + "type": "number" + }, + "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" + }, + "valid_until": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Validity limit, YYYY-MM-DD." + } + }, + "required": [ + "id", + "invoice_number", + "type", + "status", + "issue_date", + "due_date", + "valid_until", + "currency", + "net_total", + "tax_total", + "gross_total" + ], + "type": "object" +}
- Changed
update_company11 fields changed- added
Input schema / properties / city / descriptionAdded value: +"New city." - added
Input schema / properties / company_id / descriptionAdded value: +"The company UUID to update." - changed
Input schema / properties / country / descriptionPrevious value: -"ISO country, e.g. FR."New value: +"ISO 3166-1 alpha-2 country code, e.g. FR." - added
Input schema / properties / email / descriptionAdded value: +"New billing email address." - added
Input schema / properties / name / descriptionAdded value: +"New display name." - added
Input schema / properties / phone / descriptionAdded value: +"New phone number, any format." - added
Input schema / properties / postal_code / descriptionAdded value: +"New postal code." - added
Input schema / properties / street_address / descriptionAdded value: +"New street address (number and street)." - changed
Input schema / properties / tax_id / descriptionPrevious value: -"VAT number."New value: +"VAT number, e.g. FR12345678901." - added
Input schema / properties / website / descriptionAdded value: +"New website URL, including the scheme (https://)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Billing email." + }, + "id": { + "description": "Company UUID.", + "type": "string" + }, + "name": { + "description": "Display name.", + "type": "string" + }, + "siren": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "French SIREN (9 digits)." + }, + "tax_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "VAT number." + } + }, + "required": [ + "id", + "name", + "email", + "tax_id", + "siren" + ], + "type": "object" +}
- Changed
update_invoice8 fields changed- added
Input schema / properties / company_id / descriptionAdded value: +"Reassign the invoice to another company UUID (the client snapshot is rebuilt); null to detach." - added
Input schema / properties / due_date / descriptionAdded value: +"New due date, YYYY-MM-DD, on or after issue_date." - added
Input schema / properties / internal_notes / descriptionAdded value: +"Private notes never printed (max 2000 characters); null to clear." - added
Input schema / properties / invoice_id / descriptionAdded value: +"The Draft invoice UUID." - added
Input schema / properties / issue_date / descriptionAdded value: +"New issue date, YYYY-MM-DD." - added
Input schema / properties / notes / descriptionAdded value: +"Notes printed on the invoice (max 2000 characters); null to clear." - added
Input schema / properties / payment_terms / descriptionAdded value: +"New payment terms printed on the invoice." - changed
Output 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" + }, + "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" + }, + "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" + } + }, + "required": [ + "id", + "invoice_number", + "type", + "status", + "company_id", + "matter_id", + "issue_date", + "due_date", + "valid_until", + "currency", + "payment_terms", + "delivery_channel", + "net_total", + "tax_total", + "gross_total", + "advances_total", + "amount_due", + "notes", + "internal_notes", + "paid_at", + "sent_at", + "invopop_status", + "vat_scenario", + "source_quote_id", + "replaces_invoice_id", + "replaced_by_invoice_id", + "credit_note_id", + "created_source", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
update_invoice_item7 fields changed- added
Input schema / properties / description / descriptionAdded value: +"New line text (1-500 characters)." - added
Input schema / properties / item_id / descriptionAdded value: +"The line item UUID." - added
Input schema / properties / line_type / descriptionAdded value: +"New line kind: 'item', 'section' or 'description'." - added
Input schema / properties / quantity / descriptionAdded value: +"New quantity; null to clear (non-item lines)." - changed
Input schema / properties / tax_rate / descriptionPrevious value: -"OMIT — VAT is determined server-side by fiscal rules; only set on explicit user request."New value: +"OMIT - VAT is determined server-side by fiscal rules; only set on explicit user request, as a percent (0-100)." - added
Input schema / properties / unit_price / descriptionAdded value: +"New unit price excl. VAT, in the invoice currency; null to clear (non-item lines)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "created_at": { + "description": "Creation timestamp (ISO 8601).", + "type": "string" + }, + "description": { + "description": "Line text.", + "type": "string" + }, + "display_order": { + "description": "0-based position on the document.", + "type": "number" + }, + "id": { + "description": "Line item UUID.", + "type": "string" + }, + "invoice_id": { + "description": "Parent invoice UUID.", + "type": "string" + }, + "line_total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Line total incl. VAT, null for non-item lines." + }, + "line_type": { + "description": "Line kind: item, section or description.", + "type": "string" + }, + "product_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Linked product UUID, if any." + }, + "quantity": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Quantity, null for section/description lines." + }, + "tax_rate": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "VAT rate in percent, null for non-item lines." + }, + "tax_rate_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "VAT rate key (e.g. standard, reduced), null for non-item lines." + }, + "unit_price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Unit price excl. VAT, null for non-item lines." + }, + "updated_at": { + "description": "Last update timestamp (ISO 8601).", + "type": "string" + } + }, + "required": [ + "id", + "invoice_id", + "line_type", + "description", + "quantity", + "unit_price", + "tax_rate", + "tax_rate_key", + "line_total", + "display_order", + "product_id", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
update_invoice_matter3 fields changed- added
Input schema / properties / invoice_id / descriptionAdded value: +"The invoice UUID (any status except Cancelled)." - changed
Input schema / properties / matter_id / descriptionPrevious value: -"Matter UUID, or null to detach."New value: +"Matter (dossier) UUID, or null to detach." - changed
Output 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" + }, + "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" + }, + "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" + } + }, + "required": [ + "id", + "invoice_number", + "type", + "status", + "company_id", + "matter_id", + "issue_date", + "due_date", + "valid_until", + "currency", + "payment_terms", + "delivery_channel", + "net_total", + "tax_total", + "gross_total", + "advances_total", + "amount_due", + "notes", + "internal_notes", + "paid_at", + "sent_at", + "invopop_status", + "vat_scenario", + "source_quote_id", + "replaces_invoice_id", + "replaced_by_invoice_id", + "credit_note_id", + "created_source", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
upsert_invoice_client_profile5 fields changed- added
Input schema / properties / company_id / descriptionAdded value: +"Company UUID (use list_companies to resolve)." - added
Input schema / properties / delivery_channel / descriptionAdded value: +"How invoices reach this client: Email, e-Invoice or Manual. Defaults to Email on creation." - added
Input schema / properties / invoice_prefix / descriptionAdded value: +"Custom invoice number prefix (max 10 chars, uppercase letters, digits and hyphens); null to use the tenant default." - added
Input schema / properties / payment_terms / descriptionAdded value: +"Default payment terms for this client's invoices. Defaults to Net-30 on creation." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Company name, null when not resolvable." + }, + "company_id": { + "description": "Company UUID.", + "type": "string" + }, + "delivery_channel": { + "description": "Delivery channel: Email, e-Invoice or Manual.", + "type": "string" + }, + "id": { + "description": "Profile UUID.", + "type": "string" + }, + "invoice_prefix": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Custom invoice number prefix, null for the tenant default." + }, + "payment_terms": { + "description": "Payment terms: Net-15, Net-30, Net-60, Net-90 or Due on Receipt.", + "type": "string" + } + }, + "required": [ + "id", + "company_id", + "company", + "payment_terms", + "delivery_channel", + "invoice_prefix" + ], + "type": "object" +}
41 tool updates
- First observed
accept_quote - First observed
add_invoice_item - First observed
apply_provisions_to_invoice - First observed
cancel_invoice - First observed
check_certification_status - First observed
convert_quote_to_invoice - First observed
create_company - First observed
create_credit_note - First observed
create_invoice - First observed
create_provision - First observed
create_quote - First observed
delete_company - First observed
delete_invoice - First observed
delete_invoice_client_profile - First observed
delete_invoice_item - First observed
get_company - First observed
get_invoice - First observed
get_invoice_client_profile - First observed
get_invoice_pdf - First observed
get_rectification_links - First observed
get_revenue_summary - First observed
get_settings - First observed
import_external_invoice - First observed
issue_invoice - First observed
list_available_provisions - First observed
list_companies - First observed
list_invoices - First observed
list_mcp_activity - First observed
mark_invoice_paid - First observed
mark_provision_paid - First observed
rectify_invoice - First observed
reject_quote - First observed
remove_provision_from_invoice - First observed
reorder_invoice_items - First observed
send_provision - First observed
send_quote - First observed
update_company - First observed
update_invoice - First observed
update_invoice_item - First observed
update_invoice_matter - First observed
upsert_invoice_client_profile
Publisher details
- Operator
- Kema Invoice · Publisher source
- Operator website
- https://kema-studio.com/en · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://docs.kema-studio.com/invoice/guide-utilisateur/connecter-votre-agent-mcp · Publisher source
- Trust center
- Not available
- Restrictions
- Requires an active Kema Invoice subscription (EUR 10 excl. VAT per user per month). Free trial: 14 days or 10 invoices, whichever comes first, single user, no credit card. Without an entitlement the connector still connects and lists its tools; every tools/call returns an explanatory refusal instead of data. No admin approval, no regional restriction and no custom OAuth app to create: the server supports dynamic client registration (RFC 7591). The product targets French and EU invoicing rules. · Publisher source
Related MCP Connectors
Log hours and invoice clients from your AI chat. Time tracking and invoicing for freelancers.
Free invoice drafts, templates and direct PDF generation for AI agents. No account needed.
41Make PDF invoices from your AI chat: clients, numbering, VAT, overdue reports. All data is local.
Create, send and track invoices for freelancers and small businesses.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to create and manage e-invoices through natural language, supporting EU compliance formats like ZUGFeRD and XRechnung, as well as US plain PDF invoices.7-

InvoiceXMLofficial
AlicenseNot gradedqualityCmaintenanceInvoiceXML brings e-invoice compliance to your AI agent. Create, validate, convert, render, and extract structured invoices across UBL (Peppol BIS Billing 3.0, used worldwide), CII, Factur-X, ZUGFeRD, and XRechnung, all checked against the EN 16931 standard and official Schematron rules. Ask your assistant to generate a compliant invoice, validate one for errors, or convert between formats, with n5MIT- AlicenseNot gradedqualityCmaintenanceEnables drafting quotations and invoices from AI assistants like ChatGPT, Claude, and Gemini, with 133 templates, tax rules for 195 countries, and a link to the finished document.MIT

BeeL MCP serverofficial
AlicenseAqualityAmaintenanceEnables AI agents to issue, correct, and register legally compliant Spanish electronic invoices with AEAT VeriFactu, supporting F1/F2 types, R1–R5 correctives, and NIF validation from Claude, ChatGPT, Cursor, or VS Code.12148 npm2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.