Skip to main content
Glama

Taokeh MCP server

Suggest bank-row categories (human reviews in Taokeh)

draft_bank_classification

Propose a category (and optionally a contact) for up to 50 bank rows still waiting for review — imported statement lines AND rows the owner typed in by hand, which land as UNCATEGORIZED — get their ids from bank_review_queue. PROPOSALS ONLY: this writes a suggestion the owner sees as an 'AI suggestion' badge on the Banking → Review screen; it never confirms, never posts, and nothing you send here moves money — the owner reviews and posts every line in /banking. Only SUGGESTED/UNCATEGORIZED rows accept a proposal (already-decided CONFIRMED/POSTED/IGNORED rows are rejected). category must be one of the review screen's own set. contactName applies only to CUSTOMER_PAYMENT (a customer) or SUPPLIER_PAYMENT (a vendor) and must match an EXISTING contact exactly — an unresolvable name rejects that row (create the contact first, or omit it). accountCode proposes the LEDGER ACCOUNT for the row (e.g. a hosting bill to 6500) and is accepted ONLY for the two categories whose account the owner picks by hand — OTHER and INTERNAL_TRANSFER. Every other category already books against a fixed account (a customer payment to receivables, a bank charge to bank charges, and so on), so sending accountCode with one is rejected and the reply names the account that category already carries. The code must exist in this company's chart (expense_accounts lists the expense side); a bank or credit-card account's own ledger account is refused, because that would post the money against itself. CARD_PAYMENT is the one category that REQUIRES accountCode, and takes only a credit-card account: it means "this bill settles that card", so propose it with the card's code or not at all — a card payment is never an expense, and naming an expense account (or naming a card account under OTHER) is refused, because the card's spending was already booked line by line from the card statement. The account you propose arrives PRE-SELECTED in the owner's account dropdown on Banking → Review, marked as proposed by you — it saves them hunting the chart, it does not decide anything: if they have already picked an account themselves, theirs stands. allocations proposes WHICH invoices or bills the money settles — the question Taokeh's own matcher hands to a human whenever the payment is partial, spans several documents, or could clear more than one combination, and the one you may already know from a remittance advice or the payer's own message. Send it ONLY with CUSTOMER_PAYMENT on a money-IN row or SUPPLIER_PAYMENT on a money-OUT row, and ONLY together with contactName, because every line is checked against THAT contact's live open documents: up to 20 entries of { docNumber, amount }, where docNumber is the document number as Taokeh shows it (open_invoices / ap_aging list them). EVERY amount is in RINGGIT, and specifically the outstanding balance as Taokeh reports it on those tools — never the document's own foreign-currency figure, and never its gross total where the two differ; a foreign-currency invoice is settled in Banking, not here. The amounts must add up to the WHOLE line within 0.10 — a proposal that leaves part of the deposit unexplained is refused with the exact shortfall, never trimmed to fit — no line may exceed what its document still owes, and an unknown number, a duplicate, or a document dated AFTER the payment is refused too; the refusal names that contact's own open documents with their outstanding amounts, so you can correct it in one more turn. What it does is PRE-FILL: the owner's Match pane opens with those documents ticked and those amounts entered, under a banner saying you proposed it and quoting your note. It settles nothing — the owner reads it and clicks Save — and if a document has been paid or part-paid since you proposed it, the pane says your proposal no longer fits and fills in nothing rather than allocating a stale figure. It never reaches the one-tap Accept on the payments list either; that button only ever applies Taokeh's own exact match. note is your stated reason (≤300 chars), shown to the owner — write it well, because the owner reads it when deciding. Your proposals are also collected into a 'Proposals from your AI' panel on Banking → Review, where the owner can accept a whole batch of them in one tap after reading them grouped by category with your reasons; that acceptance sets the category and contact only and is still the owner's decision — it never posts to the ledger. If a row's existing suggestion says "You set this rule on ", the OWNER has written a standing rule for that payer (What Taokeh has learned → Bank rules) — proposing something different is allowed and is sometimes right, but say in your note that you are contradicting their own rule, and expect them to keep the rule. Per-row outcomes are reported — nothing is silently skipped.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
suggestionsYes

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed1 schema field changed
    • addedInput schema / properties / suggestions / items / properties / allocations
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "amount": {
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "docNumber": {
      +        "maxLength": 60,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "docNumber",
      +      "amount"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 20,
      +  "minItems": 1,
      +  "type": "array"
      +}
  2. Changed1 schema field changed
    • addedInput schema / properties / suggestions / items / properties / accountCode
      Added value: +{
      +  "maxLength": 40,
      +  "type": "string"
      +}
  3. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations are bare (all false flags), so the description carries the full burden, and it delivers: every line is a pre-fill suggestion the owner must approve; invalid rows are rejected with named corrective data; stale allocations fill in nothing rather than a stale figure. Safety-relevant behaviors are stated explicitly and repeatedly ('never posts to the ledger', 'the one-tap Accept never applies'), consistent with readOnlyHint=false since it writes suggestions.

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

Conciseness3/5

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

Every sentence carries substantive constraint information and the core purpose is front-loaded, but the ~850-word description is one unbroken paragraph with no hierarchy. The 'it never posts / owner decides' point is restated at least four times, and the standing-rule caveat is buried at the end, so an agent must parse a dense wall of text to find critical rules.

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 tool with six nested fields, intricate category-dependent conditionals, currency rules, and reference-data dependencies, nearly everything an agent needs is stated: ID source, valid category set, contact matching, the CARD_PAYMENT exception, allocation math with tolerance, and failure reporting ('Per-row outcomes are reported — nothing is silently skipped'). The only minor omission is the exact shape of the per-row outcome report, which the no-output-schema setup leaves the agent to infer.

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 0% and there are no per-property descriptions, so the description must supply all semantics — and it does, exhaustively: category must come from the review screen's set; contactName must match an existing contact exactly; accountCode is accepted only for OTHER/INTERNAL_TRANSFER and required for CARD_PAYMENT; allocations are limited to 20 items, only with contactName, in Ringgit, summing to the line within 0.10. It also encodes cross-field invariants the schema cannot express, such as the currency and outstanding-balance rules.

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 — 'Propose a category (and optionally a contact) for up to 50 imported bank rows still waiting for review' — and names bank_review_queue as the ID source. The PROPOSALS ONLY framing ('never confirms, never posts, nothing you send here moves money') cleanly separates this from the create_*_draft siblings that actually create documents.

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?

Gives explicit when-to-use (rows still waiting for review, IDs from bank_review_queue) and when-not (already-decided CONFIRMED/POSTED/IGNORED rows are rejected). It names reference siblings as data sources — expense_accounts for the chart, open_invoices / ap_aging for open documents — and the standing-rule caveat tells the agent how to behave when the owner already has a rule.

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