Taokeh

Malaysian SME accounting and payroll. Your AI reads the books and files drafts you approve in-app; nothing posts by itself.

Documentation

The Taokeh MCP server

Taokeh runs an official Model Context Protocol server. Connect Claude, ChatGPT or any MCP-capable client to a Taokeh company and it can read the live books — sales, cash, aging, stock, statements — and file drafts a human approves. Live since 16 July 2026, 61 tools. The design goal is stated plainly: the AI runs the books, and the human approves on one page — every write tool here files a draft that waits on /go for a tap.

Endpoint

https://taokeh.my/mcp

Transport

Streamable HTTP (MCP)

Tools

61 — 37 read, 24 write (drafts only)

Auth

OAuth 2.1 with dynamic client registration and PKCE, or a personal access token as a bearer

Tested clients

claude.ai · ChatGPT custom connectors · Claude Desktop · Claude Code · Cursor

Price

RM29/month add-on, included in the 14-day free trial

The first Malaysian-built accounting AI connector we are aware of (as of July 2026).

Connecting

claude.ai and ChatGPT. Add https://taokeh.my/mcp as a custom connector. The client registers itself, you are bounced to Taokeh to log in, and a consent screen names the company and the scope before anything is granted. No key to copy, no config file to edit. On ChatGPT that means Developer mode and a custom plugin — the clicked-through steps are at Connect ChatGPT to your accounting books.

One connector per company. Every company also answers at its own address, https://taokeh.my/mcp/<company-slug> (the exact URL is on Integrations → Ask Taokeh connector). Use it when you keep books for more than one company: claude.ai and ChatGPT allow a single connector per address, so a second company added on the shared URL is refused as a duplicate. The address is a distinct URL and nothing more — it carries no access, the shared endpoint keeps working, existing connections are untouched, and which set of books opens is still decided by the sign-in you approve at consent.

Claude Desktop, Claude Code, Cursor and other CLI clients. Generate a personal access token inside Taokeh (they look like tkm_…) and send it as Authorization: Bearer <token>. Tokens are stored only as a hash, are scoped to one company, and can be revoked at any time.

The config, ready to paste. Claude Code can add the server directly — claude mcp add --transport http taokeh https://taokeh.my/mcp — and walk the same OAuth consent as the web clients, no token to manage. For a client that wants a config file and a personal access token instead:

{
  "mcpServers": {
    "taokeh": {
      "command": "npx",
      "args": ["mcp-remote", "https://taokeh.my/mcp", "--header", "Authorization:${AUTH_HEADER}"],
      "env": { "AUTH_HEADER": "Bearer tkm_your_token_here" }
    }
  }
}

Two things worth knowing, written down here rather than discovered: the header argument has no space after the colon (Authorization:${AUTH_HEADER}) — a space splits the argument and the server answers 401 — which is why the value is passed through env rather than inline; and the token is a personal access token you mint inside Taokeh, so it carries one company and can be revoked without touching this file.

Both routes need the Ask Taokeh connector add-on switched on for the company. The tenant-facing setup walkthrough lives on the Ask Taokeh connector page.

The safety contract

This is a design decision, not a limitation we are working around. An AI connected to a business’s books must not be able to change them.

Reads are free

Every read tool answers immediately. Ask for the aging, the cash position, last month’s P&L or a product’s stock and the answer comes straight from the ledger — no approval step, because a read changes nothing.

Writes are drafts

Every write tool files a pending draft. It appears in Taokeh for the owner to check against the original document, and only the human tap posts it. Six draft kinds: expense, bill, invoice, quote, customer receipt, and a contact read off a name card.

It can never post, edit or delete

There is no tool that posts to the ledger, amends a posted document, voids one, deletes anything, confirms a bank row, or sends an email. Bank statement rows import into a review queue; classification suggestions are proposals the owner sees, not decisions.

Your AI does the processing — ours never does

On MCP paths the Taokeh server never calls a language model. Your assistant reads the receipt, reads the statement, reads the name card, and sends structured fields; our server validates them, re-computes the arithmetic, and files a draft. That means the reasoning runs on your own AI subscription with your own choice of model, and your documents are not fanned out to a third model we picked for you. We do the books. Your AI does the reading.

The 61 tools

Names and behaviour as registered by the server. 37 read tools:

ToolWhat it returns
Overview & cash
business_snapshotOne-glance health check: today’s and this month’s sales and expenses so far.
daily_briefThe morning brief in one call — sales, cash, top debtors, pending approvals (the count is of DECISIONS, not rows — a real approval queue contributes its item count, an operational to-do counts as 1 however long its backlog), tax, low stock.
cash_positionEvery bank account and cash pocket with its current GL balance, plus the liquid total. An owner advance, and anything owed on a credit card, are reported separately as liabilities — never as cash.
cash_forecastA forward 8-week cash-flow forecast built from open invoices, open bills, payroll, statutory remittances, loans and SST — with every assumption listed.
profit_driversWhy net profit moved: a revenue/COGS/opex bridge against the same day-span of the previous month, with one-offs pulled out.
Statements & tax
income_statementProfit and loss for a period: revenue, COGS, gross profit, expenses, net income — optionally against a comparison period, with every variance computed on the server.
balance_sheetBalance sheet as of a date: assets, liabilities, equity, with the balanced check — optionally against a second date, with the movement computed on the server.
tax_positionCurrent SST period payable (if registered) plus e-invoice consolidation status and the filing due date.
Who owes whom
ar_agingWho owes you money and how overdue — accounts-receivable aging by customer.
ap_agingWhom you owe and how overdue — accounts-payable aging by supplier.
open_invoicesThe unpaid or part-paid invoices for one customer, oldest first.
payer_historyHow this company has categorised a given bank counterparty before — the tenant’s own precedent behind a suggestion.
Sales, stock & channels
sales_summaryHow much you have sold — today and month-to-date, or a date range broken down by month, customer and product.
expenses_summaryHow much you have spent: paid expenses today and this month so far.
channel_summarySales by channel (Shopee, TikTok Shop, Shopify, your storefront) with discounts, shipping, freight-out, marketplace fees, returns and net proceeds.
stock_levelUnits on hand right now for a product, by name or SKU.
stock_movementsThe stock movement ledger in bulk, across products — what moved, when, why, the signed quantity, the balance it left behind and the document behind it. Says which stock mode the company is in, because on the default (modified periodic) selling does not move stock at all.
low_stockThe reorder list: products at or below their reorder point.
counter_dayA Counter (Kaunter) till day: receipt and voided counts, cash and DuitNow QR totals, the 5-sen rounding, whether the day is still open or closed into the books, and the receipt-number range. Counter add-on only.
Documents & search
search_documentsFind invoices, credit notes, quotes, delivery orders, bills, debit notes and purchase orders by number, party, date, amount or type.
search_document_linesRead the LINE ITEMS of posted invoices, credit notes, sell-side debit notes, bills and buy-side debit notes in bulk — product, description, quantity, unit, price, the cost basis stamped at posting, discount and line total across many documents in one call, instead of one PDF at a time. Sizes and grades live in the name/description text, so the AI does the grouping.
search_expensesSearch paid expenses already posted to the ledger — the duplicate check before filing an expense draft.
search_journalSearch the ledger’s journal entries — every posting, whatever door created it (manual journal, scan, invoice, bank, expense, payroll) — each returned WITH its balanced lines, so you can see exactly how something was booked.
get_document_pdfA short-lived signed link to the real PDF of an invoice, quote or credit note. It emails nobody; it hands you the link.
get_attachmentA short-lived signed link to the ORIGINAL document someone filed — the receipt behind a posted expense, the scan on an invoice, bill or quote, the file riding a pending draft, or a Shoebox photo nobody has read yet. Taokeh serves the bytes; your own AI reads them.
shoebox_itemsThe photos waiting in the Shoebox — paper the people in the business snapped on their phones and sent in, which nobody has read yet. Look at one with get_attachment, then file it by passing shoeboxItemId to a draft tool; Taokeh attaches its own stored copy, so the image is never re-sent. No AI credits are drawn on this lane.
Banking review
bank_review_queueThe imported bank rows still awaiting review, each with Taokeh’s own suggested category, confidence score and reason. Lowest confidence first.
bank_reconciliation_statusWhere each bank account stands: GL balance against the latest statement close, row counts by status, and the unreviewed backlog.
Your own queue
my_workWhat your AI filed and what happened to it: everything still waiting on the owner’s approval (with how long it has waited and the exact next step), what the owner approved and what it became, what was rejected and — where Taokeh stores one — the reason, and the migration sets still at a commit door.
Payroll
payroll_summaryA month’s payroll gross to net, as it was actually run: gross, every employee deduction (EPF/SOCSO/EIS/SKBBK/PCB/zakat), every employer contribution (EPF/SOCSO/EIS/HRD Corp), net pay and the employer’s true total cost — optionally per employee — plus who is on approved leave in the next 14 days, and, if you ask for it, the staff roster — which is where the employeeId for update_employee_draft comes from. Summed from the stored payslips, never recalculated. Admin seats only.
employer_cost_estimateWhat a hypothetical hire really costs: monthly wage plus employer EPF/SOCSO/EIS/HRD Corp, and the employee’s take-home after their own deductions — PCB from Taokeh’s implementation of LHDN’s official computerised MTD method. Every assumption is stated, so a scenario can never be read as a quote. Admin seats only.
Lookups & shaping
resolve_customerMatch a customer name against the real customer list — resolved, ambiguous or none, with current outstanding A/R. Never guesses.
resolve_vendorMatch a supplier name against the real vendor list. Near-misses are flagged rather than guessed.
resolve_productMatch a product by name or SKU and return its unit and default sell price.
expense_accountsThe expense categories and paid-from accounts this company can actually post to.
intake_contractThe exact shape a Taokeh draft needs — required fields, totals, measurement and SST rules, and a worked example grounded in this company.
find_in_taokehWhere in Taokeh to do something: the real deep-link page(s) for a plain-language question, from the live feature catalogue. Guides only; changes nothing.

24 write tools — every one of them files a draft or a suggestion, never a posted entry:

ToolWhat it files
create_expense_draftFile a paid-expense draft from a receipt, with the original image attached — or pass shoeboxItemId and Taokeh attaches the Shoebox photo it already holds. Does not post.
create_bill_draftFile a supplier-bill draft (inventory lines), optionally from a Shoebox photo via shoeboxItemId. Does not post, receive stock or move cost.
create_invoice_draftFile a sales-invoice draft, optionally from a Shoebox photo via shoeboxItemId. Does not post or move stock; the server re-computes every line and total.
create_quote_draftFile a quotation draft — an estimate, never a ledger entry.
create_credit_note_draftFile a credit-note draft — a sales return, short delivery, price correction or allowance. Against a specific invoice, or as a standalone allowance. Does not post, and whether stock comes back is the owner’s decision at approval.
create_debit_note_draftFile a sell-side debit-note draft — an additional charge on an invoice you already issued (an undercharge, a price revised upward, a missed surcharge). The original invoice is required; it posts nothing, and it never moves stock.
create_purchase_order_draftFile a purchase-order draft — an order you intend to place with a supplier. It posts nothing and moves no stock; convert the order to a bill when the goods arrive.
create_journal_draftFile an adjusting-journal draft — an accrual, a prepayment, a correction, a year-end adjustment, or the reversing entry that fixes a wrong posted entry. It must balance to the sen; it posts nothing, and posted history is never edited or deleted.
create_receipt_draftFile a customer-payment draft, allocated across open invoices. Nothing settles until approved.
create_contact_draftFile a contact draft read off a business card. The card image is required so the owner can check your fields against the picture.
update_contact_draftPropose changes to a customer or vendor already on the books — tax id, e-Invoice details, phone, flags, and the people filed under them. The owner approves a plain current-to-proposed diff; nothing changes until they do.
update_invoice_draftPropose a correction to an invoice already posted — a wrong line, a wrong date, the wrong payment method. An admin approves a plain current-to-proposed diff; nothing changes until they do, and the correction keeps the same invoice number and carries the original document across. It can never change the customer, the invoice number, or an invoice LHDN has already validated.
update_employee_draftPropose corrections to an employee already on payroll — IC, EPF/SOCSO/tax numbers, salary, the statutory flags. An admin approves a plain current-to-proposed diff; nothing changes until they do, and an approved change applies to future payroll runs only. Admin-only.
update_product_draftPropose changes to a product already in the catalogue — name, unit, selling price, reorder point, barcode, category. The owner approves a plain current-to-proposed diff; nothing changes until they do. It can never move stock on hand or restate a cost.
update_logo_draftPropose a new company logo — the mark Taokeh prints on every invoice, quote and receipt it generates. Send a PNG or JPEG; oversized artwork is shrunk for you rather than refused. An admin approves it looking at the logo they have now beside the one proposed; nothing changes until they do. It is one value, so a second proposal replaces the first. Admin-only.
create_recurring_invoice_draftPropose a recurring invoice — a billing schedule that issues the same invoice to a customer every month, quarter or year. It creates nothing; the owner approves it, and the review page states the date the FIRST invoice would go out. A schedule filed this way always files a draft invoice each cycle for a person to approve — it can never be set to post by itself.
update_recurring_invoice_draftPropose changes to a recurring invoice already set up — a price rise across a subscription, a new end date, or pausing the billing. The owner approves a plain current-to-proposed diff, and the review page states the date the next invoice would go out and whether approving moves it. Invoices the schedule has already issued are never touched, and it can never end a schedule or switch it to posting unattended.
revise_draftCorrect a draft you already filed — amend a PENDING draft of any kind in place instead of re-filing it (which the duplicate guard refuses). Revising never approves: the draft stays pending and the owner still taps.
import_bank_statementImport a bank or credit-card statement for reconciliation. Every row lands in Banking → Review; the server refuses a statement whose rows do not tie to the printed closing balance, and a card statement must declare which sign convention it was read in.
draft_bank_classificationPropose categories — and, where the owner picks the account by hand, the ledger account too — for up to 50 bank rows. Written as an “AI suggestion” badge the owner sees, pre-selecting their dropdowns; it never confirms and never posts.
request_attachment_uploadA one-time upload link for a file too large to inline, returning a token any draft tool accepts.
stage_documentBring one already-issued historical invoice or supplier bill across from the system you are migrating from. Groups into monthly batches the owner approves together; idempotent on the old system’s own document id, so re-running your export never double-books. Attach the original (request_attachment_upload → PUT → attachmentToken) and it rides the staged row onto the posted document.
stage_opening_balancesBring a whole set of opening balances across when switching accounting system — the closing trial balance, the aged receivables or the aged payables. The owner reviews it on the Switch wizard’s own screens and posts it; re-staging replaces the set, because a balance set only means anything whole.
stage_master_dataBring the chart of accounts, the product catalogue, the customer/supplier book or the staff list across when switching accounting system. The owner confirms it on the screen that already shows that list and applies it; re-staging replaces the set, and unlike opening balances it may be sent again after an import — a catalogue is upserted, not posted. The chart lane renames freely, never deletes an account, and refuses to re-type one that already has postings. The staff lane is admin-only and CREATES people rather than updating them, so anyone already in Taokeh is left off the list.

Questions developers and buyers actually ask

Can ChatGPT create an invoice in my accounting software?

With the Taokeh MCP server connected, yes — as a draft. ChatGPT calls create_invoice_draft, which files a pending sales invoice into Taokeh. It does not post to the ledger and does not move stock. You open Taokeh, check the lines against the source document, and tap approve. Only that tap posts it.

Can my AI categorise receipts and bank transactions?

Yes. Your AI reads the receipt itself and files it with create_expense_draft, original image attached. For bank statements it calls import_bank_statement, then draft_bank_classification to propose a category per row. Proposals appear as AI suggestions in Banking → Review. Confirming and posting each row stays a human click.

Can I ask who owes me money?

Yes — that is a plain read. Your AI calls ar_aging for the full receivables aging by customer and overdue bucket, or open_invoices for one customer’s unpaid invoices oldest first. payer_history explains how a given counterparty has been treated before. No approval needed: reads change nothing.

Can my AI generate my monthly profit and loss?

Yes. income_statement returns revenue, cost of goods sold, gross profit, expenses and net income for any period, straight from the double-entry ledger — not estimated by a model. balance_sheet does the same as of a date, and profit_drivers explains why the number moved against last month.

Can it prepare a monthly management report?

Not as a packaged report — as a composition your AI assembles. It calls income_statement twice (this month and last), profit_drivers for the bridge, ar_aging, cash_position, cash_forecast and expenses_summary, then writes the narrative itself on your own AI subscription. The figures come from the ledger; the document is your AI’s. Worked prompt and full recipe: /guides/talk-to-your-books.

Can it flag anomalies before month-end?

When you ask it to. No tool returns an “anomaly” field — your AI reads daily_brief, search_expenses (the doubled-bill check), ar_aging, bank_reconciliation_status and low_stock, and judges what looks off. MCP is pull-only: Taokeh runs no watcher and pushes no alert, so a standing scan is a scheduled prompt in your AI client. Full recipe: /guides/talk-to-your-books.

Is there an API? How is MCP different from a REST API?

MCP is the API, described so an AI can use it without you writing code. Each of the 61 tools carries a typed schema and a description your assistant reads at connect time, so it knows what exists and what each field means. A REST API needs an integration built first; MCP needs a connection.

Can one AI connection cover all my companies?

One connection per company — by design. A company-scoped token or OAuth grant binds to the one company you consented to, so an AI connected to one company cannot reach another’s books. claude.ai and ChatGPT both hold several named connectors side by side, so an accountant connects each company separately. One connection spanning companies is not offered today. Name each connector after the company it opens — “Taokeh — Lim Hardware”, not twelve connectors all called “Taokeh”; the name is what your AI sees in its tool list, and it is how it knows whose books it is reading. Every tool response also carries the company name, so the AI is told on every call.

Are there API rate limits for AI agents?

Yes, and they are published: 200 MCP calls per company per day, plus 300 requests per 15 minutes per IP address and a platform-wide daily backstop. They exist for fair use and cost control, not to meter you — a normal agent day sits far below 200. A limit returns a JSON-RPC error your client can read.

Are the AI’s actions fully auditable and reversible?

Yes. Every AI-filed draft records the connecting client’s name, the user whose grant it acted under, and the time. Approving or rejecting stamps the deciding user and timestamp. Nothing posts to the ledger without that tap, and a rejected draft posts nothing at all. Correcting a posted GL document is a void and repost that keeps its number.

What does the Taokeh MCP server cost?

RM29 per month as an à-la-carte add-on on top of a Taokeh base plan, and it is included in the 14-day free trial — so you can connect your AI and try every tool before paying for anything.

Point your AI at your books

RM29/month, included in the 14-day free trial. Connect it, ask it anything, and see how a draft feels before you pay for a thing.

Tool names and behaviour on this page mirror the live server. Setup walkthrough: Ask Taokeh connector. Security and data ownership: Trust & security.