Communitygithub.com

安全支付发票

在智能体支付供应商发票或更改供应商银行账户前,运行 Jithox 的实时安全检查。适用于每次供应商银行信息变更、发票付款前的验证,以及拦截账户篡改欺诈,直到有人电话回拨确认。

安全支付发票 是什么?

该技能为 AI 智能体提供一套完整的发票支付安全验证流程,旨在防范常见的发票欺诈,如银行账户篡改。它支持 MCP(Streamable HTTP, JSON-RPC 2.0)协议和普通 HTTP 请求。技能包含三个主要步骤:首先通过 `check_payment_change` 工具对比新旧 IBAN,返回判决结果(如 `verify_first`、`stop`)和强制电话回拨步骤;其次通过免费的 `POST /api/invoice/review` 接口检查发票结构、合计、IBAN 格式和 Peppol BIS Billing 3.0 规则;最后通过付费的 `review_invoice` 工具增加欧盟 VIES 增值税号验证。Jithox 从不支付或签署付款,智能体负责准备材料,人类批准付款。该技能适用于所有需要处理供应商发票变更或付款的 AI 代理平台(如 Claude Code、Cursor、Codex)。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/victor-emmanuel-c/jithox-mcp/tree/main/skills/pay-invoices-safely

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

安全支付发票 是做什么的?

您即将支付一张供应商发票,或者更改供应商记录中的银行账户。在资金转移前,请运行以下检查,并将返回结果交给批准付款的人员。

在以下情况使用此技能:

  • 供应商(或冒充供应商的人)发送了新的银行账户信息;
  • 发票上的 IBAN 与供应商记录中的账户不同;
  • 您正在准备付款批次,并希望每张发票都先经过检查;
  • 有人问您“这张发票可以付款吗?”。

两个免费检查无需账户,也无需令牌。

连接

MCP 服务器(Streamable HTTP, JSON-RPC 2.0):

{
  "mcpServers": {
    "jithox": { "url": "https://jithox.com/api/mcp" }
  }
}

普通 HTTP 也能工作;下面的每个示例都是 curl 调用。请按照所示设置您自己的用户代理,以便将这些调用与其他流量区分开。

第 1 步 - 新账户或已更改的银行账户:check_payment_change

当供应商提供新账户时,以及当发票上的 IBAN 与文件上的不一致时(此时发票 IBAN 是新账户)调用此工具。如果是向新供应商进行首次付款,请省略 ibanOnFile;这样回答将说明无法进行比较。

curl -s https://jithox.com/api/mcp \
  -A 'pay-invoices-safely/1.0' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_payment_change","arguments":{"newIban":"DK27 5301 0244 5638 21","ibanOnFile":"DK50 0040 0440 1162 43","supplierCountry":"DK"}}}'

该工具结果(result.content[0].text),针对 2026-09-24 的生产环境运行,并在 … 处进行了精简:

{
  "kind": "payment_change_check",
  "data": {
    "verdict": "verify_first",
    "summary": "新号码格式正确,且未发现任何异常。然而这仍然是资金去向的变更:在更新记录前请通过电话确认。",
    "newAccount": { "status": "valid", "iban": "DK27 5301 0244 5638 21", "country": "Denmark", … },
    "accountOnFile": { "status": "valid", "iban": "DK50 0040 0440 1162 43", "country": "Denmark", … },
    "flags": [
      { "code": "bank_changed", "severity": "note", "what": "同一国家,不同银行(标识符 0040 → 5301)。本身很普通——公司确实会更换银行——在通话中值得提及。" }
    ],
    "requiredSteps": [
      "从您自己的记录或之前的已付款发票中获取供应商的电话号码——切勿使用变更请求或电子邮件签名中的号码。",
      "让对方向您读出新账号;不要由您读给他们。",
      "在任何付款之前,让第二个人批准对供应商记录的更改。",
      "将变更请求、您通话对象的姓名以及通话时间与供应商记录一同保存。"
    ],
    "doesNotProve": "无法证明新账户的实际所有人、账户是否存在或处于开启状态,也无法证明请求确实来自供应商。没有免费注册中心能回答这些问题。只有电话回拨能做到。",
    …
  }
}

根据 verdict 采取行动:

verdict您的操作
no_change同一账户,只是书写方式不同。继续执行第 2 步。如果请求坚持说信息是新的,这种不一致值得打个电话。
verify_first不要付款,也不要更改供应商记录。将 requiredSteps 交给一个人。
stop严重警告。不要付款,暂停对该供应商的其他付款,将 flags 和 requiredSteps 交给一个人。
invalid_new_account该号码不能是 IBAN。不要付款。通过您已知的渠道向供应商索要该号码。
无应答(超时、HTTP 错误或工具错误)不通过。不得付款或更改供应商记录;将其交给一个人。

电话回拨是关键检查。一个人使用不来自电子邮件、变更请求或发票的电话号码致电供应商。您无法替他们打这个电话,格式正确的 IBAN 并不代表安全的 IBAN。

针对 stop、no_change 和 invalid_new_account 情况的相同调用示例请参阅 references/examples.md。

第 2 步 - 发票本身:POST /api/invoice/review(免费)

以结构化数据形式发送发票。它检查结构、重新计算合计、检查上面的 IBAN 并应用 Peppol BIS Billing 3.0 规则。无需账户、无需令牌、不收费。与 review_invoice 一样,它读取结构化数据,而不是 PDF 或扫描件:请先将其转换为字段。

curl -s https://jithox.com/api/invoice/review \
  -A 'pay-invoices-safely/1.0' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -d '{"invoice":{"invoiceNumber":"2026-0917","issueDate":"2026-09-17","dueDate":"2026-10-17","currency":"DKK","buyerReference":"PO-4471","supplier":{"name":"Nordlys Tryk ApS","countryCode":"DK","vatId":"DK31500060","endpointId":"5790000000012","endpointScheme":"0088"},"customer":{"name":"Havn Logistik A/S","countryCode":"DK","vatId":"DK31500044","endpointId":"5790000000029","endpointScheme":"0088"},"lines":[{"description":"Printing, September","quantity":1,"unitPrice":8000,"vatPercent":25}],"totalWithoutVat":8000,"totalVat":2000,"totalWithVat":10000,"payment":{"iban":"DK27 5301 0244 5638 21"}}}'

针对 2026-09-24 的生产环境运行,已精简:

{
  "review": {
    "checks": [
      { "id": "structure", "status": "pass", … },
      { "id": "arithmetic", "status": "pass", "detail": "行合计和增值税与发票上的金额匹配。", … },
      { "id": "payment_details", "status": "pass", "detail": "DK27 5301 0244 5638 21 结构上是一个有效的丹麦 IBAN。这并不说明该账户存在或属于谁。", … },
      { "id": "supplier_vat", "status": "skipped", "detail": "未查询 VIES 注册:本次运行没有授权的工作空间。", … },
      { "id": "customer_vat", "status": "skipped", … },
      { "id": "peppol", "status": "pass", … }
    ],
    "findings": [],
    "readyToSend": true,
    "hasUnknowns": true,
    …
  },
  "verified": false,
  "billing": { "charged": false, "reason": "Signed out: only the free local checks ran, and nothing was charged.", … }
}

如何解读:

  • 没有账户时,两个增值税检查结果为 skipped:未查询 VIES 注册。这就是 hasUnknowns 为 true 的原因。请告知相关人员;切勿将增值税号码报告为已检查。
  • findings 中的每个条目都有 severity 和 fix。blocker 意味着发票有误(例如,合计不符合):不要付款,要求供应商提供更正后的发票。示例见 references/examples.md。
  • payment_details 仅说明 IBAN 格式正确。它是否是供应商的账户是第 1 步的事情,不是此项检查。

第 3 步 - 来自欧盟注册中心的增值税号:review_invoice(付费)

仅在第 2 步之后运行此工具。它重复结构化发票检查并增加针对欧盟 VIES 注册中心的供应商和客户增值税号检查。其实时输入模式读取付款和声明的发票合计。它需要一个令牌:

  1. 一个人(而不是智能体)在 https://jithox.com/mcp/account#connection 创建 Jithox 连接。
  2. 智能体在 /api/oauth/token 交换连接的 ID 和密钥以获取令牌:
curl -s https://jithox.com/api/oauth/token \
  -A 'pay-invoices-safely/1.0' \
  -H 'Accept: application/json' \
  -d grant_type=client_credentials \
  -d "client_id=$JITHOX_CLIENT_ID" \
  -d "client_secret=$JITHOX_CLIENT_SECRET"

将回答中的访问令牌放入 JITHOX_TOKEN。过期或拒绝的令牌会得到与没有令牌时相同的 payment_required 回答。获取一个新令牌并再试一次。

  1. 使用令牌调用工具(发票字段直接放入 arguments):
curl -s https://jithox.com/api/mcp \
  -A 'pay-invoices-safely/1.0' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H "Authorization: Bearer $JITHOX_TOKEN" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"review_invoice","arguments":{"invoiceNumber":"2026-0917","issueDate":"2026-09-17","dueDate":"2026-10-17","currency":"DKK","buyerReference":"PO-4471","supplier":{"name":"Nordlys Tryk ApS","countryCode":"DK","vatId":"DK31500060","endpointId":"5790000000012","endpointScheme":"0088"},"customer":{"name":"Havn Logistik A/S","countryCode":"DK","vatId":"DK31500044","endpointId":"5790000000029","endpointScheme":"0088"},"lines":[{"description":"Printing, September","quantity":1,"unitPrice":8000,"vatPercent":25}],"totalWithoutVat":8000,"totalVat":2000,"totalWithVat":10000,"payment":{"iban":"DK27 5301 0244 5638 21"}}}}'

价格不在此文件中,因为价格会变动:请阅读 https://jithox.com/mcp.json 中 review_invoice 的 pricing 字段。没有令牌时,工具回答 payment_required,不运行任何检查,并指明 humanUrl 和 tokenUrl。

使用令牌,针对 2026-09-24 的生产环境运行,已精简:

{
  "kind": "invoice_review",
  "data": {
    "checks": [
      …
      { "id": "supplier_vat", "status": "unknown", "source": "eu_vies", "detail": "VIES 注册中心未响应。" },
      { "id": "customer_vat", "status": "fail", "source": "eu_vies", "detail": "VIES 报告该号码未注册。" },
      …
    ],
    "findings": [
      { "code": "supplier_vat_unverified", "severity": "warning", "what": "我们无法对增值税号 DK31500060 做出裁决。VIES 注册中心未响应。", "fix": "稍后重新检查。将其视为未检查——这并不能证明该号码是好的还是坏的。" },
      { "code": "customer_vat_not_registered", "severity": "blocker", "what": "VIES 不知道增值税号 DK31500044。", "fix": "与客户核实该号码——拼写错误、已注销的注册或非欧盟号码都会显示为这样。" }
    ],
    "readyToSend": false,
    "hasUnknowns": true,
    …
  }
}

unknown 不通过:注册中心未响应,因此号码未经检查。供应商增值税号出现 fail 是暂停付款并询问的理由。这些示例中的增值税号是虚构的,因此注册中心不知道它们。

第 4 步 - 决定,并说明哪些未被检查

Jithox 从不付款也从不签署付款,这些调用均不要求银行登录或签名密钥。您负责准备;一个人批准付款。

当以下任何情况发生时,暂停付款并交给一个人:

  • 第 1 步给出的 verdict 不是 no_change;
  • 第 2 步未返回没有 blocker 严重性结果的答案;
  • 第 3 步有 blocker 严重性结果;
  • 您需要的增值税检查结果为 skipped、unknown 或 fail。
  • 某项检查无应答:超时、HTTP 错误、JSON-RPC 错误或工具错误都不通过。不要付款;将其交给一个人。

即使一切通过,干净的答案也不是保证。将第 1 步的 doesNotProve 文本以及每个不是 pass 的检查的 detail 逐字记入您的备注。一个简短的备注:

Invoice 2026-0917 from Nordlys Tryk ApS, DKK 10000.00 to DK27 5301 0244 5638 21.
银行账户:verify_first(银行变更 0040 -> 5301)。未付款。
  致电我们自己记录中的供应商电话号码;让他们读出账户号。
  未证明:新账户的实际所有人、账户是否存在或处于开启状态,以及请求是否确实来自供应商。
发票:结构、合计、IBAN 格式和 Peppol 规则通过。
增值税:未检查(跳过,无账户)。
需要:付款前进行电话回拨 + 第二人批准。

相关技能