Communitygithub.com

안전하게 송장 결제하기

AI 에이전트가 공급업체 송장을 결제하거나 공급업체의 은행 계좌를 변경하기 전에 Jithox의 실시간 검사를 실행합니다. 모든 공급업체 계좌 변경 시, 결제 실행 전 검증 시, 그리고 사기성 계좌 전환 결제를 보류할 때 사용하세요.

안전하게 송장 결제하기란 무엇인가요?

이 스킬은 AI 에이전트가 공급업체 송장을 결제하거나 공급업체의 은행 계좌를 변경하기 전에 Jithox의 실시간 검사를 수행하여 송장 사기(특히 계좌 전환 사기)를 방지하도록 설계되었습니다. `check_payment_change` 도구는 새 IBAN과 기존 계좌를 비교하고, `POST /api/invoice/review` (무료)는 송장 구조, 합계, IBAN 및 Peppol BIS Billing 3.0 규칙을 확인합니다. 유료 `review_invoice` 도구는 이러한 검사를 반복하고 EU VIES 등록부를 통해 공급업체 및 고객의 VAT 번호를 추가로 확인합니다. MCP(Streamable HTTP, JSON-RPC 2.0)와 일반 HTTP를 모두 지원하며, Claude Code, Cursor, Codex 등 모든 MCP 호환 에이전트에서 사용할 수 있습니다. 중요한 점은 Jithox는 결제를 실행하거나 서명하지 않으며, 에이전트가 검사를 준비하면 사람이 최종 결제를 승인합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/victor-emmanuel-c/jithox-mcp/tree/main/skills/pay-invoices-safely

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

송장 결제를 안전하게 하기

지금 공급업체 송장을 결제하려 하거나, 공급업체 레코드의 은행 계좌를 변경하려고 합니다. 돈이 이동하기 전에 아래 검사를 실행하고, 그 결과를 결제 승인자에게 전달하십시오.

다음 상황에서 이 스킬을 사용하십시오:

  • 공급업체(또는 공급업체를 사칭하는 사람)가 새로운 은행 정보를 보낼 때;
  • 송장의 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 번호 확인을 추가합니다. 이 도구의 실시간 입력 스키마는 결제 정보와 송장 합계를 읽습니다. 토큰이 필요합니다:

  1. 사람(에이전트가 아님)이 https://jithox.com/mcp/account#connection 에서 Jithox 연결을 생성합니다.
  2. 에이전트는 연결의 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 응답을 받습니다. 새 토큰을 하나 가져와서 한 번 더 시도하십시오.

  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": "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.

관련 스킬