Skip to main content
Glama

Taokeh MCP server

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

update_contact_draft

FILES A PENDING DRAFT ONLY — NOTHING CHANGES UNTIL A HUMAN REVIEWS AND APPROVES IT IN TAOKEH. Propose changes to a customer or vendor ALREADY in Taokeh — the correction door for an address book with missing tax ids, stale phone numbers or wrong e-Invoice flags (e.g. after a migration). 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. Pass partyKind ('customer' or 'vendor'), the contact's REAL contactId from resolve_customer / resolve_vendor — a name is refused, because a near-match would edit the wrong company — and proposed, an object holding ONLY the fields you want changed. Settable fields, mirroring the contact screen exactly: name, email, phone, address, tin (Tax ID), brn (registration no.), idType ('BRN' or 'NRIC'); on a CUSTOMER also requiresEinvoice, einvCity, einvPostcode, einvState (LHDN 2-digit code), remindersMuted; on a VENDOR also selfBill, alwaysExpense, state. Pass null on a text field to CLEAR it. Anything else is refused by name — do not invent fields. You cannot move a contact between customer and vendor here; they are separate records. A field the contact already agrees with is dropped, and a proposal that changes nothing is refused rather than filed as an empty diff for a human to tap. One contact per call — loop for a sweep, because 100 reviewable diffs is the point: the owner sees each change before it lands. BE HONEST: never guess a tax id or a phone digit; if you are unsure, leave the field out and say so in notes with needsReview. If the record has been edited since you read it, the owner is shown BOTH values and the one-tap approval is refused — that is by design; call revise_draft (kind 'contact_update') to re-read and re-propose.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
notesNoA SHORT reviewer note, in the reviewer's language: what you changed and why, and anything they should double-check. Leave empty when there is nothing to flag.
personsNoChanges to the PEOPLE filed under this contact (the individuals you deal with there). Each entry is one change. A removal names only personId. A person needs a name to be added. These ride the SAME draft and the SAME single approval as the field changes — the owner sees a removal shown as a removal, in words.
proposedNoONLY the fields you want changed. A field the contact already agrees with is dropped; an unknown or wrong-side field is refused by name. Omit it entirely when you are only changing the PEOPLE below.
contactIdYesREQUIRED — the contact's real id from resolve_customer / resolve_vendor. A name is refused: editing the wrong company silently is worse than asking.
partyKindYesWhich side of the book the contact is on: 'customer' (someone you sell to) or 'vendor' (someone you buy from). They are separate records — this tool cannot move one to the other.
needsReviewNoSet true when something gave you pause — a tax id you read off a blurry document, a phone number the user was unsure about. It flags the draft for the reviewer.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Added

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only convey readOnly=false, openWorld=false, idempotent=false, destructive=false, so the description carries the behavioral burden — and it exceeds it. It discloses the draft-only semantics ('nothing changes until a human approves'), the diff review flow, rejection behaviors (empty proposals refused, agreeing fields dropped, unknown fields refused by name), null-clears-text semantics, one-contact-per-call, and the concurrency design where simultaneous edits force re-proposal. Nothing in the description contradicts the annotations; in fact, the draft-only framing explains why destructiveHint=false is appropriate.

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 description is long (~350 words) and repeats the core draft-only message three times (title, opening sentence, third sentence). However, it is front-loaded with the most decision-critical fact and the remaining length is dense with safety-critical semantics — particularly the 'never guess a tax id' honesty rule and the concurrency behavior. A small trim of the redundant draft-only restatements would make it exemplary, but every substantive paragraph earns its place.

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?

This is a high-complexity tool — 6 parameters, two nested objects (proposed, persons), conditional customer/vendor fields, concurrency edge cases, no output schema — and the description still leaves nothing essential unexplained. It covers field eligibility rules, the people sub-object, failure modes (name refused, empty diff refused, stale-record refusal), looping guidance for sweeps, and honesty requirements. No output schema exists, so some return-value details are absent, but for a tool whose semantics are this intricate the description is remarkably complete.

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 baseline is 3, but the description adds real semantic value on top: 'Pass null on a text field to CLEAR it', 'Anything else is refused by name — do not invent fields', the consolidated customer-vs-vendor field grouping ('on a CUSTOMER also requires...'), and 'Omit it entirely when you are only changing the PEOPLE below'. These operational meanings are not fully inferable from the schema's property descriptions alone.

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?

The description uses a specific verb-resource pair: 'Propose changes to a customer or vendor ALREADY in Taokeh' and 'FILES A PENDING DRAFT ONLY'. It clearly distinguishes itself from the create sibling by scoping to existing contacts ('the correction door'), and the title adds the human-approval workflow. An agent can immediately tell this is the update/amend tool, not the creation tool.

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?

The description gives explicit when-to-use context (missing tax ids, stale phone numbers, wrong e-Invoice flags after a migration) and explicit exclusions: 'You cannot move a contact between customer and vendor here' and 'A name is refused'. It also routes to alternatives: resolve_customer/resolve_vendor for the real ID and 'call revise_draft (kind 'contact_update')' for the concurrency case. This is actionable routing guidance, not just a purpose statement.

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