Simpler.Asia
by simpler.asia in Markets & finance
Free back office for small businesses in Singapore and Southeast Asia: invoices, expenses, stock.
https://simpler.asia/mcp- Tools
- 320
- open to any client
- Uptime
- 100%
- last 30 days
- Response time
- 1.2 s
- 2.1 s slowest 5%
- Last check
- Passed
- 5 h ago, next in 43 min
Reliability
Status and outage history · Atom feed · Watch with other listings
How to connect
Add it to any MCP client that supports remote servers.
{
"mcpServers": {
"simpler-asia": {
"type": "http",
"url": "https://simpler.asia/mcp"
}
}
}320 tools
- simpler.directory
DISCOVERY TIER 1 of 3 — the service directory: one token-dense line per service (s:name st:status cost:class ops:N — purpose). START HERE instead of reading every tool. No auth required. NEXT: simpler.describe_service with a service name from the listing.
- simpler.describe_service
DISCOVERY TIER 2 of 3 — one service's operations and entity shapes from the live catalog, token-dense (op lines name the underlying tool). No auth required. NEXT: simpler.invoke {service, operation, args} — or call the named tool directly.
- simpler.invoke
DISCOVERY TIER 3 of 3 — execute one operation: dispatches to the underlying generated tool (same gates, same envelope, same idempotency as calling it directly). Requires auth. args = the underlying tool's arguments object.
- simpler.outcomes
DISCOVERY TIER 0 — the OUTCOME MENU: one line per common business outcome, each mapped to ONE tool with one-call notes (composites: ONE call creates the whole document). START HERE for a business task. No auth required. NEXT: call the named tool directly, or simpler.directory…
- simpler.approval_status
Check a parked approval by approval_id (returned in an APPROVAL_REQUIRED refusal). States: pending (the account owner has not decided — tell the user, do NOT retry the original call), executed (done — the result rides this response; never re-run the call; an approved…
- agent_note_send_cross_tenant
Send a cross-tenant AI-to-AI message into another tenant's agent_note inbox — the door that turns a cross_tenant_comm consent grant into an actual reach. Both tenants must be KYB-approved and the recipient must hold an active grant (claims can narrow it further); every…
- contact_upsert
Create-or-merge a contact keyed on email-then-phone identity — the sync door the future desktop harness and ingest lanes write through. Matching probes email first, then phone; a hit MERGES only the fields you send (omitted fields keep their stored values, so a partial sync…
- expense_create
Logs a new expense — amount_cents must be integer CENTS (a decimal string via `amount` also works, and `category` resolves to a category_id by name). A same-amount, same-UTC-day duplicate for the same user is refused as CONFLICT unless you resend identically with force: true…
- expense_submit
Sends your own draft expense into the approval queue — draft only; an already-submitted or resolved expense refuses CONFLICT, and only the expense's own creator may submit it. Nobody is notified automatically — approvers see it appear in the Team Claims view. NEXT…
- expense_approve
Approves a submitted expense claim — requires the admin or owner role, and only a 'pending' expense qualifies (CONFLICT otherwise). Stamps approved_by and approved_at with the caller and the current time; once approved, the row's content freezes for everyone except the approver…
- interaction_create
Log an interaction — call, meeting, email, message, visit, payment, or other — against a contact. The ONE activity-logging door every lane funnels through, so the contact's last_contact_at freshness bumps no matter which surface logged the touch; the bump never moves backward…
- invoice_create
ONE call creates the whole document: client_name + `items` [{description, quantity, unit_price}], each price as written ("5000.00"). It claims the next invoice number and writes every line; client_name finds or creates the client. A 'paid' birth needs items in the same call…
- invoice_adjustment_record
[REQUIRES APPROVAL] Records a credit note, write-off or post-issue discount on an issued invoice. A credit_note is numbered from the credit note series, holds its tax at the invoice's rate and takes reason_code and credit_outcome: reduce_balance (default) lowers what is owed…
- invoice_payment_record
Records a money-in fact row against an invoice (by invoice_id or its invoice_number) in ONE call: money is integer CENTS via amount_cents, or a decimal STRING via amount — never multiply or divide yourself. A draft invoice auto-advances to 'sent'; a cancelled invoice refuses; an…
- myinvois_invoice_generate
Mint a sealed LHDN e-invoice in ONE call: invoice_type, line_items (unit_price_cents in integer CENTS, tax_rate_bps in basis points), and a buyer as customer_id or an inline buyer object. Refuses until myinvois_settings_save is done; invoice_type 02/03/04 also needs…
- myinvois_invoice_record_submission
Record the UUID the LHDN MyInvois portal assigned after the owner keyed this e-invoice into the portal (its form or LHDN's Excel batch template). Simpler never submits to LHDN and never calls the MyInvois API; this only stores the UUID the owner copies back. Only a type-01…
- myinvois_invoice_read
Read one sealed e-invoice by id, with its portal_field_sheet: the document's values laid out to key into the LHDN MyInvois portal form (e-invoice details, supplier, buyer, each line, totals), coded values with their meaning. Simpler never submits to LHDN…
- quote_create
ONE call creates the whole document: client_name + `items` [{description, quantity, unit_price}], each price as written ("5000.00"). It claims the next atomic quote number and writes every line together; client_name finds or creates the client. tax_scheme sg_gst or my_sst taxes…
- quote_convert
Converts a quote into its invoice in ONE call: claims the quote's 'converted' status first (so a lost race never creates an orphan invoice), copies every live line item across, and records converted_invoice_id — nothing else to do afterward. Refuses if the quote is already…
- settlement_proposal_propose_cross_tenant
Record a payment obligation against a KYB-verified partner tenant's settlement_proposals — the record-don't-move on-ramp: this writes the row only, no money moves until a later settlement-rails door executes it. amount_cents is a nonzero integer CENTS (positive = you owe them…
- sticky_note_create
Create a sticky_note.
- stock_item_adjust
Move stock in or out by id or item name, in one atomic write with its movements-ledger row: stock-out clamps at zero (never negative) and applied_quantity reports what actually moved. An unmatched name CREATES the item at quantity 0 first so the delivery still lands as an…
- team_assignment_create
[REQUIRES APPROVAL] Delegates a task to a teammate (or yourself) as a new team_assignment; status is workflow-owned and always starts 'pending' — passing status yourself fails validation instead of being silently overridden. Accepts natural language for the common fields…
- workflow_create
Create a workflow — an AI operator's job: validates definition_json (a { nodes, edges, schedule? } graph) against the platform's node vocabulary, refusing unknown node types and any comms/message-shaped step that isn't a prepare_output node, since the platform prepares outputs…
- workflow_prepared_outputs
List this tenant's APPROVED prepared outputs: drafts a workflow's prepare_output nodes parked for review, which a human then approved in the platform inbox. Pending and rejected drafts never appear here — approval happens only in the inbox, never through this call. Optional…
- ai.budget
Your prepaid wallet, period spend, caps, and runway as a compact line DSL (~8 lines). Requires auth (your balance is closed data). Read this BEFORE committing paid actions; pair with ai.estimate_cost to price a specific call first.
- ai.estimate_cost
Price an AI task BEFORE running it: provider passthrough at wholesale cost, no markup — the per-token platform fee is retired, so text/reasoning passes through at cost. Anonymous — open catalog includes open pricing. Returns integer micro-USD plus a USD total. NEXT: run the…
- sales_receivables
Who owes you, by client: each client's unpaid balance aged by days past its due date — current (not yet due), 1-30, 31-60, 61-90 and over 90 days — counted in the business's own days (the sales_settings time zone), so an invoice due today is still current. Only issued invoices…
- sales_document_show
Show one invoice, quote or receipt as the document itself. When the result has a second content block, it is the document as copy-ready plain text (title, business, billed to, dates, one line per item, the totals as printed, notes, payment terms and details, or on a receipt the…
- invoice_message_prepare
Prepare what a business sends a client about one issued invoice: purpose 'invoice', 'reminder' (overdue), 'receipt' (paid in full) or 'promise_follow_up' (promised date passed); left out, the one that fits. language 'en', 'ms' or 'zh'; left out, the client's…
- invoice_reminders_due
Today's collection list, in the business's days (its sales_settings time zone). reminders: each issued invoice still owed that is 3 days before its due date, on it, or 7 or 14 days after, as its client's reminder_cadence allows (standard, from_due, overdue_only or off; set it…
- statement_prepare
A client's statement of account over a period of the business's own days (the sales_settings time zone): the balance they owed before it (opening), each invoice issued, payment received, credit and write-off in it with a running balance, the balance at its end (closing), and…
- invoice_handoff
Get one issued invoice ready to give the client, in one call: the document, the client link (made if it has none), the PDF (printed or the stored one) and the prepared message (invoice_message_prepare's words, with the link). ready lists the parts made; missing gives each other…
- forecast.run
WHAT-IF / scenario lane: runs monthly data YOU supply through a seeded 5,000-path simulation of monthly revenue and costs; bands are simulation outputs, not calibrated probabilities. The paths are clustered into 3-7 outcome bands for the next 6 months, with per-month revenue and…
- forecast.run_stored
Run the tenant's REAL forecast from the books — cash receipts (recorded invoice payments by payment date, plus paid invoices with no recorded payment at their paid date, flagged) and expenses by expense date, monthly in the tenant's base currency, up to the last complete month…
- forecast.read
Read the tenant's STORED forecast — the verify-read for this rail. view picks the answer, one of summary, monthly, variance, scenarios, weekly (default summary). summary: the outcome bands (label, growth_direction, probability_pct, final_month_revenue_low and _high…
- image.generate
[paid: $0.06/image max] Generate 1-3 images from a text prompt on the first lane that delivers, tried in order: google/nano-banana-2.1 via the Cloudflare AI catalog ($0.06/image), then @cf/black-forest-labs/flux-2-dev via Cloudflare Workers AI, only when the first lane is down…
- document.extract
Fetch a document from a URL, classify its type (personal/medical/business/unknown) with keyword + PII-pattern heuristics (documents containing actual PII data are NEVER business), and return extracted text capped at 100K chars. Free. STREAMING SUPPORTED: send Accept…
- template.list
Free. The media templates: product-shot (product shot), product-lifestyle (product in a real place), poster (promo poster), showcase-video (product video), explainer-voice (voice-over with captions), brand-mockup (brand mockups). Each entry says what it makes, what it delivers…
- spreadsheet.create_with_content
Create a spreadsheet in the user's library from CSV content in ONE call: the platform stores the bytes (honest text/csv) and registers the file row. Free — storage costs nothing; only AI lanes bill. Returns the file row including its id. Refuses: VALIDATION_ERROR when title or…
Security scan
7 findings
- Unusually long description in tool:forecast.run
forecast.run WHAT-IF / scenario lane: runs monthly data YOU supply through a see… - Unusually long description in tool:forecast.run_stored
forecast.run_stored (forecast.run stored) Run the tenant's REAL forecast from th… - Unusually long description in tool:forecast.read
forecast.read Read the tenant's STORED forecast — the verify-read for this rail.… - Unusually long description in tool:banking.import_statement
banking.import_statement (banking.import statement) Import one bank account's st… - Unusually long description in tool:image.add_shadow
image.add_shadow (image.add shadow) Add a product shadow to a cut-out (subject o… - Unusually long description in tool:image.adjust
image.adjust Apply 1..10 adjustments to a photo in order, with the editor's own … - Unusually long description in tool:image.marketplace_check
image.marketplace_check (image.marketplace check) Check a product photo against …
Recent checks
| When | Result | HTTP | Time |
|---|---|---|---|
| 5 h ago | Passed | 200 | 453 ms |
| 17 h ago | Passed | 200 | 338 ms |
| 29 h ago | Passed | 200 | 1.3 s |
| 40 h ago | Passed | 200 | 461 ms |
| 2 days ago | Passed | 200 | 465 ms |
Show 10 older checks
| 3 days ago | Passed | 200 | 1.6 s |
| 3 days ago | Passed | 200 | 420 ms |
| 4 days ago | Passed | 200 | 334 ms |
| 4 days ago | Passed | 200 | 1.5 s |
| 4 days ago | Passed | 200 | 508 ms |
| 5 days ago | Passed | 200 | 1.6 s |
| 6 days ago | Passed | 200 | 972 ms |
| 6 days ago | Passed | 200 | 1.9 s |
| 7 days ago | Passed | 200 | 517 ms |
| 8 days ago | Passed | 200 | 1.5 s |