Developer documentation
Taokeh runs an official Model Context Protocol server. Connect Claude, ChatGPT or any MCP-capable client to a Taokeh workspace and it can read the live books — sales, cash, aging, stock, statements — and file drafts a human approves. Live since 16 July 2026, 37 tools.
https://taokeh.my/mcpThe first Malaysian-built accounting AI connector we are aware of (as of July 2026).
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
workspace and the scope before anything is granted. No key to copy, no config file to edit.
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 workspace, and can be revoked at any time.
Both routes need the AI connector add-on switched on for the workspace. The tenant-facing setup walkthrough lives on the Ask Taokeh connector page.
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.
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.
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.
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.
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.
Names and behaviour as registered by the server. 28 read tools:
| Tool | What it returns |
|---|---|
| Overview & cash | |
business_snapshot | One-glance health check: today’s and this month’s sales and expenses so far. |
daily_brief | The morning brief in one call — sales, cash, top debtors, pending approvals, tax, low stock. |
cash_position | Every bank account and cash pocket with its current GL balance, plus the liquid total. An owner advance is reported separately as a liability, never as cash. |
cash_forecast | A forward 8-week cash-flow forecast built from open invoices, open bills, payroll, statutory remittances, loans and SST — with every assumption listed. |
profit_drivers | Why 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_statement | Profit and loss for a period: revenue, COGS, gross profit, expenses, net income. |
balance_sheet | Balance sheet as of a date: assets, liabilities, equity, with the balanced check. |
tax_position | Current SST period payable (if registered) plus e-invoice consolidation status and the filing due date. |
| Who owes whom | |
ar_aging | Who owes you money and how overdue — accounts-receivable aging by customer. |
ap_aging | Whom you owe and how overdue — accounts-payable aging by supplier. |
open_invoices | The unpaid or part-paid invoices for one customer, oldest first. |
payer_history | How this workspace has categorised a given bank counterparty before — the tenant’s own precedent behind a suggestion. |
| Sales, stock & channels | |
sales_summary | How much you have sold — today and month-to-date, or a date range broken down by month, customer and product. |
expenses_summary | How much you have spent: paid expenses today and this month so far. |
channel_summary | Sales by channel (Shopee, TikTok Shop, Shopify, your storefront) with discounts, shipping, freight-out, marketplace fees, returns and net proceeds. |
stock_level | Units on hand right now for a product, by name or SKU. |
low_stock | The reorder list: products at or below their reorder point. |
| Documents & search | |
search_documents | Find invoices, credit notes, quotes, delivery orders, bills, debit notes and purchase orders by number, party, date, amount or type. |
search_expenses | Search paid expenses already posted to the ledger — the duplicate check before filing an expense draft. |
get_document_pdf | A short-lived signed link to the real PDF of an invoice, quote or credit note. It emails nobody; it hands you the link. |
| Banking review | |
bank_review_queue | The imported bank rows still awaiting review, each with Taokeh’s own suggested category, confidence score and reason. Lowest confidence first. |
bank_reconciliation_status | Where each bank account stands: GL balance against the latest statement close, row counts by status, and the unreviewed backlog. |
| Lookups & shaping | |
resolve_customer | Match a customer name against the real customer list — resolved, ambiguous or none, with current outstanding A/R. Never guesses. |
resolve_vendor | Match a supplier name against the real vendor list. Near-misses are flagged rather than guessed. |
resolve_product | Match a product by name or SKU and return its unit and default sell price. |
expense_accounts | The expense categories and paid-from accounts this workspace can actually post to. |
intake_contract | The exact shape a Taokeh draft needs — required fields, totals, measurement and SST rules, and a worked example grounded in this workspace. |
find_in_taokeh | Where 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. |
9 write tools — every one of them files a draft or a suggestion, never a posted entry:
| Tool | What it files |
|---|---|
create_expense_draft | File a paid-expense draft from a receipt, with the original image attached. Does not post. |
create_bill_draft | File a supplier-bill draft (inventory lines). Does not post, receive stock or move cost. |
create_invoice_draft | File a sales-invoice draft. Does not post or move stock; the server re-computes every line and total. |
create_quote_draft | File a quotation draft — an estimate, never a ledger entry. |
create_receipt_draft | File a customer-payment draft, allocated across open invoices. Nothing settles until approved. |
create_contact_draft | File a contact draft read off a business card. The card image is required so the owner can check your fields against the picture. |
import_bank_statement | Import a bank statement for reconciliation. Every row lands in Banking → Review; the server refuses a statement whose rows do not tie to the printed closing balance. |
draft_bank_classification | Propose categories for up to 50 bank rows. Written as an “AI suggestion” badge the owner sees — it never confirms and never posts. |
request_attachment_upload | A one-time upload link for a file too large to inline, returning a token any draft tool accepts. |
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.
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.
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.
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.
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.
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.
MCP is the API, described so an AI can use it without you writing code. Each of the 37 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.
One connection per company — by design. A workspace-scoped token or OAuth grant binds to the one workspace 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.
Yes, and they are published: 200 MCP calls per workspace 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.
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.
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.
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.