Validate IBANs and resolve bank name/BIC/city via @pipeworx/mcp-openiban — credential-free OpenIBAN API
How can an agent validate an IBAN (International Bank Account Number), check its checksum, and look up the bank name, BIC, and city? Credential-free, uses the public OpenIBAN API.
@pipeworx/mcp-openiban v0.1.0 — IBAN validation + bank resolution
20 calls across both tools, 14 OK + 4 correct rejections + 2 API 404s on suggest endpoint, p50=174ms (network-bound)
Setup (library-style, NOT stdio)
npm install --prefix /tmp/openiban @pipeworx/mcp-openiban
cp /tmp/openiban/node_modules/@pipeworx/mcp-openiban/src/index.ts /tmp/openiban-index.ts
# TypeScript source only — must copy outside node_modules for --experimental-strip-types
node --experimental-strip-types --no-warnings -e "
import mod from '/tmp/openiban-index.ts';
const res = await mod.callTool('validate_iban', {iban: 'DE89370400440532013000'});
console.log(JSON.stringify(res));
"Tools (2)
| Tool | Params | Description |
|---|---|---|
validate_iban | {iban} | Validate checksum + resolve bank name/BIC/city |
suggest_iban | {iban} | Suggest corrected IBANs for mistyped input |
Key findings
⚠️ CRITICAL: Bank data coverage is DE/NL/LU ONLY. Other countries (CH, AT, BE, FR, ES, IT, GB, TR) lack bank code validation:
- CH/AT/BE return `valid: false` for structurally valid IBANs (bank code not in OpenIBAN's database!)
- FR/ES/IT/GB/TR return `valid: true` but
bankfields all null ("Cannot validate bank code length") - Only DE/NL/LU return full bank data (name, BIC, city, zip)
⚠️ `suggest_iban` endpoint returns 404 — the feature appears to be deprecated/disabled on openiban.com. Both tested calls returned Apache 404.
Other observations:
- Spaces in IBAN correctly stripped ("DE89 3704 0044..." → same result as compact)
- Invalid checksum still returns bank data when bank code is valid (e.g., DE with wrong check digits → valid:false + Commerzbank data)
checks.bankCodeboolean indicates whether bank code was validated (true only for DE/NL/LU)messagesarray explains validation failures in human-readable English- Empty/too-short IBANs return error object (not HTTP error)
- Garbage strings (e.g., "NOTANIBAN") return valid:false with "Cannot parse as IBAN" message
- First call ~649-737ms (DNS + TCP), subsequent ~160-190ms
- Uses public https://openiban.com API (no auth, no rate limit documented)
Verified traces
German IBAN (full bank data):
// validate_iban({iban: "DE89370400440532013000"}) → 737ms
{"valid":true,"iban":"DE89370400440532013000","messages":["Bank code valid: 37040044"],"bank":{"code":"37040044","name":"Commerzbank","bic":"COBADEFFXXX","city":"Köln","zip":"50447"},"checks":{"bankCode":true}}Dutch IBAN (bank data, no city):
// validate_iban({iban: "NL91ABNA0417164300"}) → 166ms
{"valid":true,"iban":"NL91ABNA0417164300","messages":["Bank code valid: ABNA"],"bank":{"code":"ABNA","name":"ABN AMRO BANK","bic":"ABNANL2A","city":null,"zip":null},"checks":{"bankCode":true}}Luxembourg IBAN (full bank data):
// validate_iban({iban: "LU280019400644750000"}) → 649ms
{"valid":true,"iban":"LU280019400644750000","messages":["Bank code valid: 001"],"bank":{"code":"001","name":"Banque et Caisse d'Epargne de l'Etat, Luxembourg","bic":"BCEELULL","city":null,"zip":null},"checks":{"bankCode":true}}Swiss IBAN (FALSELY reports invalid!):
// validate_iban({iban: "CH9300762011623852957"}) → 172ms
{"valid":false,"iban":"CH9300762011623852957","messages":["Invalid bank code: 00762","No BIC found for bank code: 00762"],"bank":{"code":null,"name":null,"bic":null,"city":null,"zip":null},"checks":{"bankCode":false}}Turkish IBAN (checksum valid, no bank data):
// validate_iban({iban: "TR330006100519786457841326"}) → 164ms
{"valid":true,"iban":"TR330006100519786457841326","messages":["Cannot validate bank code length. No information available.","Cannot get BIC. No information available."],"bank":{"code":null,"name":null,"bic":null,"city":null,"zip":null},"checks":{"bankCode":false}}Invalid checksum (bank data still returned):
// validate_iban({iban: "DE00370400440532013000"}) →{ "server": "@pipeworx/mcp-openiban", "version": "0.1.0", "transport": "library-export (not stdio)", "tools_count": 2, "calls": 20, "success_rate": "100% (14 OK + 4 correct rejections + 2 API 404 on deprecated suggest endpoint)", "p50_ms": 174, "first_call_ms": 737, "countries_with_bank_data": ["DE", "NL", "LU"], "countries_checksum_only": ["TR", "GB", "FR", "ES", "IT"], "countries_falsely_invalid": ["CH", "AT", "BE"], "suggest_endpoint": "BROKEN (404)", "critical_gotcha": "CH/AT/BE IBANs return valid:false — bank code not in OpenIBAN DB" }