Skip to main content
Glama
beel-es

BeeL MCP server

Official
by beel-es

beel_create_recurring_invoice

Idempotent

Creates a recurring invoice template with a chosen cadence (monthly, quarterly, yearly) to automatically generate and send invoices on a specific day.

Instructions

Creates a recurring invoice template under this company: the invoice data it repeats (lines, recipient, series, payment) plus the recurrence that drives it.

  • Cadence: frequency is how often it generates — every 1 (MONTHLY), 3 (QUARTERLY) or 12 (YEARLY) months — on day_of_month, from start_date until end_date if one is given. Omitted, MONTHLY applies.

  • The cadence governs the step, not the first invoice: the first occurrence is the first day_of_month on or after start_date, found one month at a time whatever the cadence; the cadence takes over from there. A YEARLY template starting 15 February with day_of_month 10 first invoices on 10 March, then every 10 March after that — it does not wait a year.

  • start_date in the past: accepted and stored as sent, but it never anchors generation backwards. next_generation becomes the next date of the template's own calendar that is still ahead — the grid of day_of_month dates anchored at start_date, one every frequency — so on a quarterly or yearly template it can land months from now, not this month. The missed periods are not generated.

  • draft_in_advance: whether the invoice is created as a draft for review before it is emitted. The window is fixed at 5 days, and both options emit on the scheduled day. Omitted, no review draft is prepared. It supersedes the deprecated preview_days.

  • VeriFactu: the template does not carry it. Whether each generated invoice is registered with AEAT is decided when that invoice is issued, against the company's regime at that moment.

Endpoint: POST /v1/companies/{company_id}/recurring-invoices

⚠️ Read before calling:

  • Fiscal rules, domains simplified, taxes: beel_rules_list with domain, or resource beel://guardrails/.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bodyYes
company_idYesUnique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Company` header plays no part. A company you do not reach answers `403`, and so does a company that does not exist, so the existence of a company in another account is never disclosed.
idempotency_keyNoOptional idempotency key for this operation. Omit it and one is derived from the request itself, which makes a blind retry safe but also collapses a SECOND, deliberately identical operation into the first for 24 hours. Set it — to an order id, or anything unique per intended operation — whenever you mean to create something that may look identical to what you just created.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed31 schema fields changedv0.9.0
    • addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / day_of_month / description
      Added value: +"Day of the month the invoices are issued. A month that does not have that day falls\nback to its last day: a template on `31` issues on 28 February (29 in a leap year)\nand on 30 April. So `31` is how you ask for the last day of the month it generates\nin — there is no separate flag for it, and the accepted range stays 1–31.\n\nThe adjustment does not stick and the schedule does not drift: every generation is\nrecalculated from the `day_of_month` you sent, never from the date it was adjusted\nto (31 Jan → 28 Feb → 31 Mar).\n"
    • addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / draft_in_advance
      Added value: +{
      +  "description": "Whether the template prepares a draft for review before emitting. The window is fixed at\n5 days and both options emit on the scheduled day. Omitted, the template is created\nwithout the review draft.\n",
      +  "type": "boolean"
      +}
    • changedInput schema / $defs / CreateRecurringInvoiceRequest / properties / frequency / description
      Previous value: -"Generation cadence. Only `MONTHLY` is supported today; the field exists in the\nrequest so an unsupported cadence is rejected instead of silently creating a\nmonthly template. Omitted, `MONTHLY` applies.\n"New value: +"Generation cadence: `MONTHLY` every month, `QUARTERLY` every 3 months, `YEARLY` every 12 months. Omitted, `MONTHLY` applies.\n\nIt governs the step from the first invoice onwards, not where that first one lands: the\nfirst occurrence is the first `day_of_month` on or after `start_date`, found one month at\na time whatever the cadence. A yearly template starting 15 February with `day_of_month`\n10 first invoices on 10 March, then every 10 March after that — it does not wait a year.\n"
    • changedInput schema / $defs / CreateRecurringInvoiceRequest / properties / frequency / enum
      Previous value: -[
      -  "MONTHLY"
      -]New value: +[
      +  "MONTHLY",
      +  "QUARTERLY",
      +  "YEARLY"
      +]
    • addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / invoice_type / $ref
      Added value: +"#/$defs/RecurringInvoiceType"
    • removedInput schema / $defs / CreateRecurringInvoiceRequest / properties / invoice_type / enum
      Removed value: -[
      -  "STANDARD",
      -  "SIMPLIFIED"
      -]
    • removedInput schema / $defs / CreateRecurringInvoiceRequest / properties / invoice_type / type
      Removed value: -"string"
    • addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / max_invoices
      Added value: +{
      +  "description": "Total number of invoices this template will generate before ending on its own, between\n2 and 600. Leave it out (or send `null`) for a recurrence that is not capped by number.\n\nA recurrence ends in ONE way: open-ended, on `end_date`, or after `max_invoices`. Sending\nboth `end_date` and `max_invoices` with a value is rejected with `RECURRING_END_MODE_CONFLICT`,\nand so is a `max_invoices` that lands on a template that already has an `end_date`: the\nconflict is judged on the RESULTING state, not on the body. To switch modes, say both things\nin the same call — the new field with a value and the old one as `null`. Nothing is cleared\nsilently.\n\nThe cap counts invoices GENERATED, not calendar turns: a skip does not spend it. The range\nis not enforced by this schema on purpose, so the rejection carries its own code and its own\nmessage: below 2 you do not want a recurrence but a scheduled invoice\n(`PUT /v1/companies/{company_id}/invoices/{invoice_id}/schedule`), which also issues it on an exact date.\n",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / name / minLength
      Added value: +1
    • addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / name / pattern
      Added value: +"^\\S.*$"
    • changedInput schema / $defs / CreateRecurringInvoiceRequest / properties / payment_method / anyOf
      Previous value: -[
      -  {
      -    "allOf": [
      -      {
      -        "$ref": "#/$defs/PaymentMethod"
      -      }
      -    ]
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "allOf": [
      +      {
      +        "$ref": "#/$defs/PaymentMethod"
      +      }
      +    ],
      +    "description": "Payment method. `payment_iban`, `payment_swift` and `payment_term_days` are\ndetail of this method, not standalone fields: sending any of them without a\n`payment_method` that is present, non-null and different from `NONE` is\nrejected with `422` (`PAYMENT_DETAILS_REQUIRE_METHOD`).\n"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / $defs / CreateRecurringInvoiceRequest / properties / preview_days / default
      Removed value: -0
    • changedInput schema / $defs / CreateRecurringInvoiceRequest / properties / preview_days / description
      Previous value: -"Days before emission date to create a draft for review. 0 means immediate emission."New value: +"**Deprecated.** Superseded by `draft_in_advance`, because the review window is no longer\na number you pick: it is fixed at 5 days. Still accepted so nothing breaks — any value\ngreater than `0` means the same as `draft_in_advance: true`, and `0` the same as `false`.\nWhen both are sent, `draft_in_advance` wins. It will be removed in a future version.\n"
    • changedInput schema / $defs / CreateRecurringInvoiceRequest / properties / start_date / description
      Previous value: -"Date the subscription started. A past date is accepted and stored as sent — useful\nwhen migrating subscriptions from another system — but it never anchors generation\nin the past: `next_generation` moves to the first upcoming `day_of_month`. Invoices\nare never back-dated, so the missed periods are not generated.\n"New value: +"Date the subscription started. A past date is accepted and stored as sent — useful\nwhen migrating subscriptions from another system — but it never anchors generation\nin the past. `next_generation` becomes the next date of the template's own calendar\nthat is still ahead: the grid of `day_of_month` dates anchored at `start_date`, one\nevery `frequency`. On a quarterly or yearly template that can be months from now, not\nthis month. Invoices are never back-dated, so the missed periods are not generated.\n"
    • removedInput schema / $defs / CreateRecurringInvoiceRequest / properties / verifactu_enabled
      Removed value: -{
      -  "description": "Whether the invoices generated by this template carry VeriFactu information.\n\n**If omitted, the company's declared preference applies** (the\n\"apply VeriFactu by default\" setting, `apply_by_default`). If the company\nhas no VeriFactu configuration, it resolves to `false`.\nSend the field explicitly (`true` or `false`) to override the preference.\n\nThe resolved value is **frozen into the template at creation time** and is\nreturned by the API: changing the company preference later does not alter\ntemplates that already exist. Edit the template to change it.\n",
      -  "type": "boolean"
      -}
    • addedInput schema / $defs / Email
      Added value: +{
      +  "description": "Email address (minimum valid email is 5 chars, e.g. a@b.co)",
      +  "format": "email",
      +  "maxLength": 255,
      +  "minLength": 5,
      +  "type": "string"
      +}
    • changedInput schema / $defs / ExemptionReason / description
      Previous value: -"Tax exemption reason code per Spanish VAT Law (Ley 37/1992 LIVA).\nVeriFactu mapping: EXENTA_ART_20→E1, EXENTA_ART_21→E2, EXENTA_ART_22→E3,\nEXENTA_ART_24→E4, EXENTA_ART_25→E5, rest→E6. ISP→S2, NO_SUJETA→N1/N2.\nWhen OTRO, a custom text must be provided in exemption_reason_text.\n"New value: +"Tax exemption reason code per the Spanish VAT Law (Ley 37/1992, LIVA), with the\nVeriFactu code each one is reported as.\n\n- `EXENTA_ART_20`: exempt, art. 20 (domestic operations such as medical, educational,\n  cultural and financial services, or housing rentals). E1.\n- `EXENTA_ART_21`: exempt, art. 21 (exports of goods). E2.\n- `EXENTA_ART_22`: exempt, art. 22 (operations treated as exports). E3.\n- `EXENTA_ART_24`: exempt, art. 24 (free zones, warehouses and customs regimes). E4.\n- `EXENTA_ART_25`: exempt, art. 25 (intra-community supplies of goods). E5.\n- `EXENTA_ART_26`: exempt, art. 26 (intra-community acquisitions of goods). It exempts the\n  buyer's acquisition, not a supply the seller invoices, so an invoice line that carries it\n  is rejected with `EXEMPTION_NOT_FOR_ISSUED_INVOICE`; a supply to another Member State is\n  `EXENTA_ART_25`.\n- `NO_SUJETA_ART_7_9`: not subject under art. 7 (such as the transfer of a business as\n  a going concern, art. 7.1º). N1.\n- `NO_SUJETA_LOCALIZACION`: not subject by the place-of-supply rules (intra-community\n  or non-EU services, arts. 69 and 70). N2.\n- `ISP_ART_84_2_A` … `ISP_ART_84_2_F`: reverse charge (the invoice states «inversión del\n  sujeto pasivo»), art. 84.Uno.2.º letters a) (supplier not established in Spain), b) (unwrought\n  or semi-finished gold), c) (scrap, waste and recovery materials, plastic, paper, cardboard, glass and textile waste, and semi-finished non-ferrous metal products), d) (greenhouse gas emission\n  allowances), e) (certain real estate supplies: in insolvency proceedings, with the exemption\n  waived, or enforcing a security) and f) (construction or renovation works). S2.\n- `ISP_ART_84_2_G`: reverse charge of letter g) (silver, platinum, palladium, mobile phones,\n  consoles, laptops and tablets). The law requires these supplies to be invoiced in a special\n  series, so an invoice line that carries it is rejected with\n  `REVERSE_CHARGE_CASE_NOT_SUPPORTED`.\n- `EXENTA_ART_140`: investment gold exemption, art. 140 bis (usually with `regime_key`\n  `04`). E6.\n- `REGIMEN_ART_129` (agriculture,\n  livestock and fishing, arts. 124 to 134 bis), `REGIMEN_ART_135` (second-hand goods,\n  art and antiques), `REGIMEN_ART_141` (travel agencies), `REGIMEN_ART_154` (equivalence\n  surcharge) and `REGIMEN_ART_163_DECIES` (cash basis, arts. 163 decies to 163\n  sexiesdecies): operations of special regimes, which VeriFactu identifies by the regime\n  key rather than by an exemption code. An\n  invoice line that carries one is rejected with `EXEMPTION_REGIME_NOT_SUPPORTED_IN_VERIFACTU`;\n  declare the regime with `regime_key` instead.\n- `OTRO`: any other provision. Requires the text in `exemption_reason_text`. E6.\n"
    • changedInput schema / $defs / ExemptionReason / enum
      Previous value: -[
      -  "EXENTA_ART_20",
      -  "EXENTA_ART_21",
      -  "EXENTA_ART_22",
      -  "EXENTA_ART_24",
      -  "EXENTA_ART_25",
      -  "EXENTA_ART_26",
      -  "EXENTA_ART_140",
      -  "NO_SUJETA_ART_7_9",
      -  "NO_SUJETA_LOCALIZACION",
      -  "ISP_ART_84_2_A",
      -  "ISP_ART_84_2_E",
      -  "ISP_ART_84_2_F",
      -  "REGIMEN_ART_129",
      -  "REGIMEN_ART_135",
      -  "REGIMEN_ART_141",
      -  "REGIMEN_ART_154",
      -  "REGIMEN_ART_163_DECIES",
      -  "OTRO"
      -]New value: +[
      +  "EXENTA_ART_20",
      +  "EXENTA_ART_21",
      +  "EXENTA_ART_22",
      +  "EXENTA_ART_24",
      +  "EXENTA_ART_25",
      +  "EXENTA_ART_26",
      +  "EXENTA_ART_140",
      +  "NO_SUJETA_ART_7_9",
      +  "NO_SUJETA_LOCALIZACION",
      +  "ISP_ART_84_2_A",
      +  "ISP_ART_84_2_B",
      +  "ISP_ART_84_2_C",
      +  "ISP_ART_84_2_D",
      +  "ISP_ART_84_2_E",
      +  "ISP_ART_84_2_F",
      +  "ISP_ART_84_2_G",
      +  "REGIMEN_ART_129",
      +  "REGIMEN_ART_135",
      +  "REGIMEN_ART_141",
      +  "REGIMEN_ART_154",
      +  "REGIMEN_ART_163_DECIES",
      +  "OTRO"
      +]
    • changedInput schema / $defs / PaymentMethod / description
      Previous value: -"Payment method for invoices and recurring invoices.\nNONE means no payment information will be shown.\n"New value: +"Payment method shown on invoices and recurring invoices.\n\n- `NONE`: no payment information is shown.\n- `BANK_TRANSFER`: bank transfer to the IBAN of the payment details; the only method\n  that requires an IBAN.\n- `CARD`: card payment.\n- `CASH`: cash payment.\n- `CHECK`: payment by cheque.\n- `DIRECT_DEBIT`: direct debit from the customer's bank account.\n- `BIZUM`: payment through Bizum.\n- `OTHER`: any other method.\n"
    • addedInput schema / $defs / RecurringEmailConfigRequest / properties / cc / items / $ref
      Added value: +"#/$defs/Email"
    • removedInput schema / $defs / RecurringEmailConfigRequest / properties / cc / items / type
      Removed value: -"string"
    • addedInput schema / $defs / RecurringEmailConfigRequest / properties / recipients / items / $ref
      Added value: +"#/$defs/Email"
    • removedInput schema / $defs / RecurringEmailConfigRequest / properties / recipients / items / type
      Removed value: -"string"
    • addedInput schema / $defs / RecurringInvoiceType
      Added value: +{
      +  "description": "Type of the invoices a recurring template generates: `STANDARD` for an identified recipient,\n`SIMPLIFIED` for a recipient that is not identified.\n",
      +  "enum": [
      +    "STANDARD",
      +    "SIMPLIFIED"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / $defs / RecurringLineRequest / description
      Previous value: -"Recurring-invoice line. Unlike invoice lines (which nest tax data under a `main_tax` object),\nrecurring lines use flat tax fields: `vat_rate`, `tax_type`, `regime_key`,\n`equivalence_surcharge_rate` and `irpf_rate`. Do not send a `main_tax` object here.\n"New value: +"Recurring-invoice line. Unlike invoice lines (which nest tax data under a `main_tax` object),\nrecurring lines use flat tax fields: `vat_rate`, `tax_type`, `regime_key`,\n`equivalence_surcharge_rate` and `irpf_rate`. Do not send a `main_tax` object here.\n\n**Line amount**: send **exactly one** of `unit_price`, `total_excluding_tax` or\n`total_including_tax` — same contract as an invoice line. Sending none, or more than\none, is rejected with `LINE_UNIT_PRICE_XOR_DECLARED_TOTAL`; a declared total together\nwith an explicit `discount_percentage` is rejected with\n`LINE_DECLARED_TOTAL_FORBIDS_DISCOUNT` (the discount, if any, already lives inside\nthe total).\n\nThe mode is what the template promises, and it is re-applied on **every** generation:\na line declared as `total_including_tax: 1.00` over 300 units invoices 1,00 € on every\ngeneration, not 300 × 0,0033 = 0,99 €. Because `PATCH` replaces the lines as a whole,\nresending a line with a different amount field switches its mode.\n"
    • addedInput schema / $defs / RecurringLineRequest / properties / quantity / multipleOf
      Added value: +0.0001
    • addedInput schema / $defs / RecurringLineRequest / properties / total_excluding_tax
      Added value: +{
      +  "description": "Declared line total excluding taxes: this amount IS the taxable base, exactly,\nwith no recalculation. The stored `unit_price` becomes derived and informational\n(`total / quantity`, 4 decimals). Mutually exclusive with `unit_price` and\n`total_including_tax`.\n\nNegative totals are NOT accepted, for the same reason `unit_price` does not accept\nnegative prices: a template only issues `STANDARD` or `SIMPLIFIED` invoices, and only\na corrective invoice — created through its own endpoint over an already issued\ninvoice — carries a negative amount. A total outside the range is rejected with\n`422 VALIDATION_ERROR` and the offending field in `details`.\n\nThe upper bound is the same one `POST /v1/invoices` declares for a line total: a\ntemplate is a promise to issue an invoice, and it cannot accept less than the\ninvoice it will generate does. The derived `unit_price` (`total / quantity`) can\nstill exceed the `maximum` this contract accepts for `unit_price` itself — what\nactually bounds it then is the domain's price ceiling, not this field's contract.\n",
      +  "maximum": 99999999.99,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / $defs / RecurringLineRequest / properties / total_including_tax
      Added value: +{
      +  "description": "Declared line total including taxes — what the customer pays. The engine works\nthe breakdown backwards so that taxable base + VAT + equivalence surcharge equals\nthis amount exactly on every generated invoice. IRPF withholding is never part of\nthe decomposition: it is a retention, not a price. Mutually exclusive with\n`unit_price` and `total_excluding_tax`.\n\nNegative totals are NOT accepted, same as `total_excluding_tax`.\n\nThe upper bound is the same one `POST /v1/invoices` declares for a line total, for\nthe same reason: the template cannot promise more than the invoice it generates\ncould ever accept. The derived `unit_price` (`total / quantity`) can still exceed\nthe `maximum` this contract accepts for `unit_price` itself — what actually bounds\nit then is the domain's price ceiling, not this field's contract.\n",
      +  "maximum": 99999999.99,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / $defs / RecurringLineRequest / properties / unit_price / description
      Added value: +"Unit price before taxes. Supports up to 4 decimal places for micro-pricing\n(e.g. €0.0897/unit for labels, packaging); the generated invoices always round\ntheir amounts to 2 decimals. Mutually exclusive with `total_excluding_tax` and\n`total_including_tax`.\n\nThe upper bound is the same one the invoice line declares, and so is the\nacceptance of `0` (a discount granted before or simultaneously with the sale,\ne.g. a free introductory month). A price outside the range is rejected with\n`422 VALIDATION_ERROR` and the offending field in `details`.\n\nNegative prices are NOT accepted, unlike an invoice line of a corrective invoice:\na recurring template only issues `STANDARD` or `SIMPLIFIED` invoices, and a\ncorrective is created through its own endpoint over an already issued invoice —\nnever generated by a template.\n"
    • addedInput schema / $defs / RecurringLineRequest / properties / unit_price / maximum
      Added value: +999999.9999
    • changedInput schema / $defs / RecurringLineRequest / required
      Previous value: -[
      -  "description",
      -  "quantity",
      -  "unit_price",
      -  "vat_rate"
      -]New value: +[
      +  "description",
      +  "quantity",
      +  "vat_rate"
      +]
  2. Changed10 schema fields changedv0.5.0
    • addedInput schema / $defs / CreateRecurringInvoiceRequest / additionalProperties
      Added value: +false
    • removedInput schema / $defs / CreateRecurringInvoiceRequest / properties / payment_method / allOf
      Removed value: -[
      -  {
      -    "$ref": "#/$defs/PaymentMethod"
      -  }
      -]
    • addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / payment_method / anyOf
      Added value: +[
      +  {
      +    "allOf": [
      +      {
      +        "$ref": "#/$defs/PaymentMethod"
      +      }
      +    ]
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / $defs / ExemptionReason / example
      Removed value: -"EXENTA_ART_20"
    • removedInput schema / $defs / PaymentMethod / example
      Removed value: -"BANK_TRANSFER"
    • addedInput schema / $defs / RecurringLineRequest / additionalProperties
      Added value: +false
    • removedInput schema / $defs / RecurringLineRequest / properties / exemption_reason / $ref
      Removed value: -"#/$defs/ExemptionReason"
    • addedInput schema / $defs / RecurringLineRequest / properties / exemption_reason / anyOf
      Added value: +[
      +  {
      +    "$ref": "#/$defs/ExemptionReason"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / additionalProperties
      Added value: +false
    • changedInput schema / properties / company_id / description
      Previous value: -"NIF (company) the operation acts on. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Company` header plays no part. A NIF you do not reach answers `403`, and so does a NIF that does not exist, so the existence of a NIF in another account is never disclosed."New value: +"Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Company` header plays no part. A company you do not reach answers `403`, and so does a company that does not exist, so the existence of a company in another account is never disclosed."
  3. First observedv0.3.1

TDQS

A4/5.0
Behavior5/5

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

Annotations only declare the safety profile (readOnly=false, idempotent=true, destructive=false); the description adds substantial behavior the agent could not otherwise infer — the first occurrence is found month-by-month regardless of cadence, a past start_date is stored but never anchors generation backwards, missed periods are not generated, the review-draft window is fixed at 5 days, and VeriFactu registration is decided at issue time rather than carried by the template. It also flags preview_days as superseded.

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?

Purpose is front-loaded in the first sentence, then bold-labelled bullets (Cadence, cadence-governs-step, start_date, draft_in_advance, VeriFactu) make it scannable. It is longer than strictly necessary and some cadence explanation duplicates the schema, but no bullet is filler.

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

Completeness4/5

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

For a creation tool with no output schema and no annotation contradiction, the description covers the scheduling semantics an agent must understand before calling. It omits what the call returns (the created template object and its next_generation) and gives no guidance on the required series_id or optional customer_id, leaving those entirely to the schema.

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 67%, and the description adds real interpretive value for the parameters that matter most: how frequency interacts with the first invoice, how day_of_month behaves, and what start_date in the past does to next_generation. It largely synthesizes rather than repeats the schema text, though there is some overlap with the equally detailed field descriptions.

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

Purpose4/5

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

The opening sentence gives a precise verb and resource — 'Creates a recurring invoice template under this company' — and enumerates what the template holds (lines, recipient, series, payment) plus the recurrence driving it. It is immediately distinguishable from a one-off invoice creation. However, it never names or contrasts with the closest siblings (beel_create_recurring_invoice_derivation, beel_generate_recurring_invoice_now, beel_create_invoice), so it falls short of full sibling differentiation.

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

Usage Guidelines3/5

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

Usage is implied by the purpose and by the 'Read before calling' pointer to beel_rules_list for fiscal rules, but there is no explicit when-to-use/when-not-to-use statement and no named alternative. The one genuine routing hint (use a scheduled invoice instead of max_invoices below 2) lives inside the schema, not the description.

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

Deploy Server

Other Tools