Skip to main content
Glama

Update invoice

well_update_invoice
Destructive

Update an existing invoice in Well.

Call well_get_schema("invoices") to discover all available fields.

REQUIRED: invoice_id OPTIONAL (only pass fields you want changed):

  • reference_number, issue_date (ISO date), due_date (ISO date)

  • status (draft | issued | paid | canceled). "paid" is an "issued" request that also records the source's claim that the invoice was settled; it is never a lifecycle word of its own. Never set a draft to issued or paid here: finalize a draft with well_issue_invoice. A status change to issued or paid on a draft is refused.

  • terms, description

  • grand_total, items_total, tax_total (numbers)

  • local_currency (ISO 4217 three-letter code, e.g. "EUR", "USD")

  • document_type_code (UN/CEFACT 1001 code, e.g. "380")

  • billing_context (e.g. subscription, one_time, project, ...)

  • valid_until (YYYY-MM-DD, the last day a quote stays valid) and quote_outcome (pending, accepted, denied, invoiced or expired, the customer's answer): both only on a quote (document_type_code "310"); null clears either one. A quote moved to another type needs both cleared in the same call.

  • issuer_company_id / receiver_company_id (uuid to set, null to clear, omit to leave unchanged)

  • receiver_person_id (a private individual's person id from well_list_customers or well_create_person; uuid to set, null to clear). A receiver is a company or a person: setting one clears the other, and both in one call is refused.

Cannot change line items, payment_means, or document attachment via this tool.

Input Schema

NameRequiredDescriptionDefault
termsNoPayment terms text; pass null to clear
statusNoInvoice lifecycle status
due_dateNoPayment due date (ISO 8601); pass null to clear
tax_totalNoTotal tax amount; pass null to clear
invoice_idYesThe UUID of the invoice to update
issue_dateNoIssue date (ISO 8601, e.g. 2026-04-27); pass null to clear
descriptionNoFree-form description; pass null to clear
grand_totalNoTotal invoice amount including tax; pass null to clear
items_totalNoSum of line items before tax; pass null to clear
valid_untilNoLast day the quote stays valid, YYYY-MM-DD (quotes only); pass null to clear
workspace_idNoTarget workspace. Omit when the token authorizes one workspace. Required when it authorizes several — a write lands in exactly one workspace and this call would not say which.
quote_outcomeNoThe customer's answer to a quote: pending, accepted, denied, invoiced or expired (quotes only); pass null to clear
local_currencyNoISO 4217 three-letter currency code (e.g. EUR, USD); pass null to clear
payment_statusNoUser-driven payment_status override — requires override_version (CAS)
billing_contextNoBilling context / business model; pass null to clear
conversation_idNoThe conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.
workspace_scopeNoRestrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.
override_versionNoRequired when payment_status is present — current override_version for CAS
reference_numberNoInvoice reference number (e.g. INV-2026-001); pass null to clear
issuer_company_idNoIssuer company UUID. Omit = no change, null = clear, uuid = set.
document_type_codeNoUN/CEFACT 1001 document type code (e.g. 380 for commercial invoice); pass null to clear
receiver_person_idNoReceiver person UUID, for a private individual. Omit = no change, null = clear, uuid = set.
receiver_company_idNoReceiver company UUID. Omit = no change, null = clear, uuid = set.

Output Schema

NameRequiredDescriptionDefault
errorNo
linesNo
statusNo
sourcesNoThe tools that hold a copy of the invoice, highest source precedence first. Empty when no tool holds it.
successYes
currencyNo
tax_totalNo
invoice_idNo
issue_dateNo
grand_totalNo
items_totalNo
source_countNoHow many tools hold the invoice; sources may list fewer.
customer_nameNo
design_layoutNo
fx_conversionNo
customer_sirenNoThe SIREN the invoice prints for its customer. Absent while the customer has none.
missing_fieldsNoOn a draft, every part the person gives that it still lacks before it can be issued. The draft is complete only when this list is empty.
card_line_countNo
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
newly_connectedNoTools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: "<name> is connected.". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.
reference_numberNo
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
conversation_id_sourceNoWhere the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.
next_invoice_number_stateNoWhether the workspace's next invoice number lets the issue go ahead. Well settles it when the invoice is issued: it is never named to the person and never makes the draft incomplete.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / customer_siren
      Added value: +{
      +  "description": "The SIREN the invoice prints for its customer. Absent while the customer has none.",
      +  "type": "string"
      +}
  2. Changed40 schema fields changed
    • removedInput schema / properties / due_date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / due_date / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / grand_total / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / grand_total / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedInput schema / properties / issue_date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / issue_date / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / items_total / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / items_total / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedInput schema / properties / tax_total / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / tax_total / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedInput schema / properties / valid_until / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / valid_until / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / currency / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / currency / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / design_layout / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / design_layout / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / grand_total / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / grand_total / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / issue_date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / issue_date / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / items_total / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / items_total / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / lines / items / properties / line_total / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / lines / items / properties / line_total / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / lines / items / properties / quantity / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / lines / items / properties / quantity / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / lines / items / properties / tax_amount / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / lines / items / properties / tax_amount / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / lines / items / properties / tax_rate / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / lines / items / properties / tax_rate / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / lines / items / properties / unit_price / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / lines / items / properties / unit_price / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / reference_number / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / reference_number / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / sources / items / properties / domain / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / sources / items / properties / domain / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / status / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / status / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / tax_total / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / tax_total / type
      Added value: +[
      +  "number",
      +  "null"
      +]
  3. Changed6 schema fields changed
    • addedOutput schema / properties / items_total
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / lines / items / properties / line_total
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / lines / items / properties / tax_amount
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / missing_fields
      Added value: +{
      +  "description": "On a draft, every part the person gives that it still lacks before it can be issued. The draft is complete only when this list is empty.",
      +  "items": {
      +    "enum": [
      +      "customer_address",
      +      "buyer_siren",
      +      "due_date",
      +      "line_price",
      +      "line_tax_rate",
      +      "issuer",
      +      "legal_name",
      +      "postal_address",
      +      "siren",
      +      "vat_number",
      +      "legal_form",
      +      "receiver",
      +      "line_items",
      +      "currency",
      +      "issue_date"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / next_invoice_number_state
      Added value: +{
      +  "description": "Whether the workspace's next invoice number lets the issue go ahead. Well settles it when the invoice is issued: it is never named to the person and never makes the draft incomplete.",
      +  "enum": [
      +    "ready",
      +    "missing",
      +    "without_digits",
      +    "in_use"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / tax_total
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  4. Changed6 schema fields changed
    • addedInput schema / properties / quote_outcome
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "pending",
      +        "accepted",
      +        "denied",
      +        "invoiced",
      +        "expired"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The customer's answer to a quote: pending, accepted, denied, invoiced or expired (quotes only); pass null to clear"
      +}
    • addedInput schema / properties / valid_until
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Last day the quote stays valid, YYYY-MM-DD (quotes only); pass null to clear"
      +}
    • addedOutput schema / properties / card_line_count
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / lines / items / properties / covered_lines
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "line_id": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / lines / items / properties / line_kind / enum
      Previous value: -[
      -  "billed",
      -  "optional",
      -  "alternative"
      -]New value: +[
      +  "billed",
      +  "optional",
      +  "alternative",
      +  "section"
      +]
    • addedOutput schema / properties / lines / items / properties / section_path
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  5. Changed2 schema fields changed
    • addedOutput schema / properties / fx_conversion / properties / rate_display
      Added value: +{
      +  "type": "string"
      +}
    • changedOutput schema / properties / fx_conversion / required
      Previous value: -[
      -  "from_currency",
      -  "to_currency",
      -  "rate",
      -  "rate_date",
      -  "source"
      -]New value: +[
      +  "from_currency",
      +  "to_currency",
      +  "rate",
      +  "rate_display",
      +  "rate_date",
      +  "source"
      +]
  6. Changed1 schema field changed
    • addedInput schema / properties / receiver_person_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "uuid",
      +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Receiver person UUID, for a private individual. Omit = no change, null = clear, uuid = set."
      +}
  7. Changed2 schema fields changed
    • addedOutput schema / properties / source_count
      Added value: +{
      +  "description": "How many tools hold the invoice; sources may list fewer.",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / sources
      Added value: +{
      +  "description": "The tools that hold a copy of the invoice, highest source precedence first. Empty when no tool holds it.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "domain": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "kind": {
      +        "enum": [
      +          "accounting_tool",
      +          "connector",
      +          "mail_extraction"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "service_id": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "service_id",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  8. Changed1 schema field changed
    • changedOutput schema / properties / newly_connected / description
      Previous value: -"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. Start the reply with one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."New value: +"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."
  9. Changed1 schema field changed
    • addedInput schema / properties / workspace_scope
      Added value: +{
      +  "description": "Restrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.",
      +  "enum": [
      +    "family"
      +  ],
      +  "type": "string"
      +}
  10. Changed1 schema field changed
    • addedOutput schema / properties / newly_connected
      Added value: +{
      +  "description": "Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. Start the reply with one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "name": {
      +        "type": "string"
      +      },
      +      "service_id": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "service_id"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  11. Changed1 schema field changed
    • addedOutput schema / properties / lines / items / properties / line_kind
      Added value: +{
      +  "description": "Whether the line is charged. Only a billed line counts toward grand_total; an optional or alternative line is printed with its price but not charged. Its line_id still names it in an edit.",
      +  "enum": [
      +    "billed",
      +    "optional",
      +    "alternative"
      +  ],
      +  "type": "string"
      +}
  12. Changed8 schema fields changed
    • addedOutput schema / properties / currency
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / customer_name
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / design_layout
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / fx_conversion
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "from_currency": {
      +      "type": "string"
      +    },
      +    "rate": {
      +      "type": "string"
      +    },
      +    "rate_date": {
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "to_currency": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "from_currency",
      +    "to_currency",
      +    "rate",
      +    "rate_date",
      +    "source"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / grand_total
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / issue_date
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / lines
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "line_id": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "quantity": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "tax_rate": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "unit_price": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "quantity",
      +      "unit_price",
      +      "tax_rate"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / status
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  13. Changed4 schema fields changed
    • addedInput schema / properties / conversation_id
      Added value: +{
      +  "description": "The conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id
      Added value: +{
      +  "description": "The conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id_note
      Added value: +{
      +  "description": "Present only when the server opened a fresh lane, stating that no choice recorded earlier was read.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id_source
      Added value: +{
      +  "description": "Where the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.",
      +  "enum": [
      +    "host_meta",
      +    "argument",
      +    "minted"
      +  ],
      +  "type": "string"
      +}
  14. Changed2 schema fields changed
    • changedInput schema / properties / description / anyOf
      Previous value: -[
      -  {
      -    "maxLength": 2000,
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 255,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / terms / anyOf
      Previous value: -[
      -  {
      -    "maxLength": 1000,
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 300,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  15. Changed1 schema field changed
    • changedInput schema / properties / workspace_id / description
      Previous value: -"Target workspace. Omit to use the only authorized workspace, or (for read tools) to query all authorized workspaces grouped by workspace. Required for write tools when the token authorizes more than one workspace."New value: +"Target workspace. Omit when the token authorizes one workspace. Required when it authorizes several — a write lands in exactly one workspace and this call would not say which."
  16. First observed

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, and the description goes further by stating hard limits (no line items, payment_means, or document attachment), which transitions are refused, and that receiver company/person are mutually exclusive and both-at-once is refused. It stops short of spelling out what data loss looks like when a field is set to null (clearing totals, dates, issuer) or whether the operation is reversible, which matters given destructiveHint=true.

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

Conciseness4/5

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

Front-loaded with purpose, then the required id, then an optional-field list, which is the right order for a 24-parameter tool. It is long and repeats some schema content (type hints like "ISO date" and "uuid"), but almost every bullet carries a constraint rather than a restatement.

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

Completeness5/5

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

For a 24-parameter mutation with an output schema already present, the description covers the risky parts: what cannot be edited, which cross-field combinations are refused, and how optional vs null differ. Nothing an agent needs in order to call it without triggering a refusal is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already carries types, enums, and the "null to clear" semantics, meaning the baseline is 3. The description still adds real meaning beyond it: quote fields are valid only on document_type_code "310" and both must be cleared when a quote changes type, receiver company vs person exclusivity, and the nuanced reading of status "paid". It leaves the infrastructure params (workspace_id, workspace_scope, conversation_id, idempotency_key, payment_status/override_version) entirely to the schema.

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

Purpose5/5

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

"Update an existing invoice in Well" states a specific verb and resource, and the body immediately routes the agent elsewhere for the one adjacent operation (finalizing a draft) via well_issue_invoice. An agent can distinguish this from well_delete_invoice, well_issue_invoice, and well_sum_invoices without reading any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use rules: call well_get_schema("invoices") first, only pass fields you want changed, never set a draft to issued/paid here (use well_issue_invoice), and quote-only fields apply only when document_type_code is "310". It also names the consultation siblings (well_list_customers, well_create_person) for receiver ids.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources