Skip to main content
Glama

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

update_product_draft

FILES A PENDING DRAFT ONLY — NOTHING CHANGES UNTIL A HUMAN REVIEWS AND APPROVES IT IN TAOKEH. Propose corrections to a product ALREADY in Taokeh's catalogue — a selling price keyed wrong, a name that came across from the old system mangled, a missing barcode, the wrong unit, a reorder point nobody set, an item filed under the wrong category. This does NOT change anything: it files a pending DRAFT the owner reviews as a DIFF (current → proposed, changed fields only) and approves with one tap; only that tap writes. Name the product with productId (the id resolve_product returns) or with its EXACT sku — a SKU is unique inside a company, so it is an exact key; a product NAME is not, and is refused. If you pass both and they disagree, the call is refused rather than guessing. proposed holds ONLY the fields you want changed: name, unit, unitPrice, reorderPoint, barcode, and the category (pass categoryId, or category as a name matched against the categories the company ALREADY has — this tool will never create a category, because the owner is approving a change to a product, not new master data). ⛔ WHAT IT CANNOT DO, each refused by name with the screen that owns it: it cannot change STOCK ON HAND — a quantity change moves inventory and cost of goods sold together, so Taokeh only takes it at Products → Adjust stock where a counted reason is required; it cannot change the AVERAGE COST, which the purchases that set it own and which is what the inventory is worth on the balance sheet, so an edit here would restate that value with no journal behind it; it cannot change the SKU, the key everything else resolves on; it cannot set a description, which the product page has no control for at all (the catalogue import does); it cannot switch "Service — no stock" (isService) on or off — the owner ticks it on the product page; and it cannot publish or unpublish the item to the online shop, because what strangers can see and buy is not something an AI proposal should decide. 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 product per call — loop for a sweep, because each reviewable diff is the point. BE HONEST: never guess a price or a barcode; leave the field out and say so in notes with needsReview.

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": {
      "proposed": "<proposed>"
    },
    "name": "update_product_draft"
  }
}

Input Schema

NameRequiredDescriptionDefault
skuNoThe EXACT SKU, as an alternative to productId. Exact only — a near miss is refused, and a product NAME is never accepted.
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.
productIdNoThe product's real id, from resolve_product. Give this OR `sku`.
needsReviewNoSet true when something gave you pause — a price the user was unsure about, a barcode read off a blurry photo.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • removedInput schema / properties / proposed / properties / categoryId / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / proposed / properties / categoryId / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false but destructiveHint=false; the description explains exactly why — nothing writes until a human taps approve on a diff. It adds behavior annotations cannot express: unchanged fields are dropped, a no-op proposal is refused, one product per call, and refusal-by-name for stock, average cost, SKU, description, isService, and publish state.

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?

Excellent front-loading — the draft-only constraint is the first clause, and the refusal list is grouped in one block. It is long, though, and the "nothing changes until a human approves" point is restated three times, which costs some density even if the repetition is partly deliberate for safety.

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 nested-object mutation tool with no output schema, the description covers input selection, refusal semantics, excluded fields with their owning screens, no-op handling, and batching advice. An agent has everything needed to call it correctly and to explain the result to a user.

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

Parameters5/5

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

Schema coverage is already 100%, yet the description still adds real meaning: `productId` provenance from resolve_product, SKU being exact-only and names refused, the both-passed-and-disagree refusal, and the guarantee that `category` resolves to existing master data rather than creating it. It also tells the agent to omit uncertain values and use `notes`/`needsReview`.

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 ("FILES A PENDING DRAFT") and immediately scopes it to corrections on a product already in the catalogue, enumerating concrete examples (mispriced selling price, mangled name, missing barcode). It is clearly distinguishable from create/update siblings and from stage_master_data, since it explicitly refuses master-data creation.

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?

States when to use it, how to identify the product (productId or exact SKU, never a name), what to pass in `proposed`, and what happens on conflicting identifiers. It also names explicit when-NOT cases with the owning surface for each (Products → Adjust stock, product page, catalogue import, online shop), which is the strongest form of routing guidance.

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.