Skip to main content
Glama

Server Details

Cross-border payment & banking intelligence for AI agents: SWIFT/BIC, IBAN, sanctions, FX, tracking.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL

Available Tools

34 tools
bank_holidaysAInspect

Get bank/public holidays for a country with payment impact analysis.

Returns all public holidays plus a 'payment_impact' section that shows:

  • Whether today is a business day or holiday in this country

  • Upcoming holidays in the next 14 days

  • Recent holidays in the last 14 days — for diagnosing a payment that is ALREADY stuck ("in progress for N days", "sent X days ago"). A recent holiday only counts if BOTH hold: it falls INSIDE the payment's own window (on or after the send date), AND its 'costs_a_business_day' is true. One that predates the send date is irrelevant, and one on the country's banking weekend closed nothing that was open — neither may be subtracted or given to the user as a cause. An empty list affirmatively means no recent holiday explains the delay — do not invent one from training data.

  • Every holiday entry (upcoming, recent, and next_holiday_after_today) carries 'costs_a_business_day'. Roughly one holiday date in six lands on its own country's weekend and shortens nothing; check the flag before quoting a holiday as a delay, a closure or a reason a window was short.

  • elapsed_business_days_by_send_date — the AUTHORITATIVE elapsed business-day count keyed by send date (weekends + this country's holidays already excluded). Use it verbatim instead of hand-counting.

  • Next business day and how many consecutive non-business days remain This context helps determine if holidays are causing payment delays.

Args: country_code: ISO 3166-1 alpha-2 code (e.g., "US", "DE", "GB") year: Year (default: current year). Range: 2020-2030.

Examples: bank_holidays("US") bank_holidays("DE", 2026) bank_holidays("GB", 2025)

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNo
country_codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries full burden and excels. It reveals the internal logic of payment_impact analysis, the meaning of 'costs_a_business_day', the conditions for a holiday to count, and the authoritative nature of elapsed_business_days_by_send_date. It also warns against misinterpreting empty lists, providing transparent boundaries.

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 sections and bullet points. Every paragraph adds value; however, the diagnostic bullet is dense and could be tightened. It is not as concise as a two-sentence description, but length is justified by complexity.

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 purpose, parameters, return sections, edge cases, and examples. It anticipates the user's diagnostic needs and explains the semantics of the output. For a tool with two parameters and no annotations, it is exceptionally complete.

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?

Schema description coverage is 0%, so the description fully compensates. It defines country_code as ISO 3166-1 alpha-2 with examples, and year as optional with default current year and a range 2020-2030. Both parameters are clearly explained and mapped to usage.

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+resource: 'Get bank/public holidays for a country with payment impact analysis.' It clearly distinguishes this tool from siblings like is_business_day_check and country_banking_rules by focusing on the payment impact analysis, not just listing holidays.

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 states when to use: 'for diagnosing a payment that is ALREADY stuck' and provides decision rules for interpreting recent holidays. It includes a caveat to not invent holidays from training data, and directs to use the authoritative business-day count 'verbatim instead of hand-counting.' This goes beyond vague context to actionable guidelines.

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

banks_using_correspondentAInspect

Reverse SSI lookup — find banks that use a given correspondent for a currency.

Given a correspondent BIC, currency, and origin country, returns the banks in that country that have a declared nostro at the correspondent for that currency. Inverse of ssi_lookup.

Returns only swift + name per bank — to retrieve the account number, intermediary chain, or other SSI details for a specific bank from the result list, call ssi_lookup(bank_swift, currency) on it.

Country and currency are required (not optional) — both bound the result set and the query is rejected without them.

Requires an API key with an active PRO, VIP, or FI subscription. Tight per-account daily caps apply (5/day on PRO, 10/day on VIP/FI/trial).

Args: correspondent_swift: BIC of the correspondent bank (e.g. "IRVTUS3N"). currency: ISO 4217 (e.g. "USD"). country: ISO 3166-1 alpha-2 of the client banks (e.g. "AE"). name_prefix: Optional prefix on bank name (e.g. "AL"). page: 1–4. Defaults to 1. api_key: Your Ohmyfin API key (prod-...). Can also be passed via KEY header or Authorization: Bearer header.

Examples: banks_using_correspondent("IRVTUS3N", "USD", "AE") banks_using_correspondent("CITIUS33", "USD", "SA", name_prefix="AL")

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
api_keyNo
countryYes
currencyYes
name_prefixNo
correspondent_swiftYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Since no annotations are provided, the description carries full responsibility. It discloses critical behavioral traits: the tool returns only swift and name per bank (not account numbers), country and currency are required and bound the result set, API key requirements, subscription tiers, strict daily caps (5/day PRO, 10/day VIP/FI/trial), and pagination limits (page 1–4). This level of detail ensures the agent understands constraints and side effects.

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: a clear one-sentence summary, followed by a detailed explanation of behavior and constraints, then a bullet-like list of parameters with types and defaults, and finally concrete examples. Every sentence adds value; there is no redundancy or fluff. The front-loading of the core purpose and inverse relationship is effective.

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 (6 parameters, cross-domain functionality) and the presence of an output schema, the description is complete. It explains the return format (swift and name only), required parameters, optional parameters, usage caveats (no account numbers), authentication requirements, rate limits, and examples. No significant gaps remain for an agent to invoke the tool correctly.

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?

With 0% schema description coverage, the description compensates fully. It explains each parameter: correspondent_swift with example 'IRVTUS3N', currency as ISO 4217, country as ISO 3166-1 alpha-2, name_prefix as optional prefix, page range 1–4, and api_key with alternative header options. It also emphasizes that country and currency are mandatory and bound the result set. Examples show parameter combinations, adding meaning beyond the raw 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 explicitly states 'Reverse SSI lookup — find banks that use a given correspondent for a currency.' It clearly identifies the verb 'find', resource 'banks', and context 'using a correspondent'. It also distinguishes itself from the sibling 'ssi_lookup' by calling it the inverse, providing clear purpose differentiation.

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 guidance on when to use this tool (reverse SSI lookup) and when not (for retrieving account numbers, it directs users to 'ssi_lookup'). It also details requirements: country and currency are required, an API key with specific subscriptions (PRO, VIP, FI) is needed, and daily caps are mentioned. Examples illustrate correct usage, making it highly instructive.

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

company_registriesAInspect

EXPERIMENTAL — List available company registries and supported jurisdictions.

Returns the list of company registries that can be searched, along with the jurisdiction codes you can use in company_search_person and company_search_company. This is the LIVE list and outranks the codes named in those two tools' descriptions.

Any country code not returned here has no registry behind it: a search naming it comes back empty and "completed", which does not mean the company is unregistered. XX (GLEIF LEI) is global and is the fallback for those jurisdictions.

No API key required.

Examples: company_registries()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description carries full behavioral disclosure. It labels the tool as 'EXPERIMENTAL,' notes 'No API key required,' and explains the behavior of searches with unregistered jurisdictions (empty 'completed' results) and the `XX` (GLEIF LEI) global fallback. This is thorough and goes beyond the typical surface-level description.

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 a one-line purpose and 'EXPERIMENTAL' warning, then provides necessary context about jurisdiction codes and fallback behavior, ending with an example. Every sentence serves a distinct purpose, and the structure is clean and 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 tool has zero parameters and an output schema exists, the description doesn't need to detail return fields. It covers purpose, usage context, behavioral caveats, and authentication requirements, making it complete for an agent to understand when and how to use the tool.

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 tool takes zero parameters, and the input schema is empty. The example `company_registries()` makes the lack of arguments unambiguous, and the description's mention that it lists registries with no input requirements adds crystal-clear 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 clearly states 'List available company registries and supported jurisdictions' with a specific verb and resource. It further distinguishes itself from sibling tools by explaining that it provides the authoritative list of jurisdiction codes for company_search_person and company_search_company, and that it outranks those tools' descriptions.

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 tells when to use this tool: to obtain the LIVE list of registry codes before using company search tools. It also explains that the returned codes take precedence over those in sibling tool descriptions and warns that unsupported country codes will return empty 'completed' results, preventing misinterpretation.

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

company_search_companyAInspect

EXPERIMENTAL — Search company registries for a company with its officers and shareholders.

Find company registrations across worldwide registries, including directors, officers, and beneficial owners (PSC/shareholders). Every entity found is automatically screened against sanctions lists.

You MUST specify at least one jurisdiction. "ALL" is not supported. Available jurisdictions: AM, AT, AU, BR, CA, CH, CZ, DE, DK, EE, FI, FR, IE, IL, IS, LT, LV, NL, NO, PL, SG, UK, XX. Call company_registries() for the live list — this one can go stale.

XX is GLEIF LEI, a GLOBAL registry rather than a country. Reach for it whenever the company sits outside the national registries above — a supplier in Hong Kong, mainland China, the US or the UAE. Hits carry an LEI, a registered address and a search.gleif.org URL the user can open.

A jurisdiction NOT on that list is dropped silently by the backend: you get total_results 0 with status "completed" and no error. That means the company was never searched for — it is NOT evidence that it is unregistered or fake, and saying so to someone checking a counterparty before wiring money is the most damaging thing this tool can do. Check jurisdictions_not_searched and coverage_warning in the response before you report an empty result.

Args: name: Company name to search for. jurisdictions: Country codes to search (required, e.g. ["UK"]). "ALL" is not supported — specify individual countries. include_sanctions_check: Auto-screen results against sanctions DB (default: true). include_officers: Include directors and officers (default: true). include_shareholders: Include PSC/beneficial owners (default: true). include_only_active: Filter to active companies only (default: false). api_key: Your Ohmyfin API key (prod-...). Can also be passed via KEY header or Authorization: Bearer header.

Examples: company_search_company("Equinor", jurisdictions=["NO"]) company_search_company("Acme Corp", jurisdictions=["UK", "DE"], include_only_active=True)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
api_keyNo
jurisdictionsYes
include_officersNo
include_only_activeNo
include_shareholdersNo
include_sanctions_checkNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description thoroughly discloses behavior: it is marked EXPERIMENTAL, auto-screens against sanctions, and explains the silent-drop behavior with total_results 0 and status 'completed' when a jurisdiction is not on the list. It also clarifies the meaning of an empty result and tells the user to check `jurisdictions_not_searched` and `coverage_warning`, adding significant behavioral insight.

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 (overview, jurisdiction constraints, warning, args, examples). The opening sentence and the following sentence are somewhat repetitive ('Search company registries' vs 'Find company registrations'), but the extra detail about beneficial owners and sanctions screening justifies the length. It is mostly front-loaded and each paragraph serves a distinct purpose.

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 7-parameter tool without annotations, the description covers: jurisdiction list and limitations, exception for XX (GLEIF LEI), silent failure semantics, sanctions screening, all parameter semantics, API key alternatives, and examples. Return values are covered by the output schema, so the description is complete for selection and invocation.

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 provides zero descriptions for all 7 parameters, but the description's Args section explains every parameter, including types, defaults, and constraints. For example, it clarifies that jurisdictions must be specified individually, "ALL" is not supported, and provides meaning for include_officers, include_shareholders, etc., fully compensating for the schema's lack of detail.

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 'Search company registries for a company with its officers and shareholders' — a specific verb plus clear resource. It further clarifies 'Find company registrations across worldwide registries, including directors, officers, and beneficial owners (PSC/shareholders)', which clearly distinguishes it from siblings like company_search_person and company_registries.

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 usage conditions: 'You MUST specify at least one jurisdiction. "ALL" is not supported', directs to 'Call company_registries() for the live list — this one can go stale', and offers specific guidance for the XX registry ('Reach for it whenever the company sits outside the national registries above'). It also warns about silent jurisdiction drops, which is critical usage context.

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

company_search_personAInspect

EXPERIMENTAL — Search company registries for a person's directorships, officer roles, and shareholdings.

Searches worldwide company registries to find where a person holds director, officer, or shareholder positions. Every person and company found is automatically screened against sanctions lists.

You MUST specify at least one jurisdiction. "ALL" is not supported. Available jurisdictions: AM, AT, AU, BR, CA, CH, CZ, DE, DK, EE, FI, FR, IE, IL, IS, LT, LV, NL, NO, PL, SG, UK, XX. Call company_registries() for the live list — this one can go stale.

XX is GLEIF LEI, a GLOBAL registry rather than a country. Use it for anyone connected to a company outside the national registries above.

A jurisdiction NOT on that list is dropped silently by the backend: you get total_results 0 with status "completed" and no error. That means the person was never searched for — it is NOT evidence they hold no roles. Check jurisdictions_not_searched and coverage_warning in the response before you report an empty result to the user.

Args: name: Person name to search for. jurisdictions: Country codes to search (required, e.g. ["UK", "NO"]). "ALL" is not supported — specify individual countries. include_sanctions_check: Auto-screen results against sanctions DB (default: true). include_inactive_roles: Include resigned/ceased roles (default: true). api_key: Your Ohmyfin API key (prod-...). Can also be passed via KEY header or Authorization: Bearer header.

Examples: company_search_person("John Smith", jurisdictions=["UK", "NO"]) company_search_person("Jane Doe", jurisdictions=["DE"])

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
api_keyNo
jurisdictionsYes
include_inactive_rolesNo
include_sanctions_checkNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and excels. It reveals that unsupported jurisdictions are silently dropped, resulting in a false-empty result with status 'completed' and no error. It also warns about the stale jurisdiction list and directs users to check `jurisdictions_not_searched` and `coverage_warning` in the response—critical behavioral insights beyond what any schema would encode.

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 and front-loaded: a one-line purpose, followed by necessary usage caveats, then Arg descriptions and examples. Every sentence serves a purpose—no fluff. The length is justified by the five parameters and the critical silent-drop behavior.

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 is remarkably complete for a tool with no annotations. It covers purpose, parameter semantics, edge cases (silent drops, stale jurisdiction list), response fields to verify (`jurisdictions_not_searched`, `coverage_warning`), and includes two examples. The existing output schema complements this well, so the description doesn't need to re-explain return values.

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 input schema has zero descriptions for parameters, so the description's Args section fully compensates. It explains each parameter: name, jurisdictions (required, with example format), include_sanctions_check (default true), include_inactive_roles (default true), and api_key (alternatives via headers). Concrete examples further clarify usage.

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 clear, specific verb-resource statement: 'Search company registries for a person's directorships, officer roles, and shareholdings.' This distinguishes it from its sibling company_search_company, which presumably searches for companies. It also mentions automatic sanctions screening, further refining the tool's purpose.

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 strong usage guidance: jurisdictions are mandatory, 'ALL' is not supported, the list can go stale (call company_registries() for the live list), and XX is a global registry. It gives explicit prerequisites and pitfalls, but it does not explicitly contrast this tool with alternatives like company_search_company. The when-to-use is implied by the person focus.

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

company_search_resultAInspect

EXPERIMENTAL — Retrieve cached company search results by search ID.

Every company_search_person and company_search_company call returns a search_id. Use this tool to retrieve those results again without re-running the search.

Args: search_id: The search_id from a previous company search response. api_key: Your Ohmyfin API key (prod-...). Can also be passed via KEY header or Authorization: Bearer header.

Examples: company_search_result("abc123-def456")

ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNo
search_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It discloses experimental status, that results are cached, and authentication methods, but lacks details on error handling or rate limits.

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?

Concise and well-structured with purpose, usage, args, and example. No unnecessary words.

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

Completeness4/5

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

Covers tool's purpose, parameters, authentication, and relation to siblings. With an output schema present, return values need not be explained. Lacks mention of potential errors.

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?

Despite 0% schema coverage, the description explains search_id as from a previous response and api_key with format hints, adding meaning beyond 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 the tool retrieves cached company search results by search ID, differentiating it from sibling search tools like company_search_person and company_search_company that produce the search_id.

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?

It explains to use this tool when you have a search_id from a previous search, and implicitly not to use it without one, mentioning the sibling tools that generate search_ids.

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

country_banking_rulesAInspect

Get banking rules and requirements for a country.

Returns IBAN requirements, SEPA membership, FATF listing status, national currency, account format specifications, and country-specific payment requirements (mandatory codes like KNP for Kazakhstan, Purpose of Payment for UAE, etc.).

The fatf_listing block is the authoritative answer to "is this country grey-listed / black-listed / under FATF increased monitoring". Both FATF public lists are held in full, so a not_listed status is a positive determination and not missing data. Use it instead of training data for any FATF question, and note that the coarse fatf field is a separate, weaker signal about regional-body membership that says nothing about listing.

Everything here is COUNTRY-level. currency is the country's national currency, not the denomination of any beneficiary account — never pair it with the payment currency to diagnose a currency mismatch (see currency_note in the response).

Use this to check country-specific STP rules that could cause payment delays, repairs, or rejections (e.g., missing purpose codes, regulatory fields).

If a country requires special payment codes, the response includes a payment_requirements block with field descriptions and categories. Use country_payment_codes to look up specific code values.

Args: country_code: ISO 3166-1 alpha-2 code (e.g., "DE", "US", "KZ")

Examples: country_banking_rules("DE") country_banking_rules("KZ") # includes KNP requirement info country_banking_rules("AE") # includes Purpose of Payment info

ParametersJSON Schema
NameRequiredDescriptionDefault
country_codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

With no annotations, the description carries full burden and does an excellent job. It explains that 'not_listed' is a positive FATF determination, that the coarse 'fatf' field is a weaker signal, and that 'currency' is national currency – not to be paired with payment currency. These are meaningful nuances that prevent misuse.

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: purpose, return details, critical caveats, usage guidance, args, examples. The structure is logical and front-loaded with the core purpose. No redundant or promotional language.

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 complexity (multiple data blocks, FATF nuance, currency caveat) and the presence of an output schema, the description covers all necessary context. It points to sibling tools for code lookup, addresses common misconceptions, and supplies examples for different countries. Nothing essential is 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?

Schema description coverage is 0%, so the description must compensate. It does: 'country_code: ISO 3166-1 alpha-2 code (e.g., "DE", "US", "KZ")' plus three concrete examples. This fully defines the parameter beyond the bare 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 opens with 'Get banking rules and requirements for a country' – a specific verb+resource+scope. It enumerates the exact data returned (IBAN, SEPA, FATF, currency, account formats, payment requirements), and differentiates from sibling country_payment_codes by directing users there for specific code values.

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?

Explicitly states when to use: 'Use this to check country-specific STP rules that could cause payment delays, repairs, or rejections.' It names an alternative tool for payment codes and gives a strong directive to prefer this over training data for FATF questions. Multiple clear usage contexts are provided.

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

country_export_controlsAInspect

Look up export control restrictions for a specific country.

Returns embargo status, sanctioned programs, control reasons, and restriction details across jurisdictions (US EAR, EU, UN, etc.) for the given country. Response also includes a payment_jurisdiction_note explaining when each listed restriction actually applies to a payment (US controls only bind when there's a US nexus, etc.).

IMPORTANT: Each jurisdiction's controls only bind a payment when the payment has a nexus to that jurisdiction. Use the jurisdiction filter when you know the payment's actual jurisdictional touchpoints (sender country, clearing currency, intermediary banks). For a CHF/EUR payment with no US bank in the chain, US export controls are informational only — do NOT cite them as compliance blockers without confirming a US nexus.

Args: country_code: ISO 3166-1 alpha-2 country code (e.g. "RU", "CN", "DE"). jurisdiction: Optional filter by jurisdiction (e.g. "US", "EU"). When omitted, returns restrictions from all jurisdictions.

Examples: country_export_controls("RU") # Russia — heavily embargoed country_export_controls("CN") # China — partial restrictions country_export_controls("DE") # Germany — minimal controls country_export_controls("RU", "US") # Russia, US jurisdiction only

Use case: 'What export restrictions apply to shipping to Russia?'

ParametersJSON Schema
NameRequiredDescriptionDefault
country_codeYes
jurisdictionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description fully discloses behavioral traits: returns restriction details across jurisdictions, highlights the jurisdiction nexus nuance and payment_jurisdiction_note. 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.

Conciseness5/5

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

Well-structured with purpose, important note, Args, Examples, Use case. Every sentence adds value. No 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 complexity of export controls and presence of output schema, the description covers all aspects: parameters, usage caveats, examples, and context. No gaps.

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 0%, but description compensates by explaining country_code as ISO 3166-1 alpha-2 and jurisdiction as optional filter with default behavior. Examples clarify usage. Could mention jurisdiction allowed values explicitly.

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 clearly states it looks up export control restrictions for a specific country, listing specific outputs (embargo status, sanctioned programs, etc.). Distinguished from sibling tools like sanctions_screen or export_controls_screen by focusing on country-level controls.

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?

Provides explicit guidance on when to use the jurisdiction filter and a critical note about binding jurisdiction. Includes examples and a use case. Could explicitly mention alternative tools for individual/entity screening but overall clear.

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

country_payment_codesAInspect

Look up country-specific payment codes (KNP, purpose codes, etc.).

Use country_banking_rules first to see which code types a country requires (in the payment_requirements block), then use this tool to find the right code value.

Args: country_code: ISO 3166-1 alpha-2 (e.g., "KZ", "AE") code_type: Code table to search (from payment_requirements required_fields[].code_type, e.g., "knp", "purpose_code") search: Optional keyword filter (e.g., "transport", "trade", "insurance")

Examples: country_payment_codes("KZ", "knp", "transport") country_payment_codes("KZ", "knp", "insurance") country_payment_codes("AE", "purpose_code", "trade") country_payment_codes("KZ", "knp") # all codes (large response)

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNo
code_typeYes
country_codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

No annotations provided, but description adds context about potential large response when no search filter, and explains the relationship with country_banking_rules. Could be improved by mentioning data freshness or rate limits.

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?

Concise and well-structured with an overview, Args section, and examples. No superfluous text.

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

Completeness4/5

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

Given no annotations and presence of output schema, the description covers purpose, usage, parameters, and a caveat. It references a relevant sibling tool (country_banking_rules). Minor missing aspects like error handling or exhaustive list of code types.

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?

With 0% schema description coverage, the description fully compensates by explaining each parameter: ISO alpha-2 format, code_type from payment_requirements, optional search filter. Examples illustrate usage.

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 verb 'look up' and resource 'country-specific payment codes (KNP, purpose codes, etc.)'. It distinguishes from siblings by referencing country_banking_rules as a prerequisite.

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?

Explicitly instructs to 'Use country_banking_rules first to see which code types a country requires... then use this tool'. Provides clear examples and explains optional search parameter.

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

eccn_lookupAInspect

Look up an Export Control Classification Number (ECCN).

Pure reference tool — returns classification details, controlled jurisdictions, and license requirements for the given ECCN.

ECCNs are alphanumeric codes (e.g. "5A001") used under export control regimes (US EAR, EU Dual-Use Regulation, Wassenaar Arrangement) to classify items that may require an export license.

Args: eccn: The ECCN to look up (e.g. "5A001", "3A001", "1C351").

Examples: eccn_lookup("5A001") # Telecommunications security equipment eccn_lookup("3A001") # Electronic components eccn_lookup("1C351") # Human pathogens, zoonoses, toxins

ParametersJSON Schema
NameRequiredDescriptionDefault
eccnYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Discloses that it returns classification details, controlled jurisdictions, and license requirements, and that it is a reference tool (no side effects). However, with no annotations, it lacks information on error behavior, rate limits, or authentication needs. The description is adequate but not thorough.

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?

Concise and well-structured: first line states purpose, second clarifies nature, then context, Args, and Examples. Every sentence is informative with no fluff. Length is appropriate for the simplicity of the tool.

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

Completeness4/5

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

Covers purpose, usage context (export control regimes), parameter examples, and return content. Lacks error handling details, but the presence of an output schema mitigates this. Overall sufficiently complete for a simple lookup tool.

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?

The input schema has 0% description coverage, but the description provides examples and explains the parameter meaning ('The ECCN to look up'). This adds significant value beyond the schema, compensating for the lack of schema descriptions.

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 clearly that the tool looks up an ECCN and returns classification details, jurisdictions, and license requirements. Distinguishes itself from siblings like 'export_controls_screen' by focusing on a specific code.

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

Usage Guidelines3/5

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

Labels itself as a 'pure reference tool' implying read-only usage, but does not explicitly compare to alternatives (e.g., when to use eccn_lookup vs export_controls_screen). Examples subtly guide usage but lack explicit when-not-to-use guidance.

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

export_controls_screenAInspect

Screen goods for export-control restrictions to a destination country.

Combines the goods classification with the destination's restriction status and returns whether a license is required, the risk level, applicable license policies (e.g. presumption of denial), control reasons (NS, MT, NP, CB, AT), and proliferation/dual-use flags. Identify the goods by ANY of: ECCN, HS code, or a free-text description (English or Russian).

IMPORTANT — jurisdiction nexus: each jurisdiction's controls only bind a payment/shipment when there is a nexus to that jurisdiction (US EAR binds US persons, USD-clearing, and US-origin items; EU/UK/JP bind their persons, currencies, and origin). Use jurisdiction="ALL" for a comprehensive multi-jurisdiction view, or pick the one matching the actual touchpoints.

IMPORTANT, prefer eccn or hs_code: goods_description is a fallback: the classifier matches it lexically, so a vague description still returns one specific HS code and it is usually the wrong one ("industrial machinery" returns bakery and pasta machinery). When you pass a description only, the result carries classification_basis and classification_confidence_note; read them, never quote the inferred code back to the user as their HS code or ECCN, and ask for the code on their invoice or export declaration. The destination findings (embargo, transshipment risk, screening duties) are NOT affected by that doubt, so report them normally.

Args: destination_country: ISO 3166-1 alpha-2 destination code (e.g. "RU", "CN"). eccn: Optional Export Control Classification Number (e.g. "3A001"). hs_code: Optional Harmonized System code, 4-8 digits (e.g. "854231"). goods_description: Optional free-text goods description (EN or RU). jurisdiction: "US" (default), "EU", "UK", "JP", "ITAR", or "ALL".

Provide at least one of eccn / hs_code / goods_description.

Examples: export_controls_screen("RU", eccn="3A001") # electronics → Russia export_controls_screen("CN", eccn="3A090") # advanced computing → China export_controls_screen("IR", goods_description="industrial valves") export_controls_screen("RU", goods_description="drone", jurisdiction="ALL") export_controls_screen("DE", hs_code="854231") # → Germany (allied)

Use case: 'Can we ship integrated circuits to Russia?'

ParametersJSON Schema
NameRequiredDescriptionDefault
eccnNo
hs_codeNo
jurisdictionNoUS
goods_descriptionNo
destination_countryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description fully carries the behavioral disclosure burden and does so richly. It explains the lexical classifier fallback, warns that vague descriptions return a likely-wrong HS code, instructs agents to never quote inferred codes as user-provided, and clarifies that destination findings are unaffected by classification doubt. These are meaningful behavioral traits beyond what any schema or annotation would show.

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 paragraphs, IMPORTANT callouts, an Args section, and examples. It front-loads the core purpose before adding caveats. Some redundancy exists (e.g., the final use case restates the opening purpose), but the length is justified by the high-stakes, complex domain and the need to warn about classifier pitfalls.

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 all essential aspects: input requirements, jurisdiction logic, classification uncertainty, return values (license, risk, policies, reasons, flags), and usage examples. An output schema is present, so the description does not need to enumerate every return field; it provides enough context for an agent to invoke the tool correctly and interpret results correctly.

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?

Schema description coverage is 0%, so the description must compensate, and it does. It explicitly lists each parameter, gives formats (ISO 3166-1 alpha-2, ECCN example, HS code digit range), acceptable jurisdiction values, and the 'at least one of' constraint. It also includes multiple usage examples that map parameters to real inputs, making parameter semantics far clearer than the raw 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 opens with a specific verb+resource combination: 'Screen goods for export-control restrictions to a destination country.' It clearly explains the tool's combined function (goods classification + destination restriction status) and differentiates it from siblings by mentioning the multi-jurisdiction and license-determination aspects, which are not covered by other tools like goods_classify alone.

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 gives a concrete use case ('Can we ship integrated circuits to Russia?') and provides guidance on when to use jurisdiction='ALL' versus a specific jurisdiction. It also warns against using goods_description when ECCN/HS code is available. However, it does not explicitly name alternative sibling tools or say 'use X instead when...', so it stops short of full when-not/alternatives guidance.

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

federal_register_changesAInspect

Get recent US regulatory changes from BIS and OFAC.

Returns Federal Register publications including entity list updates, rule changes, country policy shifts, and new sanctions programs.

Args: agency: Filter by agency — "BIS" (Bureau of Industry and Security) or "OFAC" (Office of Foreign Assets Control). Omit for both. category: Filter by change category — "entity_list", "rule_change", "country_policy", or "sanctions". Omit for all categories. severity: Filter by severity — "critical", "high", "medium", or "low". Omit for all severity levels. days: Number of days to look back (1–365). Default: 30. limit: Maximum number of results to return. Default: 50.

Examples: federal_register_changes() # Last 30 days, all federal_register_changes(agency="OFAC", days=7) # OFAC changes this week federal_register_changes(category="entity_list", severity="critical")

Use case: 'Any new entity list additions affecting China?'

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
limitNo
agencyNo
categoryNo
severityNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It clearly indicates the tool is read-only ('Returns Federal Register publications'), and describes the scope (date range, filters). It could explicitly state it does not modify data, but the context is sufficient.

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: a concise one-line purpose, a brief summary of return contents, then a clear 'Args' list. While the Args section is detailed, it is necessary given the parameter count. The examples and use case add value without 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 has an output schema (so return format is covered elsewhere), the description covers all input parameters with examples and a use case. It provides sufficient context for an agent to select this tool over siblings and invoke it correctly.

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?

Despite 0% schema description coverage, the description thoroughly explains all five parameters—their purpose, accepted values (e.g., 'BIS', 'OFAC', 'entity_list'), defaults, and constraints (days 1–365). This fully compensates for the missing schema descriptions.

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 retrieves 'recent US regulatory changes from BIS and OFAC' and lists specific categories like entity list updates, rule changes, etc. This specific verb+resource combination distinguishes it from sibling tools like 'country_export_controls' and 'sanctions_screen'.

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 multiple examples and a concrete use case ('Any new entity list additions affecting China?'), explicitly showing when and how to use the tool. The parameter descriptions and default values further guide appropriate usage.

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

fx_rateAInspect

Get the latest available reference (mid-market) exchange rate for a pair.

Rates are the official ECB euro foreign-exchange reference rates where the ECB publishes the currency; pairs whose currency the ECB does not cover (e.g. VND, NGN, PKR, KZT, MAD) fall back to a market data feed. ALWAYS check the source field before describing provenance: "ecb" = official ECB reference rate; "market" = indicative mid-market rate, NOT an ECB fixing — never call it "the ECB rate". The source_note field in the result states this explicitly. Coverage is wide (~60 currencies) but NOT universal — some currencies (e.g. CLP, COP, PEN) have no rate on file at all. When a leg is missing, the error names exactly which currency is uncovered: relay that we hold no rate rather than supplying one from your own knowledge. Non-EUR pairs are computed as cross-rates via EUR (e.g., USD/GBP = EUR/GBP / EUR/USD), so they are indicative mid-rates, not dealable/executable rates.

BOTH currencies are required. Always pass the exact pair you intend. There is no implicit default pair: a call that omits or mis-names a currency returns a "missing required argument" error rather than a silently-wrong rate. Never assume EUR/USD when the user asked about a different pair such as USD/VND.

Args: base: Base currency (ISO 4217, e.g., "USD") target: Target currency (ISO 4217, e.g., "VND")

Examples: fx_rate("EUR", "USD") fx_rate("GBP", "JPY") fx_rate("USD", "VND")

ParametersJSON Schema
NameRequiredDescriptionDefault
baseYes
targetYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and succeeds: it reveals dual data sources (ECB and market), the meaning of the 'source' and 'source_note' fields, cross-rate computation via EUR, possible missing currencies, and exact error behavior. This goes well beyond basic 'get rate' and covers important caveats the agent must 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?

Although long, the description is tightly structured with clear paragraphs: first the rate definition and source caveats, then cross-rate explanation, then requirements, then arguments and examples. Each sentence adds non-redundant information; the length is justified by the tool's behavioral nuances. Front-loaded with the main verb phrase.

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 is complete for a 2-parameter tool with an output schema. It covers provenance, edge cases (missing currencies), calculation methodology, error semantics, and argument requirements. Given the output schema exists, the description need not list return fields, but it already explains the key 'source' and 'source_note' fields. No significant gaps remain.

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 input schema only defines 'base' and 'target' as strings with no enum or description. The description compensates fully: explains they are ISO 4217 currencies, both are always required, gives multiple usage examples, and clarifies that omitting or mis-naming a currency returns an error. It also resolves ambiguity around ordering (e.g., USD/VND vs EUR/USD).

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+resource: 'Get the latest available reference (mid-market) exchange rate for a pair.' It distinguishes from siblings like fx_rate_history (history vs current), and adds useful qualifiers (reference, mid-market, latest). The examples make clear the tool returns a single rate for an exact pair.

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 extensive when-to-use details: check the 'source' field, never call market rates 'ECB rate', both currencies are required, no implicit default pair, and what to do when a currency is missing. However, it does not explicitly reference alternative sibling tools (e.g., fx_rate_history, fx_timing_advisor) or state when NOT to use this tool in favor of another, so it misses the 'alternatives' criterion for a 5.

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

fx_rate_historyAInspect

Get the historical reference exchange-rate series for a currency pair.

Returns series (the daily rates) plus the metadata needed to describe it honestly. READ series_coverage BEFORE CHARACTERISING THE PERIOD. days is the window we look back over, NOT a promise of how much history exists: our series start at different dates per currency, so a 365-day request routinely returns five months. series_coverage.first_date/last_date are what the numbers actually span, and series_coverage.truncated is true when that is shorter than you asked for. Say "the ~N months we hold", never "over the past year", and never fill the gap from your own knowledge.

CHECK source BEFORE ATTRIBUTING PROVENANCE. "ecb" = official ECB euro reference fixings, weekdays only. "market" = an indicative market data feed for a currency the ECB does not publish (AED, QAR, SAR, KWD, NGN, PKR, VND, KZT, RUB, UAH and ~20 more). A market series is NOT an ECB series and must never be described as one. Where a pair mixes the two, series_coverage reports the dates lost to aligning them.

peg_context appears when either currency is pegged, including when the peg is against some third currency: it names the anchor and the pair whose movement you are really looking at. Take the peg date from there rather than from memory.

An uncovered pair returns an error naming the missing leg instead of an empty series. Report that we hold no history rather than describing the rate as stable or range-bound.

BOTH currencies are required. Always pass the exact pair you intend. There is no implicit EUR/USD default: an omitted or mis-named currency errors rather than returning the wrong pair's history.

Args: base: Base currency (ISO 4217, e.g., "EUR") target: Target currency (ISO 4217, e.g., "USD") days: Lookback window in days (1-365, default 90). A ceiling on the window, not a guarantee of the number of points returned.

Examples: fx_rate_history("EUR", "USD", 30) fx_rate_history("GBP", "CHF", 365)

ParametersJSON Schema
NameRequiredDescriptionDefault
baseYes
daysNo
targetYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It openly explains that `days` is a ceiling not a guarantee, that series start at different dates per currency, that `series_coverage` reports what is actually spanned, that market data is not ECB, that peg context includes third-currency pegs, and that errors name the missing leg. This is exceptionally transparent about edge cases and potential misinterpretations.

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 sentence serves a purpose. It uses paragraphs, bolded warnings, and a clear separation between the main description, args, and examples. The structure makes important caveats prominent without being verbose or repetitive.

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 (source distinctions, data gaps, peg context) and the absence of annotations, this description is remarkably complete. It covers return values, error handling, historical coverage semantics, and user precautions. The presence of an output schema reduces the need to explain return structure, but the description still covers all important behavioral aspects, making it fully adequate for an agent to select and invoke the tool correctly.

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 provides no descriptions (0% coverage), so the description must compensate. It does so thoroughly in the Args section: base and target are defined as ISO 4217 codes, and days is explained as a lookback window with a default of 90 and a clear caveat that it is a ceiling, not a guarantee. The inclusion of examples further clarifies parameter usage.

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's purpose: 'Get the historical reference exchange-rate series for a currency pair.' It uses a specific verb ('Get'), identifies the resource ('historical reference exchange-rate series'), and distinguishes itself from the sibling 'fx_rate' tool by emphasizing 'historical'. This makes it unambiguous and differentiates it from other rate-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 Guidelines4/5

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

The description provides explicit usage guidance, including that both currencies are required, there is no implicit EUR/USD default, and how to interpret `series_coverage` and `source` fields. It also gives strong when-not guidance (e.g., never describe a market series as ECB, never fill gaps from memory). However, it does not explicitly mention alternatives or when to use this tool versus sibling tools like `fx_rate` or `fx_volatility`, so it falls short of a 5.

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

fx_timing_advisorAInspect

Get FX trading windows for FX execution timing and spread / rate optimization.

Returns market sessions and liquidity windows for a currency. Use this to understand:

  • Rate optimization (primary, reliable use): higher liquidity means tighter spreads and better rates. Execute during peak windows to minimize conversion costs.

  • Delay diagnosis (use with care): the FX market session is when a currency TRADES. It is NOT a guaranteed processing schedule for an inbound foreign-currency payment that the beneficiary bank converts on arrival. Conversion timing is beneficiary-bank-specific (some convert in real time during the session, others batch once or twice daily), so do NOT tell the user a payment is "held until the next session" and do not quote specific hold durations ("adds X hours", "overnight delay"); those are bank policy and are not in our data. For the binding delivery-side cutoff that gates the converted local-currency leg, call country_banking_rules(destination) and read local_clearing.systems. When a currency is restricted, this tool's own output carries an inbound_processing_note with the accurate framing to quote.

Pass a currency code to get its optimal window, or omit to get all market sessions and overlap windows.

Args: currency: ISO 4217 currency code (e.g., "EUR", "JPY"). Omit to get all sessions and overlaps.

Examples: fx_timing_advisor("EUR") fx_timing_advisor("JPY") fx_timing_advisor("INR") # Check INR conversion windows fx_timing_advisor()

ParametersJSON Schema
NameRequiredDescriptionDefault
currencyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries full burden for behavioral disclosure. It transparently explains that the FX market session is a trading window, not a guaranteed processing schedule, and warns against common misinterpretations. It also notes that restricted currencies carry an inbound_processing_note.

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 markdown headers and examples, and each sentence adds value. However, it is somewhat verbose (multiple paragraphs). For the tool's complexity, the length is justified, but it could be slightly more concise.

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 presence of an output schema (context signals indicate 'Has output schema: true'), the description covers the tool's purpose, usage, parameters, examples, and nuanced interpretation. It addresses common pitfalls and provides references to other tools, making it complete for an AI agent.

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?

Although schema description coverage is 0%, the description compensates by explaining the 'currency' parameter: pass a currency code for a specific window, or omit for all sessions and overlaps. Examples are provided, adding significant meaning beyond the schema's type definition.

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's purpose: 'Get FX trading windows for FX execution timing and spread / rate optimization.' It specifies the resource (FX trading windows) and the action (Get), and distinguishes it from sibling tools like fx_rate and fx_rate_history by focusing on timing and liquidity windows.

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 detailed usage guidance, including when to use the tool for rate optimization and when to use with care for delay diagnosis. It explicitly states what NOT to do ('do NOT tell the user a payment is held until the next session') and directs users to the country_banking_rules tool for delivery-side cutoffs, offering clear alternatives.

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

fx_volatilityAInspect

Get realized FX volatility for a currency pair, and size the FX risk on an exposure held to a future date.

Computes 30-day and 90-day annualized volatility from historical ECB reference rates (standard deviation of daily log returns, annualized by sqrt(252)). Returns a qualitative bucket: LOW (<5%), MEDIUM (5-15%), HIGH (15-25%), VERY_HIGH (>25%), PEGGED (currency peg — near-zero volatility, e.g., USD/AED, USD/HKD).

Also returns practical daily/weekly movement estimates and a settlement_risk_note explaining what the volatility means over a typical T+2 settlement period — use these to advise users on FX risk for their specific payment.

PASS horizon_days WHENEVER THE USER'S EXPOSURE RUNS PAST SETTLEMENT. It returns a horizon block: the volatility scaled to that horizon as an actual rate band at 1 and 2 sigma, which end of the band hurts a payer versus a receiver, and what the band does and does not tell them about hedging. Use it for questions shaped like:

  • "should I hedge / lock in / take a forward for ?"

  • "how far could move by ?"

  • "what rate should I budget for next year?"

  • "I have invoices in through 2027 — what is my risk?"

  • any exposure not settling within a few days. Count the calendar days from today to the date the exposure ends and pass that. Rough is fine — the band moves with the square root of time, so a month either way barely changes it.

Read sample_depth before quoting any figure: this is REALISED volatility from a short history, not implied volatility, and the sample may be shorter than the horizon asked about (horizon.beyond_sample). Say so.

IMPORTANT — the band is the range of FUTURE SPOT. It is not a rate anyone can transact at, and the width of the band is NOT the cost of a hedge. A forward is priced off the interest-rate differential between the two currencies, which we do not hold and must not guess or recall from memory. Relay horizon.hedge_cost_note rather than inventing forward points, a carry figure, or a "typical" hedging cost. Never state a forward rate.

Args: base: Base currency (ISO 4217, e.g., "EUR") target: Target currency (ISO 4217, e.g., "TRY") horizon_days: Optional. Calendar days from today to the end of the exposure (1-1825). Omit for spot/settlement risk only.

Examples: fx_volatility("EUR", "USD") fx_volatility("USD", "TRY") fx_volatility("GBP", "JPY", 506) # exposure running to end-2027 fx_volatility("EUR", "PLN", 90) # invoice settling in a quarter

ParametersJSON Schema
NameRequiredDescriptionDefault
baseYes
targetYes
horizon_daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

With no annotations, the description carries the full disclosure burden and does so thoroughly: it specifies the methodology (30/90-day annualized, standard deviation of log returns, sqrt(252)), explains qualitative buckets, and discloses critical caveats such as realized vs implied volatility, sample depth limitations, and the meaning of the future-spot band. It also explicitly warns that the band is not a transactable rate and not a hedge cost.

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 appropriately so for a complex tool; it is front-loaded with the core purpose, followed by structured guidance and a clear Args section. Each sentence adds actionable value, and the examples make scanning easy without 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 sparse schema but complex behavior, the description fully covers the tool's inputs, outputs, assumptions, limitations, and typical use cases. It references output fields like sample_depth and horizon.hedge_cost_note, which is sufficient even though an output schema exists.

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?

Schema description coverage is 0%, so the description must fully compensate for the parameters. It defines base and target as ISO 4217 currency codes and explains horizon_days in detail: optional, calendar days, range 1-1825, omit for spot-only, and practical examples that show usage patterns.

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: 'Get realized FX volatility for a currency pair, and size the FX risk on an exposure held to a future date.' It clearly distinguishes itself from sibling tools like fx_rate and fx_rate_history by emphasizing realized volatility, risk sizing, and horizon scaling.

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 gives explicit when-to-use guidance: pass horizon_days whenever exposure runs past settlement, omit for spot/settlement risk only, and provides concrete question examples. It also explains what not to do — never state a forward rate or invent hedging costs — which clearly separates it from alternatives.

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

goods_classifyAInspect

Classify goods for export control from a description (or HS code).

Bilingual (English / Russian, auto-detected) goods classifier. Returns the best-matching HS code (with EN+RU descriptions), related ECCNs, control reasons (NS, MT, NP, CB, AT...), an export-control level (high/medium/low/ none), a confidence score, and alternative matches for review.

This is destination-agnostic — it identifies WHAT the goods are and whether they are controlled in principle. To get the license decision FOR A SPECIFIC destination, pass the result into export_controls_screen.

IMPORTANT, the matcher is lexical, and confidence scores the strength of the string match, not the correctness of the classification: "equipment" returns semiconductor manufacturing equipment at confidence 1.0. Treat the code as a suggestion for narrowing the question. When no hs_code was supplied the result carries classification_basis and classification_confidence_note; read them before quoting any code, and ask the user for the HS code or ECCN on their shipping documentation.

Args: description: Goods description, min 2 chars (e.g. "uranium centrifuge", "центрифуга для урана"). Required. hs_code: Optional known HS code (4 or 6 digits) for a direct lookup. language: Optional hint — "en" or "ru" (auto-detected if omitted).

Examples: goods_classify("uranium centrifuge") # → HS 840120, ECCN 0B001 goods_classify("центрифуга для обогащения урана") # Russian query, same result goods_classify("semiconductor manufacturing equipment") goods_classify("", hs_code="840120") # direct HS lookup

Use case: 'Is a semiconductor lithography machine export-controlled?'

ParametersJSON Schema
NameRequiredDescriptionDefault
hs_codeNo
languageNo
descriptionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and does so excellently. It discloses the lexical matcher's behavior, explains that confidence reflects string match strength rather than classification correctness, and warns users to read classification_basis and classification_confidence_note when no HS code is supplied.

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 thorough yet well-structured. It front-loads the core purpose, then covers key behavior, parameters, and examples. Every sentence adds critical value, including the practical warning about lexical matching and the concrete use case at the end.

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 is complete for a tool of this complexity. It covers purpose, usage, limitations, parameters, examples, and expected return elements (HS code, ECCNs, control reasons, confidence, alternatives). Since an output schema exists, the description appropriately focuses on behavior and context rather than exhaustively listing return fields.

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 provides no parameter descriptions (0% coverage), but the description fully compensates: it explains description is required with min length, hs_code is optional for direct lookup, and language is an auto-detected hint. Examples also demonstrate parameter combinations, including empty description with hs_code.

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: 'Classify goods for export control from a description (or HS code).' It clearly differentiates from sibling tools by stating it is destination-agnostic and directs users to export_controls_screen for destination-specific decisions.

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?

Explicitly states when to use the tool (to identify what goods are and whether controlled in principle) and provides an alternative: 'To get the license decision FOR A SPECIFIC destination, pass the result into export_controls_screen.' It also clarifies the tool's limitations with the lexical matching caveat.

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

gpi_status_codesAInspect

Explain SWIFT GPI tracking status codes and provide stuck-payment investigation guidance.

USE THIS TOOL FIRST whenever the user reports a payment that is stuck, delayed, not arriving, held, pending, rejected, or otherwise not behaving as expected. It is the primary diagnostic entrypoint for payment investigation — calling with a specific code returns a full investigation playbook (common delay causes, recommended actions, GPI SLA timeframes, escalation steps).

Recommended calls by scenario:

  • Payment "stuck" / "in progress" / "pending" / "not arrived": gpi_status_codes("ACSP") → playbook for in-progress payments

  • Payment explicitly "on hold" / compliance review: gpi_status_codes("PDNG") → playbook for held payments

  • Payment "blocked" / sanctions flag: gpi_status_codes("BLCK") → playbook for blocked payments

  • Payment rejected by a bank in the chain (never credited): gpi_status_codes("RJCT") → rejection investigation playbook

  • Payment returned to sender (accepted then sent back): gpi_status_codes("RTRN") → return investigation playbook

  • Reference for ISO 20022 codes: gpi_status_codes() → list all codes

Each code call returns:

  • Code description and meaning

  • For ACSP/PDNG/BLCK/RJCT/RTRN: investigation playbook with common causes, recommended actions (request gCCT tracker, request pacs.002/pacs.004 reason code, verify beneficiary details, escalate via MT199, etc.), and common ISO 20022 reason codes (AC01, AC04, AG01, RR01-RR04, etc.) when applicable

  • Child reason codes (e.g., G001-G004 for ACSP) that narrow the cause further

Common codes: ACCC (success), ACSP (in progress), RJCT (rejected), PDNG (on hold), BLCK (blocked). GPI reason codes (G000-G004) qualify ACSP with more detail (e.g. G001 = cover payment sent, G002 = forwarded to next agent).

Examples: gpi_status_codes("ACSP") # stuck-payment diagnostic playbook gpi_status_codes("G001") # detail on a specific reason code gpi_status_codes() # full reference list

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description fully carries the transparency burden. It discloses exactly what each call returns: investigation playbooks, common causes, recommended actions, ISO 20022 reason codes, and child reason codes. It also explains the behavior of omitting the code, leaving no ambiguity about side effects or output.

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: purpose, usage-first directive, scenario table, return value breakdown, and examples. It uses bullets and bolded scenarios for scannability, and there is no redundant filler.

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 goes beyond by explaining domain concepts (GPI reason codes, child codes), providing realistic examples, and covering edge cases like omitted arguments. It is complete enough for an agent to select and invoke the tool correctly in the majority of payment-investigation contexts.

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 only documents a single nullable 'code' parameter with no description. The description compensates completely by explaining what values to pass, examples (ACSP, G001), and the meaning of omitting the code. It transforms the raw parameter into a fully understood API.

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 specific verbs ('Explain', 'provide') and clearly identifies the resource (SWIFT GPI tracking status codes). It distinguishes itself from sibling tools like track_payment and tracking_history by framing itself as the diagnostic entrypoint for stuck-payment investigation.

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 states 'USE THIS TOOL FIRST' for stuck payments and provides scenario-by-scenario recommended calls with concrete code arguments. It clearly signals when to call with a code versus without, and gives exclusions implicitly by listing specific scenarios.

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

hs_code_lookupAInspect

Reverse-lookup an HS code → mapped export-control classifications (ECCNs).

For customs brokers / shippers who have an HS (Harmonized System) code and need to know which export-control classifications may apply. Returns the mapped ECCNs with confidence levels, control reasons, sensitivity, and the governing international regime (Wassenaar, MTCR, NSG, etc.).

A 4-digit HS heading is accepted, but mappings are richest at the 6-digit subheading level (e.g. "854231" rather than "8542"). An empty mapping list means no export-control mapping is on file for that code — it is NOT a guarantee the goods are uncontrolled; confirm with goods_classify or a formal classification.

Args: hs_code: 4-6 digit HS code (e.g. "854231", "8411"). Dots/spaces are ok. jurisdiction: Optional filter — "US", "EU", "UK", or "JP".

Examples: hs_code_lookup("854231") # semiconductors → 3A001 / 3A090 ... hs_code_lookup("841112") # turbojet engines → 9A001 ... hs_code_lookup("854231", "US") # US mappings only

Use case: 'What export controls might apply to HS code 854231?'

ParametersJSON Schema
NameRequiredDescriptionDefault
hs_codeYes
jurisdictionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

No annotations are provided, so the description carries full burden. It clearly indicates the tool is a read-only lookup with no side effects, describes accepted input formats (dots/spaces allowed), and discloses that empty results lack certainty, directing users to formal classification.

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 clear sections (overview, details, Args, Examples, Use case) and front-loads the key purpose. It is slightly longer than necessary, but every sentence adds value. Minor redundancy could be trimmed (e.g., Example repetition).

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 (export control mapping with caveats), the description covers input requirements, output content (ECCNs, confidence, regime), limitations, and alternative tools. It even references output schema fields implicitly. No gaps remain for the agent to interpret.

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 has 0% description coverage (no parameter descriptions in schema), but the description includes an 'Args:' section that explains both parameters: hs_code (4-6 digits, dots/spaces ok) and jurisdiction (optional filter with examples). This fully compensates for the missing schema descriptions.

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 performs a reverse-lookup from HS codes to export-control classifications (ECCNs). It uses specific verbs ('reverse-lookup'), specifies the resource (HS code to ECCNs), and distinguishes itself from sibling tools like goods_classify and eccn_lookup by focusing on the mapping direction and use case.

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 explicitly targets customs brokers and shippers, advises on optimal input (6-digit vs 4-digit), and cautions that an empty mapping does not guarantee uncontrolled goods, recommending goods_classify for confirmation. However, it does not explicitly name all alternative tools or describe when not to use this tool.

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

iban_validateAInspect

Validate an IBAN and identify the institution that holds the account.

Performs format check, country-specific length check, and ISO 7064 mod-97 checksum verification. Also returns COUNTRY-level banking rules for the IBAN's country prefix (national currency, SEPA status, expected format).

CROSS-CHECKS THE BENEFICIARY BANK. Where the country's IBAN registry mask defines the bank identifier as four alpha characters (GB, NL, IE, RO, PK, MT, JO, QA, KW and others), bank_identifier.resolved_institution names the institution that actually holds the account, read out of the IBAN itself. Call this whenever the user supplies an IBAN AND names a beneficiary bank or BIC — if the two disagree, that mismatch is a far better explanation for a rejected or returned payment than anything you can infer, and it is invisible without this call.

valid: true means the check digits are right and NOTHING MORE — not that the account exists, is open, or belongs to the named beneficiary or the named bank. Never rule out the account details on the strength of it when diagnosing a failed payment (see verification_note).

An IBAN encodes country + bank + account number and carries NO currency information. country_currency is the country's national currency, NOT this account's denomination — never infer a currency mismatch or a "resend in X" recommendation from it (see currency_note in the response).

Examples: iban_validate("DE89370400440532013000") iban_validate("GB29 NWBK 6016 1331 9268 19")

ParametersJSON Schema
NameRequiredDescriptionDefault
ibanYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries full burden and does so thoroughly. It details what `valid: true` means (not that account exists or belongs to named beneficiary), warns about currency being country-level, and explains the bank cross-check resolution. It even references response fields like `verification_note` and `currency_note`, providing complete behavioral context.

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 front-loaded with the primary purpose, then uses structured paragraphs (validation steps, cross-check, caveats, examples). It is lengthy but every section adds critical information. A slight deduction for verbosity, though the organization and clear headers (CROSS-CHECKS, valid: true, currency) aid readability.

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 goes beyond it to explain response semantics (valid meaning, bank_identifier.resolved_institution, country_currency), potential use cases, and common pitfalls. The provided examples and warnings make the tool self-contained for an agent to use correctly in payment diagnostics.

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?

The schema has a single `iban` string with 0% coverage, so the description must compensate. It provides two clear examples of valid inputs (compact and space-separated) and explains that the IBAN encodes country+bank+account. It doesn't explicitly say 'the iban parameter is the IBAN string', but the examples and context make this unambiguous, adding meaningful semantics beyond the raw 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 opens with a specific verb+resource: 'Validate an IBAN and identify the institution that holds the account.' It clearly distinguishes this tool from siblings by focusing on IBAN validation and bank resolution, and it explains the cross-check feature that is unique to this tool.

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 states when to use the tool: 'Call this whenever the user supplies an IBAN AND names a beneficiary bank or BIC.' It also provides exclusion guidance, e.g., 'Never rule out the account details on the strength of it when diagnosing a failed payment.' This gives clear context and limits, outperforming typical tool descriptions.

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

is_business_day_checkAInspect

Check if a specific date is a business day in a country.

Accounts for weekends (country-specific) and public holidays. Returns whether the date is a business day, and if not, why (weekend or specific holiday name) and the next business day.

The response carries a today block with the server's real current date. Resolve any relative date in the user's question ("the 20th", "next Friday") against that, not against your own sense of today. A check_date already in the past also returns date_anchor_warning — heed it: a mis-resolved year flips the answer outright (2025-07-20 is a Sunday, 2026-08-20 is a Thursday).

Args: country_code: ISO 3166-1 alpha-2 code (e.g., "US", "DE") check_date: Date in ISO format (YYYY-MM-DD)

Examples: is_business_day_check("US", "2026-12-25") is_business_day_check("DE", "2026-03-12") is_business_day_check("GB", "2026-01-01")

ParametersJSON Schema
NameRequiredDescriptionDefault
check_dateYes
country_codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden. It honestly discloses the 'today' block, the date_anchor_warning for past dates, and concrete examples of year-mis-resolution flipping the answer (2025-07-20 vs 2026-08-20). This is far beyond a minimal description.

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?

Though a bit long, every sentence adds value: purpose, behavior, warnings, args, examples. It is well-structured, front-loaded with the core function, and the examples are representative. No fluff or redundant phrasing.

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 (relative dates, holiday logic, warnings), the description covers all critical aspects: return content (business day, reason, next business day), the 'today' block, and the date_anchor_warning. An output schema exists, so detailed return field documentation is unnecessary here.

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?

Schema description coverage is 0%, so the description must compensate. It does so by defining both parameters: country_code as ISO 3166-1 alpha-2 with examples ('US', 'DE') and check_date as ISO format (YYYY-MM-DD), plus three concrete usage examples that map parameters to real calls.

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: 'Check if a specific date is a business day in a country.' This clearly distinguishes it from siblings like bank_holidays (which likely lists holidays) and value_date (a settlement concept).

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?

It provides clear context for when to use the tool (any business-day question) and gives important guidance on resolving relative dates against the server's today block. However, it does not explicitly contrast itself with alternative tools, such as saying 'use instead of bank_holidays when you need a yes/no business-day answer.'

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

mcp_registerAInspect

Register for an Ohmyfin API key to use paid tools.

Creates an account and sends a 6-digit verification code to your email. After receiving the code, call mcp_verify to complete registration and get your API key.

By setting accept_terms to true, you confirm acceptance of the Ohmyfin Terms & Conditions (https://ohmyfin.ai/terms) on behalf of your operator, including the API/MCP access terms (Section 3A), sanctions screening terms (Section 3B), and financial data disclaimer (Section 3C).

Args: email: Your email address. organization_name: Your company or project name. accept_terms: Must be true. Confirms acceptance of the Ohmyfin Terms & Conditions at https://ohmyfin.ai/terms.

Examples: mcp_register("agent@example.com", "Acme Corp", true)

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYes
accept_termsYes
organization_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Describes key behaviors: sends verification code, requires accept_terms confirmation, and outlines legal implications by referencing specific terms sections. No annotations provided, so description carries the burden and does it well, though lacks mentions of rate limits or error handling.

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?

Description is well-structured with a clear purpose, parameter explanations, and an example. No unnecessary sentences every part adds value.

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

Completeness4/5

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

Covers tool purpose, parameters, and next steps. Given that an output schema exists, it's not required to explain return values. Lacks information on error cases or prerequisites, but sufficient for a registration tool.

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?

Even though schema description coverage is 0%, the description explains each parameter in detail: email, organization_name, and accept_terms with the requirement to be true and its legal significance. Includes a usage example demonstrating parameter usage.

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 states the tool registers for an Ohmyfin API key to use paid tools, describes the flow (creates account sends verification code), and distinguishes from sibling mcp_verify by indicating the next step.

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?

Provides clear context for when to use (registration step for API key) and what to do next (call mcp_verify). Doesn't explicitly state when not to use, but implicitly suggests it's for new users only.

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

mcp_verifyAInspect

Verify your email and receive your API key.

After calling mcp_register, check your email for the 6-digit code and pass it here. On success, returns your production and test API keys. You must subscribe at ohmyfin.ai/subscription to activate paid tools.

Args: email: The email you registered with. code: The 6-digit verification code from your email.

Examples: mcp_verify("agent@example.com", "123456")

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses success behavior (returns API keys) and mentions subscription activation for paid tools, but does not describe error cases (e.g., invalid code, expired code) or state changes, which limits transparency.

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 concise with 4 sentences plus Args and Examples. It front-loads the core purpose. The subscription mention is slightly tangential but not overly verbose. Overall efficient and well-structured.

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

Completeness4/5

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

Given the presence of an output schema, the description needn't detail return structure. It covers the workflow clearly: after registration, verify with code to get API keys. It lacks error handling details but is sufficient for a straightforward verification tool.

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 0%, but the description explicitly defines both parameters: 'email: The email you registered with' and 'code: The 6-digit verification code from your email.' This adds essential meaning beyond the bare 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 the tool verifies email and returns API keys. It distinguishes itself from the sibling tool mcp_register by explicitly mentioning 'after calling mcp_register', making the purpose and context unambiguous.

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 clear context on when to use (after mcp_register, check email for code) and includes an example. However, it does not explicitly mention when not to use or alternatives, missing some usage boundaries.

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

payment_cutoff_timesAInspect

Get payment system cutoff times for major clearing systems.

Covers RTGS (T2 — formerly TARGET2, CHAPS, Fedwire, BOJ-NET, SIC), net settlement (CHIPS, BACS), SEPA schemes (SCT, SCT Inst, OCT Inst, SDD Core, SDD B2B), FX settlement (CLS, FXYCS), and other systems (CIPS, SPEI, FAST).

For same-day EUR guidance: filter by currency="EUR" to retrieve all SEPA schemes plus T2 in one call — the scheme-level view is usually what treasurers need. Underlying CSMs (TIPS, RT1, EURO1, STEP2) are referenced in scheme notes.

DST-observing systems also carry season_now and operative_cutoff_today fields computed for the current date. cutoff_utc/cutoff_local are the STANDARD-TIME (winter) values; summer_offset holds the DST value. Quote the cutoff that operative_cutoff_today points at for TODAY's season — do not default to the winter figure when DST is currently in force (e.g. the T2 customer cutoff is 15:00 UTC in summer, not the 16:00 UTC winter value).

Args: system: System name (e.g., "T2", "TARGET2", "FEDWIRE", "CHAPS"). Case-insensitive. "TARGET2" and "T2" both resolve to the same entry (T2 is the post-March 2023 name). Omit to list all or filter by currency. currency: ISO 4217 currency code to filter by (e.g., "USD", "EUR").

Examples: payment_cutoff_times(system="T2") payment_cutoff_times(currency="EUR") payment_cutoff_times(currency="USD") payment_cutoff_times()

ParametersJSON Schema
NameRequiredDescriptionDefault
systemNo
currencyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

No annotations exist, so the description carries full responsibility. It thoroughly discloses behavioral nuances: the distinction between standard and DST values, the existence of `season_now` and `operative_cutoff_today`, the warning to quote today's operative cutoff rather than defaulting to winter values, and the alias handling for T2/TARGET2. This goes far beyond a basic read-only query description.

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?

Despite being long, the description is well-structured with clear sections (coverage, guidance, DST warning, Args, examples). Every sentence carries meaningful information—there is no fluff. The prominent DST warning is placed close to the top, ensuring agents notice the critical pitfall.

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 (many systems, DST handling, multiple parameters) and the presence of an output schema, the description is remarkably complete. It covers system coverage, currency filtering logic, DST behavior, parameter semantics, and usage examples. The guidance about which cutoff to quote is especially valuable for correct real-world 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 input schema provides only types without descriptions, so the description compensates fully. It explains both parameters in an 'Args' section, giving concrete examples ('system="T2"', 'currency="EUR"'), notes case-insensitivity, and clarifies that 'TARGET2' and 'T2' resolve to the same entry. This adds substantial meaning beyond the schema structure.

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 'Get payment system cutoff times for major clearing systems', a specific verb-resource pairing. It further details the exact systems covered (RTGS, net settlement, SEPA, FX, etc.) and distinguishes itself from sibling tools by focusing solely on cutoff times, not other payment-related queries.

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?

Provides clear usage guidance, e.g., 'For same-day EUR guidance: filter by currency="EUR" to retrieve all SEPA schemes plus T2 in one call' and explains how to interpret DST-sensitive values. While it does not explicitly mention when not to use or name alternatives (like settlement_eta or value_date), the instructions are concrete and contextual enough for an agent to apply correctly.

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

payment_method_compareAInspect

Compare payment methods and investigate fee deductions for a country pair.

Evaluates SEPA vs SWIFT vs domestic options. Also explains SWIFT charge options (OUR/SHA/BEN) and fee investigation — use this when the beneficiary received less than expected to understand where the money went and which MT103 fields reveal each deduction. Returns cost, speed, requirements, charge options, and step-by-step fee investigation guidance.

Args: source_country: ISO 3166-1 alpha-2 code (e.g., "DE", "US") dest_country: ISO 3166-1 alpha-2 code (e.g., "GB", "TR")

Examples: payment_method_compare("DE", "FR") # Both SEPA — will recommend SCT payment_method_compare("US", "TR") # Non-SEPA — will recommend SWIFT payment_method_compare("GB", "GB") # Domestic — will show CHAPS/FPS payment_method_compare("US", "VN") # Fee investigation — why beneficiary got less

ParametersJSON Schema
NameRequiredDescriptionDefault
dest_countryYes
source_countryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Without annotations, the description carries full burden for behavioral transparency. It explains that the tool evaluates methods, explains charge options (OUR/SHA/BEN), and returns cost, speed, requirements, and step-by-step fee investigation guidance. It does not mention side effects, but as a comparison/investigation tool, this is acceptable. It could disclose if it modifies data or has external calls, but given the nature, it's reasonably transparent.

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 and front-loaded with the main purpose, followed by details and examples. Every sentence adds value—no filler. It is concise yet comprehensive, using bullet points and examples effectively without being verbose.

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 (multiple payment methods, fee investigation), the description is complete. It covers inputs, behavior, and examples. Since an output schema exists (as indicated by context signals), the description does not need to enumerate return fields. The examples cover the main use cases, making the tool easy to use.

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?

Schema documentation coverage is 0% (no descriptions in schema properties), so the description must fully explain parameters. It does so clearly: both parameters (source_country, dest_country) are described as ISO 3166-1 alpha-2 codes, and examples are provided for each use case. This fully compensates for the missing schema descriptions.

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's purpose: compare payment methods and investigate fee deductions for a country pair. It lists specific methods (SEPA, SWIFT, domestic) and explicitly mentions fee investigation, distinguishing it from sibling tools that might focus on single-country or general banking data.

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 clear usage context, including when to use the tool for fee investigation ('when the beneficiary received less than expected'). It includes multiple examples showing different scenarios (SEPA, non-SEPA, domestic). However, it does not explicitly state when not to use this tool or mention alternatives among siblings, though the examples imply some differentiation.

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

sanctions_screenAInspect

Screen a name against global sanctions and watchlists.

FREE TIER: 3 screens per day without an API key. PAID: Unlimited screens with an API key.

Checks the name against 300+ sanctions, designation and watchlists worldwide, including US OFAC (SDN and non-SDN), EU, UK OFSI, Canada, Switzerland, Australia, New Zealand, Japan, Israel and national lists. Returns matching entities with similarity scores. The response says how many lists were actually searched (lists_searched); report THAT, and do not present a fixed per-jurisdiction table of "clear" rows, which asserts a per-list result the screen does not return and understates the coverage.

For a company or an individual the screen covers every list, including adverse media, PEP and debarment registers. For a BANK or other financial institution it returns sanctions DESIGNATIONS only: a warning-list entry naming a bank is usually a clone-firm alert about fraudsters impersonating it, and the feed carries nothing that tells the two apart.

When the name resolves in our bank directory, each designation is also cross-referenced against that institution's record (country, entity type, and the name or ALIAS that earned the fuzzy score) and contradicted rows are removed. ALWAYS read the verification block, which is on every response: applied: false means nothing was cross-referenced and the rows are raw feed output — either the name is not in our bank directory, or the subject is a company or individual, which has no directory record to check against. Never report an applied: false result as verified, and never report an empty one as verified-clear. Screening a bank by BIC, or calling swift_lookup, gets a verified answer.

A row surviving that cross-reference is NOT the same as a row the cross-reference supported. Each verified row carries adjudication: corroborated means the check backed it and it is a designation against this institution; not_corroborated means it survived the false-positive floor but nothing tied it to this institution — typically country_conflict: true, the designated entity being domiciled elsewhere. is_false_positive: false is only that floor test and is never a finding; read adjudication instead. When NOTHING is corroborated the response carries verification_gate.applied: true and recommended_action has been lowered from BLOCK to REVIEW: report a possible match needing identity confirmation, do not reinstate BLOCK from the row-level action fields, and do not report the institution as clear either — every row is still in matches and the open question is which legal entity the counterparty is.

On an unverified response every row also carries query_match, listing which of the screened words appear in that row's own name or aliases and which do not. Nothing is removed on account of it. Weigh it against the score: a row sharing one word out of four with the query is usually a different entity, and its action is that entity's action, not a verdict on the party screened. Absence is not proof — non-Latin aliases contribute no words, and a transliterated designation of the right party can show words missing — but where every query word is present, take the row at face value.

On a COMPANY or INDIVIDUAL screen the response also carries coverage_gate. It is the same question asked once for the whole payload: how much of the name you screened actually appears on the rows that are blocking. When applied is true the payload-level recommended_action has been lowered from BLOCK to REVIEW, because no blocking row carries more than half of the distinctive words you screened — report a possible match that needs identity confirmation, NOT a designation, and do not reinstate BLOCK from the row-level action fields. Nothing was removed: every row the feed returned is still in matches, with its own score and action intact. When applied is false the verdict is exactly what the feed set.

Args: name: The person or entity name to screen. api_key: Your Ohmyfin API key (prod-...). Can also be passed via KEY header or Authorization: Bearer header. Optional — free tier allows 3 screens/day without a key. threshold: Minimum match score 0-100 (default 85). subject_type: What is being screened: "bank" for a financial institution, "party" for a company or individual, or "auto" (default). A name the bank directory resolves is treated as a financial institution whatever you pass here.

Examples: sanctions_screen("Acme Trading Ltd") sanctions_screen("John Smith", threshold=90) sanctions_screen("First Abu Dhabi Bank", subject_type="bank") sanctions_screen("Acme Trading Ltd", api_key="prod-abc123...")

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
api_keyNo
thresholdNo
subject_typeNoauto

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description shoulders the full behavioral disclosure burden. It exceeds it remarkably: it details cross-referencing, the verification block, adjudication semantics (corroborated vs not_corroborated), coverage_gate behavior, what is and isn't removed, and how to handle unverified responses. It even explains the underlying logic of false-positive floors and warns against misreporting. No contradiction with annotations exists since none are provided.

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?

Though long, the description is densely informative and well-structured. It opens with a one-line purpose, then moves into tier/coverage details, bank-specific nuances, verification and adjudication logic, gates, and finally a clear Args section and examples. Every section earns its place; nothing is fluff. For a tool with this many behavioral subtleties, the length is justified and the structure helps an agent parse it.

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 tool is complex—multiple gates, adjudication values, verification blocks, and subject-type variations. The description covers all of them in depth, explains the output semantics (what fields mean, how to interpret them), and gives edge-case handling (e.g., bank clone-firm alerts, non-Latin aliases). It also warns against common reporting pitfalls. For the complexity level, nothing essential is 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 has zero description coverage, so the description must compensate entirely. The 'Args' section gives each parameter (name, api_key, threshold, subject_type) a full explanation: types, defaults, allowed values, and behavioral implications (e.g., subject_type options and how bank resolution overrides the passed value). It also provides concrete examples for different parameter combinations, adding meaning far beyond the raw 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 opens with a precise declaration: 'Screen a name against global sanctions and watchlists.' It names the verb (screen), resource (name against sanctions/watchlists), and global scope, and it distinguishes itself from siblings like export_controls_screen (export controls) and swift_lookup (SWIFT lookups) by stating exactly what this tool does and what it doesn't. The purpose is unambiguous and unique among the sibling set.

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 guidance: it explains the free/paid tier distinction, when to pass an API key, and how to choose subject_type ('bank' vs 'party' vs 'auto'). It also gives clear direction on when to prefer alternatives (e.g., for banks, screening by BIC or calling swift_lookup yields a verified answer). It even tells the agent how to interpret results and when to avoid certain reporting behaviors, leaving nothing to inference.

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

settlement_etaAInspect

BETA. Estimate when a SWIFT payment will arrive: a corpus-grounded arrival window with an honest tail, computed from real completed payments we have tracked, projected onto the currency's banking calendar.

This estimator is in BETA and still calibrating. Say so when you present a number: call it an estimate or a typical window, never a commitment, and never let a user plan an irreversible decision (a cutoff, a contractual settlement date) on it without that caveat. The payload carries beta=true while this holds.

Two modes:

  • Forward (default): "when will it land" — returns P50/P90/P95 arrival dates, sample size, confidence, competing non-arrival risk, delay-risk factors, and (where validated) the most likely correspondent route.

  • Reverse: pass arrive_by_date (YYYY-MM-DD) — returns the latest send date such that arrival by that day is likely ("send by Thursday to land by month-end").

INPUT DISCIPLINE (important):

  • Mid-flight payment: pass ONLY the uetr (from TrackingContext or track_payment). The server resolves the current status, currency and elapsed time deterministically from the tracking record. NEVER compute elapsed_business_days yourself.

  • Pre-trade question ("how long will a USD wire from X to Y take?"): pass currency + sender_bic/receiver_bic (8 or 11 chars, or bank names). current_status / elapsed_business_days are for this path only.

Reading the answer honestly (relay these to the user):

  • basis.n is the sample size and confidence reflects it; when confidence is "low", present the window as a rough range, never a promise.

  • route.confirmed=false means the route is INFERRED from settlement instructions on file, not confirmed by GPI — say so.

  • basis.route_adjusted=true means we hold no completed payments for this exact pair and the window was lifted to a route-composed estimate: the SSI-implied correspondent chain (route.intermediaries hops) with typical processing time per hop. Present it as a route-based estimate, not as observed statistics, and never quote the faster currency-pool average alongside it as if corridor-specific.

  • mode="outlier" means the payment is already slower than ~90% of similar payments: stop quoting a window, explain the usual manual causes (compliance review, repair/RFI, missing cover) and pivot to the stuck-payment diagnostic flow.

  • non_arrival.p_reject is the share of similar payments that were returned or rejected rather than delivered.

  • "Delivered" (ACCC) means delivered to the beneficiary bank per GPI; funds can become usable in the account slightly later.

Available on every surface to any caller with an active subscription. The estimate itself costs no credits (tracking a payment does cost credits; never describe tracking as free).

Args: uetr: UETR of a tracked payment (preferred for mid-flight questions) currency: 3-letter currency (pre-trade path; ignored when uetr resolves) sender_bic: Sender bank BIC or name (pre-trade path) receiver_bic: Receiver bank BIC or name (pre-trade path) intermediary_bic: Known intermediary BIC (optional) current_status: GPI status like ACSP (pre-trade/no-uetr path only) elapsed_business_days: Business days already in flight (pre-trade path only) amount: Payment amount (improves delay-risk assessment). A plain number is fine — 50000 and "50,000.00" are both accepted. sender_country: ISO2 country of the sender bank (optional) receiver_country: ISO2 country of the receiver bank (optional) arrive_by_date: YYYY-MM-DD — switches to reverse send-by mode. You do not know today's date; a deadline stated as "the 20th" or "by month-end" must be resolved against the today block returned by bank_holidays / value_date / is_business_day_check, not against your own sense of the current date. A date in the past is rejected. api_key: Optional API key (internal calls ride the MCP secret)

ParametersJSON Schema
NameRequiredDescriptionDefault
uetrNo
amountNo
api_keyNo
currencyNo
sender_bicNo
receiver_bicNo
arrive_by_dateNo
current_statusNo
sender_countryNo
intermediary_bicNo
receiver_countryNo
elapsed_business_daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden — and it overdelivers. It discloses the BETA status and instructs the agent to say so, defines response semantics (`route.confirmed=false` means inferred, not GPI-confirmed; `route_adjusted=true` means route-composed, not observed), flags the outlier mode behavior, and even addresses billing transparency ('never describe tracking as free'). This goes far beyond any annotation could have captured.

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?

Exceptionally well-structured with headers, bold labels, and code-format parameter names — easy to scan despite length. The 'Reading the answer honestly' section and forward/reverse mode setup earn their place. Docked one point because some agent-behavior instructions (e.g., 'relay these to the user') could arguably live in the system prompt rather than a tool description, and the description could be tightened by 15-20% without losing meaning.

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 12-parameter, dual-mode tool in BETA with no annotations, this is as complete as it gets. It covers both invocation modes, edge cases (outlier mode, rejected past dates), interpretation guidance for every non-obvious return field (n, route_adjusted, p_reject), and even billing implications. The guidance to present windows as estimates rather than commitments is exactly the kind of nuance an agent needs for a financial tool of this complexity.

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?

Schema coverage is 0%, so the description had to carry everything — and it documents all 12 parameters in a well-organized Args block. It adds meaningful context per param: `uetr` is 'preferred for mid-flight questions,' `current_status` and `elapsed_business_days` are 'pre-trade path only,' `arrive_by_date` switches to reverse mode and 'a date in the past is rejected,' and `amount` accepts both formats ('50000' and "50,000.00"). Also clarifies the deterministic resolution of parameters from the tracking record.

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 first sentence nails it: 'Estimate when a SWIFT payment will arrive: a corpus-grounded arrival window with an honest tail, computed from real completed payments...' — a specific verb (estimate), resource (SWIFT payments), and scope (arrival windows). It clearly differentiates from siblings like `track_payment` (tracking status) and `value_date` (business-day resolution) by framing itself as the arrival estimator with two explicit modes.

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?

Excellent input discipline section: distinguishes 'Mid-flight payment' (pass ONLY the uetr) from 'Pre-trade question' (currency + sender_bic/receiver_bic), and explains reverse mode with arrive_by_date. It even directs the agent to resolve date ambiguities 'against the `today` block returned by bank_holidays / value_date / is_business_day_check.' Slightly docked because it never explicitly names a sibling as a better alternative in plain terms — the guidance is thorough on how to use THIS tool but doesn't say 'for X, use sibling Y instead' as a direct comparison.

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

ssi_lookupAInspect

Look up correspondent banking / settlement instructions (SSI) for a bank.

Returns the correspondent banks (nostro accounts) that a given bank uses to settle payments in a specific currency, including account numbers (when available) and intermediary chains. Essential for payment routing and pre-validation.

Each correspondent is annotated with a clearing_note indicating whether it can clear the currency directly (located in a home country for that currency) or needs its own correspondent. If the note suggests a further lookup, call ssi_lookup on the correspondent's SWIFT code to find the full clearing chain.

IMPORTANT — known data gaps to respect:

  • Account numbers may be empty for some/all correspondents. The response surfaces an account_availability_note in those cases. Do NOT invent account numbers. Use swift_lookup() to find the bank's own published correspondent banks page when accounts are missing.

  • is_preferred is rarely populated — its absence is a DATA gap, not a signal. When preferred_correspondent_note is present (all flags false), do NOT infer a "preferred"/"natural" correspondent, and equally do NOT tell the user the bank "has no preference" or "rotates" — do not draw attention to the flag at all. Any listed BIC is a valid clearing route.

  • intermediaries is almost always empty in our dataset — an empty list does NOT mean the payment is direct.

  • Asset category per correspondent is COMMERCIAL (for customer MT103 credit transfers) or FINANCIAL (for bank-own-account / interbank MT202/pacs.009 settlements). Read asset_categories (the full list) rather than the single asset_category, which shows the commercial view only: one entry is one BIC+account and the same account is often published under BOTH categories, so the single field can never establish what an account may NOT be used for. The asset_category_note summarises the split — match the listed correspondents to the user's flow type (customer payment vs treasury/interbank).

  • If correspondents is EMPTY, we have no SSI on file for that bank/currency. The response carries a no_ssi_note (no SSI in any currency) or requested_currency_unavailable_note (SSI on file for other currencies only). This is a coverage gap, NOT a finding that the bank has no correspondents. Do NOT name a correspondent for the missing currency from training data — surface the published_ssi_document / the bank's website and tell the user to confirm SSI with the bank.

Always inspect the response's top-level next_steps array — it chains the swift_lookup / country_banking_rules / bank_holidays calls that complete a settlement-instruction answer.

Requires an API key with an active FI subscription. To get started: call mcp_register → mcp_verify → subscribe to an FI plan at https://ohmyfin.ai/subscription.

Args: swift: SWIFT/BIC code of the bank (e.g., "DEUTDEFF", 8 or 11 chars). currency: ISO 4217 currency code (e.g., "USD", "EUR", "GBP"). api_key: Your Ohmyfin API key (prod-...). Can also be passed via KEY header or Authorization: Bearer header.

Examples: ssi_lookup("DEUTDEFF", "USD") # Deutsche Bank USD correspondents ssi_lookup("HSBCHKHH", "EUR") # HSBC HK EUR correspondents ssi_lookup("DEUTDEFF", "USD", api_key="prod-abc123...")

ParametersJSON Schema
NameRequiredDescriptionDefault
swiftYes
api_keyNo
currencyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description fully discloses behavioral traits: data gaps (account numbers empty, is_preferred rarely populated, intermediaries empty), interpretation of fields like asset_categories, and error scenarios (empty correspondents). It also warns against inventing data and clarifies subscription requirements.

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 lengthy but well-structured with sections (purpose, data gaps, usage notes, examples). It is front-loaded with the main goal and progressively detailed. Some repetition could be trimmed, but the complexity justifies 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?

Given the tool's complexity and the presence of an output schema, the description covers all necessary aspects: response field meanings, error handling, data limitations, and integration with other tools via next_steps. It leaves no significant gaps.

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?

Schema coverage is 0%, so the description compensates fully. It explains 'swift' as a SWIFT/BIC code with format (8 or 11 chars), 'currency' as ISO 4217, and 'api_key' as optional with alternative passing methods. Examples illustrate usage.

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's purpose: 'Look up correspondent banking / settlement instructions (SSI) for a bank.' It specifies the resource (SSI for a bank) and differentiates from siblings like swift_lookup by focusing on settlement instructions.

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 explains when to use the tool ('Essential for payment routing and pre-validation') and provides guidance on next steps, such as calling ssi_lookup on correspondent SWIFT codes and inspecting the next_steps array. It also mentions using swift_lookup for missing account numbers, but lacks explicit 'when not to use' criteria.

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

swift_lookupAInspect

Search banks and financial institutions by name, SWIFT/BIC code, or country.

Covers both SWIFT-connected banks and non-SWIFT financial institutions (e-money issuers, payment processors, MFOs, brokerages, VASPs, etc.).

Returns: SWIFT/BIC code (if any), name, city, country, institution type, GPI membership, a coarse sanctions FLAG across 7 hard-sanctions watchlists (OFAC SDN, EU, UK, CA, CH, AU, NZ — see sanctions_note; this is NOT a full screen, use sanctions_screen for a compliance verdict), and enriched bank profile when available.

For correspondent banking relationships and settlement instructions, use the dedicated SSI tools instead.

The country parameter accepts both 2-letter ISO codes ("ID", "DE") and full English names ("Indonesia", "Germany"). Names are resolved automatically.

A BIC IDENTIFIES AN OFFICE, NOT A BRAND, AND THE DIFFERENCE IS PRICED. A name search returns ONE representative office per bank, elected by BIC convention rather than by relevance to the payment, and office_note says so whenever the bank holds more than one. Published tariffs, correspondent chains and settlement instructions are filed per BIC, so the choice changes the answer: transfer_cost("COBADEFF") returns Commerzbank's published 0.15% sending fee and transfer_cost("COBADEBB") refuses for want of a filed tariff, and both of those are Commerzbank AG in Germany. So:

  • If the user named a CITY, put it in the query — "Commerzbank Frankfurt" resolves to the Frankfurt office, and the plain name cannot.

  • If they did not, ask which BIC is on their statement or payment instruction before pricing or routing, and say which office you used.

  • Never present a representative office's BIC as "the bank's BIC".

Examples: swift_lookup("DEUTDEFF") # exact BIC lookup swift_lookup("Deutsche Bank") # search by name swift_lookup("Commerzbank Frankfurt") # bank + city -> that office's BIC swift_lookup("TBC PAY") # find non-SWIFT payment processor swift_lookup("bank", country="KZ") # explore banks in a country swift_lookup("Halyk", country="KZ") # find specific bank in country swift_lookup("Bank Mandiri", country="Indonesia") # full country name OK

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
countryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden and does so thoroughly: it discloses representative-office selection, office_note, the coarse sanctions FLAG limitation, country-name normalization, and the pricing implications of BIC choice. It is unusually transparent about the 'BIC identifies an office, not a brand' trap and provides worked examples. No contradiction with annotations because none are present.

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 every block carries operational weight: coverage scope, sanctions caveat, BIC-office pricing rule, and usage examples. It is front-loaded with the search statement and uses capitalization sparingly for a genuinely critical warning. Still, the BIC-identification section could be tightened without losing value.

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 tool with an output schema already explaining return shape, the description covers the remaining agent-critical context: entity classes searched, coarse vs full sanctions distinction, parameter formats, office-vs-brand behavior, and examples. The limit omission is minor because the schema provides a default and the output schema bounds what is returned.

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?

The schema provides only property names and defaults with 0% description coverage, so the description must compensate. It richly explains query (name, BIC, city, non-SWIFT entities) and country (ISO or full English name, auto-resolution), but says nothing about limit or its default meaning. This is a small but real gap, so 4 rather than 5.

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-resource pair: 'Search banks and financial institutions by name, SWIFT/BIC code, or country.' It also differentiates itself from neighboring tools by explicitly pointing to SSI tools for settlement instructions and sanctions_screen for compliance verdicts, so an agent can select it correctly without opening 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?

It provides concrete when-to-use guidance: use for bank/institution lookup across SWIFT and non-SWIFT entities; use dedicated SSI tools for correspondent/settlement; use sanctions_screen for a full compliance verdict. It also gives decision rules for city/BIC disambiguation, telling the agent to include a city when named and to ask which BIC otherwise. This is explicit and actionable routing.

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

swift_message_referenceAInspect

Look up SWIFT message types — MT (FIN) and MX (ISO 20022).

Pass a specific type to get full details, or omit to list all types. Covers customer payments (MT103, pacs.008), FI transfers (MT202, pacs.009), trade finance (MT700, MT760), cash management (MT940, camt.053), and payment status (pacs.002).

Also use this tool to answer questions about where specific payment fields live — e.g., where the UETR sits in an MT103 (Field 121, Block 3 header), where charges appear (71A/71F/71G), or which fields carry routing info (56/57). MT103 and pacs.008 responses include a tracing_note explaining UETR recovery for customers who only have a reference number.

Args: message_type: Message type (e.g., "MT103", "pacs.008", "MT940"). Case-insensitive. Omit to list all.

Examples: swift_message_reference("MT103") swift_message_reference("pacs.008") swift_message_reference()

ParametersJSON Schema
NameRequiredDescriptionDefault
message_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Since no annotations are provided, the description fully carries the transparency burden. It discloses case-insensitivity, the effect of omitting the parameter, and that 'MT103 and pacs.008 responses include a tracing_note explaining UETR recovery,' which goes beyond the schema to reveal valuable output behavior.

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?

Although longer than average, the description is well-structured with clear sections for overview, coverage, field questions, args, and examples. The first sentence front-loads the core purpose, and every section adds substantive value without 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 single optional parameter and the presence of an output schema, the description is comprehensive. It explains the tool's scope, usage, parameter behavior, and a special output detail, making it fully sufficient for selection and invocation.

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's message_type has zero description coverage, but the Args section fully compensates with examples, case-insensitivity note, and the omit-to-list behavior. This provides the agent with complete semantic understanding of the parameter.

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 'Look up SWIFT message types — MT (FIN) and MX (ISO 20022),' which clearly identifies the action and resource. It also distinguishes itself from siblings by explicitly covering message types and payment field locations, making the tool's unique purpose evident.

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 gives clear usage guidance: 'Pass a specific type to get full details, or omit to list all types' and 'Also use this tool to answer questions about where specific payment fields live.' However, it does not mention when-not-to-use or name alternative tools, so it lacks explicit exclusions.

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

tracking_historyAInspect

Show how a SWIFT payment's tracking results changed over time.

Returns the DISTINCT tracking results recorded for a payment (by UETR or reference), deduplicated so ten identical re-tracks collapse to one entry while any change — a new last-update, a status change, or new bank data — appears as its own entry. Each entry includes what was ENTERED when the search was run (amount, currency, date) alongside the banks that reported data and their confirmed amount / value date.

WHEN TO USE THIS:

  • The user says the page shows different data than you see, or asks why a bank line (e.g. JP Morgan) "disappeared" or a value date differs.

  • You need to reconcile an amount discrepancy. Correspondent banks such as JP Morgan return their confirmation ONLY when the tracked amount exactly matches the payment, so a search run with the wrong amount silently drops their line. Comparing entries here — same UETR, different entered amounts, different bank data — is how you spot that the amount was the problem.

  • Before concluding "the record was consolidated" or "the bank stopped reporting", check the history: the earlier result you're being asked about is usually still here, under a different entered amount.

Only results for the current user (plus system tracks with no owner) are returned; other users' searches of the same UETR are never shown.

Requires an API key with an active FI subscription.

Args: uetr: UETR (UUID v4) of the payment. Strongly preferred. reference: Sender's reference (MT103 Field 20) — used when no UETR.

ParametersJSON Schema
NameRequiredDescriptionDefault
uetrNo
api_keyNo
referenceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Despite no annotations, the description fully discloses behavioral traits: deduplication of identical tracks, only results for current user + system tracks, requirement of an API key with active FI subscription. It explains limitations like not showing other users' data and that entries include what was entered vs. bank confirmations.

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: a summary paragraph, a bullet-style usage guide, visibility note, API requirement, and Args list. Every sentence adds value without redundancy, and the format enhances readability for an AI agent.

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 and that it has an output schema, the description covers all necessary aspects: what the tool returns (distinct entries with entered data and bank details), deduplication logic, user scope, and prerequisites. It prepares the agent for interpreting results (e.g., amount discrepancies) and explains constraints thoroughly.

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 0%, so the description must compensate. It provides detailed semantics for 'uetr' (strongly preferred) and 'reference' (used when no UETR) in an 'Args' section. However, the 'api_key' parameter is only mentioned in the body text without explanation of its purpose or behavior in the args section, leaving a small gap.

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 shows how tracking results changed over time, distinct from sibling tools like track_payment that show current status. It provides a specific verb ('Show') and resource ('tracking history') with clear deduplication behavior.

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?

Includes a dedicated 'WHEN TO USE THIS' section with three explicit scenarios (page discrepancy, amount reconciliation, before concluding consolidation). It also explains when not to use it and what alternatives to consider, e.g., 'check the history' before assuming data loss.

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

track_paymentAInspect

Track a SWIFT payment by UETR or reference number.

Basic SWIFT payment tracking enriched by data from certain banks in the correspondent chain. Returns the overall payment status and, when available, per-bank details showing which banks reported information about this payment.

IMPORTANT — every trace needs four things: amount, currency, date, and an identifier (uetr, or reference when there is no UETR). amount, currency and date are required parameters, on the UETR path too: there is no UETR-only lookup, so never tell the user the UETR alone is enough to run one. Ask for whatever is missing before calling, and never guess a value.

IMPORTANT — UETR vs Reference: The UETR (Unique End-to-End Transaction Reference) is a UUID assigned to every SWIFT gpi payment. Tracking by UETR succeeds ~80% of the time. Tracking by reference number alone succeeds less than 1% of the time because most banks only index by UETR.

→ Always provide the UETR if available. → The reference number is Field 20 of the MT103 (or the equivalent / in pacs.008). It is the sender's transaction reference. Still valuable — provide it alongside the UETR when you have both.

WHEN THE USER HAS ONLY A REFERENCE AND NO UETR ("how do I find / trace my payment?", "I have a reference number but no UETR, where is it?"): This is exactly the scenario this tool can attempt — do NOT answer from general knowledge. A reference-based trace cannot be run from the reference alone; you MUST first collect three things from the user: 1. amount — the exact amount as sent 2. currency — ISO 4217 (e.g. "USD") 3. date — the send date (within the last 90 days) Then call track_payment(reference=..., amount=..., currency=..., date=...). State the expectation up front: reference-only tracing succeeds less than 1% of the time. In parallel, tell the user how to recover the UETR for a reliable (~80%) trace: ask the SENDING bank for the MT103 confirmation — the UETR is in Block 3, tag {121:} (a UUID v4), stored by every gpi-enabled bank against the payment. Re-run with uetr= once they have it. (swift_message_reference("MT103") returns the full field/UETR-recovery reference if you need to cite specifics.)

IMPORTANT — Interpreting bank details: Each entry in the 'details' array represents a bank that reported data about this payment. The bank could be the SENDER, the BENEFICIARY, or ANY INTERMEDIARY/CORRESPONDENT in the chain. Do NOT assume a bank is an intermediary just because it appears in the list — we only know the payment passed through that bank. The bank's role is only known when it self-reports via push API (indicated by a non-null 'role' field).

Requires an API key with an active FI subscription. To get started: call mcp_register → mcp_verify → subscribe to an FI plan at https://ohmyfin.ai/subscription.

Args: uetr: UETR (UUID v4 format, e.g. "eb6305c8-0710-4e41-84ad-f58db3083e82"). Strongly recommended — tracking without UETR rarely returns results. This is the Unique End-to-End Transaction Reference assigned to every SWIFT gpi payment. reference: Sender's bank reference number (MT103 Field 20 / pacs.008 InstrId). Useful alongside UETR for cross-referencing, but alone it rarely produces results. Required only if uetr is not provided. amount: REQUIRED. Transaction amount as sent (e.g. 15000.00). Must match the original payment amount — even small differences may prevent tracking from finding the payment, so ask the user for the exact figure rather than estimating or rounding one. currency: REQUIRED. ISO 4217 code of the currency the payment was SENT in (e.g. "USD", "EUR", "GBP"). Ask if you do not know it; do not assume the sender's or the beneficiary's home currency. date: REQUIRED. Transaction date. Preferred format: YYYY-MM-DD (ISO 8601). Also accepted: DD.MM.YYYY or DD-MM-YYYY (European format). Must be within the last 90 days. api_key: Your Ohmyfin API key (prod-...). Can also be passed via KEY header or Authorization: Bearer header.

Returns a dict with: status: Overall payment status — one of: "success" — payment delivered to beneficiary (final) "in progress" — payment is being processed (may update) "returned" — payment was canceled/returned after processing (final) "rejected" — payment was refused (final) "on hold" — temporarily held, e.g. compliance review "future" — scheduled for a future value date "unknown" — no tracking data available yet status_raw: ISO 20022 status code (ACCC/ACSP/RJCT/PDNG) or null status_reason: ISO 20022 reason code if available, or null lastupdate: Date of last status change (YYYY-MM-DD) or null details: Array of bank-level tracking entries (see role_explanation in each entry for how to interpret the bank's role) not_found_guidance: Present only when nothing was found — concrete next steps (UETR recovery, exact-match checks). Relay these to the user instead of improvising; a miss on a reference-only trace is the expected outcome and does NOT mean the payment failed.

Examples: track_payment(uetr="eb6305c8-0710-4e41-84ad-f58db3083e82", amount=15000, currency="USD", date="2026-03-10") track_payment(uetr="eb6305c8-0710-4e41-84ad-f58db3083e82", reference="FT2603100123", amount=15000, currency="USD", date="2026-03-10") track_payment(reference="FT2603100123", amount=5000, currency="EUR", date="12.03.2026")

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
uetrNo
amountYes
api_keyNo
currencyYes
referenceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and delivers richly: it discloses success rates (~80% UETR, <1% reference-only), the need for exact amount/currency/date, the interpretation caveat that 'details' banks may be sender/beneficiary/intermediary and role is only known via self-report, and the behavior of not_found_guidance. This goes far beyond a basic safety profile and fully informs the agent of behavioral nuances.

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 (IMPORTANT, Args, Returns, Examples) that make it navigable. It earns most of its length due to the tool's complexity. However, there is some repetition — e.g., the required-ness of amount/currency/date appears both in the 'every trace needs four things' warning and in the Args section, and the UETR concept is explained multiple times. A moderately tighter version would earn a 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?

Given the tool's complexity (6 parameters, multiple status outcomes, bank-detail interpretation, auth requirements, and recovery paths), the description is remarkably complete. It covers required parameters, exceptions, return value semantics, failure handling (not_found_guidance), and concrete examples. The presence of an output schema is a plus, but the description still goes beyond it by explaining status meanings and per-bank role interpretation, leaving no major gap for the agent.

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?

Schema description coverage is 0%, so the description must compensate — and it does. Every parameter receives detailed semantics: UETR format and UUID v4 example, reference as MT103 Field 20 / pacs.008 InstrId, amount exactness and warning against rounding, currency ISO 4217 and 'as sent' requirement, date formats and 90-day window, and api_key alternatives (KEY header or Authorization). Examples further illustrate correct usage. This is exemplary 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 'Track a SWIFT payment by UETR or reference number', a specific verb+resource statement that clearly distinguishes this from sibling tools like swift_lookup or tracking_history. It further clarifies the scope ('enriched by data from certain banks in the correspondent chain') and the primary identifier (UETR), making the tool's function 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?

The description provides explicit when-to-use guidance, including a dedicated 'WHEN THE USER HAS ONLY A REFERENCE AND NO UETR' section that tells the agent exactly what to collect and how to set expectations. It also names alternatives (recover UETR via MT103, use swift_message_reference for details) and gives onboarding steps (mcp_register → mcp_verify → subscribe), making usage context exceptionally clear.

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

transfer_costAInspect

BETA. Estimate what a cross-border payment will COST, split by WHO PAYS: the sending bank's published fee (the sender's side), what correspondents deduct in transit and what the beneficiary's own bank charges to credit it (the beneficiary's side), and what actually lands.

This estimator is in BETA. Present every number as a typical case and a high case, never as a quote, and never let a user commit to a contractual amount on it. The payload carries beta=true while this holds.

HOW TO READ THE ANSWER (relay these honestly):

  • answered=false means we REFUSED. The most common reason is that we hold no published tariff rule for the sending bank, in which case there is deliberately no total and no "recipient receives" figure. Say we do not know what that bank charges. Do NOT add up the parts yourself and present a total: treating the unknown fee as zero is the exact defect this tool was built to remove.

  • The correspondent fee is a RANGE (p50 typical, p90 high case), not a point. The spread is real: SWIFT tracking never reveals whether a payment was sent OUR, SHA or BEN, so a single cohort mixes all three.

  • THREE FEES, THREE DIFFERENT PAYERS, AND THEY ARE NOT INTERCHANGEABLE. sending_fee is billed to the SENDER by their own bank. correspondent_fee comes out of the payment in transit, so the BENEFICIARY bears it. beneficiary_fee is what the RECEIVING bank charges its own customer to credit the payment, so the beneficiary bears that too - and it is frequently the largest of the three (measured 2026-08-22 on one live corridor: 35.26 USD of sender-side cost against a 245.68 USD beneficiary bank fee). Never quote one of them as "the cost", and never call the beneficiary bank's fee a correspondent charge. total is the sending fee plus the transit deduction; total_both_sides adds the beneficiary bank's fee and is the all-in figure.

  • WHERE EACH NUMBER COMES FROM. The correspondent fee is OBSERVED, from payments we have tracked. beneficiary_fee.source is tariff (or tariff_fallback, see below) and never observed: a beneficiary bank deducts after the last bank that reports to GPI, so no tracking data can see it, and we read it off that bank's published incoming tariff instead. Say which is which when the user leans on a figure.

  • beneficiary_fee.known=false means WE HOLD NO INCOMING TARIFF for that bank (we hold one for roughly two thirds of beneficiary banks). Its charge is then missing from every figure, total_both_sides is null, and recipient_receives.typical is an UPPER BOUND - recipient_receives.beneficiary_fee_known says so. Do not fill that gap with a zero, a guess or a typical figure; say the receiving bank's own charge is not included and point the user at that bank's tariff.

  • beneficiary_fee.applies=false under OUR / OUR-OUR: the instruction says the sender covers every downstream charge, so the bank claims it back rather than taking it off the credit. The figure is reported but NOT subtracted. Our data ends before the account is credited, so we can neither confirm nor refute that it was honoured on a given payment.

  • beneficiary_fee.segment says which of the bank's incoming price lists was read. segment_fallback=true means the account type asked for had no usable schedule so the other one answered - which can only happen when beneficiary_segment was NOT supplied, i.e. when we were assuming the beneficiary matches the sender. Say that you assumed it.

  • beneficiary_fee.reason='other_segment_only' means you DID supply beneficiary_segment, and that bank publishes an incoming tariff for the other account type only (beneficiary_fee.other_segment names it). We decline to quote it. Do NOT report this as "we hold no tariff for that bank": we hold one, for a different kind of account. Tell the user which, because it is often the useful half of the answer.

  • basis.n is how many observed payments back the correspondent figure and confidence reflects it. At "low", present the range as rough.

  • basis.level says how specific the evidence is: corridor is this correspondent into this destination country, correspondent is that bank overall, and currency or global mean we hold nothing specific and are quoting a pool. Say so when it is a pool.

  • ON A REFUSAL basis IS NULL, and the same two figures are still on each entry of correspondent_fee.legs[] as level and n. Read them there. Do not read a missing basis as corridor-specific evidence: on a measured DE->AM screen the legs said level: "currency", n: 146, a currency-wide pool, and the answer described it as a single well-priced hop because the top-level key was absent.

  • assumptions is a list of plain sentences explaining what shaped the number (SEPA, OUR honoured, PSD2, a modelled BEN uplift, a stale tariff). Relay the ones that matter to the user's question.

  • under OUR the correspondent leg carries our_breach: the measured share of OUR payments that lose a charge in transit anyway, and what that costs. p50 is 0 and p90 is that loss. Quote BOTH - "the beneficiary should receive the full amount, and in about 7% of the OUR payments we can follow end to end they do not" - never the p50 alone as a promise.

  • chain.status = no_chain means the pair settles on local rails (SEPA, domestic, same banking group) with NO correspondent deduction at all.

IMPORTANT ON CHARGE TYPE: charge_type is an INPUT and is never inferred from tracking. OUR is a real instruction and usually holds - of 150 payments whose own MT103 declared OUR and which we could follow from the instructed amount to the settled one, 139 reached the beneficiary intact, against 6 of 52 under SHA. It is NOT a guarantee: the other 11 lost a flat correspondent charge in transit, and we find no evidence that this depends on the destination country or on a US correspondent being in the chain, so do not tell a user that OUR is safe everywhere except the US. BEN is materially more expensive than SHA and our high case models it rather than measuring it. If the user has not said which they will use, ask, or state which one you assumed.

Pass beneficiary_bic whenever the user knows the receiving bank: without it there is no correspondent chain to price and no beneficiary bank to read a tariff from, so the answer is the sending fee alone and no total.

customer_segment selects which side of the SENDING bank's published price list is read. It is not cosmetic: of 30 banks publishing both schedules, 9 of the 17 that answered on both quote a different fee, one of them 220 PLN for a company against free for a person. It defaults to individual here; pass business when the payer is a company, and say which you assumed.

beneficiary_segment does the same for the RECEIVING side, which is a different bank's price list and not a restatement of the sender's. Of 120 banks publishing both schedules, 28 quote a different incoming fee (measured 2026-08-24), and it runs both ways: Hipotekarna banka (HBBAMEPG) credits a 100,000 EUR payment free of charge to a company and takes 0.1% of it from a person, while Nordea charges a person 60 SEK and a company 250. Omit it and we assume the beneficiary matches the sender, which is what this tool did before 2026-08-24 - so if you omit it, say you assumed it. Supply it when the user has told you who is being paid, and prefer asking over guessing when the amount makes the difference material.

Available to any caller with an active subscription. The estimate itself costs no credits (tracking a payment does cost credits; never describe tracking as free).

Args: bank_swift: Sending bank BIC (8 or 11 chars) amount: Transfer amount currency: 3-letter transfer currency charge_type: SHA (default), OUR or BEN. Ask the user rather than guessing beneficiary_bic: Receiving bank BIC; needed for a total channel: online | branch | mobile_app | any customer_segment: individual | business | financial_institution - the SENDER beneficiary_segment: individual | business | financial_institution - the party being PAID. Omitted, it mirrors customer_segment customer_sub_segment: standard | premium | private_banking | vip api_key: Optional API key (internal calls ride the MCP secret)

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYes
api_keyNo
channelNo
currencyYes
bank_swiftYes
charge_typeNoSHA
beneficiary_bicNo
customer_segmentNo
beneficiary_segmentNo
customer_sub_segmentNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure, and it goes far beyond a simple summary. It explains refusal semantics, what happens when beneficiary_fee.known=false, the OUR-breach caveat, why correspondent fees are ranges, and that the estimator is BETA with beta=true in the payload. It even warns against common misuse patterns like adding missing fees as zero, which is exactly the kind of behavioral transparency an agent needs.

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-organized with headers and bullets, and most sentences carry real operational value. There is some redundancy (BETA is stated twice, and 'never a quote' is repeated in different forms) and the examples are detailed, but given the tool's complexity and the absence of annotations, the length is largely justified. It is structured well, with the core summary front-loaded and detailed behavioral notes following.

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 addresses nearly every situation an agent will encounter: refusals, missing tariffs, observed vs. tariff sources, charge type behavior, assumptions, segment fallbacks, OUR breach, and corridor-level basis. It also covers operational context like credit costs and the BETA flag. With an output schema present and no annotations, this description is unusually complete for a tool of this complexity.

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?

Schema description coverage is 0%, so the description must compensate, and it does. The Args section explains all 10 parameters, including BIC formats, charge_type options, the meaning of beneficiary_segment, and the default behavior when it is omitted. It adds substantial meaning beyond the bare schema by explaining why each parameter matters and what the consequences of omitting it are.

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: 'Estimate what a cross-border payment will COST, split by WHO PAYS.' It names the three fee components and the recipient-receives figure, so an agent immediately knows what the tool does. This also distinguishes it from sibling tools like fx_rate or track_payment, which cover related but different concerns.

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 gives strong contextual guidance: pass beneficiary_bic when known, ask the user for charge_type, only use this for cross-border payment cost estimation, and never use it as a contractual quote. It does not explicitly name sibling tools as alternatives or state when NOT to use this tool instead of another, so it stops one short of a 5.

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

value_dateAInspect

Calculate the value/settlement date for a payment.

Determines when a payment will settle based on:

  • Source and destination country holiday calendars

  • Weekend conventions (Sat/Sun or Fri/Sat)

  • Currency center holidays (if FX conversion involved)

  • Settlement convention (T+0, T+1, T+2)

Args: source_country: Sender's country (ISO 3166-1 alpha-2, e.g., "US") dest_country: Receiver's country (ISO 3166-1 alpha-2, e.g., "DE") settlement_type: One of "wire" (T+0 domestic / T+1 international), "fx_spot" (T+1 or T+2 based on pair), "sepa" (D+1), "sepa_instant" (T+0) base_currency: Base currency for FX (ISO 4217, e.g., "USD"). Required when settlement_type is "fx_spot". target_currency: Target currency for FX (ISO 4217, e.g., "EUR"). Required when settlement_type is "fx_spot". from_date: Start date in ISO format (YYYY-MM-DD). Default: today. You do not know today's date — omit this argument unless the user named a specific send date. If the user's date is relative ("the 20th", "next Friday", "month-end"), read the today block in any response from this tool, bank_holidays or is_business_day_check and resolve against that.

Examples: value_date("US", "DE") value_date("US", "DE", "fx_spot", "USD", "EUR") value_date("DE", "FR", "sepa") value_date("US", "US", "wire", from_date="2026-07-03")

ParametersJSON Schema
NameRequiredDescriptionDefault
from_dateNo
dest_countryYes
base_currencyNo
source_countryYes
settlement_typeNowire
target_currencyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It explains the calculation factors, the settlement_type values and their implications, and even provides instruction on handling relative dates via the `today` block from other tools, which helps agents use it correctly.

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 well-structured, with a lead sentence, a bulleted list of behavioral factors, an Args list, and examples. Every sentence adds value, and the format makes 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?

This tool has six parameters with conditional requirements, and the description covers all of them, provides example calls, and addresses the nuance of the default from_date. The output schema exists, so not describing return values is acceptable. The description is complete for agent use.

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?

Schema description coverage is 0%, so the description's detailed Args section is essential. It provides country/currency formats, default values, conditional requirements (e.g., FX currencies required for fx_spot), and settlement_type semantics, fully compensating for the sparse 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 opens with a specific verb ('Calculate') and resource ('value/settlement date for a payment'), and elaborates on the inputs that affect the result. This clearly differentiates it from sibling tools like settlement_eta or fx_timing_advisor, which target different aspects of payment timing.

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 gives a strong sense of when to use the tool—for determining settlement dates with holiday/weekend/convention logic—and includes worked examples for common scenarios. However, it does not explicitly name alternative tools or list exclusions (e.g., 'use settlement_eta for expected arrival times'), so it earns a 4 rather than a 5.

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

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    IBAN validation, BIC/SWIFT lookup, SEPA compliance, issuer classification and risk indicators for AI agents. 39K+ bank entries from GLEIF. Supports 75+ countries.
    8
    249
    3
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Banking infrastructure for AI agents: open accounts, issue cards, send SEPA/SWIFT payments, run mass payouts, and pay invoices via natural language.
    2
    MIT
  • A
    license
    A
    quality
    A
    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
    89
    MIT
  • A
    license
    A
    quality
    B
    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
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.3/5.0
Disambiguation4/5

Most tools have distinct purposes, but some overlapping areas (goods_classify vs hs_code_lookup vs eccn_lookup; fx_rate vs fx_rate_history vs fx_volatility) require close reading of descriptions to select correctly. The detailed descriptions help, but the shear number of lookup tools creates mild ambiguity.

Naming Consistency3/5

Names mix verb-first (track_payment, mcp_verify) and noun-first patterns (iban_validate, fx_rate, ssi_lookup), with some phrase-like names (banks_using_correspondent, is_business_day_check). While readable, there is no single consistent convention.

Tool Count3/5

33 tools is heavy, but the server's broad scope (payments, FX, sanctions, export controls, company registries, SWIFT) justifies most of them. A few marginal tools (mcp_register, mcp_verify, company_search_result) add bulk without core value.

Completeness5/5

The tool set covers the payment lifecycle end-to-end: tracking, settlement, FX, compliance, sanctions, and company due diligence. There are no obvious dead ends; the tools chain together via next_steps and search_id flows.

Resources