Communitygithub.com

安全支付發票

使用 Jithox 的即時檢查,在 AI 代理支付供應商發票或變更供應商銀行帳戶前,安全地驗證付款資訊。

安全支付發票 是什麼?

這項技能旨在防止發票詐騙,特別是針對供應商銀行帳戶變更的「帳戶轉移詐騙」。當代理收到新的 IBAN(例如來自電子郵件或發票上與記錄不符的帳戶)時,必須先執行此技能。技能分為四個步驟:首先,使用 `check_payment_change` 工具比對新舊 IBAN,並提供「回撥供應商」的具體步驟作為安全驗證;其次,透過免費的 `POST /api/invoice/review` API 檢查發票結構、金額計算、IBAN 格式及 Peppol BIS Billing 3.0 規則;第三,付費的 `review_invoice` 工具會重複上述檢查並加入歐盟 VIES 的增值稅號查驗;最後,代理必須根據各項檢查的 verdict(判定結果)決定是否放行付款,並記錄所有未通過的檢查。此技能支援 MCP(Streamable HTTP)和普通 HTTP 呼叫,Jithox 本身不會執行任何付款,最終決策權始終保留給人類。

相容平台~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 呼叫。請按所示設定您自己的 User-Agent,以便將這些呼叫與其他流量區分開來。

步驟 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 不代表它是安全的帳戶。

針對 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": "未登入:僅執行了免費的本地檢查,未收取任何費用。", … }
}

如何解讀:

  • 若無帳戶,兩項增值稅檢查會顯示 skipped:未查詢 VIES 註冊庫。這就是 hasUnknowns 為 true 的原因。請向負責人說明;切勿回報增值稅號碼已通過檢查。
  • findings 中的每個項目都有 severity 和 fix。blocker 表示發票有誤(例如,總額不符):請勿付款,並要求供應商提供更正後的發票。範例請參閱 references/examples.md。
  • payment_details 僅表示 IBAN 格式正確。該 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 的 findings 的答案;
  • 步驟 3 有嚴重度為 blocker 的 finding;
  • 您需要的增值稅檢查結果為 skipped、unknown 或 fail。
  • 某項檢查沒有回應:超時、HTTP 錯誤、JSON-RPC 錯誤或工具錯誤都不能視為通過。不要付款;將情況交給一個人處理。

即使所有檢查都通過,一個乾淨的答案也並非保證。請將步驟 1 的 doesNotProve 文字以及每個狀態不是 pass 的檢查的 detail,逐字放入您的備註中。一個簡短的備註範例:

發票 2026-0917,來自 Nordlys Tryk ApS,DKK 10000.00,收款帳戶 DK27 5301 0244 5638 21。
銀行帳戶:verify_first(銀行變更 0040 -> 5301)。尚未付款。
  使用我們自己記錄中的號碼致電供應商;請對方將帳號讀回來。
  未經證明:新帳戶的所有權人、帳戶是否存在或是否啟用,以及請求是否確實來自供應商。
發票:結構、總額、IBAN 格式和 Peppol 規則通過。
增值稅:未檢查(已跳過,無帳戶)。
需要:回撥電話 + 第二個核准人,然後才能付款。

相關技能