Bundle
dsh-duizhang
Reconciliation: statements, invoices and ledgers that have to balance. 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.
- Source
- mario03690
- License
- MIT
- Updated
- Updated 6 days ago
Readme
# 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.
<!-- TOOLS:BEGIN -->
## 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:
```sh
curl -s -X POST https://ainetcafe.com/mcp/duizhang -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
```
<!-- TOOLS:END -->
## Install
```sh
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](https://ainetcafe.com) — our own service, free tier plus paid usage. Full bundle (everything at once): [dsh-netcafe](https://github.com/mario03690/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](https://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.
Install
dsh plugin --profile web add github:mario03690/dsh-duizhang#bdc9148918d3d118586b5707eed302e7730a1072
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-duizhang from the hub