Skip to main content
Glama

Batch Validate IBANs

batch_validate_iban
Read-onlyIdempotent

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: $0.002 per IBAN (free: 10 units/IP/day on this transport, one per call and one per IBAN in batch_validate_iban, or a free API key at POST https://api.ibanforge.com/v1/keys/generate for 200 REST calls/month).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
ibansYesArray of IBANs (1-100)

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
countYesNumber of IBANs processed.
resultsYesOne result per input IBAN, in the same order. Same shape as validate_iban.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed14 schema fields changed
    • removedOutput schema / properties / results / items / properties / bank_code_check / properties / match / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / bank_code_check / properties / match / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / bank_code_check / properties / register / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / bank_code_check / properties / register / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / bic / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "authoritative": {
      -        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. In Switzerland the register confirms the code while the BIC still comes from our curated map.",
      -        "type": "boolean"
      -      },
      -      "bank_name": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "basis": {
      -        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE and BG; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      -        "type": "string"
      -      },
      -      "city": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "code": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "code",
      -      "bank_name",
      -      "city"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "authoritative": {
      +        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. In Switzerland the register confirms the code while the BIC still comes from our curated map.",
      +        "type": "boolean"
      +      },
      +      "bank_name": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "basis": {
      +        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE and BG; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      +        "type": "string"
      +      },
      +      "city": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "code": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "bank_name",
      +      "city"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / results / items / properties / clearing / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "eurosic": {
      -        "type": "boolean"
      -      },
      -      "iid": {
      -        "type": "string"
      -      },
      -      "instant_payments_chf": {
      -        "type": "boolean"
      -      },
      -      "name": {
      -        "type": "string"
      -      },
      -      "qr_iid": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "sic": {
      -        "type": "boolean"
      -      },
      -      "town": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "type": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "iid",
      -      "name",
      -      "type",
      -      "town",
      -      "sic",
      -      "instant_payments_chf",
      -      "eurosic",
      -      "qr_iid"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "eurosic": {
      +        "type": "boolean"
      +      },
      +      "iid": {
      +        "type": "string"
      +      },
      +      "instant_payments_chf": {
      +        "type": "boolean"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "qr_iid": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "sic": {
      +        "type": "boolean"
      +      },
      +      "town": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "iid",
      +      "name",
      +      "type",
      +      "town",
      +      "sic",
      +      "instant_payments_chf",
      +      "eurosic",
      +      "qr_iid"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / results / items / properties / official_identity / properties / address / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / official_identity / properties / address / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / official_identity / properties / lei / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / official_identity / properties / lei / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / risk_indicators / properties / issuer_type / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / risk_indicators / properties / issuer_type / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / sepa / properties / vop_participant / anyOf
      Removed value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / sepa / properties / vop_participant / type
      Added value: +[
      +  "boolean",
      +  "null"
      +]
  2. Changed3 schema fields changed
    • addedOutput schema / properties / results / items / properties / cost_usdc / description
      Added value: +"What THIS IBAN was billed. Zero on the free MCP tier."
    • addedOutput schema / properties / results / items / properties / list_price_usdc
      Added value: +{
      +  "description": "Catalogue price per IBAN on the paid REST/x402 route.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / results / items / properties / sepa / properties / basis
      Added value: +{
      +  "enum": [
      +    "country_default",
      +    "epc_register"
      +  ],
      +  "type": "string"
      +}
  3. Changed2 schema fields changed
    • addedOutput schema / properties / results / items / properties / bank_code_check / properties / reason
      Added value: +{
      +  "description": "WHY the verdict is not verified, as one token to branch on. Absent when status is verified. not_allocated (a national register denies the code — the only value that licenses \"do not send\") | absent_from_reference_data (our composite map does not carry it; the country register was not consulted) | no_reference_data_for_country | register_names_no_holder (the register defines the code space and publishes no holder — silence, not a denial) | national_register_unavailable (the register this country is normally decided against could not be consulted) | lookup_failed (the lookup could not run: timeout, unreadable database). The last two describe IBANforge, never the beneficiary. Never escalate either into a refusal.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / results / items / properties / bic / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "bank_name": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "city": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "code": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "code",
      -      "bank_name",
      -      "city"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "authoritative": {
      +        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. In Switzerland the register confirms the code while the BIC still comes from our curated map.",
      +        "type": "boolean"
      +      },
      +      "bank_name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "basis": {
      +        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE and BG; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      +        "type": "string"
      +      },
      +      "city": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "code": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "bank_name",
      +      "city"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  4. Changed1 schema field changed
    • addedOutput schema / properties / results / items / properties / official_identity
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Who a central bank says holds 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": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "One-line registered address as published."
      +    },
      +    "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": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "matched_by": {
      +      "description": "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. Relay it.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "name",
      +    "lei",
      +    "address",
      +    "category",
      +    "matched_by",
      +    "source",
      +    "free_of_charge",
      +    "as_of",
      +    "authoritative"
      +  ],
      +  "type": "object"
      +}
  5. Changed1 schema field changed
    • addedOutput schema / properties / results / items / properties / sepa / properties / vop_participant
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  6. Changed3 schema fields changed
    • changedOutput schema / properties / results / items / properties / bank_code_check / properties / authoritative / description
      Previous value: -"True only where the reference set is the national register (CH, LI). Only then does not_in_register mean the code is not allocated."New value: +"True only where the reference set is the national register (CH, LI, DE). Only then does not_in_register mean the code is not allocated."
    • addedOutput schema / properties / results / items / properties / bank_code_check / properties / retired
      Added value: +{
      +  "description": "True when an authoritative register is withdrawing the code. Still a verified result: it WAS allocated.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / results / items / properties / bank_code_check / properties / superseded_by
      Added value: +{
      +  "description": "The bank code that takes over. Re-paper the beneficiary against it.",
      +  "type": "string"
      +}
  7. Changed1 schema field changed
    • addedOutput schema / properties / results / items / properties / next_steps
      Added value: +{
      +  "description": "Ordered advice derived from THIS result: what blocks a payment first, what merely enriches it after. Branch on `code`, never on the prose. `because` names the field that produced the step so the advice is auditable. Empty for an IBAN that failed validation.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "description": "An IBANforge call that performs the step, when one exists.",
      +        "type": "string"
      +      },
      +      "because": {
      +        "description": "The response field that produced this step.",
      +        "type": "string"
      +      },
      +      "code": {
      +        "description": "Stable identifier. Branch on this.",
      +        "type": "string"
      +      },
      +      "do": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "do",
      +      "because"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  8. Changed7 schema fields changed
    • addedOutput schema / properties / results / items / properties / bank_code_check
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "as_of": {
      +      "type": "string"
      +    },
      +    "authoritative": {
      +      "description": "True only where the reference set is the national register (CH, LI). Only then does not_in_register mean the code is not allocated.",
      +      "type": "boolean"
      +    },
      +    "candidates": {
      +      "description": "BIC8 the prefix matched; >1 means the BIC may belong to another institution.",
      +      "type": "number"
      +    },
      +    "match": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "register (exact key) | prefix (bic8 LIKE heuristic) | null"
      +    },
      +    "register": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "status": {
      +      "description": "verified | not_in_register | unavailable. A separate verdict on the bank code, so bic:null stops meaning three different things.",
      +      "type": "string"
      +    },
      +    "value": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "value",
      +    "status",
      +    "match",
      +    "register",
      +    "authoritative",
      +    "as_of"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / results / items / properties / issuer / properties / classification
      Added value: +{
      +  "type": "string"
      +}
    • changedOutput schema / properties / results / items / properties / issuer / required
      Previous value: -[
      -  "type",
      -  "name"
      -]New value: +[
      +  "type",
      +  "name",
      +  "classification"
      +]
    • addedOutput schema / properties / results / items / properties / risk_indicators / properties / issuer_type / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / results / items / properties / risk_indicators / properties / issuer_type / type
      Removed value: -"string"
    • addedOutput schema / properties / results / items / properties / risk_indicators / properties / sepa_reachable_scope
      Added value: +{
      +  "type": "string"
      +}
    • changedOutput schema / properties / results / items / properties / risk_indicators / required
      Previous value: -[
      -  "issuer_type",
      -  "country_risk",
      -  "test_bic",
      -  "sepa_reachable",
      -  "vop_coverage"
      -]New value: +[
      +  "issuer_type",
      +  "country_risk",
      +  "test_bic",
      +  "sepa_reachable",
      +  "sepa_reachable_scope",
      +  "vop_coverage"
      +]
  9. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "count": {
      +      "description": "Number of IBANs processed.",
      +      "type": "number"
      +    },
      +    "results": {
      +      "description": "One result per input IBAN, in the same order. Same shape as validate_iban.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "bban": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "account_number": {
      +                "type": "string"
      +              },
      +              "bank_code": {
      +                "type": "string"
      +              },
      +              "branch_code": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "bank_code",
      +              "account_number"
      +            ],
      +            "type": "object"
      +          },
      +          "bic": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "bank_name": {
      +                    "anyOf": [
      +                      {
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ]
      +                  },
      +                  "city": {
      +                    "anyOf": [
      +                      {
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ]
      +                  },
      +                  "code": {
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "code",
      +                  "bank_name",
      +                  "city"
      +                ],
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "clearing": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "eurosic": {
      +                    "type": "boolean"
      +                  },
      +                  "iid": {
      +                    "type": "string"
      +                  },
      +                  "instant_payments_chf": {
      +                    "type": "boolean"
      +                  },
      +                  "name": {
      +                    "type": "string"
      +                  },
      +                  "qr_iid": {
      +                    "anyOf": [
      +                      {
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ]
      +                  },
      +                  "sic": {
      +                    "type": "boolean"
      +                  },
      +                  "town": {
      +                    "anyOf": [
      +                      {
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ]
      +                  },
      +                  "type": {
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "iid",
      +                  "name",
      +                  "type",
      +                  "town",
      +                  "sic",
      +                  "instant_payments_chf",
      +                  "eurosic",
      +                  "qr_iid"
      +                ],
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "cost_usdc": {
      +            "type": "number"
      +          },
      +          "country": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "code": {
      +                "type": "string"
      +              },
      +              "name": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "code",
      +              "name"
      +            ],
      +            "type": "object"
      +          },
      +          "error": {
      +            "type": "string"
      +          },
      +          "error_detail": {
      +            "type": "string"
      +          },
      +          "iban": {
      +            "type": "string"
      +          },
      +          "issuer": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "name": {
      +                "type": "string"
      +              },
      +              "type": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "type",
      +              "name"
      +            ],
      +            "type": "object"
      +          },
      +          "risk_indicators": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "country_risk": {
      +                "type": "string"
      +              },
      +              "issuer_type": {
      +                "type": "string"
      +              },
      +              "sepa_reachable": {
      +                "type": "boolean"
      +              },
      +              "test_bic": {
      +                "type": "boolean"
      +              },
      +              "vop_coverage": {
      +                "type": "boolean"
      +              }
      +            },
      +            "required": [
      +              "issuer_type",
      +              "country_risk",
      +              "test_bic",
      +              "sepa_reachable",
      +              "vop_coverage"
      +            ],
      +            "type": "object"
      +          },
      +          "sepa": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "member": {
      +                "type": "boolean"
      +              },
      +              "schemes": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "vop_required": {
      +                "type": "boolean"
      +              }
      +            },
      +            "required": [
      +              "member",
      +              "schemes",
      +              "vop_required"
      +            ],
      +            "type": "object"
      +          },
      +          "valid": {
      +            "type": "boolean"
      +          }
      +        },
      +        "required": [
      +          "iban",
      +          "valid",
      +          "cost_usdc"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "results",
      +    "count"
      +  ],
      +  "type": "object"
      +}
  10. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark the operation as read-only, idempotent, and non-destructive. The description adds valuable behavioral context beyond that: detailed cost per IBAN, free tier limits, the exact return shape ({ results, count, valid_count }), and a note that results match validate_iban's shape. No contradictions 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.

Conciseness4/5

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

The description is longer than average but well-structured with clear 'USE WHEN', 'RETURNS', and 'COST' sections. Every sentence contributes either usage guidance, return details, or pricing. The cost explanation is a bit detailed but relevant for decision-making. It is efficient despite the length.

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?

Combined with the output schema and annotations, the description provides everything needed to call the tool correctly: purpose, batch limit, trigger conditions, return shape, and cost considerations. There are no missing pieces that would cause an agent to misuse it.

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 describes the 'ibans' parameter as an array of 1-100 strings (100% coverage). The description repeats the 'up to 100' limit but does not add format, examples, or edge-case guidance beyond what the schema provides. This meets the baseline of 3 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 states a specific verb ('Validate'), a resource ('IBANs'), and a clear batch constraint ('up to 100 IBANs in a single call'). It also distinguishes itself from the sibling validate_iban by highlighting the batch nature and cost advantage, so an agent can immediately tell it apart.

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' scenarios: pasting a list, cleaning a CSV/spreadsheet, deduping a customer database, triaging a payout list. It also gives a concrete decision rule: use instead of validate_iban when calling it more than 2-3 times in a row, and notes the cost difference. This fully covers when-to-use and alternatives.

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.

TDQS

A4.5/5.0
Disambiguation4/5

Each tool has a distinct job, and the descriptions provide strong USE WHEN/DO NOT USE cues. The only plausible boundary cases are validate_iban vs batch_validate_iban (single vs bulk) and validate_iban vs check_compliance (general enrichment vs payment-risk triage), but both are clearly signposted.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern: validate_iban, check_compliance, lookup_bic, send_feedback, etc. batch_validate_iban reads as a compound verb + object and does not break the convention, and the verb choice also aligns with intent: validate for format checks, check for rule/risk checks, lookup for directory data.

Tool Count5/5

Eight tools are well-scoped for an IBAN validation and payment-intelligence API: single/batch validation, compliance, address rules, reference validation, BIC and Swiss clearing lookups, and feedback. Each tool carries a distinct capability and none feels redundant or padding.

Completeness5/5

The surface covers the full IBAN-informed workflow: validation, enrichment, batch processing, BIC/Swiss clearing resolution, payment-reference pairing, postal-address rail rules, and pre-payment compliance triage. Explicit limitations such as not verifying account existence or payee identity are domain constraints, not missing tools.