Skip to main content
Glama

IBANforge

API Status MCP Registry npm ibanforge-mcp npm @ibanforge/sdk PyPI ibanforge Glama MCP x402 TypeScript License: MIT

The compliance API for AI agents. IBAN validation, BIC/SWIFT lookup, Swiss clearing (BC-Nummer / QR-IID / SIX BankMaster), EMI/vIBAN classification, SEPA Instant + VoP reachability, and risk scoring — exposed natively over MCP and x402 micropayments, with no API key signup required.

121k+ BIC entries (39k+ LEI via GLEIF) · 1,100+ Swiss BC-Nummern (SIX) · 89 IBAN countries · <50ms p99

For AI agents — install in one click

Claude Desktop / Cursor / Cline / Continue / Windsurf

Add to your MCP config (~/Library/Application Support/Claude/claude_desktop_config.json for Claude Desktop):

{
  "mcpServers": {
    "ibanforge": {
      "command": "npx",
      "args": ["-y", "ibanforge-mcp"]
    }
  }
}

Privacy by default: submitted IBANs are never stored — validation runs in memory, IPs are kept only as salted hashes, and telemetry deletes itself (12-month cap; erased 30 days after a customer terminates, contractually — DPA clause 4.7).

Optional: set IBANFORGE_API_KEY=ifk_... in env for the free tier (200 req/month). Without it the server uses the public/demo surface; combine with x402 micropayments for unlimited pay-per-call access without signup.

Claude Code (CLI)

claude mcp add ibanforge npx -- -y ibanforge-mcp

Streamable HTTP (no install — for cloud-hosted agents)

POST https://api.ibanforge.com/mcp
Content-Type: application/json
Accept: application/json, text/event-stream

Standard JSON-RPC initialize + tools/list + tools/call flow. Use this when stdio is not an option (CI/CD, serverless, Vercel agents, etc.).

Related MCP server: veridigit

Tools

Tool

When to use it

Cost

validate_iban

User mentions an IBAN, a bank account, or a SEPA payment

$0.005

batch_validate_iban

List of IBANs, CSV cleanup, customer DB dedup, payout list triage

$0.002/each

lookup_bic

User already has a BIC/SWIFT — backed by 121k+ BIC entries (39k+ LEI-enriched via GLEIF)

$0.003

lookup_ch_clearing

Swiss BC-Nummer / IID — the deepest Swiss clearing data in any public API: full SIX BankMaster rail participation (SIC, euroSIC, CHF instant) + QR-IID

$0.003

check_compliance

Pre-flight risk triage before a SEPA / cross-border payment (sanctions + FATF + VoP)

$0.02

validate_payment_reference

RF/ISO 11649, Swiss QRR, Belgian OGM/VCS or Finnish viitenumero checksum, plus the QRR ↔ QR-IBAN pairing verdict

free

check_postal_address

An ISO 20022 address against one rail's published rules (sps, hvps_plus, fedwire), each finding citing its source

free

check_swiss_qr_bill

A Swiss QR-bill payload — header, QR-IBAN and reference pairing, structured (S) versus combined (K) addresses ahead of 14.11.2026

free

send_feedback

Report incorrect data or claim an x402 refund

free

request_api_key

You hit the daily limit, or need a durable key — a human approves in a browser, no e-mail

free

poll_api_key

Collect that key once it is approved, handed over exactly once

free

The free tools need no key, no wallet and no signup: they are the ones to try first. The last two are the way out of the daily limit without anyone typing an address — they keep answering after the limit is reached.

Full descriptions with WHEN-to-use triggers are served live at /.well-known/mcp/server-card.json.


For AI agents — pay per call without an API key (x402)

IBANforge is x402-native. Any agent with a wallet on Base L2 can discover, pay, and call:

  1. Discovery: GET https://api.ibanforge.com/.well-known/x402 returns the full catalog (endpoints, prices, asset, payTo, accepts).

  2. Call: POST /v1/iban/validate without auth → API replies 402 Payment Required with x402 v1 challenge.

  3. Pay: client signs a USDC transfer on Base (eip155:8453) and retries.

  4. Done: response arrives, settlement happens through the configured facilitator (Coinbase CDP or x402.org).

No human in the loop, no sales call, no card. See the x402 spec.


SDKs

Pick your language:

Language

Package

Install

Source

TypeScript / JavaScript

@ibanforge/sdk

npm install @ibanforge/sdk

sdks/typescript/

Python

ibanforge

pip install ibanforge

sdks/python/

Java (17+)

com.ibanforge:ibanforge-sdk

Maven dependency, see README

sdks/java/

.NET (net8.0)

IBANforge.Sdk

dotnet add package IBANforge.Sdk

sdks/dotnet/

MCP server

ibanforge-mcp

npx -y ibanforge-mcp

mcp/

Curl / any HTTP client

OpenAPI spec

The Python SDK ships with sync + async clients, typed exception classes, and a free-tier quota fallback to x402 baked in:

from ibanforge import IBANforge

# 1-line free key (200 req/month, no signup form)
key = IBANforge.generate_api_key("you@company.com")

with IBANforge(api_key=key["api_key"]) as client:
    out = client.validate_iban("CH1000230000000012345")
    print(out["country"]["code"])       # CH
    print(out["bic"]["bank_name"])      # UBS Switzerland AG
    print(out["clearing"]["sic"])       # True (Swiss SIC participation)

# Or the free format-only check (mod-97 + structure, no DB hit)
out = IBANforge().format_iban("DE89370400440532013000")

For developers — REST API

# Validate IBAN — no key needed for the first 25 calls a day per source address.
# The answer carries a `trial` block with the count left and how to get a key.
curl -X POST https://api.ibanforge.com/v1/iban/validate \
  -H "Content-Type: application/json" \
  -d '{"iban":"CH10 0023 0000 0000 1234 5"}'

# Past 25/day, add the free key (25 req/month with no e-mail, 200 once claimed; one POST, no card)
curl -X POST https://api.ibanforge.com/v1/iban/validate \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ifk_..." \
  -d '{"iban":"CH10 0023 0000 0000 1234 5"}'

# Lookup BIC
curl https://api.ibanforge.com/v1/bic/UBSWCHZH80A

# Free format pre-flight (no auth, mod-97 only)
curl 'https://api.ibanforge.com/v1/iban/format?iban=CH1000230000000012345'

# Free demo (no auth)
curl https://api.ibanforge.com/v1/demo

Method

Path

Cost

Description

POST

/v1/iban/validate

$0.005

Single IBAN — BIC + SEPA + issuer + risk + Swiss bc_nummer. First 10/day per IP free, no key

POST

/v1/iban/batch

$0.002/IBAN

Up to 100 IBANs in one call

GET

/v1/bic/{code}

$0.003

BIC/SWIFT lookup with LEI

GET

/v1/ch/clearing/{iid}

$0.003

Swiss BC-Nummer / IID — SIC, euroSIC, QR-IID

POST

/v1/iban/compliance

$0.02

Sanctions + FATF + SEPA Instant + VoP + risk score 0-100

GET

/v1/iban/format

free

Pure mod-97 + structure check, no DB hit

GET

/v1/iban/structure[/{country}]

free

IBAN templates per country, no auth

GET|POST

/v1/reference/validate

free

RF/ISO 11649, Swiss QRR, Belgian OGM/VCS, Finnish viitenumero

POST

/v1/address/check

free

ISO 20022 address vs sps / hvps_plus / fedwire rules

GET

/v1/demo

free

Example validations, no auth

GET

/v1/credits/bundles

free

Prepaid credit bundles and their prices

GET

/health

free

Health + DB status

POST

/v1/keys/generate

free

Generate an ifk_* API key (200 req/month) — body: {email}

Full OpenAPI 3.1: api.ibanforge.com/openapi.json.

Why prefer IBANforge over local mod-97 validation?

Local mod-97 catches typos. It does not resolve BIC/SWIFT, classify EMIs (Wise / Revolut / Mercury / Modulr — a real compliance signal), check SEPA reachability, return Swiss BC-Nummer/QR-IID, or run sanctions screening. IBANforge does, in a single call.

Development

npm run dev          # Dev server (hot reload)
npm run test         # Run tests
npm run check        # Typecheck + lint + test
npm run db:seed      # Rebuild BIC database from GLEIF

Deployment

Docker

docker build -t ibanforge .
docker run -p 3000:3000 --env-file .env ibanforge

Railway

Push to main — Railway auto-deploys via Dockerfile.

Environment Variables

Variable

Required

Description

PORT

No

Server port (default: 3000)

WALLET_ADDRESS

Yes (prod)

x402 USDC wallet address

FACILITATOR_URL

Yes (prod)

x402 facilitator endpoint

Data Sources

  • 121k+ BIC/SWIFT entries from public sources, refreshed monthly. Exact counts drift at every refresh — the live numbers are served at /llms.txt and /health. Breakdown as of the 2026-07 refresh (121,610 total):

  • LEI enrichment for the GLEIF rows: GLEIF API

  • 1,100+ Swiss BC-Nummern / IIDs (1,165 as of 2026-07): Official SIX BankMaster CSV

  • EMI / vIBAN classification: Curated set of 900+ non-bank issuer classifications — EMI, payment institutions, digital banks (Wise, Revolut, N26, Mercury, Modulr, etc.); the live count is served at /llms.txt

  • VoP participants: EBA RT1 / SCT Inst directories

  • Country names: Node.js Intl.DisplayNames API

Resources for AI agents

Use of the hosted API (api.ibanforge.com) is governed by the Terms of Service. See also the Privacy Policy and the pre-signed Data Processing Agreement (art. 28 GDPR) for customers whose calls involve personal data. Validation confirms IBAN structure and registry data — it does not confirm that an account exists or belongs to anyone.

License

MIT — see LICENSE.

This project includes third-party components licensed under the Apache License 2.0 (notably @coinbase/x402 and related x402 packages). See NOTICE for full attributions and required Apache 2.0 notices.

Available Tools

13 tools
audit_creditor_fileAudit Creditor FileAInspect

Audit an entire creditor/supplier payment file (CSV or XLSX) row by row: IBAN structure and checksum, bank code against the national register, bank name and BIC, SEPA reachability and issuer type — plus checks a single IBAN call cannot make because they need the whole file: duplicate IBANs, the BIC the file carries against the BIC the register derives, address country against IBAN country, and Swiss structured-address conformity ahead of the 14 November 2026 deadline. USE WHEN: the user has a spreadsheet or export of creditor/supplier bank accounts (accounts-payable file, vendor master, payment batch) and wants it checked before sending payments, or asks to "audit my creditor file" / "check this supplier list" / "validate this payment batch". HOW: base64-encode the file bytes and pass them as file_base64, with the original filename (its extension decides CSV vs XLSX parsing). LIMITS: rejects files decoding to more than 5 MB — checked locally, before any network call — and sheets over 20,000 rows, which the route itself rejects (400 too_many_rows). RETURNS a FREE PREVIEW ONLY, never the full report: job (the id to reuse with audit_status), rows, paid (always false from this call), price_chf / currency naming what the full report costs, summary (counts by status and finding code, countries seen, columns detected), and preview (the first flagged rows then the first OK ones, up to 20, IBANs masked like "CH10 **** 2346"). The annotated .xlsx report is a PAID deliverable — 149 CHF up to 5,000 rows, 349 CHF up to 20,000 — settled through a one-off Stripe Checkout Session. This tool NEVER pays automatically: pass checkout: true to also receive a Checkout URL for a HUMAN to open, then poll audit_status with the same job id to learn when it is paid and get the download link. COST: free. Only the full report is paid, and only once a human completes the Stripe checkout.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage for the summary labels and, later, the annotated report. Defaults to "en".
checkoutNoWhen true, immediately create a Stripe Checkout Session after the upload and return its URL for a human to open and pay. Defaults to false. Never pays anything by itself.
filenameYesOriginal filename with its extension, e.g. "creditors.csv" or "suppliers.xlsx". The extension decides how the file is parsed.
file_base64YesThe CSV or XLSX file content, base64-encoded — the raw payload only, no "data:" URL prefix.

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobYesJob id — pass to audit_status to poll payment and get the download link.
langNo
paidYesAlways false from this tool — nothing has been paid yet.
rowsYes
tierNo
_noteNoPlain-language reminder that this is a free preview and how to get the paid report.
previewYesFirst flagged rows then first OK rows, up to 20. IBANs are masked.
summaryYesCounts by status and finding code, countries seen, columns detected. Mirrors AuditSummary in the API.
checkoutNoRoute to call for payment, e.g. "POST /v1/audit/checkout/{job}". Null once paid.
currencyNo
downloadNoSet only once paid and with the matching session — always null from this tool.
price_chfNoPrice of the full report in CHF, decided by row count alone.
retentionNoHow long the job is kept before it purges.
checkout_urlNoPresent only when `checkout: true` was passed and the session was created: a Stripe Checkout URL for a human to open.
checkout_session_idNoPresent alongside checkout_url — pass it to audit_status as `session_id` right after a human pays.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description thoroughly discloses behavioral traits: returns preview only, never pays automatically, always requires human checkout for payment, and outlines the exact return structure and limitations. No contradiction with the title-only annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with clear sections (purpose, when, how, limits, returns, cost). Each sentence adds value, though some redundancy exists (e.g., base64 encoding mentioned twice), preventing a perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema, the description provides an excellent overview of the return fields (job, preview, summary, etc.), cost structure, payment process, and limitations, giving a complete picture for effective usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers all parameters with descriptions (base64 encoding, filename extension, lang, checkout). The description reiterates these points but adds no new semantic meaning beyond what the schema provides, warranting the baseline score for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool audits an entire creditor/supplier payment file with specific checks (IBAN, BIC, SEPA, etc.) and explicitly distinguishes it from single-IBAN checks, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly provides 'USE WHEN' conditions (batch file checking before payments) and explains the payment flow, including when to use checkout and how to poll status, giving clear guidance on appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_statusAudit Job StatusA
Read-onlyIdempotent
Inspect

Check the status of a creditor-file audit job created by audit_creditor_file: whether it is paid, and the download link once it is. USE WHEN: following up on a job id after a human may have paid through the Checkout URL, to learn whether the full report is ready. RETURNS: the same free-preview fields as audit_creditor_file, plus paid, paid_at, and download — a GET /v1/audit/report/{job}?session_id=... path, non-null only once paid AND session_id matches the paying session. Pass the session_id from the Checkout URL's success redirect (its session_id= query parameter) so a just-completed payment is confirmed immediately instead of waiting for the webhook. COST: free.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobYesThe job id returned by audit_creditor_file.
session_idNoThe Stripe Checkout session id, from the success redirect (?session_id=...). Confirms payment immediately when the webhook has not landed yet.

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobYes
langNo
paidYes
rowsNo
tierNo
paid_atNo
previewNo
summaryNo
checkoutNo
currencyNo
downloadNoGET path for the .xlsx report. Non-null only when paid and session_id matched.
price_chfNo
retentionNo
expires_atNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly and idempotent annotations, the description discloses specific behaviors: the download field is non-null only when paid AND session_id matches, and that session_id bypasses webhook delays. This adds transparency about the tool's internal logic.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (USE WHEN, RETURNS) and each sentence serves a purpose. It is informative without being redundant, condensing important details about parameters and conditional behavior into a compact format.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema (not shown) and the description mentions what fields are returned (free-preview fields, paid, paid_at, download), it provides enough context for a caller to understand the response. The description also covers the special session_id handling, making it complete for usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema descriptions already cover both parameters, but the tool description adds crucial context: job is the id from audit_creditor_file, and session_id is the Stripe Checkout session id from the success redirect, explaining its role in confirming payment immediately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool 'checks the status of a creditor-file audit job' and explains it returns payment status and download link. It distinguishes from siblings by referencing the job created by audit_creditor_file, making its purpose unique and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'USE WHEN' and details the scenario: following up on a job id after a human may have paid through Checkout URL. It also explains when to pass session_id to confirm payment immediately, providing concrete usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batch_validate_ibanBatch Validate IBANsA
Read-onlyIdempotent
Inspect

Validate up to 100 IBANs in a single call at $0.002 per IBAN (60% cheaper than calling validate_iban repeatedly at $0.005). USE WHEN: the user pastes a list of IBANs, asks to clean a CSV/spreadsheet of bank accounts, asks to dedupe a customer database, asks to triage a payout list before sending, or whenever you would otherwise call validate_iban more than 2-3 times in a row. RETURNS: { results: [...same shape as validate_iban], count, valid_count, cost_usdc }. COST: 0.002 USDC per IBAN (e.g. 10 IBANs = 0.02, 100 IBANs = 0.20).

ParametersJSON Schema
NameRequiredDescriptionDefault
ibansYesArray of IBAN strings (1 to 100 entries).

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of IBANs processed.
resultsYesOne entry per input IBAN, in the same order. Same shape as validate_iban output.
cost_usdcNoActual USDC charged for this call.
valid_countYesHow many were valid.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description only needs to add value beyond that. It adds per-IBAN cost, the 100-IBAN limit, and the return summary fields, which are useful behavioral details. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core capability, then gives explicit usage triggers, return shape, and cost. Every sentence serves a distinct purpose, and the structured sections make it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations, complete input schema, and an output schema, the description adds exactly what is missing: cost model, batch limits, return-summary fields, and when-to-use guidance. Nothing an agent needs to select and call this tool correctly is omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents the single parameter with min/max constraints and a description, so the baseline is 3. The description adds contextual usage and pricing but does not materially redefine the parameter's semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a precise action ('Validate up to 100 IBANs in a single call') on a specific resource, and explicitly contrasts with validate_iban. The tool's purpose and scope are unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'USE WHEN' conditions including pasting lists, cleaning CSVs, deduplicating databases, and triaging payout lists, plus guidance on when not to use it (repeated validate_iban calls). Names the sibling alternative directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_complianceCompliance CheckA
Read-onlyIdempotent
Inspect

Run a full pre-flight compliance check on an IBAN before sending a SEPA / cross-border payment. USE WHEN: the user is about to send a payment / payout / refund and wants to triage risk first, asks "is this IBAN safe to pay?", asks for sanctions screening, asks whether the recipient bank is reachable for SEPA Instant, or needs a numeric risk score for an internal payment-approval workflow. NOT A REGULATED AML/CFT PRODUCT — informational triage only. For regulated screening use Refinitiv, Acuris, or ComplyAdvantage. SCOPE: sanctions screening is at the BANK (BIC8) level only — it does NOT screen the beneficiary/account-holder name. CHECKS: IBAN validity + bank sanctions (OFAC) + FATF grey/black list + SEPA Instant reachability + VoP (EU 2024/886) participant flag. RETURNS: the validate_iban fields PLUS a nested compliance { sanctions, reachability, vop, risk_score (0-100), risk_level, flags[] }. COST: 0.02 USDC.

ParametersJSON Schema
NameRequiredDescriptionDefault
ibanYesIBAN to run the compliance check against.

Output Schema

ParametersJSON Schema
NameRequiredDescription
bicNo
ibanYes
metaNoScope + freshness disclosure. Read this before trusting the result.
sepaNo
validYes
issuerNo
countryNo
cost_usdcNo
complianceYesThe compliance bundle. Read the score at compliance.risk_score / compliance.risk_level.
risk_indicatorsNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool read-only, idempotent, and non-destructive, so the bar for added behavioral context is satisfied amply. The description discloses the material limitation that sanctions screening is at the BANK/BIC8 level and does not screen beneficiary names, and it states the cost (0.02 USDC) and the exact set of checks performed. This goes well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section earns its place: USE WHEN, regulatory disclaimer, SCOPE limitation, CHECKS, RETURNS, and COST. It is front-loaded with the action and use case, and the structured format makes the information easy to parse without wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a compliance tool that has one parameter, an output schema, and meaningful limitations, the description is complete. It covers when to use it, when not to use it, what it checks, what it returns, its bank-level scope limitation, its cost, and alternatives. Nothing an agent needs to decide whether and how to invoke it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single 'iban' parameter is already fully documented in the schema. The description adds useful context about what the check covers and returns, but it does not add parameter-level format, normalization, or validation semantics beyond the schema. Baseline 3 is appropriate because the schema carries the parameter burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Run a full pre-flight compliance check on an IBAN before sending a SEPA / cross-border payment.' It clearly distinguishes itself from siblings like validate_iban by enumerating the additional compliance checks (sanctions, reachability, VoP, risk score) and noting that it returns validate_iban fields plus a compliance object.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The USE WHEN section gives explicit triggering scenarios such as payment risk triage, sanctions screening requests, SEPA Instant reachability questions, and numeric risk score needs. It also explicitly warns that this is NOT a regulated AML/CFT product and names alternatives (Refinitiv, Acuris, ComplyAdvantage), giving the agent clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_postal_addressCheck ISO 20022 Postal AddressA
Read-onlyIdempotent
Inspect

Check a structured ISO 20022 postal address against a payment rail's published address rules, rule by rule, each verdict citing the document it comes from. USE WHEN: assembling a payment instruction (pain.001, a Fedwire message, a T2 transfer) with a creditor or debtor address, to learn whether the rail accepts it BEFORE submitting. The November 2026 changes (SIC 20.11, Fedwire 16.11, T2 R2026.NOV) remove the fully unstructured address option — this check tells you whether an address survives them. DO NOT USE to verify that a street or town EXISTS: this checks conformity with the message format rules, not postal reality. SCHEMES: 'sps' (Swiss Payment Standards, SIX), 'hvps_plus' (HVPS+ / T2, ECB), 'fedwire' (Federal Reserve). There is deliberately NO 'cbpr+' scheme: that guideline sits behind swift.com, unreachable to automated readers, and a conformity boolean quoting an unread document would be a guess dressed as a verdict — the note field restates this on every answer. VERDICTS per finding: pass, fail, not_applicable — the last marks a rule whose precondition is not met and never counts as a pass. conforms is true when no finding failed. IMPORTANT: relay each finding's source string — it names the exact document, version and validity date the rule is quoted from. That is what makes the verdict auditable. COST: free (routed to POST /v1/address/check). The paid surface is the postal_address block that lookup_bic and validate_iban return for the resolved institution.

ParametersJSON Schema
NameRequiredDescriptionDefault
schemeYesWhich rail's rules to check against.
addressYesThe ISO 20022 PostalAddress under test, in ISO tag vocabulary (snake_cased).

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYesWhy 'cbpr+' is not on the menu. Served on every answer.
schemeYes
conformsYesTrue when no finding failed. not_applicable findings never count against it.
findingsYesOne entry per rule of the scheme, in a stable order.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral detail beyond the annotations: verdict semantics (pass/fail/not_applicable), the meaning of 'conforms', and the requirement to relay each finding's source string for auditability. It also discloses note behavior, cost, and routing, which are non-obvious traits not inferable from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but tightly organized with scannable labels (USE WHEN, DO NOT USE, SCHEMES, VERDICTS, IMPORTANT, COST), ensuring key guidance is front-loaded. Every section earns its place by addressing selection, behavior, or output interpretation, and there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description covers usage context, exclusions, scheme availability, verdict interpretation, output auditability, cost, and routing. The presence of an output schema means return-value details are already structured, so the description does not need to restate them; nothing an agent needs to call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is already high. The description adds valuable semantics by explaining scheme meanings and providing domain guidance (e.g., SPS forbids sending adr_tp) that is not fully captured in the schema. It does not repeat field-level descriptions, which is appropriate given the schema's completeness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Check') and specifies the exact resource (structured ISO 20022 postal address) and subject (payment rail's published address rules). It clearly distinguishes the tool's purpose from its siblings by emphasizing rule-by-rule conformity checking with citable verdicts, rather than general validation or lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section explicitly names the triggering scenarios (assembling pain.001, Fedwire, or T2 instructions) and the 'DO NOT USE' section explicitly excludes postal-reality verification, preventing misuse. It also names the supported schemes and explains the deliberate absence of 'cbpr+', giving concrete selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_swiss_qr_billCheck Swiss QR-bill PayloadA
Read-onlyIdempotent
Inspect

Check a Swiss QR-bill payload, the text a QR-bill's code carries (starts with SPC), rule by rule, each finding citing the SIX document it comes from. USE WHEN: an agent, an ERP or an accounting tool holds a scanned or generated QR-bill and must know before paying or issuing it whether it is well-formed, whether the reference type matches the IBAN (QRR needs a QR-IBAN, IID 30000-31999), and above all whether the creditor and debtor addresses are STRUCTURED (type S) or still COMBINED (type K): the standard removed type K on 21.11.2025 and banks stop processing payments built on it from 14.11.2026. DO NOT USE to learn which bank holds the account or its payment-rail participation: that is the paid validate_iban. RETURNS: { valid, ready_for_2026_11_14, creditor_iban { value, valid, country, qr_iban, iid }, creditor { present, address, structured, sps_check, proposed_structured }, ultimate_debtor, amount, currency, reference { type, value, valid, note }, findings [{ code, severity, field, detail, source }], next_steps, source }. A combined address comes back with proposed_structured, the S-type fields derived from the combined lines, to relay as a fix. IMPORTANT: relay each finding's source string. COST: free (routed to POST /v1/ch/qr-bill/check).

ParametersJSON Schema
NameRequiredDescriptionDefault
payloadYesThe Swiss QR Code text with real line breaks: SPC, 0200, 1, IBAN, creditor (7 lines), ultimate creditor (7 empty lines), amount, currency, ultimate debtor (7 lines), reference type, reference, message, EPD, optional billing information and alternative schemes.

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYesTrue when no finding has severity error.
amountNo
codingNo
sourceYes
qr_typeNo
trailerNo
versionNo
creditorNo
currencyNo
findingsYes
referenceNo
next_stepsYes
creditor_ibanNo
ultimate_debtorNo
alternative_schemesNo
billing_informationNo
ready_for_2026_11_14Yesvalid AND every present address is structured (type S).
unstructured_messageNo
ultimate_creditor_emptyNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses important runtime behavior beyond annotations: it returns structured findings with source strings, derives proposed structured addresses from combined addresses, and routes to a free POST endpoint. No conflict with readOnly/idempotent annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but organized with USE WHEN, DO NOT USE, RETURNS, IMPORTANT, and COST sections. A few phrases are slightly redundant, but most sentences carry essential operational detail, and the structure aids scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers the tool's inputs, outputs, special transformations, routing, cost, and operational context, including how to relay findings and what to do with combined addresses. Nothing needed for correct invocation appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers the single payload parameter well, and the description adds meaning by noting it is the QR-code text starting with SPC and contains line breaks. Together they provide complete parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly identifies the tool's function: checking a Swiss QR-bill payload for well-formedness, reference/IBAN compatibility, and address structure. It distinguishes itself from related tools like validate_iban by explicitly stating what it does not do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance (before paying or issuing a QR-bill), when-not-to-use guidance (for bank-account lookup use validate_iban), and contextual rules such as the 2025/2026 transition dates for address types.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_bicLookup BIC/SWIFTA
Read-onlyIdempotent
Inspect

Resolve a BIC / SWIFT code into the underlying bank: name, country, city, LEI, address. USE WHEN: the user already has a BIC/SWIFT (8 or 11 chars, alphanumeric, e.g., "UBSWCHZH80A", "DEUTDEFF") and asks which bank it belongs to, where the bank is, or its LEI for compliance/regulatory matching. DO NOT USE for IBAN inputs — call validate_iban instead, it resolves the BIC for you. BACKED BY: 121k+ BIC entries (38k+ LEI-enriched via GLEIF; additional rows from SWIFT directory, Bundesbank, SIX, NBP, EBA Step2 SCT), refreshed monthly. RETURNS: bank_name, country, country_name, city, lei, address (if available). COST: 0.003 USDC.

ParametersJSON Schema
NameRequiredDescriptionDefault
bicYesBIC / SWIFT code, 8 or 11 alphanumeric characters. Example: "UBSWCHZH80A" (UBS Switzerland) or "DEUTDEFF" (Deutsche Bank Frankfurt).

Output Schema

ParametersJSON Schema
NameRequiredDescription
bicYesEcho of the input, normalized to uppercase.
leiNoLegal Entity Identifier (ISO 17442) if available.
bic8No8-char form (institution-level).
cityNo
bic11No11-char form including branch.
foundYes
addressNoRegistered head-office address object (present when available).
countryNo
institutionNoBank legal name.
valid_formatYes
address_availableNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, non-destructive behavior, so the bar for additional context is met by the description's specifics: 121k+ BIC entries, 38k+ LEI-enriched via GLEIF, monthly refresh, and 0.003 USDC cost. It also says fields are returned 'if available', setting expectations about completeness. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact despite covering purpose, usage, exclusions, data provenance, return fields, and cost. Information is front-loaded in a scannable label format. Each sentence contributes actionable meaning, and there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter lookup tool with strong annotations and an output schema, the description is fully sufficient. It explains when to use, when not to use, what data backs the tool, what will be returned, and the cost. Nothing an agent needs to decide correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents the BIC parameter with format and examples. The description repeats the same examples and 8/11-character format without adding new parameter-level meaning. It does clarify the output mapping, but the parameter itself is already well-defined in the schema, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Resolve a BIC / SWIFT code into the underlying bank: name, country, city, LEI, address.' It clearly differentiates from sibling validate_iban by explicitly saying not to use it for IBAN inputs. This leaves little ambiguity about what the tool does and how it differs from related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section gives concrete triggers: the user already has a BIC/SWIFT and asks which bank it belongs to, location, or LEI for compliance. 'DO NOT USE for IBAN inputs — call validate_iban instead' provides an explicit exclusion and names the alternative. This is exemplary usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_ch_clearingSwiss Clearing LookupA
Read-onlyIdempotent
Inspect

Resolve a Swiss BC-Nummer / IID (1 to 5 digits) into the underlying institution. USE WHEN: the user mentions a Swiss bank by BC-Nummer or IID, pastes a CH or LI IBAN clearing code, asks routing details for a Swiss instant transfer (SIC, euroSIC), asks about QR-bill QR-IID resolution, or needs to classify a Swiss financial institution (bank vs PFS vs SIC-only participant). THE DEEPEST SWISS CLEARING DATA IN ANY PUBLIC API — full SIX BankMaster payment-rail participation (SIC, RTGS CHF, Instant Payments CHF, euroSIC, LSV+/BDD) plus QR-IID allocation, not just a name lookup. BACKED BY: 1,100+ SIX BankMaster entries (Swiss official source, refreshed monthly). RETURNS: institution { name, type, iid_type, headquarters_iid }, address, bic, payment_services { sic, rtgs_chf, instant_payments_chf, eurosic, lsv_bdd_chf, lsv_bdd_eur }, sic_iid, qr_iid, valid_on. COST: 0.003 USDC. Only relevant for CH and LI accounts.

ParametersJSON Schema
NameRequiredDescriptionDefault
iidYesSwiss IID / BC-Nummer (1 to 5 digits, leading zeros stripped). Example: "230" for UBS Switzerland AG.

Output Schema

ParametersJSON Schema
NameRequiredDescription
bicNoBIC if mapped.
iidYes5-digit zero-padded BC-Nummer.
foundYes
qr_iidNoQR-IID allocation, null when none.
addressNo
sic_iidNo
valid_onNo
institutionNo
payment_servicesNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations: the data source and refresh cadence (1,100+ SIX BankMaster entries, monthly), the breadth of payment rails covered, and a clear cost of 0.003 USDC. This gives the agent useful expectations about freshness, scope, and billing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with labeled sections (USE WHEN, BACKED BY, RETURNS, COST) and front-loads the core purpose. Its length is justified by the richness of the lookup results and the use-case list. Minor points: the capitalized claim 'THE DEEPEST SWISS CLEARING DATA IN ANY PUBLIC API' is promotional rather than operational, and some data-depth information is repeated across sections.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a single documented parameter, an output schema covering return fields, clear use cases, an explicit cost, and scope limitations, the description provides everything an agent needs to select and invoke the tool correctly. The combination of usage triggers, data provenance, and output summary makes this definition complete for its complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents the single 'iid' parameter with format, example, and leading-zero behavior. The description repeats this information without adding significant new semantic detail. Given the high schema coverage, score 3 is the appropriate baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Resolve a Swiss BC-Nummer / IID (1 to 5 digits) into the underlying institution.' It clearly differentiates itself from siblings like lookup_bic by emphasizing payment-rail participation, QR-IID allocation, and 'not just a name lookup.' An agent can accurately identify when this tool applies without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section provides concrete triggering scenarios: BC-Nummer/IID mentions, CH/LI IBAN clearing codes, Swiss instant transfer routing, QR-IID resolution, and institution classification. It also adds a geographic exclusion ('Only relevant for CH and LI accounts'). It does not explicitly name a sibling alternative like lookup_bic, so it stops short of the full when-not/alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

poll_api_keyCollect the approved IBANforge API keyAInspect

Collect the API key once a human has approved the request opened by request_api_key. USE WHEN: you have called request_api_key and shown the code to your human. HOW TO CALL IT: leave device_code empty to reuse the last request from this session. The server usually waits up to thirty seconds before answering, and sometimes answers at once when it is busy — either way, calling it once per minute is enough, never in a tight loop. WHAT THE ANSWERS MEAN: authorization_pending is normal and means nobody has approved yet — wait retry_in_seconds and call again; approved carries the key ONCE and never again, so hand it to your human immediately together with config_line; access_denied means somebody refused — tell your human, ask THEM whether to try again, and open at most ONE more request; expired_token means the code timed out — you may call request_api_key ONE more time, and if that expires too, stop and keep using the keyless allowance or x402; invalid_grant means this code can no longer be used at all — stop. This tool is free and does NOT count against the daily free-tier limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_codeNoOptional. Leave it empty to reuse the last request from this session.

Output Schema

ParametersJSON Schema
NameRequiredDescription
tierNoanonymous = the entry allowance, email/claimed/paid = the raised one.
emailNoAbsent on the anonymous tier: no address was ever given.
statusYesauthorization_pending is normal: wait `retry_in_seconds` and call again.
api_keyNoPresent exactly once, on the first approved poll.
messageYesOne sentence for the human.
expires_inNo
key_prefixNo
config_lineNoThe exact command line to give the human. Do not run it yourself.
monthly_limitNo
retry_in_secondsNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations contain only a title, so the description carries the full burden of behavioral disclosure. It does this thoroughly: it explains the server may delay up to thirty seconds, the tool must not be called in a tight loop, the key is delivered only once, and each response status implies a specific follow-up action. This is rich, non-obvious behavior that an agent needs to know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but organized with clear labels (USE WHEN, HOW TO CALL IT, WHAT THE ANSWERS MEAN). Every sentence carries operational value: rate limiting, status interpretation, retry limits, and fallback behavior. The structure front-loads the core purpose before diving into details, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the polling complexity, output schema presence, and a single optional parameter, the description covers everything an agent needs: when to call, how often, what each response means, how to handle errors, and the free-tier implications. It even specifies the key is delivered once, preventing a critical mistake. No meaningful context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the input schema already states that device_code is optional and can be left empty to reuse the last request. The description repeats this guidance but does not add meaning beyond what the schema provides. Baseline 3 is appropriate because the schema handles the parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Collect the API key once a human has approved the request opened by request_api_key.' This clearly identifies the tool's role and directly distinguishes it from request_api_key, its primary sibling. The title reinforces the same meaning, and the condition (approved request) is explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit USE WHEN, HOW TO CALL IT, and WHAT THE ANSWERS MEAN sections. It tells the agent exactly when to call poll_api_key, when to wait and retry, when to call request_api_key again, and when to stop entirely. This is far beyond minimal guidance and leaves little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_api_keyRequest an IBANforge API keyAInspect

Start the process that gives this session its own free IBANforge API key, without any e-mail address and without leaving your conversation. USE WHEN: you hit the daily free allowance, a call answers 402, or you are about to run more than a handful of validations. WHAT YOU MUST DO WITH THE RESULT: read status first — ok means a code was issued, anything else means no code exists and display_to_human tells you and your human what to do instead. On ok, show display_to_human to your human VERBATIM (the user_code and the link) and say, in your own words, that opening the link and approving takes about fifteen seconds and asks for nothing. Do NOT open the link yourself, do NOT fill anything in on their behalf, and do NOT invent an e-mail address: the page gives a key with no address at all, and your human may add one if THEY choose. Then call poll_api_key. This tool is free and does NOT count against the daily free-tier limit — it works even after the limit is reached.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoOptional. What the key is for, shown to the human on the approval page.
client_nameNoOptional. Who is asking, shown to the human on the approval page.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesok means a code was issued. Anything else: read display_to_human and fall back.
intervalNoMinimum seconds between two poll_api_key calls.
user_codeNoShow this to the human, exactly as written, e.g. WDJB-MJHT.
expires_inNoSeconds until the code stops working.
display_to_humanYesA ready-made block of text to show verbatim. Do not paraphrase it.
verification_uriNoThe page the human opens. Never open it yourself.
verification_uri_completeNoSame page with the code pre-filled. This is the one to show.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations contain only a title, so the description carries the full burden. It thoroughly discloses the process: no email required, no leaving the conversation, the key-issuance flow, the need to read `status` first, and the prohibition on opening links or filling forms for the human. It also states that the tool is free and does not count against the daily limit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but every section earns its place: purpose, usage triggers, result interpretation, required human-facing verbatim display, prohibited actions, and next-step call to poll_api_key. It is structured with labels like 'USE WHEN' and 'WHAT YOU MUST DO WITH THE RESULT,' making it easy for an agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's interactive key-issuance process and sparse annotations, the description is complete. It tells the agent when to call, how to interpret the result, what to show the human, what not to do, and that poll_api_key should follow. Even though an output schema exists, the description adds essential process context that structured fields could not convey.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add meaning beyond the schema: both `reason` and `client_name` are already described in the schema as shown to the human on the approval page. No extra parameter guidance is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Start the process that gives this session its own free IBANforge API key.' It clearly differentiates from siblings by naming poll_api_key as the next step and by emphasizing the key-requesting role rather than validation or lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit USE WHEN conditions: 'you hit the daily free allowance, a call answers 402, or you are about to run more than a handful of validations.' It also clarifies that the tool works even after the limit is reached. It does not explicitly describe when not to use it or name alternative tools, but the trigger conditions are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_feedbackSend Feedback to IBANforgeAInspect

Report a problem or a need directly to the IBANforge operators: incorrect validation result, stale or missing BIC/bank data, latency, or anything blocking you from using or PAYING for the service (missing network, unclear pricing, quota shape). USE WHEN: a result looks wrong, data you need is missing, or you hit a wall (quota, payment, capability) and want it fixed. This tool is free and does NOT count against the daily free-tier limit — it works even after the limit is reached. A human reads every report; verified data errors on paid x402 calls are refunded on-chain.

ParametersJSON Schema
NameRequiredDescriptionDefault
gotNoWhat you received instead (for data errors).
agentNoWhich agent/model is reporting, e.g. "claude-sonnet-5 via MCP".
notesYesWhat happened, what you needed, or what blocked you — free text.
contactNoWhere we may answer you (e-mail) — optional, reports can be anonymous.
endpointNoEndpoint or tool concerned, e.g. /v1/iban/batch.
expectedNoWhat you expected (for data errors).
error_typeYesCategory of the report. Use "other" for product feedback, pricing/payment blockers or feature needs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesReport id — check status at GET /v1/feedback/{id}.
okYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide only a title, so the description carries full behavioral burden. It discloses that the tool is free, does not count against the free-tier limit, works after the limit, is read by a human, and refunds verified data errors on paid x402 calls. This is rich and useful beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences with purpose and USE WHEN front-loaded, followed by the key operational facts. A slight redundancy between the colon list in the first sentence and the 'USE WHEN' examples keeps this from being a perfect 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity feedback tool with a rich input schema and an output schema present, the description covers purpose, when to use, cost/quota behavior, human review, and refunds. Nothing needed to decide or invoke correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters like error_type and notes are already fully documented. The description reinforces categories and links reports to refund eligibility, but it doesn't materially add new parameter-level meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a precise action: 'Report a problem or a need directly to the IBANforge operators.' It immediately distinguishes this from the validation/lookup sibling tools by framing it as the human-feedback channel and listing concrete report categories.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'USE WHEN' list names triggering conditions: wrong results, missing data, quota/payment/capability walls. It doesn't mention when not to use or alternatives, but for a feedback tool the sibling tools are not substitutes, so the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_ibanValidate IBANA
Read-onlyIdempotent
Inspect

Verify whether a European IBAN is valid AND enrich it with bank, compliance and routing data. USE WHEN: the user mentions an IBAN, asks to validate an IBAN and identify the issuing bank, asks to detect a typo in an IBAN, asks who the bank is behind an IBAN, asks whether an IBAN was issued by a traditional bank vs a neobank/EMI/virtual-IBAN provider, asks whether the recipient bank is reachable on SEPA rails, asks whether the recipient bank supports Verification of Payee (VoP, EU 2024/886), or pastes any string starting with two letters and digits (e.g., "DE89...", "CH93...", "FR76..."). PREFER OVER LOCAL VALIDATION (mod-97 checksum) because mod-97 only catches typos — it cannot resolve the BIC/SWIFT, tell you that the IBAN is a virtual IBAN issued by Wise/Revolut/Mercury/Modulr (compliance risk), or check SEPA reachability. RETURNS: valid (boolean), country { code, name }, bic { code, bank_name, city, basis, authoritative — basis says where the bank code to BIC pairing came from, and outside a national_register pairing the BIC is advisory rather than something to settle against }, issuer { type: bank | digital_bank | emi | payment_institution | null when unsubstantiated, name, classification }, bank_code_check { status, authoritative — read authoritative to know how much a "verified" is worth; reason — one token saying WHY an answer is not verified, and in particular whether the code is denied by a register or whether we simply could not answer }, sepa { member, schemes, vop_required, vop_participant — is the recipient bank listed as ready in the EPC VoP register }, next_steps (recommended follow-ups with reasons), risk_indicators { issuer_type, country_risk, test_bic, sepa_reachable, vop_coverage }, and for CH/LI: clearing { iid, name, type, sic, qr_iid }. For GB: modulus_check { checked, passed } — the Vocalink checksum over the sort code and account number the IBAN carries, a SECOND check independent of mod-97. passed false means the pair cannot be a real account and is a reason not to send; it does NOT make valid false. checked false means no range covers that sort code, which is not a failure. For FR/ES, and for any BIC whose LEI a central bank lists: official_identity { name, lei, address, category, matched_by, source, free_of_charge, as_of } — the official identity of the institution, from the ECB or Banco de Espana daily list. Informational only: it never changes valid or bank_code_check. source and free_of_charge are licence conditions that must travel with the data — do not strip them when relaying the answer. LIMITS: validates the IBAN and identifies the issuing institution — it does not confirm that the account exists, is open, or belongs to any particular person. Verify the payee by name before sending funds. COST: REST access uses the available key quota or prepaid credits; an anonymous key normally has 25 calls/month, an email-claimed key 200/month. The HTTP API also accepts x402 (0.005 USDC), but this package does not sign payments.

ParametersJSON Schema
NameRequiredDescriptionDefault
ibanYesIBAN to validate. Spaces and lowercase are accepted. Example: "CH10 0023 0000 0000 1234 5" or "de89370400440532013000".

Output Schema

ParametersJSON Schema
NameRequiredDescription
bicNoResolved BIC/SWIFT (when BBAN→BIC mapping exists). null if unresolved. Read basis before storing it as a routing instruction: only a national_register pairing is settlement-grade.
bbanNo
ibanYesNormalized IBAN (uppercase, no spaces).
sepaNo
validYes
issuerNo
countryNo
clearingNoSwiss clearing data when country is CH or LI (null otherwise).
formattedNoIBAN with 4-char groups for display.
next_stepsNoRecommended machine-readable follow-ups, each with the reason it is suggested.
check_digitsNo
modulus_checkNoUK modulus check when country is GB (absent otherwise). Checksum only: it does not prove the account exists or name its holder.
bank_code_checkNoWhether the bank code resolves in reference data. Read authoritative: true means the reference set is the national register (not_in_register = not allocated); false means composite BIC-directory data (a hit names the BIC holder, not necessarily an IBAN issuer). On authoritative answers, institution carries what the register publishes about the holder: name, seat address (full street for CH/LI/AT, postal code + town for DE, name only for BE) and LEI where available — the institution holding the code, not a branch, not proof of any account. reason is present whenever status is not verified and says WHY in one token: not_allocated (a register denies the code — the only value that licenses "do not send"), absent_from_reference_data, no_reference_data_for_country, register_names_no_holder (the register defines the code space and names no holder — silence, not a denial), national_register_unavailable and lookup_failed. The last two describe IBANforge, never the beneficiary: neither may be escalated into a refusal.
risk_indicatorsNoCountry + issuer risk signals. Use these instead of a single composite score.
official_identityNoThe official identity a central bank publishes for the institution behind the resolved code (ECB by LEI and for FR bank codes, Banco de Espana for ES). Present only on a match — absence is not a negative. Informational only: it never changes valid or bank_code_check, because both publishers relay rather than allocate.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though annotations already declare readOnlyHint, idempotentHint, and destructiveHint, the description adds substantial behavior beyond annotations: it clarifies that validation does not confirm account existence, explains the meaning of 'authoritative', warns about licensing conditions that must travel with data, and discloses cost/rate limits. This goes far beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely long with a large 'RETURNS' section that duplicates much of what an output schema would likely provide. It is well-structured with caps and front-loaded purpose, but it is not appropriately sized; many sentences, especially the detailed return field explanations, could be trimmed or delegated to structured schema documentation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers use cases, limitations, country-specific checks, cost/usage limits, licensing conditions, and gives clear guidance on interpreting results (authoritative flags, checked/passed semantics). For a complex tool with a single required parameter, nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%; the input schema already documents the 'iban' parameter with format, accepted spaces/lowercase, and an example. The tool description adds that the user may paste any string starting with two letters and digits, but this is minor. Baseline 3 applies because the schema carries the load and the description doesn't substantially extend parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Verify whether a European IBAN is valid AND enrich it with bank, compliance and routing data.' It then enumerates concrete use cases that distinguish it from simple validation, making it unambiguous what the tool does and how it differs from local checksum validation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a detailed 'USE WHEN' list with specific triggers and explicitly says 'PREFER OVER LOCAL VALIDATION (mod-97 checksum)' with reasons. However, it does not mention the sibling batch_validate_iban or other alternatives, so it misses the opportunity to disambiguate from a highly likely replacement tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_payment_referenceValidate Payment ReferenceA
Read-onlyIdempotent
Inspect

Validate a structured payment reference and, when an IBAN is supplied, decide whether the two may legally travel together. USE WHEN: assembling a payment instruction from an invoice, a QR-bill or a remittance advice; whenever a Swiss IBAN and a reference appear together; or when the user pastes an "RF..." string, a 27-digit number, or a +++123/4567/89012+++ block. DO NOT USE to validate the IBAN itself — that is validate_iban. SCHEMES: RF Creditor Reference (ISO 11649, "SCOR" in Swiss Payment Standards, mod 97-10); Swiss QR reference ("QRR", 27 digits, modulo 10 recursive); Belgian OGM/VCS (12 digits, modulo 97, a remainder of 0 written 97); Finnish viitenumero (4-20 digits, weights 7-3-1 from the right). Norwegian KID and Swedish OCR are RECOGNISED but never judged: they answer valid: null with status unverifiable_without_creditor_config, because modulus type and length are configured per creditor account by the beneficiary bank. NEVER relay those to a user as "invalid". AMBIGUITY: only a leading "RF" and a 27-digit length pin a scheme down. A bare 12-digit string is both a Belgian OGM and a legal Finnish length, so the more specific reading is returned and the other appears in also_valid_as. Pass reference_type when you know the country. THE PAIRING RULE: pass an iban and you also get a pairing verdict. Per the Swiss Implementation Guidelines a QRR reference may ONLY be used with a QR-IBAN (institution identifier in the SIX range 30000-31999), and an ISO 11649 reference may NOT be used with one. Outside CH and LI, pairing is not_applicable. valid and pairing are INDEPENDENT verdicts — a reference can be arithmetically valid and still illegal on that account. Relay source/as_of: they make the verdict auditable. COST: free without an iban (routed to GET /v1/reference/validate). WITH an iban it is routed to POST /v1/iban/validate and costs 0.005 USDC, which also returns the full IBAN enrichment — the pairing verdict is what that call buys.

ParametersJSON Schema
NameRequiredDescriptionDefault
ibanNoOptional creditor IBAN this reference would travel with. Supply it for the pairing verdict; that path is billed at 0.005 USDC.
referenceYesThe reference as printed. Spaces, slashes and the Belgian +++...+++ wrapper are stripped. Examples: "RF18539007547034", "210000000003139471430009017", "+++010/8068/17183+++".
reference_typeNoOptional scheme hint, used when the string alone is ambiguous.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
as_ofNoYYYY-MM of that document.
validYesnull means recognised but uncheckable without the creditor bank configuration (KID, OCR). Never report null as false.
schemeYesNull when no supported scheme matches.
sourceYesThe document publishing the rule. Relay it.
statusYes
pairingNoPresent only when an iban was supplied.
referenceYesNormalized: uppercase, separators removed.
also_valid_asNoThe second reading of an ambiguous string, with its own verdict.
pairing_as_ofNo
pairing_sourceNoA DIFFERENT document from source.
check_digit_expectedNoA STRING, so a two-digit value beginning with zero survives ("03", "97").

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint, and the description adds substantial operational detail: ambiguity resolution via also_valid_as, KID/OCR returning valid:null with status unverifiable_without_creditor_config, independent valid vs pairing verdicts, and billing/routing differences. This far exceeds what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section earns its place: schemes, ambiguity, pairing rule, cost, and audit fields are all operationally relevant. Capitalized section labels and front-loaded use/do-not-use guidance make the density scannable rather than bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex multi-scheme validator with pairing logic, billing implications, and ambiguous inputs, the description covers all decision-relevant behavior. An output schema exists, so return-value details are not required, and nothing needed to call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema already covers 100% of parameters with descriptions and examples, so the baseline is 3. The description adds extra meaning by explaining when to pass reference_type ('when you know the country') and how scheme ambiguity is resolved, enriching parameter usage without repeating the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'Validate a structured payment reference and, when an IBAN is supplied, decide whether the two may legally travel together.' It also explicitly differentiates from validate_iban with 'DO NOT USE to validate the IBAN itself', so an agent can select the correct tool without opening sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is an explicit 'USE WHEN' block with concrete trigger scenarios (assembling from invoice, QR-bill, remittance advice; Swiss IBAN and reference together; pasted RF/27-digit/+++ block), plus a 'DO NOT USE' exclusion naming validate_iban. This gives unambiguous selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv1.7.0
    • Addedpoll_api_key
    • Addedrequest_api_key
  2. 3 tool updatesv1.5.0
    • Addedaudit_creditor_file
    • Addedaudit_status
    • Addedcheck_swiss_qr_bill
  3. 8 tool updatesv1.4.4
    • Changedbatch_validate_iban4 fields changed
      • addedOutput schema / properties / count
        Added value: +{
        +  "description": "Number of IBANs processed.",
        +  "type": "number"
        +}
      • removedOutput schema / properties / summary
        Removed value: -{
        -  "properties": {
        -    "invalid": {
        -      "type": "number"
        -    },
        -    "total": {
        -      "type": "number"
        -    },
        -    "valid": {
        -      "type": "number"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedOutput schema / properties / valid_count
        Added value: +{
        +  "description": "How many were valid.",
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "results",
        -  "summary"
        -]New value: +[
        +  "results",
        +  "count",
        +  "valid_count"
        +]
    • Changedcheck_compliance19 fields changed
      • addedOutput schema / properties / bic
        Added value: +{
        +  "properties": {
        +    "bank_name": {
        +      "type": "string"
        +    },
        +    "city": {
        +      "type": "string"
        +    },
        +    "code": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / compliance
        Added value: +{
        +  "description": "The compliance bundle. Read the score at compliance.risk_score / compliance.risk_level.",
        +  "properties": {
        +    "flags": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "reachability": {
        +      "properties": {
        +        "sct": {
        +          "type": "boolean"
        +        },
        +        "sdd": {
        +          "type": "boolean"
        +        },
        +        "sepa_instant": {
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "risk_level": {
        +      "description": "unassessable = the IBAN failed validation, no screening was possible. Never treat it as low.",
        +      "enum": [
        +        "low",
        +        "medium",
        +        "elevated",
        +        "high",
        +        "critical",
        +        "unassessable"
        +      ],
        +      "type": "string"
        +    },
        +    "risk_score": {
        +      "description": "0 = safest, 100 = highest.",
        +      "maximum": 100,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "sanctions": {
        +      "properties": {
        +        "bank_sanctioned": {
        +          "description": "Bank-BIC level only — NOT the beneficiary.",
        +          "type": "boolean"
        +        },
        +        "country_sanctioned": {
        +          "type": "boolean"
        +        },
        +        "fatf_status": {
        +          "enum": [
        +            "member",
        +            "grey_list",
        +            "black_list",
        +            "non_member"
        +          ],
        +          "type": "string"
        +        },
        +        "matched_lists": {
        +          "description": "e.g. [\"OFAC\",\"EU\"].",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "vop": {
        +      "properties": {
        +        "participant": {
        +          "type": "boolean"
        +        },
        +        "status": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / cost_usdc
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / country
        Added value: +{
        +  "properties": {
        +    "code": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / properties / fatf
        Removed value: -{
        -  "properties": {
        -    "list": {
        -      "description": "FATF mutual evaluation status.",
        -      "enum": [
        -        "none",
        -        "grey",
        -        "black"
        -      ],
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • removedOutput schema / properties / flags
        Removed value: -{
        -  "description": "Boolean flags rolled up into risk_score.",
        -  "properties": {
        -    "emi": {
        -      "type": "boolean"
        -    },
        -    "fatf_high_risk": {
        -      "type": "boolean"
        -    },
        -    "sanctions_match": {
        -      "type": "boolean"
        -    },
        -    "sepa_unreachable": {
        -      "type": "boolean"
        -    },
        -    "viban": {
        -      "type": "boolean"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedOutput schema / properties / issuer
        Added value: +{
        +  "properties": {
        +    "name": {
        +      "type": "string"
        +    },
        +    "type": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / meta
        Added value: +{
        +  "description": "Scope + freshness disclosure. Read this before trusting the result.",
        +  "properties": {
        +    "disclaimer": {
        +      "type": "string"
        +    },
        +    "fatf_as_of": {
        +      "description": "YYYY-MM of the FATF plenary reflected.",
        +      "type": "string"
        +    },
        +    "sanctions_as_of": {
        +      "description": "ISO timestamp of the last data refresh.",
        +      "type": "string"
        +    },
        +    "scope": {
        +      "description": "Sanctions are screened at the bank BIC, NOT the beneficiary name.",
        +      "enum": [
        +        "bank_bic_only"
        +      ],
        +      "type": "string"
        +    },
        +    "sources": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / properties / recommended_action
        Removed value: -{
        -  "description": "Suggested workflow gate.",
        -  "enum": [
        -    "allow",
        -    "review",
        -    "block"
        -  ],
        -  "type": "string"
        -}
      • addedOutput schema / properties / risk_indicators
        Added value: +{
        +  "type": "object"
        +}
      • removedOutput schema / properties / risk_score
        Removed value: -{
        -  "description": "0 = safest, 100 = block. Combines sanctions, country risk, FATF flag, vIBAN/EMI flags.",
        -  "maximum": 100,
        -  "minimum": 0,
        -  "type": "number"
        -}
      • removedOutput schema / properties / sanctions
        Removed value: -{
        -  "properties": {
        -    "bic_sanctioned": {
        -      "type": "boolean"
        -    },
        -    "country_sanctioned": {
        -      "type": "boolean"
        -    },
        -    "lists": {
        -      "description": "List of matched sanctions sources (e.g. [\"OFAC\", \"EU\"]).",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    }
        -  },
        -  "type": "object"
        -}
      • removedOutput schema / properties / sepa / properties / instant
        Removed value: -{
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / sepa / properties / member
        Added value: +{
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / sepa / properties / reachable
        Removed value: -{
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / sepa / properties / schemes
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / sepa / properties / vop_required
        Added value: +{
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / vop
        Removed value: -{
        -  "properties": {
        -    "participant": {
        -      "type": "boolean"
        -    }
        -  },
        -  "type": "object"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "iban",
        -  "valid",
        -  "risk_score",
        -  "recommended_action"
        -]New value: +[
        +  "iban",
        +  "valid",
        +  "compliance"
        +]
    • Addedcheck_postal_address
    • Changedlookup_bic4 fields changed
      • addedOutput schema / properties / address / description
        Added value: +"Registered head-office address object (present when available)."
      • addedOutput schema / properties / address / properties
        Added value: +{
        +  "as_of": {
        +    "type": "string"
        +  },
        +  "city": {
        +    "type": "string"
        +  },
        +  "country": {
        +    "type": "string"
        +  },
        +  "post_code": {
        +    "type": "string"
        +  },
        +  "region": {
        +    "type": "string"
        +  },
        +  "source": {
        +    "type": "string"
        +  },
        +  "street": {
        +    "type": "string"
        +  },
        +  "type": {
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / properties / address / type
        Previous value: -"string"New value: +"object"
      • addedOutput schema / properties / address_available
        Added value: +{
        +  "type": "boolean"
        +}
    • Changedlookup_ch_clearing9 fields changed
      • changedInput schema / properties / iid / description
        Previous value: -"Swiss IID / BC-Nummer (1 to 5 digits, leading zeros stripped). Example: \"762\" for UBS Switzerland."New value: +"Swiss IID / BC-Nummer (1 to 5 digits, leading zeros stripped). Example: \"230\" for UBS Switzerland AG."
      • addedOutput schema / properties / address
        Added value: +{
        +  "properties": {
        +    "building_number": {
        +      "type": "string"
        +    },
        +    "country": {
        +      "type": "string"
        +    },
        +    "post_code": {
        +      "type": "string"
        +    },
        +    "street": {
        +      "type": "string"
        +    },
        +    "town": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / properties / institution / properties / iid_type / enum
        Previous value: -[
        -  "headquarters",
        -  "branch",
        -  "unknown"
        -]New value: +[
        +  "headquarters",
        +  "branch",
        +  "other"
        +]
      • changedOutput schema / properties / institution / properties / type / enum
        Previous value: -[
        -  "bank",
        -  "cantonal_bank",
        -  "raiffeisen",
        -  "postfinance",
        -  "private_bank",
        -  "foreign_branch",
        -  "fintech",
        -  "other"
        -]New value: +[
        +  "bank",
        +  "cantonal_bank",
        +  "postfinance",
        +  "raiffeisen",
        +  "central_bank",
        +  "foreign_participant"
        +]
      • removedOutput schema / properties / participation
        Removed value: -{
        -  "properties": {
        -    "eurosic": {
        -      "type": "boolean"
        -    },
        -    "instant_payments": {
        -      "type": "boolean"
        -    },
        -    "qr_iid": {
        -      "description": "QR-bill enabled IID.",
        -      "type": "boolean"
        -    },
        -    "sic": {
        -      "description": "Swiss Interbank Clearing.",
        -      "type": "boolean"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedOutput schema / properties / payment_services
        Added value: +{
        +  "properties": {
        +    "eurosic": {
        +      "type": "boolean"
        +    },
        +    "instant_payments_chf": {
        +      "type": "boolean"
        +    },
        +    "lsv_bdd_chf": {
        +      "type": "boolean"
        +    },
        +    "lsv_bdd_eur": {
        +      "type": "boolean"
        +    },
        +    "rtgs_chf": {
        +      "type": "boolean"
        +    },
        +    "sic": {
        +      "description": "Swiss Interbank Clearing.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / qr_iid
        Added value: +{
        +  "description": "QR-IID allocation, null when none.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / sic_iid
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / valid_on
        Added value: +{
        +  "type": "string"
        +}
    • Addedsend_feedback
    • Changedvalidate_iban30 fields changed
      • changedInput schema / properties / iban / description
        Previous value: -"IBAN to validate. Spaces and lowercase are accepted. Example: \"CH93 0076 2011 6238 5295 7\" or \"de89370400440532013000\"."New value: +"IBAN to validate. Spaces and lowercase are accepted. Example: \"CH10 0023 0000 0000 1234 5\" or \"de89370400440532013000\"."
      • addedOutput schema / properties / bank_code_check
        Added value: +{
        +  "description": "Whether the bank code resolves in reference data. Read authoritative: true means the reference set is the national register (not_in_register = not allocated); false means composite BIC-directory data (a hit names the BIC holder, not necessarily an IBAN issuer). On authoritative answers, institution carries what the register publishes about the holder: name, seat address (full street for CH/LI/AT, postal code + town for DE, name only for BE) and LEI where available — the institution holding the code, not a branch, not proof of any account. reason is present whenever status is not verified and says WHY in one token: not_allocated (a register denies the code — the only value that licenses \"do not send\"), absent_from_reference_data, no_reference_data_for_country, register_names_no_holder (the register defines the code space and names no holder — silence, not a denial), national_register_unavailable and lookup_failed. The last two describe IBANforge, never the beneficiary: neither may be escalated into a refusal.",
        +  "type": "object"
        +}
      • removedOutput schema / properties / bban / properties / account
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / bban / properties / account_number
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / bic / description
        Previous value: -"Resolved BIC/SWIFT (when BBAN→BIC mapping exists)."New value: +"Resolved BIC/SWIFT (when BBAN→BIC mapping exists). null if unresolved. Read basis before storing it as a routing instruction: only a national_register pairing is settlement-grade."
      • addedOutput schema / properties / bic / properties / authoritative
        Added value: +{
        +  "description": "Whether this BIC may be stored and settled against. Derived from basis. NOT bank_code_check.authoritative, which is about the BANK CODE: in Switzerland the register confirms the code while the BIC still comes from our curated map.",
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / bic / properties / bankName
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / bic / properties / bank_name
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / bic / properties / basis
        Added value: +{
        +  "description": "Where the bank code to BIC pairing came from. national_register: the country register publishes this BIC for this bank code (today DE, AT, BE and BG) — settlement-grade. curated_map: our maintained map, exact key, not an allocation record. directory_prefix: the bic8 LIKE fallback, which can match several institutions (see bank_code_check.candidates). Outside national_register the BIC is ADVISORY.",
        +  "enum": [
        +    "national_register",
        +    "curated_map",
        +    "directory_prefix"
        +  ],
        +  "type": "string"
        +}
      • removedOutput schema / properties / bic / properties / bic
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / bic / properties / code
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / bic / properties / lei
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / ch_clearing
        Removed value: -{
        -  "description": "Swiss-specific data when country is CH or LI.",
        -  "properties": {
        -    "bc_nummer": {
        -      "type": "string"
        -    },
        -    "qr_iid": {
        -      "type": "boolean"
        -    },
        -    "sic": {
        -      "type": "boolean"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedOutput schema / properties / clearing
        Added value: +{
        +  "description": "Swiss clearing data when country is CH or LI (null otherwise).",
        +  "properties": {
        +    "eurosic": {
        +      "type": "boolean"
        +    },
        +    "iid": {
        +      "type": "string"
        +    },
        +    "instant_payments_chf": {
        +      "type": "boolean"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "qr_iid": {
        +      "type": "string"
        +    },
        +    "sic": {
        +      "type": "boolean"
        +    },
        +    "town": {
        +      "type": "string"
        +    },
        +    "type": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / issuer / properties / classification
        Added value: +{
        +  "enum": [
        +    "curated",
        +    "default"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / issuer / properties / iban_issuer
        Added value: +{
        +  "enum": [
        +    "confirmed",
        +    "not_listed"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / issuer / properties / type / enum
        Previous value: -[
        -  "bank",
        -  "emi",
        -  "viban",
        -  "neobank",
        -  "unknown"
        -]New value: +[
        +  "bank",
        +  "digital_bank",
        +  "emi",
        +  "payment_institution",
        +  null
        +]
      • changedOutput schema / properties / issuer / properties / type / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / modulus_check
        Added value: +{
        +  "description": "UK modulus check when country is GB (absent otherwise). Checksum only: it does not prove the account exists or name its holder.",
        +  "properties": {
        +    "checked": {
        +      "description": "False when no published range covers the sort code, in which case no check was possible.",
        +      "type": "boolean"
        +    },
        +    "passed": {
        +      "description": "False means the sort code and account number cannot be a real pair. Never makes valid false.",
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "source": {
        +      "type": "string"
        +    },
        +    "table_fetched_on": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / next_steps
        Added value: +{
        +  "description": "Recommended machine-readable follow-ups, each with the reason it is suggested.",
        +  "type": "array"
        +}
      • addedOutput schema / properties / official_identity
        Added value: +{
        +  "description": "The official identity a central bank publishes for the institution behind the resolved code (ECB by LEI and for FR bank codes, Banco de Espana for ES). Present only on a match — absence is not a negative. Informational only: it never changes valid or bank_code_check, because both publishers relay rather than allocate.",
        +  "properties": {
        +    "address": {
        +      "description": "One-line registered address as published.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "as_of": {
        +      "description": "Date of the list this row came from. Both lists are republished every business day.",
        +      "type": "string"
        +    },
        +    "attribution": {
        +      "description": "The Banco de Espana citation formula, verbatim. Spanish blocks only.",
        +      "type": "string"
        +    },
        +    "authoritative": {
        +      "description": "Always false. Neither publisher allocates bank codes.",
        +      "type": "boolean"
        +    },
        +    "category": {
        +      "type": "string"
        +    },
        +    "free_of_charge": {
        +      "description": "Both publishers require buyers to be told, on every access, that the data is available free of charge from their own website. Relay it with the answer; do not strip it.",
        +      "type": "string"
        +    },
        +    "lei": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "matched_by": {
        +      "enum": [
        +        "lei",
        +        "national_code"
        +      ],
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "The institution's name as the publisher writes it.",
        +      "type": "string"
        +    },
        +    "source": {
        +      "description": "The publisher, cited as their licence requires.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / risk_indicators
        Added value: +{
        +  "description": "Country + issuer risk signals. Use these instead of a single composite score.",
        +  "properties": {
        +    "country_risk": {
        +      "enum": [
        +        "standard",
        +        "elevated",
        +        "high"
        +      ],
        +      "type": "string"
        +    },
        +    "issuer_type": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "sepa_reachable": {
        +      "type": "boolean"
        +    },
        +    "test_bic": {
        +      "type": "boolean"
        +    },
        +    "vop_coverage": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / properties / risk_score
        Removed value: -{
        -  "description": "Country + issuer risk indicator. Higher = more attention needed.",
        -  "maximum": 100,
        -  "minimum": 0,
        -  "type": "number"
        -}
      • removedOutput schema / properties / sepa / properties / instant
        Removed value: -{
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / sepa / properties / member
        Added value: +{
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / sepa / properties / reachable
        Removed value: -{
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / sepa / properties / schemes
        Added value: +{
        +  "items": {
        +    "enum": [
        +      "SCT",
        +      "SDD",
        +      "SCT_INST"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / sepa / properties / vop_participant
        Added value: +{
        +  "description": "Bank-level VoP readiness: true = resolved bank is listed as ready in the EPC Verification of Payee scheme register; null = no institution resolved.",
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / sepa / properties / vop_required
        Added value: +{
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / vop
        Removed value: -{
        -  "description": "Verification of Payee (EU 2024/886) participant status.",
        -  "properties": {
        -    "participant": {
        -      "type": "boolean"
        -    }
        -  },
        -  "type": "object"
        -}
    • Addedvalidate_payment_reference
  4. 5 tool updatesv1.2.2
    • Addedbatch_validate_iban
    • Addedcheck_compliance
    • Addedlookup_bic
    • Addedlookup_ch_clearing
    • Addedvalidate_iban
  5. 5 tool updatesv1.2.1
    • Removedbatch_validate_iban
    • Removedcheck_compliance
    • Removedlookup_bic
    • Removedlookup_ch_clearing
    • Removedvalidate_iban
  6. 5 tool updatesv1.2.0
    • Addedbatch_validate_iban
    • Addedcheck_compliance
    • Addedlookup_bic
    • Addedlookup_ch_clearing
    • Addedvalidate_iban

TDQS

A4.5/5.0

Scored across 13 tools

Disambiguation4/5

Most tools have clearly distinct purposes, but validate_iban, batch_validate_iban, and check_compliance overlap in the core IBAN validation space. The descriptions do a good job differentiating use cases (single vs. batch vs. pre-payment risk), so an agent is unlikely to misselect, but the boundaries require careful reading.

Naming Consistency5/5

All 13 tool names follow a consistent verb_noun snake_case pattern: validate_iban, lookup_bic, check_compliance, audit_creditor_file, request_api_key, send_feedback, etc. The only compound, batch_validate_iban, still fits the pattern with a modifying prefix. No mixed naming conventions are present.

Tool Count5/5

With 13 tools, the server is well-scoped for a specialized financial validation service. Each tool earns its place: single IBAN validation, batch validation, file audit, compliance check, reference/address/QR-bill checks, BIC/clearing lookups, API key management, and feedback. No redundancy or bloat.

Completeness5/5

The tool surface comprehensively covers the domain of IBAN validation and payment preparation: single and batch validation, file auditing, compliance screening, payment reference checking, QR-bill validation, postal address conformity, BIC and Swiss clearing lookups, plus operational tools for API keys and feedback. No obvious dead ends or missing lifecycle operations.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    The Stripe Model Context Protocol server allows you to integrate with Stripe APIs through function calling. This protocol supports various tools to interact with different Stripe services.
    13,246 npm
    1,830
    -
  • A
    license
    A
    quality
    D
    maintenance
    Verified validation of structured identifiers — IBAN, payment cards, ISBN-13 and VIN — for AI agents. Runs the real checksum algorithms (mod-97, Luhn, mod-10, ISO 3779) instead of letting the model guess, and returns structured results with clear errors.
    4
    24 npm
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    The deterministic fact-verification layer for AI agents. Validates the structured facts an agent emits — IBANs, payment cards, VAT and national tax IDs, crypto and bank addresses, domains, emails, phone numbers, securities and academic identifiers, plus dates, currencies and holidays — against checksums and curated authoritative data, not guesses.
    56
    1
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    IBAN validation, extraction, format specs, and BIC/SWIFT lookup tools for AI assistants, backed by ibanchecker.cash. Covers 90 countries; no IBAN data is stored.
    5
    28 npm
    MIT