Skip to main content
Glama

Taokeh MCP server

File a pending recurring-invoice change draft (human approves in Taokeh)

update_recurring_invoice_draft

FILES A PENDING DRAFT ONLY — NOTHING CHANGES UNTIL A HUMAN REVIEWS AND APPROVES IT IN TAOKEH. Propose changes to a recurring invoice ALREADY set up in Taokeh — a price rise across a subscription, a changed quantity, a new end date, a cadence correction, or PAUSING the billing. This does NOT change anything: it files a pending DRAFT the owner reviews as a DIFF (current → proposed, changed fields only) and approves; only that tap writes. Name the schedule with recurringId, its real id — there is NO name fallback, because a schedule title is free text and one customer often has two schedules (a monthly retainer and an annual licence), so guessing between them would re-bill the wrong contract. proposed holds ONLY what you want changed: title, customerId/customer, lines, cadence, paymentMethod, startDate, endDate, maxOccurrences, notes, and status ("paused" to stop future invoices, "active" to resume). ⚠ lines is WHOLE-REPLACE: send every line the schedule should have, including the unchanged ones — for a price rise, send the same lines with the new prices. ⚠ APPROVING CAN MOVE THE BILLING DATE even when you change only a price: Taokeh re-derives the next issue date from the start date on every save, so the review page states the exact date the next invoice would go out, and whether that has moved. ⛔ WHAT IT CANNOT DO, each refused by name: it cannot set issueMode: "auto" — that would let one approval remove the human tap from every future invoice; it cannot set status: "ended", a ONE-WAY door no later draft could undo (propose "paused" instead, which stops the billing just as completely and can be resumed); it cannot set MFRS 15 revenue spreading, an accounting-policy decision on the schedule's own page; it cannot set the schedule's "Paid into" account (where a CASH schedule's money is booked — picked on the schedule's own page; an approved change keeps the one the schedule has, and moving the schedule to CREDIT clears it); and it cannot touch the invoices this schedule has ALREADY issued — a change reaches the next firing and no earlier one. If a past invoice was wrong, credit it (create_credit_note_draft); the schedule only decides what happens next. A field the record already agrees with is dropped, and a proposal that changes nothing is refused rather than filed as an empty diff. One schedule per call — loop for a sweep across several, because each reviewable diff is the point.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "recurringId": "<recurringId>",
      "proposed": "<proposed>"
    },
    "name": "update_recurring_invoice_draft"
  }
}

Input Schema

NameRequiredDescriptionDefault
notesNoA SHORT reviewer note, in the reviewer's language: what you changed, why, and what they should double-check.
proposedYesONLY the fields you want changed. A field the record already agrees with is dropped; an unknown or deliberately-excluded field is refused by name.
needsReviewNoSet true when something gave you pause — a price the user was unsure about, a date you inferred.
recurringIdYesThe recurring invoice's real id. Required — there is no name fallback.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / proposed / properties / lines / description
      Previous value: -"WHOLE-REPLACE. Send every line the schedule should bill from now on, not just the changed ones — a partial set would silently drop the rest. A line carrying Taokeh's printed per-foot or per-piece note (like \"(400' @ RM 1.60/feet)\") is refused: a schedule holds no size or tally, so it would bill without its rounding line every cycle. Raise those invoices with create_invoice_draft in their filed form. On an update, such a line already on the schedule may be sent back unchanged. ⛔ LINE KEYS ARE STRICT, exactly as on create_recurring_invoice_draft: a key this schema does not list is REFUSED BY NAME and NOTHING is filed."New value: +"WHOLE-REPLACE. Send every line the schedule should bill from now on, not just the changed ones — a partial set would silently drop the rest. A line carrying Taokeh's printed per-foot or per-piece note (like \"(400' @ RM 1.60/ft)\") is refused: a schedule holds no size or tally, so it would bill without its rounding line every cycle. Raise those invoices with create_invoice_draft in their filed form. On an update, such a line already on the schedule may be sent back unchanged. ⛔ LINE KEYS ARE STRICT, exactly as on create_recurring_invoice_draft: a key this schema does not list is REFUSED BY NAME and NOTHING is filed."
  2. Changed1 schema field changed
    • changedInput schema / properties / proposed / properties / lines / description
      Previous value: -"WHOLE-REPLACE. Send every line the schedule should bill from now on, not just the changed ones — a partial set would silently drop the rest. ⛔ LINE KEYS ARE STRICT, exactly as on create_recurring_invoice_draft: a key this schema does not list is REFUSED BY NAME and NOTHING is filed."New value: +"WHOLE-REPLACE. Send every line the schedule should bill from now on, not just the changed ones — a partial set would silently drop the rest. A line carrying Taokeh's printed per-foot or per-piece note (like \"(400' @ RM 1.60/feet)\") is refused: a schedule holds no size or tally, so it would bill without its rounding line every cycle. Raise those invoices with create_invoice_draft in their filed form. On an update, such a line already on the schedule may be sent back unchanged. ⛔ LINE KEYS ARE STRICT, exactly as on create_recurring_invoice_draft: a key this schema does not list is REFUSED BY NAME and NOTHING is filed."
  3. Changed1 schema field changed
    • addedInput schema / properties / proposed / properties / lines / items / properties / unitPrice / description
      Added value: +"Two decimals at most (whole sen, or whole cents in another currency); put a discount or tax in its own field, never folded into the price."
  4. Changed4 schema fields changed
    • changedInput schema / properties / proposed / properties / lines / description
      Previous value: -"WHOLE-REPLACE. Send every line the schedule should bill from now on, not just the changed ones — a partial set would silently drop the rest."New value: +"WHOLE-REPLACE. Send every line the schedule should bill from now on, not just the changed ones — a partial set would silently drop the rest. ⛔ LINE KEYS ARE STRICT, exactly as on create_recurring_invoice_draft: a key this schema does not list is REFUSED BY NAME and NOTHING is filed."
    • addedInput schema / properties / proposed / properties / lines / items / additionalProperties
      Added value: +false
    • addedInput schema / properties / proposed / properties / lines / items / properties / description / description
      Added value: +"The line text as PRINTED on the document, when it says more than the product name does — a size, a grade, a job reference, a period covered. It rides onto the posted line and prints on the customer's copy, so send what the paper says rather than a tidier phrasing of your own. Leave it out when the product name already says it. This is TEXT, not a field: Taokeh has no column for a dimension, a grade or a variant, so anything of that kind belongs here."
    • addedInput schema / properties / proposed / properties / lines / minItems
      Added value: +1
  5. Added

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say non-destructive/non-idempotent; the description goes far beyond by disclosing that approval is human-gated, that approving can re-derive the next billing date even for a price-only change, that lines are whole-replace, and by naming each refused field (issueMode auto, status ended, MFRS 15, Paid into) with the reason. This is unusually rich behavioral context.

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?

The critical constraint ('FILES A PENDING DRAFT ONLY') is front-loaded ahead of all detail, and the sections progress logically. However it is dense and repetitive in places — the 'nothing changes' point is asserted twice and the warnings are heavy on capitalization, which costs some readability.

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?

Given a nested-object schema, no output schema, and a human-approval mutation path, the description covers everything an agent needs: what is filed, what is refused, side effects on billing dates, line-replacement semantics, and single-schedule scoping.

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 already 100%, so the baseline is 3, but the description adds meaning the schema does not: why recurringId has no name fallback (free-text titles, duplicate schedules), that `proposed` should carry only changed fields, and that `status: paused` is the reversible alternative to the refused `ended`. Much of it restates schema enums, which keeps it from a 5.

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?

Opens with a specific verb+resource+scope: files a pending draft that changes nothing until human approval. It clearly distinguishes itself from create_recurring_invoice_draft ('ALREADY set up') and from direct-write siblings, so an agent can select it without opening the 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?

Explicitly routes to alternatives under named conditions: create_credit_note_draft when a past invoice was wrong, create_invoice_draft for per-foot/per-piece lines, and 'loop for a sweep' for multiple schedules. It also states what to do when a proposal changes nothing (refused, not filed).

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