
Dunning
io.github.theluckystrike由 GitHub 账号 theluckystrike 发布v0.22.6更新于 Oct 24, 2026
Write payment chasers at three levels from the invoices that are actually overdue.
概览
根据本地保存的发票、贷项通知单和押金,生成客户对账单和逾期催款函。
- 可以做什么
- 按期间生成单个客户的对账单:期初余额、已开发票、已收款项、贷项通知单、押金及期末余额,可输出为纯文本或 A4 PDF(PDF 仅限 Pro)。按指定日期将未结余额划分为 0-30、31-60、61-90 和 90 天以上账龄,可按单个客户或全部客户、按币种查看。起草友好、强硬或最终催告三种级别的催款函,附逾期清单和银行信息。一次性汇总所有客户的未结余额,并查询或激活 Pro 许可证。
- 适用场景
- 适合已在本套本地 MCP 服务器中维护发票、贷项通知单和押金的自由职业者和小型企业,需要出具对账单并从温和到强硬的付款提醒,而不必重复录入数字。
- 运行要求
- 作为本地进程在桌面运行;npm 包尚未发布,目前可用 .mcpb 一键包或克隆后自行构建安装。需要磁盘上存在发票台账数据(贷项通知单和押金为可选)。可选的 Pro 许可证密钥通过 MCP_LICENSE_KEY 环境变量提供,离线校验。
安装
在 SourceWeft 中
- 打开 控制台中的 Dunning,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
mcp-statement-of-account
[theluckystrike/mcp-statement-of-account MCP server]
In the official MCP Registry (io.github.theluckystrike/statement-of-account).
Send a client the one document that answers "what do I actually owe you". This MCP server
reads the books you already keep in this suite, your invoices, your credit notes and your
deposits, and turns them into a statement of account for a period: the balance you were
carrying at the start, every invoice you issued, every payment that came in, every credit
note you gave, and the balance at the end. It ages what is still open into 0-30, 31-60,
61-90 and over 90 days past due, so you can see at a glance which client is the problem;
it writes the statement as pasteable text or as an A4 PDF that looks like your invoices;
and it drafts the chaser, at a friendly, a firm or a final level. It never writes anything
back into your invoices, and it never invents a late fee.
Built by theluckystrike.
npm publish for @theluckystrike/mcp-statement-of-account is pending, so npx -y @theluckystrike/mcp-statement-of-account returns 404 today. Until then, the .mcpb one-click bundle or a clone+build is the working path.
Install
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or
%APPDATA%\Claude\claude_desktop_config.json (Windows):
Claude Code
Cursor
~/.cursor/mcp.json (global) or .cursor/mcp.json (project), same entry as Claude Desktop.
Tools
Plus the statement://sources resource, which says which of the three stores this server
could read and how many rows each holds, and the chase_overdue prompt.
Free vs Pro
Aging is free and unlimited on purpose. "Who owes me money" is the question this whole server exists for, and a free tier that hides it is a demo rather than a tool. The meter is on the statement, the document that actually goes to a client, and it counts distinct statements: the same client, period and currency built again is free forever.
Get Pro, one-time, lifetime, for this server. Keys verify offline.
Where the numbers come from
Nothing here is typed in twice. The server reads three stores and writes to none of them:
A store you have never installed is simply absent, and the statement is built without it. A store that is on disk and cannot be READ is a different thing entirely, and is reported as such on every figure, because a balance that could not be computed must never be shown as a balance of nothing owed. The one store the server refuses to work without is the invoice ledger.
A measured insight
Aging a past date with today's payment figures is not slightly wrong, it is silently
empty. Aging is usually written as "take each invoice, subtract what has been paid, and
bucket by the due date". The subtraction is the part nobody dates. On the worked month in
test/_client.mjs, aged at 2026-06-10, the two rules give:
The naive rule understates what was owed by 800.00 of 2,500.00, a third of the balance,
and it reports NOTHING overdue on a date when an invoice was a month late, because a
payment that arrived two days later has already been subtracted from it. The failure is
invisible: the answer looks tidy, the buckets add up, and it cannot be reproduced next
month because the input keeps moving. So every figure in statement_aging is taken as at
the date asked for, in both directions: an invoice issued after it is not on the books, a
payment made after it has not happened, and a credit note issued after it has not been
given.
The second thing measurement showed: paid_minor and payments[] on an invoice do not
have to agree, and routinely do not. invoice_mark_paid writes both, but deposit_apply
raises paid_minor and appends no payment row at all, and an invoice created before that
field existed has no rows either. Reconstructing receipts from payments[] would have
lost 300.00 of the worked month's 900.00 of receipts, a third of the cash, with no error
anywhere. paid_minor is treated as the authority and the rows are only the attribution.
Rules this server holds to
- A deposit is money that moves once. Applying a deposit already writes the payment on the invoice, so the statement counts it there and breaks it out as "of which deposits applied" rather than crediting it a second time. Deposit money still held is a memo line and is never part of the balance: it is the client's money until it is applied.
- Currencies are never added together. One statement is one currency, and a client billed in two is asked which. There is no exchange rate in this server, so a single figure across a EUR ledger and a USD one would be one it made up.
- Due today is not overdue. An invoice enters the 0-30 bucket on the first day past its due date. What is outstanding but not yet due is reported beside the buckets, never inside them and never hidden.
- A credit note reduces the invoice it names and no other. An open balance floors at zero and any excess is reported as unapplied credit, rather than quietly cancelling an invoice the client never agreed it against.
- No chaser invents a charge. The three dunning levels differ in tone and deadline and in nothing else. No level states a late fee, an interest rate or a legal cost, because this server holds no contract terms, no statutory rate and no jurisdiction, and the one place never to put a made-up number is a demand for money.
- A chaser for a client with nothing overdue is refused, and the refusal says what is outstanding but not yet due.
Privacy
All data stays on your machine. The invoices, credit notes and deposits are read from
${XDG_DATA_HOME:-~/.local/share}/mcp-servers/, this server's own register of built
statements is written to .../mcp-servers/statement-of-account/, and nothing is sent
anywhere. There is no network call in this server at all. License keys verify offline.
License
MIT. Support: [email protected]
Built by theluckystrike.
Use these docs as an MCP server
Any MCP client (Claude, Cursor, Windsurf, VS Code) can read this repository's documentation directly via GitMCP - no install:
来源:servers/statement-of-account/README.md,提交 6535b33
工具
0版本历史
3- v0.22.6最新Oct 14, 2026
- v0.22.3Sep 23, 2026
- v0.21.0Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分