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.

已驗證STDIO僅桌面金融商業與電商

概覽

AI 產生的概覽

根據本機保存的發票、貸項通知單與押金,產生客戶對帳單與逾期催款函。

可以做什麼
依期間產生單一客戶的對帳單:期初餘額、已開發票、已收款項、貸項通知單、押金及期末餘額,可輸出為純文字或 A4 PDF(PDF 僅限 Pro)。依指定日期將未結餘額劃分為 0-30、31-60、61-90 與超過 90 天帳齡,可依單一客戶或全部客戶、依幣別查看。起草友善、強硬或最終催告三種等級的催款函,附上逾期清單與銀行資訊。一次彙總所有客戶的未結餘額,並查詢或啟用 Pro 授權。
適用情境
適合已在本套本機 MCP 伺服器中維護發票、貸項通知單與押金的自由工作者與小型企業,需要出具對帳單並從溫和到強硬的付款提醒,而不必重複輸入數字。
執行需求
以本機程序在桌面執行;npm 套件尚未發布,目前可用 .mcpb 一鍵包或複製後自行建置安裝。需要磁碟上存在發票帳冊資料(貸項通知單與押金為選用)。選用的 Pro 授權金鑰透過 MCP_LICENSE_KEY 環境變數提供,離線驗證。
安裝前請注意
免費版每個日曆月可產生 5 份對帳單;PDF 匯出、全部客戶報告與最終催告函需一次性購買 Pro。伺服器讀取發票、貸項通知單與押金檔案並寫入自己的對帳單紀錄,但不修改來源資料。資料保留在本機,沒有任何網路呼叫。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Dunning,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

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):

json
{  "mcpServers": {    "statement-of-account": {      "command": "npx",      "args": ["-y", "@theluckystrike/mcp-statement-of-account"]    }  }}

Claude Code

sh
claude mcp add statement-of-account -- npx -y @theluckystrike/mcp-statement-of-account

Cursor

~/.cursor/mcp.json (global) or .cursor/mcp.json (project), same entry as Claude Desktop.

Tools

toolwhat it does
statement_buildOne client's statement for a period: opening balance, invoices issued, payments received, credit notes, deposits applied, closing balance. Every figure in minor units and formatted
statement_agingWhat is owed, split into 0-30, 31-60, 61-90 and over 90 days past the due date as at a chosen date, for one client or for everyone, per currency
statement_textThe same statement as plain text, movements in date order, ready to paste into an email
statement_pdfThe same statement as an A4 PDF titled STATEMENT OF ACCOUNT, on the same page layout as your invoices and credit notes
dunning_textA payment chaser at level 1 (friendly), 2 (firm) or 3 (final demand), with the overdue list and your bank details
statements_reportEvery client at once: what is outstanding per currency, aged, and the oldest overdue invoice in the book
license_statusFree or Pro, and where to upgrade
license_activateActivate a Pro key

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

FreePro
Statements built5 a calendar monthunlimited
Rebuilding a statement already builtunlimitedunlimited
statement_agingunlimitedunlimited
statement_textyesyes
dunning_text levels 1 and 2yesyes
dunning_text level 3, final demandnoyes
statement_pdfnoyes
statements_reportnoyes
PDF footer creditshownremoved

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:

storeserverwhat is taken from it
invoices.jsonmcp-invoicethe invoices, their due dates and how much of each is paid
credit-notes.jsonmcp-billing-docsthe credit notes, already stored with a negative sign
deposits.jsonmcp-depositsthe deposit applications, and what is still held

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:

ruleoutstandingoverdue
as at 2026-06-102,500.00 EUR500.00 EUR, 31 days late
today's paid_minor1,700.00 EUR0.00 EUR

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
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

3
  1. v0.22.6最新Oct 14, 2026
  2. v0.22.3Sep 23, 2026
  3. v0.21.0Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分