Skip to main content
Glama

Check ISO 20022 Postal Address

check_postal_address
Read-onlyIdempotent

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 check conformity with the named document BEFORE submitting. Timetables differ: SPS 2026 in force 14 Nov 2026 requires town and country whenever an address is given, but SIC does not validate addresses and each bank decides what it still accepts. Fedwire moved its release to November 2027. The fetched T2 R2026.NOV does not forbid an AddressLine-only address; the MyStandards usage guideline could not be read. DO NOT USE to verify that a street or a building exists: the findings check conformity with the message format rules, and no street is looked up. For a Swiss or Liechtenstein address (ctry CH or LI, with pst_cd and twn_nm), the separate postcode_locality block says whether postcode and town go together in the official directory of localities of swisstopo (©swisstopo, version date in as_of); it is informative and does not change conforms. 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: pass, fail, and 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. They are what makes the verdict auditable. FREE: the rules are published commodities. The paid surface is the postal_address block that /v1/bic and /v1/iban/validate return for the resolved institution. COST: $0 per call, on every surface (free with no key on this transport: 25 units a week per source address, one per call and one per IBAN in batch_validate_iban, reset on Monday 00:00 UTC. Or an ifk_ key with no e-mail at all: POST https://api.ibanforge.com/v1/keys/generate with no body for 25 calls/month, on the REST API or on this transport, and POST /v1/keys/claim lifts that same key to 200 a month. Send the key here as Authorization: Bearer ifk_… (or X-API-Key) and each call counts against it exactly as on the REST API).

Input Schema

NameRequiredDescriptionDefault
schemeYesWhich rail's rules to check against: sps | hvps_plus | fedwire
addressYesThe ISO 20022 PostalAddress under test, in ISO tag vocabulary (snake_cased).

Output Schema

NameRequiredDescriptionDefault
noteYesWhy 'cbpr+' is not on the menu. Served on every answer.
schemeYessps | hvps_plus | fedwire — the rule set that was applied.
conformsYesTrue when no finding failed. not_applicable findings never count against it.
findingsYesOne entry per rule of the scheme, in a stable order.
postcode_localityYesSwiss and Liechtenstein addresses with a postcode and a town: whether the two go together in the official directory of localities of swisstopo. Informative, beside the format verdicts: it does not change conforms or valid. The street is not checked. null for any other address.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / postcode_locality
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "as_of": {
      +          "description": "Version date of the directory (YYYY-MM-DD).",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "detail": {
      +          "description": "What was compared and what came out of it.",
      +          "type": "string"
      +        },
      +        "localities": {
      +          "description": "The entries the directory gives for this postcode; empty when it has none.",
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "canton": {
      +                "description": "null in Liechtenstein.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "country": {
      +                "description": "CH | LI",
      +                "type": "string"
      +              },
      +              "municipality": {
      +                "type": "string"
      +              },
      +              "name": {
      +                "description": "The locality as the directory writes it.",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "name",
      +              "municipality",
      +              "canton",
      +              "country"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "source": {
      +          "description": "The directory, its version and the credit ©swisstopo that its terms require.",
      +          "type": "string"
      +        },
      +        "status": {
      +          "description": "match | town_mismatch | other_country | postcode_not_listed | not_verifiable | directory_unavailable. not_verifiable: the postcode is not in the directory, which lists territory only, while the town is listed under other postcodes of the same postal area (a post-office box or business postcode is likely).",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "status",
      +        "localities",
      +        "detail",
      +        "source",
      +        "as_of"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Swiss and Liechtenstein addresses with a postcode and a town: whether the two go together in the official directory of localities of swisstopo. Informative, beside the format verdicts: it does not change conforms or valid. The street is not checked. null for any other address."
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "scheme",
      -  "conforms",
      -  "findings",
      -  "note"
      -]New value: +[
      +  "scheme",
      +  "conforms",
      +  "findings",
      +  "postcode_locality",
      +  "note"
      +]
  2. Added

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, non-destructive behavior, and the description adds substantial context beyond them: pass/fail/not_applicable verdict semantics, conforms being true only if nothing failed, the reason cbpr+ is deliberately absent, timetable caveats (SPS 2026, Fedwire 2027, SIC non-validation), and rate-limit/auth details. No contradictions.

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?

Purpose, USE WHEN, and DO NOT USE are front-loaded correctly, but the description is very long and includes an extended cost/free-tier/auth paragraph that is noisy for tool selection. The key operational guidance earns its place; the repeated quota and key instructions do not.

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 nested address object and a shipped output schema, the description covers everything needed to call correctly: scheme meanings, verdict semantics, the role of source citations, limitations (no street lookup), and schedule caveats. Output values are explained in the schema, so no gap remains.

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 coverage is 100%, so the schema already documents both parameters and the address fields. The description still adds value by explaining what 'sps', 'hvps_plus' and 'fedwire' actually mean and why no cbpr+ enum exists, plus the CH/LI postcode block nuance.

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?

States a specific verb and resource: checks a structured ISO 20022 postal address against a named payment rail's published rules, rule by rule, with cited sources. It distinguishes itself from sibling tools (validate_iban, lookup_bic) and from the informative postcode_locality block, so an agent knows exactly what this tool is for.

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?

Explicit USE WHEN clause (assembling pain.001/Fedwire/T2 messages, before submission) and an explicit DO NOT USE clause (verifying that a street exists). It also names the alternative path for CH/LI postcode/town checks, which is full routing guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.