dsh-duizhang
Bank/credit statement PDFs and invoice batches into ledger-ready tables, then reconciled — on a shared key in integer cents, or with no shared key at all by amount, date window, reference numbers and fuzzy counterparty names.
What & why
The point is that it refuses to look right when it is wrong. reconcile_ledger compares in integer cents, so 0.1+0.2 never invents a phantom difference. extract_statement re-adds the running total independently (opening + credits − debits = closing) and, if it does not balance, names the row where it first breaks. match_transactions handles split (1:N) and combined (N:1) payments and declines to guess when the evidence is thin. dedupe_entities never merges anything — it shows the evidence, cross-checked against tax-ID checksums, and leaves the decision to a human.
Every set ships what_can_you_do — describe a task in any language, get the exact tool plus a ready-to-run call.
What's in this pack
15 tools, read from the live endpoint on 2026-08-22 — this table is generated, not hand-written, so it cannot drift away from what tools/list actually returns. The Arguments column is what the tool genuinely reads; it comes from the tool's own declared input schema.
| Tool | What it does | Arguments | Price / call |
|---|---|---|---|
what_can_you_do |
Describe a task in plain language (any language) and get back exactly which tools on this server do it, with ready- | task |
— |
extract_statement |
Turn a bank statement or transaction PDF into a clean transaction table (JSON + CSV), then cross-check it: opening | url |
$0.03 |
diff_tables |
Matches rows across two CSVs on a key column and reports three things: keys only in A, keys only in B, and keys in | url_a, url_b, text_a, text_b, key |
$0.003 |
clean_table |
Tidies a spreadsheet export: removes duplicate rows, trims whitespace (half-width and full-width — Chinese exports | url, text, ops, keep, split_column, split_by |
$0.003 |
merge_tables |
Combines up to 20 CSVs into a single table. Headers do not have to match: columns are unioned and a file missing a | urls, texts |
$0.004 |
reconcile_ledger |
Reconciles two sets of records — your books against a bank, platform, or supplier statement. Matches rows on a key | url_a, url_b, text_a, text_b, key, amount |
$0.006 |
extract_invoices |
Give it up to 20 invoice URLs (PDF or page images) and get back one table ready to post: number, date, seller, buye | urls |
$0.05 |
fix_csv_encoding |
Detect the real encoding of a CSV (GB18030, Shift-JIS, Windows-1252…), repair mojibake (UTF-8 that was read as Lati | url, text |
$0.002 |
read_xlsx |
Read an Excel .xlsx workbook (by URL) into rows — every sheet, or one you name. Returns cell values (not formula te | url, sheet, keep_formulas, max_rows, inline, preview_rows |
$0.003 |
write_xlsx |
Build an Excel .xlsx file from rows (CSV text or JSON arrays), optionally several sheets at once. Numbers are writt | sheets, url, text, sheet_name |
$0.004 |
match_transactions |
Match bank statement lines to ledger/invoice entries when there is NO shared key — by amount, date window, referenc | url_a, text_a, url_b, text_b, sheet_a, sheet_b, date_window_days, fee_tolerance, max_group_size |
$0.008 |
dedupe_entities |
Find records in a supplier/customer/store list that are probably the SAME entity under different names — "北京星辰科技有限公 | url, text, sheet, name, tax_id, phone, domain, address, bank, name_threshold |
$0.006 |
uscc_validate |
校验统一社会信用代码(GB 32100 校验位)。做企业名单去重、发票抬头核对时,先过这一关能挡掉大部分录入错误。 | code, uscc, text |
free |
amount_to_chinese |
人民币金额转中文大写(壹佰万零壹元贰角叁分)。开票、合同、支票场景,手写容易错的那一步。 | amount, value, text |
free |
vat_calc_cn |
增值税价税分离:含税价 ⇄ 不含税价 + 税额。rate 传 0.13 或 13 都可以;inclusive=false 表示传入的是不含税价。结果带勾稽自证。 | amount, rate, inclusive |
free |
— in the price column means the tool is not metered per call (session/trial-gated instead). Failed calls are never charged. Check it yourself:
curl -s -X POST https://ainetcafe.com/mcp/duizhang -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Install
dsh plugin --profile <your-profile> add github:mario03690/dsh-duizhang
Thin config layer only (one @deepseek-ai/dsh-mcp-client row, shipped as cordis.patch.yml) — no tool code runs on your machine. Built against the MCP client config shape of the dsh v0.1 developer preview; verified against the live endpoint on 2026-08-22.
Cost, quota, privacy
Mixed. The table operations are deterministic and cheap ($0.002–$0.008). The two extractors read documents with a model: extract_statement $0.03, extract_invoices $0.05. Every response reports its exact USD cost; failed calls are not charged.
No signup for the free anonymous quota. Documents are processed in memory and not retained. The config URL carries ?s=dsh-duizhang — a channel tag identifying the install path, not you.
Disclosure: built and run by the team behind ainetcafe.com — our own service, free tier plus paid usage. Full bundle (everything at once): dsh-netcafe. MIT.
Compatibility & permissions (at a glance)
| Signal | This plugin |
|---|---|
| Runtime | dsh v0.1 developer preview (Cordis v4). Touches only the MCP client config shape — the narrowest surface available. Verified against a live endpoint on 2026-08-22. |
| What runs locally | Nothing. Ships one cordis.patch.yml row; there is no tool code, no build step and no lifecycle script in this package. |
| Filesystem access | None. |
| Shell / process access | None. |
| Network access | Outbound HTTPS to ainetcafe.com only, from the MCP client that dsh already ships. |
| Credentials | None required for the free tier. An optional AllRouter key, if you supply one, is sent by dsh as a request header and is never stored by us. |
| Data retention | Documents and prompts are processed in memory and not retained. |
| Dependencies | One peer dependency: @deepseek-ai/dsh-mcp-client (ships with dsh). |
| License | MIT (see LICENSE). |
| Publisher | The team that runs ainetcafe.com. Issues get a same-day reply. |
A directory listing is not a security review. Read
cordis.patch.yml— it is short enough to read in full in under a minute.
No comments yet. Be the first to write one.