关于 recurring-invoice-scheduler-subscription-billing-due-reminders
面向需要管理固定周期账单的企业与自由职业者,此 MCP 服务可保存开票计划,并按需生成到期发票及 PDF。按每期记录实现幂等生成,并提供到期清单和收入预测;数据保存在本机。
主要功能
- 01创建、修改和暂停开票计划
- 02按期生成发票及 PDF
- 03预览即将到期的账单
- 04按月预测各币种收入
- 05跳过单次账期并保留记录
适用场景
- 01为月度顾问服务设置定期账单
- 02检查未来 30 天到期的发票
- 03预览账单生成结果后执行开票
- 04估算未来数月的月度收入
MCP 相关
作为 MCP 服务,它向客户端提供计划管理、到期查询、发票生成和收入预测工具,并提供 upcoming 资源与 monthly_billing_run 提示词。它将发票写入 mcp-invoice 的数据目录。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://mcp.zovo.one/mcp/recurringclaude mcp add --transport http theluckystrike-recurring-invoice-scheduler-subscription-billing-due-reminders https://mcp.zovo.one/mcp/recurring{"mcpServers":{"theluckystrike-recurring-invoice-scheduler-subscription-billing-due-reminders":{"type":"http","url":"https://mcp.zovo.one/mcp/recurring"}}}在 Cursor 中打开{"servers":{"theluckystrike-recurring-invoice-scheduler-subscription-billing-due-reminders":{"type":"http","url":"https://mcp.zovo.one/mcp/recurring"}}}在 VS Code 中打开{"mcpServers":{"theluckystrike-recurring-invoice-scheduler-subscription-billing-due-reminders":{"type":"http","url":"https://mcp.zovo.one/mcp/recurring"}}}{"mcpServers":{"theluckystrike-recurring-invoice-scheduler-subscription-billing-due-reminders":{"serverUrl":"https://mcp.zovo.one/mcp/recurring"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
https://mcp.zovo.one/mcp/recurring需要授权工具
14| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| every | any | 是 | 开票频率:"weekly"、"monthly"、"quarterly"、"yearly" 或 {days: 10}。按月递增时保留开始日期的日号;若较短月份没有该日,则调整为该月最后一天。因此,若计划从 31 日开始,2 月会在 28 日或 29 日开票,3 月则恢复为 31 日。 |
| items | array | 是 | 每个周期开具的明细项目 |
| notes | string | 否 | 以纯文本形式显示在每张生成的发票总额下方 |
| client | string | 是 | 客户名称或 ID,与发票服务中的信息一致。未知名称会在首次生成发票时创建。 |
| currency | string | 否 | 默认为您的企业默认币种 |
| due_days | integer | 否 | 每张发票的付款期限天数,默认使用你的付款条款 |
| end_date | string | 否 | YYYY-MM-DD,含当天:恰好落在该日期的项目仍会生成 |
| tax_note | string | 否 | 说明此计划为何按相应方式计税,例如 'Reverse charge: VAT accounted for by the recipient, art. 196 Directive 2006/112/EC'。此内容会打印在此计划生成的每张发票总额下方,因此 0% 预付费也会在单据上注明原因,而不只是在聊天中说明。 |
| anchor_day | integer | 否 | 专业版:改为在每月此日开票,而不是使用开始日期的日号。31 表示每月最后一天。 |
| start_date | string | 是 | YYYY-MM-DD。首张发票在此日期开具;对于按周、月、季度或年递增的计划,此日期的日号将作为后续每个周期的开票日。 |
| end_of_month | boolean | 否 | 专业版:始终在每月最后一天开票 |
| auto_generate | boolean | 否 | 将计划标记为供 monthly_billing_run 提示词使用。默认为 false。无论如何都不会在后台运行:只有调用 invoice_generate_due 时才会创建发票。 |
详细介绍
mcp-recurring
只需说一次“每月 1 日以 90 EUR 的单价向 Acme 开具 12 小时的账单”,之后就不用再记着这件事了。此 MCP 服务会存储定期发票计划、客户、明细项、周期以及开始和结束日期;然后在你提出请求时,将实际到期的发票作为真实记录写入 invoice server,使用其中的编号序列、客户资料和 A4 PDF。生成操作具有幂等性:每个计划在每个周期最多生成一张发票,并以发生日期作为键,因此同一天运行两次账单处理,第二次不会创建任何内容。它还能回答“未来 30 天有哪些款项到期”和“未来一年每个月我会开具多少发票”等问题。所有内容都以纯 JSON 文件的形式存储在你自己的设备上,不会上传到任何地方。
已收录于 官方 MCP Registry(io.github.theluckystrike/recurring-invoice-scheduler-subscription-billing-due-reminders)。

只需定义一次重复发票,即可通过聊天生成到期的 PDF,无需账单 SaaS。
60 秒安装
@theluckystrike/mcp-recurring 的 npm 发布尚待完成。在此之前,可使用 .mcpb 一键安装包,或克隆后构建;
以下两种方式均已验证。
一键安装(.mcpb):从最新版本下载 recurring.mcpb,然后在 Claude Desktop 中双击:
https://github.com/theluckystrike/mcp-servers/releases/latest
(claude_desktop_config.json):
{
"mcpServers": {
"recurring": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-recurring"]
}
}
}
Claude Code:
claude mcp add recurring -- npx -y @theluckystrike/mcp-recurring
(.cursor/mcp.json):
{
"mcpServers": {
"recurring": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-recurring"]
}
}
}
上面的 npx 方式将在软件包发布后立即可用。在此之前,请使用上面的 .mcpb 安装包,或通过以下三条命令从源代码构建:
git clone https://github.com/theluckystrike/mcp-servers.git && cd mcp-servers
npm install
npm run build -w packages/mcp-license -w servers/invoice -w servers/recurring
然后将客户端的 command 指向 node,并提供一个参数:servers/recurring/dist/index.js 的绝对路径。
若要在 Pro 模式下运行,请在同一配置块中设置 MCP_LICENSE_KEY,或使用你的密钥调用一次 license_activate。
搭配使用
- mcp-invoice,实际使用时必需,但代码层面并非必需。此服务会将数据写入发票服务的数据目录,并共用其编号计数器、客户列表和企业资料,因此每张生成的发票都会显示在
invoice_list中、计入overdue_report,并可使用invoice_pdf重新渲染。请在那里使用business_set设置一次开票方信息;此服务特意不提供自己的business_set,确保只需维护一份资料。 - mcp-time-tracker,用于处理不属于固定服务费的工时。跟踪工时,按需开具发票,并将每月固定部分交由此处的计划处理。
- mcp-expense-tracker,每月变动的可转收费成本应放在按需发票中;计划适用于金额固定不变的部分。
工具
| 工具 | 功能 |
|---|---|
schedule_create | 定义重复账单:客户、项目、频率、开始日期、可选结束日期、付款期限、备注 |
schedule_list | 列出所有计划及其频率、每期金额、下次到期日和状态 |
schedule_get | 查看单个计划的完整记录,以及已生成的账单数量 |
schedule_update | 更改客户、项目、货币、频率、日期、付款期限或备注。已开具账单的周期不会重新开票 |
schedule_pause | 停止生成账单,但不删除计划;保留历史记录 |
schedule_resume | 重新启用计划。暂停期间已到期的周期仍然需要开票 |
schedule_delete | 删除计划。该计划生成的账单仍保留在账单服务中,并保留历史记录作为审计追踪。重新创建的计划会获得新 ID,因此当 invoice_generate_due 再次覆盖旧计划已开票的周期时,会发出警告 |
schedule_skip | 永久跳过某一次周期,不暂停计划——适用于“10 月不要向这位客户开票”。设置 undo: true 可恢复该周期 |
schedule_upcoming | 查看未来 N 天内到期的项目、金额和各货币合计,以及已经到期但尚未开票的周期。免费版覆盖 30 天 |
invoice_generate_due | 按指定日期生成到期账单并渲染 PDF。以周期为键,具备幂等性;会报告已创建和已跳过的账单。每次调用最多生成 60 张账单,按周期从早到晚处理,并告知仍有多少张待处理。dry_run 可预览运行结果。免费且不限量 |
schedule_history | Pro:查看单个计划的审计日志——每个周期、账单编号、日期、金额、付款状态和 PDF 路径 |
forecast | 按日历月和货币预测收入,并单独列出暂停的计划,而非将其排除。免费版覆盖 3 个月 |
license_status | 显示免费版或 Pro 模式 |
license_activate | 激活 Pro 密钥(离线验证) |
资源:recurring://upcoming 以 JSON 格式返回未来 30 天内的周期。
提示词:monthly_billing_run,先试运行,再生成账单、列出即将到期的项目,然后报告哪些客户需要付款提醒。
你可以这样说
| 你说 | 工具 |
|---|---|
| “每月 1 日起,每小时 90 EUR,向 Acme 开 12 小时的账单。” | schedule_create |
| “我有哪些重复账单?” | schedule_list |
| “未来 30 天内有哪些账单到期?” | schedule_upcoming |
| “处理本月账单。” | monthly_billing_run / invoice_generate_due |
| “创建之前,先给我看看将会生成哪些账单。” | invoice_generate_due {dry_run: true} |
| “暂停 Beta Corp 的长期服务合同,他们暂时搁置了。” | schedule_pause |
| “10 月不要向 Acme 开账单。” | schedule_skip |
| “从现在起,将 Acme 的长期服务合同费率提高到每小时 100 EUR。” | schedule_update |
| “明年我每月会开出多少账单?” | forecast |
| “列出这份长期服务合同生成的所有账单。” | schedule_history |
示例
You: Bill Acme 12 hours at 90 EUR a month, starting 1 June, 14 day terms.
schedule_create {
client: "Acme Retainer", currency: "EUR", every: "monthly",
start_date: "2026-06-01", due_days: 14,
items: [{ description: "Retainer hours", quantity: 12, unit_price: 90 }]
}
-> schedule 9f2c1a04, next dates 2026-06-01, 2026-07-01, 2026-08-01, 2026-09-01
You (on 3 September): Run the billing.
invoice_generate_due {}
-> as_of 2026-09-03: created 4 invoices, skipped 0 already invoiced.
INV-2026-0001 Acme Retainer period 2026-06-01 EUR 1080.00 due 2026-06-15 .../pdf/INV-2026-0001.pdf
INV-2026-0002 Acme Retainer period 2026-07-01 EUR 1080.00 due 2026-07-15 .../pdf/INV-2026-0002.pdf
INV-2026-0003 Acme Retainer period 2026-08-01 EUR 1080.00 due 2026-08-15 .../pdf/INV-2026-0003.pdf
INV-2026-0004 Acme Retainer period 2026-09-01 EUR 1080.00 due 2026-09-15 .../pdf/INV-2026-0004.pdf
Total: EUR 4320.00
You (five minutes later, having forgotten): Run the billing.
invoice_generate_due {}
-> as_of 2026-09-03: created 0 invoices, skipped 4 already invoiced.
第二次运行最能说明问题:关键在于周期,而不是日历日期,因此重复运行账单流程不会产生任何操作,也不会在客户收件箱中造成重复账单。
免费版与 Pro
| 免费版 | Pro | |
|---|---|---|
| 活跃计划 | 3 | 不限量 |
invoice_generate_due | 是,不限量 | 是,不限量 |
schedule_upcoming 时间范围 | 30 天 | 最长 10 年 |
forecast | 3 个月 | 最长 120 个月 |
schedule_history 审计日志 | 否 | 是 |
月末和锚定日规则(anchor_day、end_of_month) | 否,按开始日期的日号开票 | 是 |
| 暂停、恢复、更新、删除、试运行、多币种 | 是 | 是 |
Pro 一次性付费 $19;支付 $39 可用于合集中的每个服务,终身有效。
日期:月末会发生什么
每个日期都是本地 ISO 日历日期,格式为 YYYY-MM-DD。一次发生是从 start_date 开始的第 k 步,发生次数 0 就是 start_date 本身,因此,从今天开始的计划今天就到期。
weekly= 每步 +7 天。{days: n}= 每步 +n 天。monthly= +1 个月,quarterly= +3 个月,yearly= +12 个月。- 月末。 月份步进会保留
start_date的月中日期,并将其限制在目标月份的天数范围内;这个限制不会延续到后续月份。从2026-01-31开始的序列依次为 01-31、02-28、03-31、04-30、05-31;二月不会悄悄把月末周期付款变成每月 28 日付款。 - 2 月 29 日。 同一规则意味着,以
2028-02-29开始的年度计划在平年会落在 02-28,并在下一个闰年回到 02-29。 anchor_day/end_of_month(Pro)。anchor_day会在限制日期前替换月中日期,因此anchor_day: 31表示每月最后一天;end_of_month: true也会明确执行相同操作。对于weekly和{days: n},由于没有可供锚定的月份,两者均会被忽略。如果锚定后的首次发生日期早于start_date,则会舍弃该次发生,绝不会提前扣款。end_date包含在内。 恰好落在end_date的发生会生成;下一次则不会。- 长期计划。 查询到期项目时,不会从
start_date重新回放整个计划:系统会跳转到接近所查询日期的估算位置,再从那里向前扫描。因此,2010 年创建的每日计划在 2026 年仍能报告到期项目,而不会逐日遍历到该日期,耗尽每次运行的发生次数上限。
金额
发票引擎会以整数最小货币单位保存金额,使用相同的 ISO 4217 表,并遵循相同的“逐行舍入后再求和”约定,因此,计划金额与其生成的发票绝不会不一致。每一行的总额会先行舍入,税额按行计算并舍入,再按税率合并为一行;总计则是这些已舍入数值的整数之和。计划使用自身的 currency,如果未设置,则使用你的企业默认货币;此处不会进行货币兑换。
数据存储方式
计划和生成日志保存在
${XDG_DATA_HOME:-~/.local/share}/mcp-servers/recurring/ 中,文件名为 schedules.json 和 history.json。它们
保存在发票服务的目录 ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/invoice/ 中,
PDF 文件则放在其 pdf/ 子目录下;invoice_list、overdue_report 和
invoice_pdf 会读取这些相同的文件。
每次修改都会在咨询锁文件保护下执行。任何会写入发票的操作都会获取两个锁,且始终按相同顺序获取:先获取 recurring/.lock,再获取 invoice/.lock,这样,两次账单生成操作(或一次账单生成操作与另一个服务中的手动发票操作)就不会交错执行、分配相同的发票编号,也不会造成死锁。发票编号会在锁定期间分配;PDF 则在释放锁后生成,因此生成缓慢也不会阻塞编号计数器。保存时会先写入临时文件,再重命名到目标位置。
如果 schedules.json 或 history.json 无法读取或不是有效的 JSON,系统绝不会将其视为“空”:文件会逐字节移至旁边,命名为 <name>.json.corrupt-<timestamp>;同时会写入 <name>.json.corrupt 标记。在恢复有效副本并删除该标记之前,所有工具都会明确报错。这里尤其需要注意这一点:如果 history.json 被静默地读作空文件,计划涵盖过的所有周期都会再次扣款。
限制与如实说明
- 不会有任何内容在后台运行。 这是一个 stdio MCP 服务:它仅在客户端运行它时存在。没有守护进程、没有 cron、没有电子邮件。只有在你(或
monthly_billing_run提示词)调用invoice_generate_due时,才会创建发票。auto_generate是供该提示词使用的标记,不是调度器。 - 不会向客户端发送任何内容。 服务会生成发票记录和 PDF;发送发票和催款仍需由你处理。发票服务中的
overdue_report会告诉你需要催收哪些款项。 - 免费套餐允许 3 个有效日程。暂停一个日程即可腾出名额;暂停日程的历史记录会保留。
- 删除日程会保留其历史记录,这是有意为之:使用相同 id 重新创建的日程无法对同一期间重复收费。这里的任何操作都不会触碰已生成的发票。
schedule_update只会更改未来期间。已经开具发票的期间仍保留已收取的金额;如需更正,请在发票服务中操作。- 不按比例计费,也不为期间中途取消提供抵扣:一个期间要么全额计费,要么不计费。
- 不进行货币转换;一个日程只能使用一种货币计费。
故障排除
npx卡住或找不到软件包:此软件包仍在等待发布到 npm。在发布完成前,请使用.mcpb捆绑包或上文的克隆并构建方式。- 使用克隆方式:先构建
servers/invoice,再构建servers/recurring,因为后者会从前者导入引擎。npm run build -w packages/mcp-license -w servers/invoice -w servers/recurring会按此顺序执行。 - “尚无业务资料”:请在发票服务(mcp-invoice)中运行
business_set,而不是在此处运行。生成操作不会因此受阻;PDF 只会使用占位发行方名称“Your business”。 - 发票不在我的发票服务中:两个服务必须使用相同的
XDG_DATA_HOME。它们会在该目录下的.../mcp-servers/invoice/中写入数据;如果一个客户端设置了该变量,而另一个没有设置,你就会有两个数据存储。 - 某个期间被跳过了:
invoice_generate_due只会跳过history.json中已有记录的期间。schedule_history(Pro)或该文件会准确显示对应期间由哪张发票覆盖。 - Node 版本:需要 Node >= 18。使用
node -v检查。
隐私
所有数据都保存在本地:日程、生成日志、发票和 PDF 都是你自己的主目录下的普通文件。该服务完全不会进行网络调用,许可证密钥也会离线验证。
由 theluckystrike 构建。MIT。支持邮箱:[email protected]
整个套件共用一份业务资料
你的身份信息只存储一次,路径为 ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/profile/business.json,套件中的每个服务都会读取它:发票发行方、docx 信头、周期性发行方、expense-tracker 的默认 VAT 税率、time-tracker 和 timezone 的主时区,以及简历和合同信头。使用 business_set(invoice 或 docx)设置一次即可,无需在其他地方重复设置。电子邮件地址只会取自该资料或明确提供的参数;如果资料中没有存储电子邮件地址,文档会显示 [add: email],工具也会明确说明,而不会让任何人自行编造地址。
将这些文档用作 MCP 服务
任何 MCP 客户端(Claude、Cursor、Windsurf、VS Code)都可以通过 GitMCP 直接读取此仓库的文档,无需安装:
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。