mcpField
Q
quotes-estimates-proposals-vat-win-rate

quotes-estimates-proposals-vat-win-rate

远程服务
mcp.zovo.one金融数据21 天前更新

关于 quotes-estimates-proposals-vat-win-rate

面向开票和报价流程的 MCP 服务,可创建、跟踪并统计含 VAT 的报价单,也能将已接受的报价单转为发票。数据保存在本地,转换时沿用报价单中的明细金额。

主要功能

  1. 01创建和修改编号报价单
  2. 02计算 VAT 和有效期
  3. 03导出邮件文本与 A4 PDF
  4. 04将已接受报价转为发票
  5. 05跟踪状态和成交率
  6. 06将记录存为本地 JSON 文件

适用场景

  1. 01制作含 VAT 和截止日期的报价单
  2. 02将客户接受的报价转为发票
  3. 03查看过期报价和成交情况
  4. 04以文本或 PDF 分享报价单

MCP 相关

向 MCP 客户端提供报价创建、查询、修改、导出、统计和接受等工具,以及未过期报价资源和跟进提示词。存在发票服务数据目录时,可将已接受报价写入发票服务。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://mcp.zovo.one/mcp/quotes
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

全部服务地址
Streamable HTTPhttps://mcp.zovo.one/mcp/quotes需要授权
安装包
mcpbquotes.mcpb0.22.5

工具

12
参数类型必填说明
itemsarray是报价单的行项目
notesstring否打印在总额下方的自由文本,例如工作范围或除外事项。最多 10000 个字符
clientstring是客户名称或 ID。发票服务已知的客户名称会自动将其地址、电子邮件和 VAT ID 添加到报价单
currencystring否默认为您的企业默认币种
tax_ratenumber否适用于未单独指定税率的商品行的 VAT 百分比。默认为企业默认值
issue_datestring否YYYY-MM-DD,默认为您企业资料时区中的当天日期
valid_untilstring否YYYY-MM-DD,明确指定的最后有效日期。优先于 validity_days
client_emailstring否仅在用户提供时使用;否则使用已存储的客户电子邮件
client_vat_idstring否客户 VAT/税务登记 ID
validity_daysinteger否报价单有效天数,从报价日期起计算,含首尾日期。默认为 30
client_addressstring否用于 QUOTE FOR 区块的邮寄地址,可包含换行符
discount_percentnumber否应用于每一商品行的折扣百分比

详细介绍

mcp-quotes

说“为 Acme 报价:12 小时,90 EUR,另加 300 EUR 设置费,23% VAT,有效期 14 天”,即可获得一份今天就能发送的编号报价单:包含按税率列出的 VAT 表格、以整数最小货币单位表示的总额、按你所在时区计算的有效期截止日期、可直接粘贴到电子邮件中的纯文本版本;Pro 版还提供与你的发票相同的 A4 PDF 版式。客户同意后,quote_accept 会在 mcp-invoice 存储库中将其转换为正式发票,使用相同的客户列表和编号序列,并沿用报价单中的数字,而非重新计算。所有数据都以纯 JSON 文件形式存储在你自己的计算机上;不会上传到任何地方。

已列入 官方 MCP Registry(io.github.theluckystrike/quotes-estimates-proposals-vat-win-rate)。

已收录于 AI Product Index - 提供在线远程端点 mcp.zovo.one/s/quotes,免费套餐,无需注册。

quotes demo

在聊天中发送一份价格明确且 VAT 计算准确的报价单,只需一次调用,即可将客户的同意转为发票。

60 秒安装

@theluckystrike/mcp-quotes 的 npm 发布尚未完成。在此之前,可通过 .mcpb 一键安装包或克隆并构建来运行。

一键安装(.mcpb):从最新版本下载 quotes.mcpb,然后在 Claude Desktop 中双击: https://github.com/theluckystrike/mcp-servers/releases/latest

(claude_desktop_config.json):

{
  "mcpServers": {
    "quotes": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-quotes"]
    }
  }
}

Claude Code:

claude mcp add quotes -- npx -y @theluckystrike/mcp-quotes

(.cursor/mcp.json):使用与 Claude Desktop 相同的条目。

从源代码安装:

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/quotes

请先构建 servers/invoice:货币、VAT、客户和编号引擎均从中导入。然后将客户端的 command 指向 node,并传入一个参数,即 servers/quotes/dist/index.js 的绝对路径。

要在 Pro 模式下运行,请在同一配置块中设置 MCP_LICENSE_KEY,或使用你的密钥调用一次 license_activate。

工具

工具功能
quote_create为客户创建报价:包含数量和以最小货币单位表示的单价的明细项、每项 VAT 或业务默认税率、可选折扣和有效期。分配 Q-YYYY-NNNN 编号
quote_list列出所有报价及其客户、总额、有效期和状态:未结、已过期、已接受或已拒绝。可按状态、客户或报价日期筛选
quote_get获取单份报价的完整存储记录,包括其转换成的发票
quote_update修改仍处于未结状态的报价。总额会重新计算;已接受或已拒绝的报价不会被编辑
quote_send_text生成纯文本报价单,包含对齐的明细表、VAT 行、总额和有效期截止日期,可直接粘贴到电子邮件中。免费
quote_accept将报价标记为已接受并转换为发票:如果发票服务存在,则直接在其中创建;否则返回可供 invoice_create 使用的明细项
quote_decline将报价标记为未中标并记录原因,使其不再计入未结报价,并纳入成交率统计
quote_delete删除尚未被任何人查看的报价草稿,并恢复其占用的未结报价名额。如果报价已发送、接受、开票或导出,则拒绝删除,并指出依赖该报价的对象。免费
quote_pdf生成 A4 PDF 并返回路径。Pro
quote_report按货币统计未结、已接受、已拒绝和已过期报价的总额、仍未结报价的金额以及成交率。当前日历年截至目前免费
license_status显示免费版或 Pro 模式
license_activate激活 Pro 密钥(离线验证)

资源:quotes://open 以 JSON 格式返回所有仍在有效期内的报价。

提示词:quote_followup 会检查未结、即将过期和已过期的报价,然后起草催办内容。

你可以这样说

你说工具
“为 Acme 报价:12 小时,90 EUR,另加 300 EUR 的设置费、23% VAT,有效期 14 天。”quote_create
“把这些内容整理成一封我可以发送的邮件。”quote_send_text
“把 Q-2026-0003 改为 20 小时,并再给他们两周时间。”quote_update
“Acme 同意了。开票吧。”quote_accept
“Beta 选择了报价更低的人。”quote_decline
“我不小心给 Acme 报了两次价,删掉第二份。”quote_delete
“还有哪些报价未结?我的成交率是多少?”quote_report
“哪些报价已经过期且没有收到回复?”使用 state: "expired" 的 quote_list

操作示例

You: Quote Acme for 12 hours of API work at 90 EUR plus a 300 EUR setup fee,
23% VAT, good for 14 days.

  quote_create {
    client: "Acme", currency: "EUR", validity_days: 14,
    items: [
      { description: "API work",  quantity: 12, unit_price_minor: 9000,  tax_rate: 23 },
      { description: "Setup fee", quantity: 1,  unit_price_minor: 30000, tax_rate: 23 }
    ]
  }
  -> Q-2026-0001, valid until 2026-09-18

Assistant:
  API work    12  x  EUR 90.00   =  EUR 1080.00
  Setup fee    1  x  EUR 300.00  =  EUR 300.00
  Subtotal                          EUR 1380.00
  VAT 23% on EUR 1380.00             EUR 317.40
  TOTAL                              EUR 1697.40
  Valid until 2026-09-18.

You: They said yes.

  quote_accept { id: "Q-2026-0001" }
  -> accepted, invoice INV-2026-0004, due 2026-09-18, total EUR 1697.40

价格以最小货币单位录入:9000 表示 90.00 EUR,150000 表示 150,000 JPY。输入中不会出现小数,因此价格绝不会小十倍。

免费版与 Pro

免费版Pro
未结报价同时 5 份不限
quote_send_text(可直接用于邮件的文本)是,不限量是,不限量
接受、拒绝、修改、VAT、折扣、多币种是是
quote_delete(仅限草稿)和重复报价防护是是
quote_pdf否是
quote_report(销售管道和成交率)本日历年至今任意日期范围
PDF 品牌标识不适用无页脚署名,并可添加你的徽标

限额统计仍处于 OPEN 状态的报价。接受、拒绝或任由报价过期都会释放名额,因此,及时处理报价的自由职业者不会触及限额。还有两项免费功能可避免浪费名额:quote_create 会拒绝与已有未结报价完全相同的报价,并告知你已有哪份报价;quote_delete 会删除无人看过的草稿,并立即释放名额。

Pro 一次性付费 19 美元;如果要为集合中的每个服务启用,则为 39 美元,终身有效。

一项实测:为什么接受报价时会复制内容,而不是重新计算

quote_accept 会根据报价中存储的明细创建发票。显而易见的另一种做法是在接受时根据价格重新计算总额,但实测后我们否决了这种做法,因为重新计算所用的 VAT 税率会取自共享业务资料中的当前税率,而不是客户收到报价时的税率。

实测(test/adversarial.test.mjs,“报价发出后、接受之前更改 VAT 税率,不会改变已商定的总额”):一份未税金额为 1,000.00 EUR 的报价按资料中的默认税率 23% 发出,因此客户收到的报价为 1,230.00 EUR。在客户回复前,default_tax_rate 被改为 8%——可能是税率变更、新的客户类别,也可能是修正了设置。如果重新计算,开出的发票会比双方同意的文件少 150.00 EUR;而且仅凭这份报价和发票记录,无法说明两者为何不同。复制存储的明细则会开出 1,230.00 EUR 的发票,并且断言 tax_lines[0].rate === 23 成立。

同一原则也解释了为什么报价使用最小货币单位录入价格并拒绝小数:报价上的数字和发票上的数字始终是同一个整数。

数字、金额和日期

报价单 ID 的格式为 Q-YYYY-NNNN。计数器按年份分别计数,并在报价单存储前写入,因此即使发生崩溃,也只会损失一个 ID,而不会重复使用。系统还会扫描现有 ID,因此恢复 quotes.json 后,也绝不会返回已出现在客户见过的文档中的 ID。年份是 ID 的一部分,这是有意为之:每年一月重置的 Q-0001 会与去年一月的报价单冲突。

金额从头到尾都以整数最小货币单位表示,每个货币单位包含多少个最小单位,取自 mcp-invoice 中的 ISO 4217 表:大多数货币为 2,JPY、KRW、ISK 等为 0,KWD 和海湾第纳尔为 3,CLF 和 UYW 为 4。这里不会重复维护货币表、增值税计算或金额格式化逻辑:computeTotals、currencyDecimals 和 formatMoney 均从 @theluckystrike/mcp-invoice/lib 导入,因此报价单转换成发票后,会按行计算再求和,舍入结果完全一致。一份报价单只能使用一种货币;如果各行货币不一致,系统会拒绝,而不会按第一行的货币单位将它们相加。

日期采用 ISO 格式 YYYY-MM-DD。“今天”(也就决定了报价单是否过期)根据共享业务资料中设置的 timezone 计算,而不是使用主机的时区:否则,如果笔记本电脑仍处于美国时间,而报价单是在华沙时间凌晨 00:30 开具的,日期就会被记为前一天,并提前一天过期。

数据存储方式

报价单和 ID 计数器存储在 ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/quotes/ 下,文件分别为 quotes.json 和 counter.json,另有一个 pdf/ 子文件夹用于存放生成的文件。quote_accept 创建的发票会写入发票服务的目录 .../mcp-servers/invoice/,因此在那里调用 invoice_list 就能看到这些发票;它们与发票共用同一组编号和客户列表。

每次会修改数据的调用都会在 .../quotes/.lock 咨询式锁目录下执行。任何会写入发票的操作也会获取 .../invoice/.lock,并始终按相同顺序加锁(先报价单,后发票)。servers/recurring 也采用这一顺序,因此两个进程不会陷入死锁。保存时会先写入每个进程各自的临时文件,再将其重命名到目标位置。实测:两个进程在同一个数据目录中创建 40 份报价单后,会留下 40 份报价单和 40 个唯一 ID(test/concurrency.test.mjs)。

如果存储文件不是有效的 JSON,系统绝不会将其视为“没有报价单”。该文件会被原样移至 quotes.json.corrupt-<timestamp>,并在旁边写入一个 .corrupt 标记文件。在人工解决问题之前,之后的每次调用(包括读取)都会失败,并提示 restore a good copy ... then delete the marker。

限制和注意事项

  • 免费版最多可同时保留 5 份未结报价单。免费版不限制文本导出、接受、拒绝和修改;管道报告免费提供当前日历年至今的数据;PDF 和更长的报告范围则属于 Pro。
  • 接受报价单时,会通过共享引擎创建发票,因此发票服务自身每个日历月最多 3 份发票的免费版上限不会应用于此操作。此处适用的是报价单上限,响应中也会说明这一点。
  • quote_accept 会拒绝已过期的报价单,除非你延长有效期(quote_update {valid_until})或设置 allow_expired: true。这是有意设置的限制:过期的价格应重新确认。
  • 不会发送电子邮件。quote_send_text 会提供文本,quote_pdf 会提供文件;由你自行发送给客户。
  • 不进行货币转换。报价单的货币在创建时即固定,所有行都必须使用该货币。
  • 接受操作不可撤销。没有取消接受的功能,因为创建的发票是带有编号的正式文档;如需取消,请在发票服务中取消该发票。

隐私

所有数据都保留在本地:以纯 JSON 文件的形式存储在你自己的数据目录中。不需要账号、API 密钥,也不会进行任何网络调用。许可证密钥会在离线状态下验证。

由 theluckystrike 构建。支持邮箱:[email protected]

将这些文档用作 MCP 服务

任何 MCP 客户端(Claude、Cursor、Windsurf、VS Code)都可以通过 GitMCP 直接读取此仓库的文档,无需安装:

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。