송장 결제를 안전하게 하기
지금 공급업체 송장을 결제하려 하거나, 공급업체 레코드의 은행 계좌를 변경하려고 합니다. 돈이 이동하기 전에 아래 검사를 실행하고, 그 결과를 결제 승인자에게 전달하십시오.
다음 상황에서 이 스킬을 사용하십시오:
- 공급업체(또는 공급업체를 사칭하는 사람)가 새로운 은행 정보를 보낼 때;
- 송장의 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"}}}'
2026-09-24 프로덕션 환경에서 실행한 도구 결과 (result.content[0].text)이며, …은 축약된 부분입니다:
{
"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": "라인 합계와 VAT가 송장 금액과 일치합니다.", … },
{ "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": "로그아웃 상태: 무료 로컬 검사만 실행되었으며 요금이 부과되지 않았습니다.", … }
}
결과 해석 방법:
- 계정이 없으면 두 VAT 검사는
skipped됩니다. VIES 레지스트리가 조회되지 않았기 때문입니다. 이것이hasUnknowns가 true인 이유입니다. 이 사실을 사람에게 알리십시오. VAT 번호가 확인되었다고 보고하지 마십시오. findings의 모든 항목에는severity와fix가 있습니다.blocker는 송장에 오류가 있음을 의미합니다(예: 합계가 맞지 않는 경우). 결제하지 말고 공급업체에 수정된 송장을 요청하십시오. 예시는 references/examples.md에 있습니다.payment_details는 IBAN 형식만 확인합니다. 해당 계좌가 공급업체의 계좌인지 여부는 1단계의 문제이며 이 검사의 대상이 아닙니다.
3단계 - EU 등록부의 VAT 번호: review_invoice (유료)
이 단계는 2단계 이후에만 실행하십시오. 구조화된 송장 검사를 반복하고 EU VIES 등록부에 대해 공급업체 및 고객의 VAT 번호 확인을 추가합니다. 이 도구의 실시간 입력 스키마는 결제 정보와 송장 합계를 읽습니다. 토큰이 필요합니다:
- 사람(에이전트가 아님)이 https://jithox.com/mcp/account#connection 에서 Jithox 연결을 생성합니다.
- 에이전트는 연결의 id와 secret을 /api/oauth/token에서 토큰으로 교환합니다:
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"
응답의 access_token을 JITHOX_TOKEN에 저장하십시오. 만료되거나 거부된 토큰은 토큰이 없는 경우와 동일한 payment_required 응답을 받습니다. 새 토큰을 하나 가져와서 한 번 더 시도하십시오.
- 토큰을 사용하여 도구를 호출하십시오 (송장 필드는
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": "VAT 번호 DK31500060에 대한 판정에 도달할 수 없습니다. VIES 레지스트리가 응답하지 않았습니다.", "fix": "나중에 다시 검토하십시오. 확인되지 않은 것으로 처리하십시오 — 번호가 좋거나 나쁘다는 증거가 아닙니다." },
{ "code": "customer_vat_not_registered", "severity": "blocker", "what": "VIES가 VAT 번호 DK31500044를 알지 못합니다.", "fix": "고객에게 번호를 확인하십시오 — 오타, 폐쇄된 등록 또는 비EU 번호 모두 이렇게 표시될 수 있습니다." }
],
"readyToSend": false,
"hasUnknowns": true,
…
}
}
unknown은 통과가 아닙니다. 레지스트리가 응답하지 않았으므로 번호가 확인되지 않은 것입니다. 공급업체 VAT 번호에 대한 fail은 결제를 보류하고 문의해야 하는 이유입니다. 이 예제의 VAT 번호는 가상의 번호이므로 레지스트리가 이를 알지 못합니다.
4단계 - 결정하고, 확인되지 않은 사항을 명시하기
Jithox는 결제를 실행하거나 서명하지 않으며, 이러한 호출 중 어떤 것도 은행 로그인이나 서명 키를 요구하지 않습니다. 귀하(에이전트)가 준비하고, 사람이 결제를 승인합니다.
다음 중 하나라도 해당되면 결제를 보류하고 사람에게 전달하십시오:
- 1단계에서
no_change이외의verdict가 반환된 경우; - 2단계에서
blocker심각도의 findings 없이 응답이 반환되지 않은 경우; - 3단계에서
blocker심각도의 finding이 있는 경우; - 필요한 VAT 검사가
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.
Bank account: verify_first (bank changed 0040 -> 5301). NOT paid.
Call the supplier on the number in our own records; have them read the account back.
Not proven: who owns the new account, that it exists or is open, or that the request came from the supplier.
Invoice: structure, totals, IBAN format and Peppol rules pass.
VAT: not checked (skipped, no account).
Needs: call-back + second approver before payment.