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 by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 58 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4/5.0

Scored across 34 tools

Disambiguation4/5

Most tools have tightly distinct purposes, and the descriptions proactively delimit scope (e.g. track_payment vs tracking_history vs gpi_status_codes, fx_rate vs fx_rate_history vs fx_volatility). The main ambiguity is in the export-control cluster (country_export_controls, export_controls_screen, goods_classify, eccn_lookup, hs_code_lookup), where an agent could plausibly pick the wrong entry point, and in the holiday/date cluster (bank_holidays, is_business_day_check, value_date).

Naming Consistency4/5

All names are snake_case with no camelCase mixing, so the surface is predictable. Placement of the verb varies (verb_noun like export_controls_screen vs noun_noun/entity-first like bank_holidays, fx_rate, value_date), which is a minor deviation rather than a breakdown.

Tool Count3/5

34 tools is heavy and pushes past the comfortable range, but the server genuinely spans many subdomains (FX, holidays, SSI, sanctions, export controls, company registries, payment tracking, auth), so roughly five tools per domain keeps most of them earning their place. It is borderline rather than incoherent.

Completeness4/5

Coverage across the domain is strong: payment tracking plus history, SSI and reverse correspondent lookup, settlement ETA/cost/value date, sanctions screening, export-control classification and screening, company registries, FX rates/history/volatility, holidays and banking rules, plus registration/auth. Minor gaps remain (e.g. no outward sanctions-reporting or bulk/batch operations), but no obvious dead-end workflows.

Available Tools

34 tools
bank_holidaysBank HolidaysA
Read-only
Inspect

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoCalendar year, 2020-2030 (default: the current year). Values outside the range are clamped.
country_codeYesISO 3166-1 alpha-2 country code, e.g. "US", "DE", "GB".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only declare readOnlyHint/openWorldHint, yet the description discloses a great deal beyond that: the payment_impact section shape, the two-part rule for a recent holiday counting, the meaning of an empty list, the costs_a_business_day flag caveat, and that elapsed_business_days_by_send_date is authoritative. This is unusually rich 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 purpose is front-loaded and the bulleted return-value breakdown keeps a long description scannable. The length is largely earned by the payment-delay diagnostic rules, though a few clauses (e.g. repeated warnings about inventing holidays) could be tightened.

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 two-parameter lookup whose output schema already exists, the description supplies everything an agent needs to interpret and safely act on the result, including how to reason about holiday-caused delays and the authoritative business-day count.

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

Parameters3/5

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

Schema description coverage is 100%, so both country_code and the year range/clamping behavior are already documented in the schema. The examples (bank_holidays("US"), bank_holidays("DE", 2026)) only illustrate call shape and add no semantics beyond the schema, so the baseline 3 applies.

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 opening sentence states a specific verb and resource ('Get bank/public holidays for a country') and adds the differentiating scope ('with payment impact analysis'), which separates it from siblings like is_business_day_check and value_date.

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?

Explicitly frames the use case: diagnosing a payment that is ALREADY stuck, plus checking whether today is a business day and upcoming/recent holidays. Strong context, but it never names the alternative sibling tools an agent should prefer for the narrower business-day or value-date questions.

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

banks_using_correspondentBanks Using a CorrespondentA
Read-only
Inspect

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoResult page, 1-4 (default 1). Any other value is refused.
api_keyNoYour Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description.
countryYesISO 3166-1 alpha-2 country code of the client banks (e.g. "AE").
currencyYesISO 4217 currency code (e.g. "USD").
name_prefixNoOptional prefix on the client bank's name (e.g. "AL").
correspondent_swiftYesBIC of the correspondent bank, 8 or 11 characters (e.g. "IRVTUS3N").

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?

Goes well beyond the readOnlyHint/openWorldHint annotations: discloses the narrowed return shape ('only swift + name per bank'), the subscription requirement (PRO, VIP, or FI API key), the mandatory-parameter rejection behavior, and the paging bound of 1-4. This is exactly the behavioral context annotations cannot carry.

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?

Front-loaded with the core purpose, then layered detail and examples. Slightly long, and the 'Country and currency are required (not optional)' line partly restates the schema's required array, but the reason given (bounding the result set) earns its place.

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 an output schema existing, the description usefully summarizes the return shape and routes the agent to ssi_lookup for detail. Auth tier, required params, and pagination limits are all covered, leaving nothing an agent needs missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds real value on top: it explains why country and currency are required (they bound the result set) and supplies worked examples showing correspondent_swift, currency, country, and name_prefix combined.

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

Purpose5/5

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

Opens with a specific verb+resource and scope: 'Reverse SSI lookup — find banks that use a given correspondent for a currency.' It explicitly names its sibling relationship ('Inverse of ssi_lookup'), letting an agent distinguish it from ssi_lookup without opening either schema.

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?

States the exact when-to-use case, the mandatory inputs, and the explicit follow-up path: call ssi_lookup(bank_swift, currency) on a result to get account numbers or intermediary chains. Exclusions are covered by the required country/currency constraint and the 'query is rejected without them' note.

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

company_registriesAvailable Company Registries (Experimental)A
Read-only
Inspect

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

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnly and openWorld=false; the description adds substantial behavioral context beyond them: no API key required, the list is LIVE and outranks the sibling tool descriptions, and — critically — that an unregistered jurisdiction returns empty with a 'completed' status that does not mean the company is unregistered. That failure-mode disclosure directly prevents a misread of results.

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?

Front-loaded with the experimental marker and the core purpose, then the precedence rule and fallback semantics. Every sentence carries information, though the trailing 'Examples: company_registries()' block is redundant for a zero-parameter tool.

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?

An output schema exists, so return values need no explanation here. Given a zero-param, read-only list tool, the description supplies everything an agent needs: what it returns, why it matters relative to siblings, and how to interpret empty results.

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 tool takes zero parameters, so the baseline is 4. The description correctly shows the no-argument call form rather than implying any input is needed, and the schema is fully documented.

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

Purpose5/5

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

States a specific verb and resource ('List available company registries and supported jurisdictions') and distinguishes the tool from its siblings by declaring itself the authoritative source that 'outranks the codes named in those two tools' descriptions.' An agent can identify this without opening the schema.

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

Usage Guidelines4/5

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

Explains the context clearly: it is the live list to consult for jurisdiction codes used by company_search_person and company_search_company, and it specifies the fallback ('XX' GLEIF LEI) for unlisted codes. It does not explicitly say 'call this first' as a sequencing instruction, but the precedence rule makes the use case unambiguous.

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

company_search_companyCompany Registry Search: Company (Experimental)AInspect

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCompany name to search for.
api_keyNoYour Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description.
jurisdictionsYesRegistry codes to search, at least one (e.g. ["UK"]). "ALL" is not supported. The UK registry is "UK", not "GB"; "XX" is GLEIF LEI (global). company_registries() returns the live list.
include_officersNoInclude directors and officers (default true).
include_only_activeNoReturn active companies only (default false).
include_shareholdersNoInclude PSC / beneficial owners (default true).
include_sanctions_checkNoScreen every company and person found against sanctions lists (default true).

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?

Goes well beyond the annotations by disclosing the backend's silent-drop failure mode: an unsupported jurisdiction returns total_results 0 with status 'completed' and no error, plus the explicit instruction to check jurisdictions_not_searched and coverage_warning before reporting an empty result. It also discloses the automatic sanctions screening and what GLEIF hits contain. Annotations only supply openWorldHint=true; the description carries the meaningful operational risk. One minor gap: it never explains the readOnlyHint=false annotation on what is plainly a read-only search.

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?

Front-loads the EXPERIMENTAL flag, the mandatory jurisdiction constraint, and the damaging-false-negative warning, which is the right ordering. The prose is dense but a few facts (jurisdiction list, ALL unsupported, XX meaning) are repeated from the schema and the two trailing paragraphs on XX are longer than strictly needed.

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 an output schema existing, the description still names the response fields that matter for interpretation (jurisdictions_not_searched, coverage_warning), which is exactly the value-add a description should provide. Combined with the jurisdiction semantics, screening behavior, and worked examples, an agent has everything needed to call it correctly and interpret the result honestly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description partly restates schema content (UK not GB, XX is GLEIF, ALL unsupported). It earns the extra point by adding rationale the schema lacks — when to reach for XX rather than a national registry — and by showing concrete invocation examples with jurisdictions and include_only_active.

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

Purpose5/5

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

States a specific verb and resource ('Search company registries for a company with its officers and shareholders') and immediately separates itself from siblings like company_search_person and company_search_result by scoping to the company entity plus its officers/PSC data. An agent can select it without opening any schema.

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?

Gives explicit when-to-use rules (at least one jurisdiction required, 'ALL' unsupported), names the alternative for the live jurisdiction list (company_registries()), and explains the exact scenario that selects the XX/GLEIF jurisdiction (company outside national registries: Hong Kong, China, US, UAE). This is routing guidance an agent can act on directly.

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

company_search_personCompany Registry Search: Person (Experimental)AInspect

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesPerson name to search for.
api_keyNoYour Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description.
jurisdictionsYesRegistry codes to search, at least one (e.g. ["UK", "NO"]). "ALL" is not supported. The UK registry is "UK", not "GB"; "XX" is GLEIF LEI (global). company_registries() returns the live list.
include_inactive_rolesNoInclude resigned and ceased roles (default true).
include_sanctions_checkNoScreen every person and company found against sanctions lists (default true).

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?

Adds substantial behavior beyond the annotations: automatic sanctions screening, the silent-drop failure mode, and the recommendation to inspect jurisdictions_not_searched and coverage_warning. However, the api_key schema explicitly defers key requirements to 'its description,' and the description never explains them, and nothing accounts for the non-readOnly/non-idempotent annotations on what is presented as a lookup.

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?

Front-loaded with the capability and the hard constraint, and the examples at the end are useful rather than filler. The inline jurisdiction list is long and somewhat duplicative given the pointer to company_registries(), but it is defensible as a stale-prone fallback.

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?

For a two-required-param search with an output schema, the description covers invocation constraints and the main failure mode well. The one real hole is API-key requirement detail, which the schema explicitly delegates to this description but it never provides.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description supplies meaning the schema does not: the consequence of an unsupported code, the distinction between national registries and the global GLEIF entry, and the empty-result interpretation. The include_inactive_roles and include_sanctions_check defaults are only restated from the schema, not extended.

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

Purpose5/5

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

States a specific verb and resource ('Search company registries for a person's directorships, officer roles, and shareholdings') and scopes it to person-level results, which clearly separates it from the sibling company_search_company. Nothing is left ambiguous about what is being found or whose roles are returned.

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?

Gives explicit usage constraints: at least one jurisdiction required, 'ALL' unsupported, the exact supported code list, the instruction to call company_registries() for a live list, and what XX/GLEIF is for. It also names the failure condition (off-list jurisdiction is silently dropped) and tells the agent not to treat that as a negative finding.

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

company_search_resultCompany Search Result (Experimental)A
Read-only
Inspect

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.

Examples: company_search_result("abc123-def456")

ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNoYour Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description.
search_idYesThe search_id returned by a previous company_search_person or company_search_company call.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: the results are cached, this avoids re-running a search, and the tool is EXPERIMENTAL. It stops short of stating cache lifetime or whether results can go stale, which is the main unaddressed trait.

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?

Front-loaded with the purpose, followed by a short mechanism explanation and a compact example. Tighter than most; the example is mildly redundant with the already-explicit search_id wording but not wasteful.

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?

An output schema exists, so return values need no prose, and annotations cover the safety profile. The description supplies the retrieval workflow and its precondition, leaving only edge cases (expired search_id, retention window) unstated — minor for a two-parameter read tool.

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

Parameters3/5

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

Schema description coverage is 100% — the search_id parameter is already documented as coming from a prior search call, and api_key documents its own header alternatives. The description restates the search_id origin without adding format, validity, or expiry details, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource: 'Retrieve cached company search results by search ID.' It explicitly names the siblings that produce the search_id (company_search_person, company_search_company), so an agent can immediately distinguish cached retrieval from running a new search.

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?

Gives a clear when-to-use: retrieve prior results again 'without re-running the search,' and explains the precondition (a search_id from a prior search call). It does not state when NOT to use it (e.g. expired/unavailable search IDs), but the routing context is unambiguous.

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

country_banking_rulesCountry Banking RulesA
Read-only
Inspect

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.

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_codeYesISO 3166-1 alpha-2 country code, e.g. "DE", "US", "KZ".

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?

Annotations only cover readOnly/openWorld, but the description adds real behavioral semantics: the fatf_listing block is authoritative, a not_listed result is a positive determination rather than missing data, the coarse fatf field is a separate weaker signal, and currency is country-level and must not be used to diagnose account mismatches. These are non-obvious disclosure traits that go well beyond the annotations.

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

Conciseness4/5

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

Well front-loaded with the core purpose and return contents first, then scoping/warning notes, then examples. Every section is substantive, though the total length is on the heavy side for a one-parameter lookup, with some output-interpretation material that could be trimmed.

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?

An output schema exists so return values need not be explained, yet the description still clarifies the interpretation of key fields (fatf_listing vs. fatf, currency). Combined with readOnly annotations and a trivial single-param schema, an agent has everything needed to select and call this correctly.

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?

With a single parameter fully documented in the schema (ISO 3166-1 alpha-2), the schema does the heavy lifting. The description adds marginal value through concrete invocations that illustrate what different codes yield ("KZ" includes KNP, "AE" includes Purpose of Payment), reinforcing the parameter's role beyond the schema's generic example.

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

Purpose5/5

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

States a specific verb and resource ("Get banking rules and requirements for a country") and enumerates exactly what comes back: IBAN requirements, SEPA membership, FATF status, national currency, account formats, payment requirements. It also explicitly distinguishes itself from the sibling country_payment_codes, so an agent can route without opening either schema.

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?

Gives explicit when-to-use ("check country-specific STP rules that could cause payment delays, repairs, or rejections"), an explicit alternative for code lookup ("Use country_payment_codes to look up specific code values"), and an explicit substitution instruction for FATF questions ("Use it instead of training data"). It also includes a when-not usage warning about pairing currency with the payment currency.

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

country_export_controlsCountry Export-Control RestrictionsA
Read-only
Inspect

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.

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_codeYesISO 3166-1 alpha-2 country code, e.g. "RU", "CN", "DE".
jurisdictionNoOptional filter by jurisdiction, e.g. "US", "EU". Omit it for every jurisdiction.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only say readOnly/openWorld=false; the description adds the critical domain behavior that jurisdiction controls bind only with a nexus, and that each response carries a payment_jurisdiction_note explaining applicability. That is genuine behavioral context an agent cannot get from the annotations or schema.

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

Conciseness4/5

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

Well front-loaded: purpose, returns, then the nexus caveat, then examples. The IMPORTANT paragraph restates the payment_jurisdiction_note point already made one sentence earlier, and the four example lines are somewhat redundant, so it is slightly longer than strictly needed.

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 two-parameter lookup with an output schema already declaring return shape, the description supplies everything else an agent needs: scoping semantics, the nexus rule, filter usage, and worked examples. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description goes beyond the schema by explaining when to supply jurisdiction (only when you know the payment's actual touchpoints) and by giving multi-example invocations including the two-argument form. The added semantics justify a 4.

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

Purpose4/5

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

States a specific verb and resource ('Look up export control restrictions for a specific country') and enumerates the returned data (embargo status, sanctioned programs, control reasons, jurisdictions). It never names the closest sibling, export_controls_screen, so an agent cannot rule that tool out from this description 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?

Gives a clear when-to-use trigger ('What export restrictions apply to shipping to Russia?'), a parameter-selection rule for the jurisdiction filter, and an explicit when-not ('do NOT cite US controls without confirming a US nexus'). It stops short of routing between this and sibling tools like export_controls_screen or sanctions_screen.

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

country_payment_codesCountry Payment CodesA
Read-only
Inspect

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.

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
searchNoOptional keyword filter (e.g. "transport", "trade", "insurance"). Omit it to list every code in the table, which is a large response.
code_typeYesWhich code table to search, as named in country_banking_rules payment_requirements.required_fields[].code_type (e.g. "knp", "purpose_code"). Case-insensitive.
country_codeYesISO 3166-1 alpha-2 country code, e.g. "KZ", "AE".

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?

Annotations declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond that: omitting the search filter returns the entire table and is flagged as a large response, and the dependency on country_banking_rules output is disclosed. No auth/rate-limit detail, but little is missing for a read-only lookup.

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?

Front-loaded one-line purpose, then a short workflow note, then examples. The phrase "which is a large response" is duplicated from the schema description, a minor redundancy, but every block otherwise earns its place.

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?

An output schema exists so return values need not be explained. Purpose, workflow ordering, parameter usage and the large-response caveat are all present, leaving nothing an agent needs to call this correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The example calls add value beyond the schema by mapping real keywords ("transport", "insurance", "trade") onto the optional search parameter and showing the required argument order, which helps an agent construct a correct invocation.

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

Purpose5/5

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

States a specific verb (look up) and resource (country-specific payment codes) with concrete examples of code types (KNP, purpose codes). It also distinguishes itself from the sibling country_banking_rules by positioning itself as the second step in that workflow.

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 says to call country_banking_rules first to discover which code types a country requires (payment_requirements block), then use this tool to resolve values. This is a clear when-to-use and how-it-relates-to-alternatives statement, and the examples show concrete invocations.

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

eccn_lookupECCN LookupA
Read-only
Inspect

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
eccnYesExport Control Classification Number, e.g. "5A001", "3A001", "1C351". Case-insensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds that it is a pure reference lookup returning classification details, controlled jurisdictions, and license requirements, which clarifies determinism and scope. It does not disclose error behavior for unknown or malformed ECCNs.

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?

Purpose is front-loaded in the first sentence, followed by return scope and examples. The ECCN background paragraph and three examples are somewhat verbose for a one-parameter lookup, but each line is informative and scannable.

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?

For a simple read-only lookup with an output schema, the description supplies enough context: what an ECCN is, what the call returns, and representative inputs. The main gap is the absence of any pointer to sibling tools for related tasks (screening, HS classification).

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

Parameters3/5

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

Schema coverage is 100% and the single parameter is fully described, including case-insensitivity, so the schema does the heavy lifting. The description's example codes reinforce but do not extend the schema's meaning beyond it.

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

Purpose4/5

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

States a specific verb (look up) and resource (ECCN) and defines what an ECCN is, so an agent understands the domain immediately. However, it never distinguishes itself from close siblings like hs_code_lookup, goods_classify, country_export_controls, or export_controls_screen, so sibling routing is left to inference.

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?

"Pure reference tool" implies this is a static lookup rather than a screening action, which is weak implicit guidance against using export_controls_screen or sanctions_screen. There is no explicit when-to-use/when-not-to-use statement or named alternative, so usage must be inferred from the domain framing.

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

export_controls_screenExport-Control Goods ScreeningA
Read-only
Inspect

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.

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
eccnNoExport Control Classification Number, e.g. "3A001". Give at least one of eccn, hs_code, goods_description.
hs_codeNoHarmonized System code, 4-8 digits (e.g. "854231"). Give at least one of eccn, hs_code, goods_description.
jurisdictionNo"US" (default), "EU", "UK", "JP", "ITAR", or "ALL".US
goods_descriptionNoFree-text goods description, English or Russian. A fallback for when no eccn or hs_code is known; see the description.
destination_countryYesDestination country, ISO 3166-1 alpha-2 country code (e.g. "RU", "CN").

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?

Annotations declare readOnlyHint=true and openWorldHint=false, and the description adds real value beyond them: it warns that goods_description is matched lexically and typically returns the wrong HS code, tells the agent to read classification_basis / classification_confidence_note and never quote an inferred code back to the user, and clarifies that destination findings (embargo, transshipment risk, screening duties) are unaffected by that doubt. That is precisely the kind of failure-mode and output-interpretation context annotations cannot carry.

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?

Front-loaded with purpose, then the two IMPORTANT blocks and worked examples, each earning its place for a non-trivial compliance tool. Slightly redundant — the 'provide at least one of' rule is stated both in prose and again in every schema field — and the block layout is dense, but there is no 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?

For a tool with an output schema, this description supplies everything else the agent needs: how to identify goods, how to select jurisdiction, what the fallback path implies, and five concrete invocation examples spanning eccn, hs_code, free-text, and ALL-jurisdiction calls. Nothing required to call it correctly is missing.

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

Parameters5/5

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

Schema coverage is 100%, so baseline is 3, but the description meaningfully exceeds the schema: it ranks the three identification parameters (eccn/hs_code preferred, goods_description a fallback), explains the lexical-matching weakness of goods_description, and gives real substance to jurisdiction via the nexus rule (US EAR binds US persons/USD-clearing/US-origin; EU/UK/JP bind their persons, currencies, origin) — none of which appears in 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 opens with a specific verb+resource+scope: 'Screen goods for export-control restrictions to a destination country,' then names the exact combination it performs (goods classification × destination restriction status). It is clearly distinguishable from siblings like eccn_lookup, goods_classify, hs_code_lookup, country_export_controls, and sanctions_screen, which each cover only one half of that combination.

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?

Strong internal guidance: 'Provide at least one of eccn / hs_code / goods_description,' 'prefer eccn or hs_code,' and a detailed rule for choosing jurisdiction ('ALL' for multi-jurisdiction, or the one matching actual touchpoints). It does not, however, explicitly route the agent away from siblings (e.g. when to call eccn_lookup or goods_classify instead), which is the only gap.

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

federal_register_changesFederal Register Export and Sanctions ChangesA
Read-only
Inspect

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.

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
daysNoDays to look back, 1-365 (default 30). A value outside the range is refused.
limitNoMaximum number of changes to return (default 50).
agencyNoOptional: "BIS" (Bureau of Industry and Security) or "OFAC" (Office of Foreign Assets Control). Omit it for both.
categoryNoOptional: "entity_list", "rule_change", "country_policy" or "sanctions". Omit it for every category.
severityNoOptional: "critical", "high", "medium" or "low". Omit it for every level.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and scope are covered structurally. The description adds the nature of returned content (entity list updates, rule changes, sanctions programs) but says nothing about ordering, freshness, pagination, or truncation behavior beyond the limit param. With annotations carrying the safety profile, a 3 is appropriate.

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?

Front-loads the one-line purpose, then a content list, then compact examples with inline comments. Nothing is redundant and each block earns its place.

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?

With an output schema present, the description needn't explain return values, and annotations cover read-only/open-world semantics while the schema covers all five parameters. The definition is essentially complete for a read-only filtered feed; only freshness/ordering context is absent.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented in the schema (ranges, enums-as-strings, defaults). The description only illustrates parameter combinations through examples, adding no syntax or constraint detail beyond what the schema provides. Baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource (get recent US regulatory changes from BIS and OFAC) and enumerates the content returned (entity list updates, rule changes, country policy shifts, new sanctions programs). This clearly separates it from sibling screening tools like sanctions_screen or export_controls_screen, though it never names a sibling explicitly.

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?

Three concrete invocation examples plus an explicit use case ('Any new entity list additions affecting China?') give clear context for when to reach for this tool. It stops short of stating when NOT to use it or naming an alternative (e.g. sanctions_screen for checking a specific party).

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

fx_rateFX Reference RateA
Read-only
Inspect

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
baseYesBase currency, ISO 4217 (e.g. "USD"). The rate is quoted as units of target per 1 base.
targetYesTarget currency, ISO 4217 (e.g. "VND").

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnly/openWorld, but the description discloses provenance semantics ('ecb' vs 'market', never call market data 'the ECB rate'), coverage limits (~60 currencies, CLP/COP/PEN absent), the exact error behavior on a missing leg, and that cross-rates via EUR are indicative and not executable. This is rich behavioral context well beyond the annotations.

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

Conciseness4/5

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

Front-loads the core purpose in the first sentence, then layers provenance, coverage, and error handling. It is dense but earns most of its length; the 'source'/'source_note' guidance is slightly repetitive and could be tightened.

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?

An output schema exists, so return-value explanation is not required, and the description still calls out the result fields that matter for provenance. Combined with coverage caveats, cross-rate mechanics, and error behavior, an agent has everything needed to call this correctly.

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

Parameters4/5

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

Schema coverage is 100% and the schema already documents base/target and quote orientation, so baseline is 3. The description adds meaningful semantics on top: both params mandatory, no implicit default, mis-named currencies produce a 'missing required argument' error rather than a silently-wrong rate, plus worked examples.

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?

Specific verb + resource: 'Get the latest available reference (mid-market) exchange rate for a pair.' It also carves out a clear niche against siblings like fx_rate_history, fx_volatility and fx_timing_advisor by emphasizing the latest single snapshot. An agent can distinguish it without opening another schema.

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

Usage Guidelines4/5

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

Strong when-to-use guidance: BOTH currencies required, no implicit default pair, never assume EUR/USD, and what to do when a leg is uncovered (relay that no rate is held rather than inventing one). It does not, however, name a sibling alternative (e.g. fx_rate_history for past rates), so it stops short of explicit routing.

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

fx_rate_historyFX Rate HistoryA
Read-only
Inspect

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
baseYesBase currency, ISO 4217 (e.g. "EUR"). Rates are quoted as units of target per 1 base.
daysNoLookback window in calendar days, 1-365 (default 90). Values outside the range are clamped. A ceiling on the window, not a promise of that many data points.
targetYesTarget currency, ISO 4217 (e.g. "USD").

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description carries substantial extra behaviour: the source field's 'ecb' vs 'market' semantics and which currencies fall under each, series_coverage.truncated logic, peg_context and third-currency anchors, and error-on-uncovered-pair instead of an empty series. This is exactly the kind of context annotations cannot supply.

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 front-loads purpose then outputs, and nearly every sentence conveys a distinct constraint (provenance, truncation, pegs, errors, required params, examples). The shouting-capital directives are slightly verbose, but the density is justified by the tool's 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?

Despite an output schema existing, the description supplies the interpretive layer the schema cannot: how to report coverage honestly, how to attribute each source, and how to handle pegged or uncovered pairs. Nothing an agent needs to call and correctly describe the result is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond it: it reinforces that days is a ceiling rather than a promise with a concrete illustration ('a 365-day request routinely returns five months'), and stresses that both currencies must be passed exactly with no implicit EUR/USD default. That is genuine added value over the schema text.

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 opening sentence names a specific verb and resource — retrieve the historical reference exchange-rate series for a currency pair — which cleanly separates it from the sibling fx_rate (current rate). An agent can identify the tool's function without opening the schema.

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

Usage Guidelines4/5

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

The description gives strong in-scope guidance (how to characterise the period, how to attribute provenance, how to report uncovered pairs) but never routes the agent to or away from siblings such as fx_rate or fx_volatility, and states no explicit 'when not to use this tool' condition. Clear context, missing the alternative comparison.

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

fx_timing_advisorFX Market Session TimingA
Read-only
Inspect

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
currencyNoOptional ISO 4217 code (e.g. "EUR", "JPY"). Omit it to get every session and overlap.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context – that output carries an inbound_processing_note for restricted currencies and that hold durations are explicitly not in the data – but it does not describe the shape of the session/liquidity windows returned beyond naming them. Solid additive context on top of annotations, not exhaustive.

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?

Front-loads purpose then bullets the two usage modes; the caveat block is long but every sentence carries a real instruction (what not to say, which tool to call instead). The trailing Examples block is somewhat redundant with the schema's ordering semantics, keeping it just short of maximal.

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?

An output schema exists, so return values need no explanation, and the description covers purpose, both call modes, the safety caveat, the escalation path to country_banking_rules, and the inbound_processing_note. Nothing an agent needs to invoke or interpret this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the single optional parameter is already documented, so the baseline is 3. The description goes slightly beyond by spelling out the two call modes' outcomes ('optimal window' when passing a code vs 'all market sessions and overlap windows' when omitting) and gives concrete examples (EUR, JPY, INR).

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

Purpose5/5

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

States a specific verb and resource ('Get FX trading windows... Returns market sessions and liquidity windows for a currency') and clearly differentiates itself from siblings like fx_rate, fx_volatility, and payment_cutoff_times by scoping to session/liquidity timing. An agent can route to it without opening the schema.

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

Usage Guidelines5/5

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

Explicitly names the primary reliable use (rate/spread optimization) and a use-with-care case (delay diagnosis), then redirects to a named alternative (country_banking_rules(destination)) for the binding delivery-side cutoff. It also tells the agent what not to claim ('held until the next session', quoted hold durations) – a rare and valuable negative constraint.

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

fx_volatilityFX Volatility and Exposure BandA
Read-only
Inspect

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.

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
baseYesBase currency, ISO 4217 (e.g. "EUR").
targetYesTarget currency, ISO 4217 (e.g. "TRY").
horizon_daysNoOptional. Calendar days from today to the end of the exposure, 1-1825. A value outside that range returns an error instead of a band. Omit it for spot / settlement risk only.

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?

Annotations only declare readOnly/openWorld, so the description carries the behavioral burden and does it well: it discloses that figures are REALISED from a short history (not implied), warns about horizon.beyond_sample, states the band is future spot rather than a transactable rate, and forbids inventing forward rates in favor of relaying horizon.hedge_cost_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?

Front-loaded with the core purpose, then usage, then guardrails, and examples land at the end. It is long, and the hedge-cost warning is somewhat repetitive, but the length is largely justified by the number of correctness rails the model must observe.

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

Completeness5/5

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

With an output schema present the return values need not be spelled out, and the description still covers the qualitative buckets, the horizon block contents, and the interpretation caveats. An agent has everything needed to call it correctly and report results safely.

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 already 100%, so the baseline is 3. The description goes beyond the schema by explaining horizon_days semantics — count calendar days from today to exposure end, rough estimates are fine because the band scales with sqrt(time) — which meaningfully adds to the 'accepts 1-1825' schema text.

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

Purpose5/5

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

States a specific verb and resource (get realized FX volatility for a currency pair) plus the secondary action (size FX risk on an exposure to a future date). It clearly separates this from siblings like fx_rate, fx_rate_history and fx_timing_advisor by being the realized-volatility/bucketing 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?

Gives explicit when-to-use triggers for horizon_days ('whenever the user's exposure runs past settlement'), a bulleted list of question shapes that select this path, and the negative case (omit it for spot/settlement risk only). This is about as routed as a definition gets.

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

goods_classifyGoods ClassificationA
Read-only
Inspect

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.

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_codeNoOptional known HS code (4 or 6 digits) for a direct lookup.
languageNoOptional hint: "en" or "ru" (auto-detected if omitted).
descriptionYesGoods description, at least 2 characters (e.g. "uranium centrifuge", "центрифуга для урана").

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?

Annotations already declare readOnlyHint and openWorldHint=false, yet the description adds substantive behavioral context: the matcher is lexical, confidence measures string-match strength not correctness, and unclassified results carry classification_basis and classification_confidence_note that must be read before quoting a code. That is exactly the kind of caveat annotations cannot convey.

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?

Front-loaded with the core purpose and routing rule, then caveats, then examples. Every section earns its place, though the return-value enumeration is partly redundant given an output schema exists and adds 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?

For a 3-parameter bilingual classifier, the definition covers scope, destination-agnostic boundary, matcher limitations, confidence interpretation, and fallback behavior when no HS code is supplied. Nothing needed to invoke or trust the output is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description goes beyond it by showing the empty-description + hs_code direct-lookup pattern and noting bilingual auto-detection, which gives practical meaning to the optional parameters rather than just restating them.

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

Purpose5/5

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

States a specific verb (classify) and resource (goods for export control) and immediately distinguishes itself from siblings by declaring it is destination-agnostic and pointing to export_controls_screen for the license decision. Also enumerates the returned artifacts (HS code, ECCNs, control reasons, level, confidence, alternatives).

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 names the alternative (export_controls_screen) and the condition that selects it, explains the destination-agnostic vs destination-specific split, and clarifies the hs_code lookup path. Examples cover EN, RU and direct-lookup invocation.

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

gpi_status_codesPayment Status Codes and Stuck-Payment Playbooks
Read-only
Inspect

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 = passed on to a bank that is not a gpi member, G002 = credit pending, may not be same day).

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
codeNoOptional ISO 20022 status code (ACSP, ACCC, PDNG, RJCT, RTRN, BLCK) or reason code (e.g. G001), case-insensitive. A status code returns its investigation playbook. Omit it to list every code.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
hs_code_lookupHS Code LookupA
Read-only
Inspect

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.

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_codeYesHS code, 4-6 digits (e.g. "854231", "8411"). Dots and spaces are fine.
jurisdictionNoOptional filter: "US", "EU", "UK" or "JP".

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?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior: mappings are richest at 6-digit level, an empty list is NOT a guarantee of being uncontrolled, and results carry confidence levels, control reasons, sensitivity, and governing regime.

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?

Front-loaded with purpose and audience, then granularity guidance, caveat, and examples. Slightly long, but each block (audience, direction, caveat, examples) earns its place and the practical caveat is well-placed.

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

Completeness5/5

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

With annotations covering safety and an output schema covering return values, the description supplies everything else an agent needs: direction, granularity expectations, filter syntax, an explicit false-negative caveat, and a fallback tool. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100% and an output schema exists, so the baseline is 3. The description goes beyond the schema by explaining the 4-digit vs 6-digit tradeoff (richer mappings at 6 digits) and showing jurisdiction-filtered invocation, adding real decision value.

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

Purpose5/5

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

States a specific verb and direction ("Reverse-lookup an HS code → mapped ECCNs") plus the resource and output artifact. The word "reverse" and the HS→ECCN direction let an agent distinguish it from the forward-looking eccn_lookup sibling without opening a schema.

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

Usage Guidelines4/5

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

Names the target audience, explains what an empty result means, and routes the agent to goods_classify or a formal classification when confirmation is needed. It does not explicitly contrast itself with eccn_lookup, which is the most likely sibling an agent could confuse it with, so it stops short of full when/when-not coverage.

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

iban_validateIBAN ValidationA
Read-only
Inspect

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. Everywhere else the bank identifier is a NATIONAL bank/sort code (the German BLZ, Italian ABI, French code banque): bank_identifier.code is those characters, is_bic_prefix is false, and no institution is named — quote the code when telling the user what to check, never a bank name derived from it.

A FAILURE IS NOT ALWAYS A CHECKSUM FAILURE. An IBAN of the right length whose characters break the country's mask (a letter where the country requires a digit — O for 0, I for 1) is refused BEFORE mod-97 runs, with format_violations naming the position. Report the position and the character; do not tell the user the check digits are wrong.

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
ibanYesThe IBAN to check, e.g. "DE89370400440532013000". Spaces and hyphens are ignored and letters are upper-cased.

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?

Annotations only declare readOnlyHint and openWorldHint, so the description carries the semantic burden — and it does: it explains that mask violations are refused before mod-97 and reported via format_violations, and that valid:true means only the check digits pass, not that the account exists or matches the beneficiary. The currency caveat (country_currency is national, not account denomination) is critical behavioral context an annotation cannot convey.

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?

Content is front-loaded (what it does, then the cross-check, then failure modes, then what valid means), but the emphatic all-caps assertions and repeated warnings make it longer than strictly needed for a single-parameter tool. Every paragraph is substantive, yet some points could be tightened.

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?

An output schema exists and the description still names the key response fields an agent must interpret (resolved_institution, bank_identifier.code, is_bic_prefix, format_violations, verification_note, currency_note), so an agent can act on results and avoid the two most likely misreadings.

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

Parameters4/5

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

Schema coverage is 100% and the schema already documents whitespace/hyphen tolerance and upper-casing, so the baseline is 3. The description reinforces this with a spaced GB example that confirms normalization behavior, adding modest value 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 names a precise verb+resource (validate an IBAN) and states the exact scope: format check, country-length check, mod-97 checksum, plus institution resolution. It distinguishes itself from neighbors like swift_lookup and country_banking_rules by explaining what it returns about the beneficiary bank versus country-level rules.

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

Usage Guidelines5/5

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

Explicit routing: 'Call this whenever the user supplies an IBAN AND names a beneficiary bank or BIC.' It also states the condition under which no institution is named (national bank/sort-code countries) and tells the agent what to quote in that case, and it points to verification_note/currency_note for follow-up.

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

is_business_day_checkBusiness Day CheckA
Read-only
Inspect

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).

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_dateYesThe date to check, YYYY-MM-DD (ISO 8601).
country_codeYesISO 3166-1 alpha-2 country code, e.g. "US", "DE".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses the return shape (business-day boolean, weekend-vs-holiday reason, next business day), the presence of a `today` block, and the `date_anchor_warning` behavior with a concrete failure example. This is precisely the kind of non-obvious behavioral detail annotations cannot carry.

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?

Front-loaded with the core purpose, then progressively adds behavior and examples. The date-anchor digression and its parenthetical '(2025-07-20 is a Sunday, 2026-08-20 is a Thursday)' are justified by the failure mode they prevent, though the mid-sentence line wrapping makes it slightly denser than needed.

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

Completeness5/5

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

With annotations covering the safety profile and an output schema covering the return structure, the description supplies exactly the missing pieces: the reason codes, the next-business-day field, and the date-resolution/warning semantics. An agent has everything needed to call and interpret it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented as ISO 8601 date and ISO 3166-1 alpha-2 code. The description only reinforces this indirectly through examples; it adds no new format, constraint, or edge-case meaning beyond the schema. Baseline 3 applies.

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

Purpose4/5

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

The first sentence gives a precise verb+resource+scope ('Check if a specific date is a business day in a country'), and the following sentences clarify what factors into the answer (country-specific weekends, public holidays). It is unmistakable what the tool does, but it never distinguishes itself from the closely related sibling 'bank_holidays' or 'value_date', leaving the agent to infer the boundary.

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 gives actionable invocation guidance rather than tool-selection guidance: resolve relative dates against the server's `today` block, and heed `date_anchor_warning` for past check_dates. That is real when-to-use-this-way context, but there is no statement of when to prefer this over 'bank_holidays' or other date/holiday siblings.

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

mcp_registerRegister for an API KeyAInspect

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).

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

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesYour email address. The verification code is sent to it.
accept_termsYesMust be true. Confirms acceptance of the Ohmyfin Terms & Conditions at https://ohmyfin.ai/terms.
organization_nameYesYour company or project name.

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?

Annotations already declare write/non-idempotent/openWorld, but the description adds real behavioral context: an account is created and a 6-digit code is emailed, and registration only completes via a follow-up call to mcp_verify. It goes further by spelling out the legal meaning of accept_terms. It stops short of noting duplicate-registration behavior or rate limits, so not a full 5.

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?

Front-loads purpose, then the flow, then the legal clause, then a concrete example. The legal paragraph is verbose but justified for a terms-acceptance field, so most sentences earn their place.

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?

An output schema exists, so return values need not be explained, and the description fully covers the multi-step registration flow and the required terms acceptance. An agent has everything needed to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema for accept_terms by explaining it confirms acceptance of the Terms on behalf of the operator, citing specific sections. The inline example also clarifies positional 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?

States a specific verb+resource ('Register for an Ohmyfin API key') with the downstream purpose ('to use paid tools'). It distinguishes itself from the sibling mcp_verify by explicitly describing the registration step versus the completion step.

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 says when to call this (to obtain an API key for paid tools) and routes the agent to the next step: call mcp_verify after receiving the 6-digit code. The sequencing and the alternative tool are both named, 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.

mcp_verifyVerify Email and Activate API KeyAInspect

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe 6-digit verification code from that email.
emailYesThe email address you registered with.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations cover the safety profile (not read-only, not idempotent, open-world), so the bar is lower, but the description adds genuinely useful behavior: it returns production AND test API keys on success, and paid tools require a separate subscription. It does not say whether the code is single-use or what happens on failure.

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?

Purpose is front-loaded in the first line, precedence follows, and the example is compact. Slightly more prose than strictly necessary (the subscription line could be tightened), but every sentence carries usable information.

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?

With an output schema present and full param coverage, the description needn't explain return values, and it still adds the key behavioral facts (returned keys, subscription gate, prerequisite call). Complete enough for an agent to invoke correctly, missing only failure/retry behavior.

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

Parameters3/5

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

Schema coverage is 100% with both parameters documented, so the schema does the heavy lifting (code = '6-digit verification code from that email'). The description adds only the worked example showing the call shape/order and no format nuances 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 states a specific verb+resource ('Verify your email and receive your API key') and ties it to a clearly named sibling flow (mcp_register), so an agent can distinguish it from the many lookup-style siblings. Scope and outcome (production and test API keys) are explicit.

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

Usage Guidelines5/5

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

It states the precondition and sequencing explicitly: 'After calling mcp_register, check your email for the 6-digit code and pass it here.' It also adds a separate activation condition (ohmyfin.ai/subscription) for paid tools, so the agent knows when the tool is sufficient and when extra action is needed.

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

payment_cutoff_timesClearing System Cutoff TimesA
Read-only
Inspect

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).

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

ParametersJSON Schema
NameRequiredDescriptionDefault
systemNoOptional clearing system code or name, e.g. "T2", "FEDWIRE", "CHAPS". Case-insensitive; "TARGET2" resolves to T2, its name since March 2023. Omit it to list every system or to filter by currency.
currencyNoOptional ISO 4217 code to filter by (e.g. "USD", "EUR").

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already establish a safe read-only, non-open-world operation. The description adds important behavior beyond annotations: DST-sensitive fields, the distinction between standard-time and summer offsets, and the instruction to quote operative_cutoff_today for the current season.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, then adds scoped coverage, usage guidance, a critical DST caveat, and concise examples. Despite its length, every section earns its place for a domain-specific reference tool.

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

Completeness5/5

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

With an output schema and clear annotations, the description does not need to explain return values. It covers scope, filtering behavior, DST caveats, and examples, leaving no essential invocation detail missing.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents both optional parameters. The description adds meaningful selection semantics, including what currency='EUR' returns (SEPA schemes plus T2) and what omitting system does, going beyond the schema descriptions.

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

Purpose4/5

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

The description gives a specific verb and resource: 'Get payment system cutoff times for major clearing systems,' then lists covered systems. This is unambiguous, though it does not explicitly distinguish itself from siblings such as settlement_eta or value_date.

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 usage context, especially the same-day EUR guidance and concrete call examples. It does not state when not to use the tool or name alternative sibling tools, so it stops short of full when/when-not guidance.

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

payment_method_comparePayment Method ComparisonA
Read-only
Inspect

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.

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_countryYesReceiving country, ISO 3166-1 alpha-2 country code (e.g. "GB", "TR").
source_countryYesSending country, ISO 3166-1 alpha-2 country code (e.g. "DE", "US").

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true and openWorldHint=false, so safety is already covered; the description usefully adds the fee-investigation workflow and that specific MT103 fields reveal each deduction. It goes beyond the annotations by disclosing the analytical process, though it does not mention input validation limits or error behavior.

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 core purpose and the when-to-use condition are front-loaded before the examples. Four examples is slightly more than needed but each demonstrates a distinct mode (SEPA, SWIFT, domestic, fee investigation), so the size is largely justified.

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?

An output schema exists, so return values need not be restated; the description nonetheless summarizes them (cost, speed, requirements, charge options, guidance). With only two required, fully documented params and clear annotations, the definition is effectively complete, missing only minor edge-case guidance.

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

Parameters3/5

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

Schema description coverage is 100%, so both country-code parameters are fully documented in the schema (ISO 3166-1 alpha-2). The description adds no format or edge-case detail beyond the schema, and the examples only reinforce a format the schema already states, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource (compare payment methods) plus a second capability (fee investigation for a country pair). It explicitly enumerates the compared options (SEPA vs SWIFT vs domestic) and the charge-option model (OUR/SHA/BEN), so an agent can distinguish it from siblings like transfer_cost or ssi_lookup without opening a schema.

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

Usage Guidelines4/5

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

Provides a clear triggering condition ("use this when the beneficiary received less than expected") and four examples that map country-pair shapes to expected outputs (SEPA → SCT, non-SEPA → SWIFT, domestic → CHAPS/FPS). It lacks explicit when-not usage or named sibling alternatives, so it stops 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.

sanctions_screenSanctions and Watchlist ScreeningA
Read-only
Inspect

Screen a name against global sanctions and watchlists.

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.

verification_gate is on every bank response whose verdict asserts a finding (BLOCK, REVIEW, MONITOR or INFORM), and it asks one question: does that verdict survive the evidence this payload actually publishes. A REVIEW, MONITOR or INFORM over an EMPTY matches list is not a weaker BLOCK. This screen publishes designations only for a financial institution, so the rows that carried such a verdict are the non-designation ones (warning lists, adverse media, PEP, debarment) it withholds — counted in non_designation_rows_withheld and never listed. Those responses come back recommended_action: CLEAR with verification_gate.applied: true, meaning no DESIGNATION matched. Say exactly that, and keep the scope with it: it is never a clean bill across every list. The gate stands down, and the verdict stays, when our own verification removed a designation as a false positive (designations_filtered_as_false_positives), when the directory record is not clean, or when the row that set the verdict was off-page.

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. Present words a row holds only inside a web address, e-mail address, @handle or labelled channel are named again in query_words_only_in_contact_details: they name an address or channel of the listed party, not the listed party, so that row is not taken at face value on their account.

The response also carries coverage_gate, set by the screening engine: how much of the name you screened actually appears on the rows that are blocking. When applied is true the payload-level recommended_action was 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 stands and reason says why. A reason of identifier_query means the name screened was a registration or tax number that matched a designation's own identifier: that is a match on identity, not on wording, so report the BLOCK as it stands.

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
nameYesThe person or entity name to screen.
api_keyNoYour Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description.
thresholdNoMinimum match score, 0-100 (default 85). Values above 95 are treated as 95.
subject_typeNoWhat 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.auto

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

With only readOnlyHint and openWorldHint annotations, the description carries the behavioral burden and does so extensively: it explains verification, adjudication, verification_gate, coverage_gate, query_match, withheld non-designation rows, false-positive handling, and reporting constraints. This goes far beyond structured fields and gives the agent the context needed to interpret results correctly.

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

Conciseness3/5

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

The purpose is front-loaded and the content is organized into useful paragraphs, but the description is extremely long and repeats several warnings about gates and adjudication. Much of the length is justified by a complex tool, yet it is not 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 complexity of sanctions screening, the presence of an output schema, and the critical reporting nuances, the description is highly complete. It defines return-field semantics, edge-case behavior, and action-lowering rules that an agent would otherwise misinterpret.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds some practical context around subject_type and examples using threshold, but most parameter meaning is already documented in the schema itself.

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 gives a specific verb and resource: 'Screen a name against global sanctions and watchlists.' It names the sibling tool swift_lookup and the BIC-based bank screening alternative, so an agent can distinguish this tool without opening the schema.

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

Usage Guidelines5/5

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

The description explicitly covers when to use this tool, when to prefer swift_lookup or BIC screening, and how subject_type changes behavior for banks versus parties. It also provides concrete invocation examples with threshold and api_key variations.

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

settlement_etaPayment Arrival Estimate (Beta)A
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
uetrNoUETR of a tracked payment, UUID v4 (e.g. "eb6305c8-0710-4e41-84ad-f58db3083e82"). Preferred for a payment already in flight; see INPUT DISCIPLINE in the description.
amountNoPayment amount; it improves the delay-risk assessment. A plain number is fine: 50000 and "50,000.00" are both accepted.
api_keyNoYour Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description.
currencyNo3-letter ISO 4217 currency, for the pre-trade path. Ignored when the uetr resolves.
sender_bicNoSending bank's BIC (8 or 11 characters) or bank name, for the pre-trade path.
receiver_bicNoReceiving bank's BIC (8 or 11 characters) or bank name, for the pre-trade path.
arrive_by_dateNoYYYY-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.
current_statusNoStatus code such as ACSP, for the path without a uetr only.
sender_countryNoOptional ISO 3166-1 alpha-2 country code of the sending bank.
intermediary_bicNoOptional BIC of a known intermediary bank.
receiver_countryNoOptional ISO 3166-1 alpha-2 country code of the receiving bank.
elapsed_business_daysNoBusiness days already in flight, for the path without a uetr only.

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?

Annotations only declare readOnlyHint/openWorldHint; the description adds far more — beta payload flag, mandatory caveat language, what mode="outlier" implies, route.confirmed=false meaning inference not GPI confirmation, basis.route_adjusted meaning no observed corridor data, and the distinction between ACCC delivery and funds usability. That is exactly the behavioral context annotations cannot carry.

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?

Long but front-loaded: the BETA caveat and the use-it-honestly instruction come first, then modes, then input discipline, then answer-reading. Every section is actionable, though the BETA warning and the confidence caveat are restated in more than one place, costing a little economy.

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, two-mode statistical estimator with an output schema, the description covers mode selection, input hygiene, contractual caveats, and interpretation of each returned field. Nothing an agent needs in order to call it correctly or relay the result honestly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so each parameter is already documented at baseline. The description nevertheless adds cross-parameter meaning the schema cannot: which parameter set applies to which path, the prohibition on self-computing elapsed_business_days, and the rule that arrive_by_date deadlines must be resolved against the today block. Some of this duplicates schema text, which keeps it below 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?

States a specific verb and resource — 'Estimate when a SWIFT payment will arrive' — and immediately separates the two operating modes (forward arrival vs reverse send-by). It is clearly distinguishable from siblings like track_payment (which supplies the uetr) and value_date/bank_holidays (which supply the calendar basis), both named explicitly.

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

Usage Guidelines5/5

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

Explicit routing rules: pass ONLY the uetr for mid-flight payments, currency+sender_bic/receiver_bic for pre-trade, and arrive_by_date for reverse mode. It also names exclusions and alternatives ('elapsed_business_days are for this path only', 'pivot to the stuck-payment diagnostic flow' on mode="outlier"), so an agent knows when not to use it.

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

ssi_lookupSettlement Instructions (SSI) LookupA
Read-only
Inspect

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.

  • WHICH CORRESPONDENT: read correspondent_selection, not the array order. It gives the COMPLETE set of BICs for each flow (customer MT103 vs interbank MT202) and for whether the correspondent clears the currency itself, each with a count. The correspondents are returned in STORAGE order, which is not a ranking. Naming a subset ("principally X and Y", "route via X") invents a preference this feed does not hold. Name every BIC in the matching set, or give its count: which one is used is the SENDING bank's choice among the ones it can already reach, not the beneficiary bank's, and not ours to guess from bank size or reputation. is_preferred is null on almost every row because the flag is genuinely unrecorded (11 rows in the entire corpus carry it); where it IS set, correspondent_selection.bank_flagged_preference names it and you should lead with that.

  • intermediaries is null — not [] — when this correspondent's onward chain is not recorded, which is 98% of rows. null means NOT ESTABLISHED, never zero hops: do not read it as a direct chain and do not count it. Whether a further hop is needed is answered by each correspondent's clearing_note, which says either that it clears the currency itself or that a further hop is expected and gives the ssi_lookup call that resolves it. When the chain IS recorded the array is populated and intermediaries_note names the hops in order.

  • 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.

COVERAGE IS KNOWABLE BEFORE YOU CALL, AND FOR FREE. swift_lookup returns a settlement_instructions block on every bank: on_file: true with a currency count means this lookup will answer, false means we hold none in any currency, null means it has not been established. Do not treat "might be a coverage gap" as a reason to skip the call and describe the routing from memory — ask swift_lookup, then read the answer here.

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.

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
swiftYesBIC of the bank, 8 or 11 characters (e.g. "DEUTDEFF").
api_keyNoYour Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description.
currencyYesISO 4217 currency code (e.g. "USD", "EUR", "GBP").

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only declare readOnlyHint/openWorldHint; the description adds far more: the API-key/FI-subscription auth requirement, the null-vs-empty distinction for `intermediaries` (98% of rows), the COMMERCIAL vs FINANCIAL asset-category split, why `is_preferred` is null, and the meaning of empty `correspondents` (a coverage gap, not a finding). This is exactly the behavioural context annotations cannot carry.

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

Conciseness3/5

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

The purpose and the routing/chaining guidance are front-loaded, which is good. However the body runs long with repeated admonitions ('Do NOT invent account numbers', 'do not read it as a direct chain', 'Do NOT name a correspondent') and onboarding boilerplate for registration, much of which could be tightened 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?

An output schema exists, yet for this data set the description's explanation of field semantics (correspondent_selection sets, clearing_note, asset_categories vs asset_category, the various *_note fields) is what makes the response interpretable and prevents hallucinated routing. Given the tool's complexity and the open trap surface, the coverage is complete.

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

Parameters3/5

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

Schema description coverage is 100% and all three parameters are documented there, so the baseline is 3. The description adds only indirect parameter meaning — the examples show swift/currency pairing and the optional api_key form ('ssi_lookup("DEUTDEFF", "USD", api_key="prod-abc123...")') — but no extra semantics on format or constraints 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 opening sentence names a specific verb and resource ('Look up correspondent banking / settlement instructions (SSI) for a bank') and immediately scopes the return to 'correspondent banks (nostro accounts) ... to settle payments in a specific currency'. It is clearly distinguishable from the nearest sibling, swift_lookup, which it explicitly frames as the coverage pre-check rather than a duplicate.

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 routing ('If the note suggests a further lookup, call ssi_lookup on the correspondent's SWIFT code'), names alternatives for the failure case (swift_lookup for the published correspondent page when accounts are missing), and states the prerequisite workflow (mcp_register → mcp_verify → FI plan subscription). It even tells the agent when NOT to skip the call ('Do not treat "might be a coverage gap" as a reason to skip').

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

swift_lookupBank and BIC Directory SearchA
Read-only
Inspect

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.

EVERY BANK COMES BACK SAYING WHETHER WE HOLD ITS CORRESPONDENT CHAIN. Read settlement_instructions on each bank: on_file: true with a currencies_on_file count means we hold that BIC8's actual correspondent BIC, nostro account number and national clearing ID, and read_with is the exact ssi_lookup call that returns them. on_file: false means we hold none in any currency — a gap in our data, not a finding about the bank. A null is "not established yet" and is neither. This is the answer to "which intermediary bank do I put on the instruction?", and it is a fact we either have or do not have — never one to recall from training data.

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
limitNoMaximum number of banks to return, 1-100 (default 20). Values outside the range are clamped.
queryYesBank name, BIC, or bank name plus city ("Commerzbank Frankfurt"). A BIC may be 8 or 11 characters; an 11-character BIC ending in XXX is searched as its 8-character form. The 12-character address in an MT message header (BIC8 + terminal letter + branch) is not a BIC: pass its first 8 characters.
countryNoOptional country filter: an ISO 3166-1 alpha-2 code ("ID", "DE") or a full English name ("Indonesia", "Germany"). Names are resolved automatically.

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?

Annotations only declare readOnlyHint and openWorldHint, so the description carries the rest and does so richly: it discloses the representative-office election behavior, the sanctioned-watchlist FLAG being coarse rather than a screen, and the tri-state semantics of settlement_instructions (on_file true / false / null, where null is 'not established yet'). It also warns that a name search returns only one office per bank and that BIC choice changes pricing, which is behavior an agent cannot infer.

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

Conciseness3/5

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

The critical scoping facts are front-loaded, but the body is heavy: all-caps emphasis lines, aphoristic asides ('never one to recall from training data'), and eight partly-overlapping examples pad the length. Most sentences carry information, but the styling and repetition keep it from being tight.

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?

Although an output schema exists and return values need not be described, the definition goes further and explains settlement_instructions and office_note semantics, which is exactly the interpretive context an agent needs. Nothing required to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the schema already documents BIC length handling and the country filter, so the baseline is 3. The description adds genuine operational meaning beyond the schema by instructing that a user-named city belongs in the query string and by explaining why office selection inside the query changes the result.

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

Purpose5/5

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

States a specific verb and resource ('Search banks and financial institutions by name, SWIFT/BIC code, or country') and explicitly scopes the corpus to SWIFT and non-SWIFT institutions. It distinguishes itself from siblings by name, routing compliance verdicts to sanctions_screen and correspondent data retrieval to ssi_lookup.

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

Usage Guidelines5/5

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

Gives explicit when-to-use coverage with eight concrete call examples, plus when-not guidance ('this is NOT a full screen, use sanctions_screen for a compliance verdict'), a rule for including a city in the query, and a fallback instruction to ask the user for the BIC on their statement. Alternatives and exclusions are both spelled out.

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

swift_message_referencePayment Message Reference (MT and ISO 20022)A
Read-only
Inspect

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
message_typeNoOptional message type, e.g. "MT103", "pacs.008", "MT940". Case-insensitive. Omit it to list every type.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: MT103 and pacs.008 responses include a `tracing_note` explaining UETR recovery, which tells the agent something about return content it would not otherwise 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?

Front-loaded with the core purpose, then the two usage modes, then concrete examples. Every sentence adds distinct information (domain coverage, field-location use case, response detail) with no 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?

An output schema exists so return values need not be documented, yet the description still flags the tracing_note behavior. With one optional parameter fully documented and clear usage modes, nothing an agent needs to invoke this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the parameter's description already covers the case-insensitive/omit behavior, so the baseline is 3. The description goes further by naming concrete valid values (MT103, pacs.008, MT202, MT700, MT760, MT940, camt.053, pacs.002) and showing call examples, which is valuable given there is no enum on 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?

States a specific verb and resource ('Look up SWIFT message types — MT (FIN) and MX (ISO 20022)') and immediately enumerates the domains covered, so an agent can distinguish it from siblings like swift_lookup or gpi_status_codes without opening the schema.

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

Usage Guidelines4/5

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

Explicitly gives both modes of use ('Pass a specific type to get full details, or omit to list all types') and adds a second legitimate use case (field-location questions). It does not, however, state when to prefer a sibling such as swift_lookup or gpi_status_codes instead, so no exclusion guidance is present.

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

tracking_historyPayment Tracking History
Read-only
Inspect

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 or date discrepancy. JP Morgan returns its line only when the entered date and amount are close to its own record (seen: value dates up to 3 days apart, amounts mostly within 1%), so a search run with a wrong date or amount can silently drop its line. When it does answer, amount_exact_match is false if its value date OR its amount differs from what was entered, despite the name, and amount_exact_match_detail names which. Comparing entries here — same UETR, different entered dates or amounts, different bank data — is how you spot which entry 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.

Each bank entry's source names the tracking SOURCE that reported it (e.g. "Standard Chartered"), not the bank at a step of the payment; track_payment names the same data by the bank at each step, so the two names differ.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
uetrNoUETR (UUID v4) of the payment. Strongly preferred.
api_keyNoYour Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description.
referenceNoSender's reference (MT103 field 20), used when there is no UETR.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

track_paymentTrack a Cross-Border 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.

Returns a dict with: status: Overall payment status — one of: "success" — delivered to the beneficiary when the gpi code ACCC backs it; otherwise one bank reported its own leg completed (status_explanation says which) "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 at PAYMENT level, or null. null is common and does NOT mean no reason code was reported — most feeds report the qualifier per bank instead, see below. reason_codes_reported_by_banks: Present whenever any bank line reports a "STATUS/REASON" qualifier (ACSP/G003, RJCT/MS03). Each entry is decoded to its name and meaning. This is what answers "is anything pending / held / rejected / flagged on my payment", not status_reason. 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
dateYesTransaction date. Preferred format YYYY-MM-DD (ISO 8601); DD.MM.YYYY and DD-MM-YYYY are also accepted, slash-separated dates are not. Must be within the last 90 days.
uetrNoUETR, UUID v4 (e.g. "eb6305c8-0710-4e41-84ad-f58db3083e82"). Strongly recommended: tracking without a UETR rarely returns results. It is the Unique End-to-End Transaction Reference every gpi payment carries.
amountYesTransaction amount as sent (e.g. 15000.00). Must match the original payment amount: even a small difference may stop tracking from finding the payment, so ask the user for the exact figure rather than estimating or rounding one.
api_keyNoYour Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description.
currencyYesISO 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.
referenceNoSender's bank reference number (MT103 field 20 / pacs.008 InstrId). Useful beside the UETR for cross-referencing, but alone it rarely produces results. Required only if uetr is not provided.

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?

Annotations are thin boolean hints, yet the description discloses the API-key/FI-subscription requirement, onboarding steps, exact-match and 90-day constraints, and the probability profile of each lookup path (~80% UETR vs <1% reference). It also warns that a reference-only miss is the expected outcome rather than a failure.

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 IMPORTANT blocks and worked examples are front-loaded and mostly earn their place, but the 'Returns a dict with...' section largely re-narrates an output schema that already exists, and the repeated emphasis markers add bulk that could be tightened.

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 6-parameter tool with 100% schema coverage and an output schema, the description still supplies the operational context an agent needs: required-vs-optional dependency logic, auth setup, status-value interpretation rules, and guidance on relaying not_found_guidance.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it establishes that amount/currency/date are required even on the UETR path and that there is no UETR-only lookup, and it explains what the reference number is (MT103 field 20 / pacs.008 InstrId).

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

Purpose5/5

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

Opens with a specific verb+resource+identifier ('Track a SWIFT payment by UETR or reference number') and clearly distinguishes itself from siblings like tracking_history and gpi_status_codes by scoping to live SWIFT gpi tracking.

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 it (reference-only user scenarios), the prerequisites that must be collected first, the alternative path (recover UETR from MT103 Block 3 {121:}), the alternative tool (swift_message_reference), and the expected success rates for each path. Nothing is left to inference.

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

transfer_costTransfer Fee Estimate (Beta)A
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesTransfer amount in `currency`, greater than zero.
api_keyNoYour Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description.
channelNoSending channel: online | branch | mobile_app | any.
currencyYes3-letter ISO 4217 transfer currency.
bank_swiftYesSending bank's BIC, 8 or 11 characters.
charge_typeNoSHA (default), OUR or BEN. Ask the user rather than guessing.SHA
beneficiary_bicNoReceiving bank's BIC (8 or 11 characters); needed for a total.
customer_segmentNoWho is SENDING: individual | business | financial_institution.
beneficiary_segmentNoWho is being PAID: individual | business | financial_institution. Omitted, it mirrors customer_segment.
customer_sub_segmentNoThe sender's tier at their bank: standard | premium | private_banking | vip.

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?

Annotations only declare readOnlyHint/openWorldHint, so the description carries the real burden and does so unusually well: beta status, refusal semantics (answered=false and why there is deliberately no total), range vs point estimates, provenance of each figure (observed vs tariff), upper-bound semantics when a tariff is unknown, and the OUR/SHA/BEN non-guarantee. This is behavior an agent cannot get from the schema.

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

Conciseness4/5

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

It is very long for a tool description, but it is well front-loaded (purpose, then beta caveat, then a structured 'HOW TO READ THE ANSWER' list) and almost every bullet corresponds to a distinct failure mode an agent would otherwise get wrong. Some length is repetition rather than new information, which keeps it out of the top band.

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 10-parameter, high-stakes financial estimator with an output schema, the description covers the input decisions (which segments, which charge type), the refusal paths, and the interpretation of the returned fields. Nothing an agent needs in order to call it correctly or relay it honestly 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 coverage is already 100%, but the description adds genuine meaning beyond it: customer_segment is explained as selecting which side of the sending bank's price list is read (with a concrete 220 PLN vs free example), beneficiary_segment as the receiving bank's separate schedule, and beneficiary_bic as the prerequisite for any total at all. This is materially more than the terse schema strings.

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 opening sentence states a precise verb ('Estimate') and resource ('what a cross-border payment will COST'), and immediately decomposes it into the three payer-attributed components. This is clearly distinguishable from siblings like fx_rate, payment_method_compare and track_payment, which do not estimate landed cost by payer.

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?

Strong conditional guidance is given for the optional inputs: 'Pass beneficiary_bic whenever the user knows the receiving bank', 'pass business when the payer is a company', 'prefer asking over guessing when the amount makes the difference material', and 'if the user has not said which they will use, ask'. It does not name an alternative sibling tool or state when to reach for a different tool instead, so it stops short of the top band.

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

value_dateValue Date CalculatorA
Read-only
Inspect

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)

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_dateNoStart date, 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.
dest_countryYesReceiver's country, ISO 3166-1 alpha-2 country code (e.g. "DE").
base_currencyNoBase currency for FX, ISO 4217 (e.g. "USD"). Required when settlement_type is "fx_spot".
source_countryYesSender's country, ISO 3166-1 alpha-2 country code (e.g. "US").
settlement_typeNoOne of "wire" (T+0 domestic / T+1 international, the default), "fx_spot" (T+1 or T+2 depending on the pair), "sepa" (D+1), "sepa_instant" (T+0).wire
target_currencyNoTarget currency for FX, ISO 4217 (e.g. "EUR"). Required when settlement_type is "fx_spot".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description adds genuine behavioral context beyond that, notably that relative dates must be resolved against the `today` block returned by this tool, bank_holidays, or is_business_day_check. It also spells out the settlement conventions (T+0/T+1/T+2, D+1) that govern the result, though it does not discuss error behavior for invalid country codes or unsupported pairs.

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?

Purpose is front-loaded in the first line, followed by a compact factor list and four illustrative calls; every element earns its place. The examples section is slightly long relative to the core content but remains skimmable and informative.

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?

With an output schema present, return values need no explanation, and the read-only annotations cover the safety profile. The description is largely complete for a 6-parameter computation tool, with the main residual gap being no explicit differentiation from adjacent siblings like settlement_eta and fx_timing_advisor.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all six parameters including defaults and the FX-required currencies. The description's examples add positional-argument ordering (value_date("US", "DE", "fx_spot", "USD", "EUR")), which is a mild bonus over the schema, but it introduces no new semantics for individual parameters.

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

Purpose4/5

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

States a specific verb and resource: calculating the value/settlement date for a payment, with the inputs that drive the result (holiday calendars, weekend conventions, settlement convention). Clear enough to distinguish from pure holiday/calendar lookups like bank_holidays or is_business_day_check, though it never explicitly contrasts itself with the close-sounding sibling settlement_eta.

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?

The bullet list of contributing factors and the four worked examples imply when the tool applies, and the settlement_type options give concrete usage modes. However, there is no explicit when-to-use/when-not statement and no routing to alternatives such as settlement_eta, payment_cutoff_times, or bank_holidays, leaving the agent to infer the boundary.

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

Tool Schema Changelog

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

  1. 33 tool updates
    • Changedbank_holidays2 fields changed
      • addedInput schema / properties / country_code / description
        Added value: +"ISO 3166-1 alpha-2 country code, e.g. \"US\", \"DE\", \"GB\"."
      • addedInput schema / properties / year / description
        Added value: +"Calendar year, 2020-2030 (default: the current year). Values outside the range are clamped."
    • Changedbanks_using_correspondent6 fields changed
      • addedInput schema / properties / api_key / description
        Added value: +"Your Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description."
      • addedInput schema / properties / correspondent_swift / description
        Added value: +"BIC of the correspondent bank, 8 or 11 characters (e.g. \"IRVTUS3N\")."
      • addedInput schema / properties / country / description
        Added value: +"ISO 3166-1 alpha-2 country code of the client banks (e.g. \"AE\")."
      • addedInput schema / properties / currency / description
        Added value: +"ISO 4217 currency code (e.g. \"USD\")."
      • addedInput schema / properties / name_prefix / description
        Added value: +"Optional prefix on the client bank's name (e.g. \"AL\")."
      • addedInput schema / properties / page / description
        Added value: +"Result page, 1-4 (default 1). Any other value is refused."
    • Changedcompany_search_company7 fields changed
      • addedInput schema / properties / api_key / description
        Added value: +"Your Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description."
      • addedInput schema / properties / include_officers / description
        Added value: +"Include directors and officers (default true)."
      • addedInput schema / properties / include_only_active / description
        Added value: +"Return active companies only (default false)."
      • addedInput schema / properties / include_sanctions_check / description
        Added value: +"Screen every company and person found against sanctions lists (default true)."
      • addedInput schema / properties / include_shareholders / description
        Added value: +"Include PSC / beneficial owners (default true)."
      • addedInput schema / properties / jurisdictions / description
        Added value: +"Registry codes to search, at least one (e.g. [\"UK\"]). \"ALL\" is not supported. The UK registry is \"UK\", not \"GB\"; \"XX\" is GLEIF LEI (global). company_registries() returns the live list."
      • addedInput schema / properties / name / description
        Added value: +"Company name to search for."
    • Changedcompany_search_person5 fields changed
      • addedInput schema / properties / api_key / description
        Added value: +"Your Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description."
      • addedInput schema / properties / include_inactive_roles / description
        Added value: +"Include resigned and ceased roles (default true)."
      • addedInput schema / properties / include_sanctions_check / description
        Added value: +"Screen every person and company found against sanctions lists (default true)."
      • addedInput schema / properties / jurisdictions / description
        Added value: +"Registry codes to search, at least one (e.g. [\"UK\", \"NO\"]). \"ALL\" is not supported. The UK registry is \"UK\", not \"GB\"; \"XX\" is GLEIF LEI (global). company_registries() returns the live list."
      • addedInput schema / properties / name / description
        Added value: +"Person name to search for."
    • Changedcompany_search_result2 fields changed
      • addedInput schema / properties / api_key / description
        Added value: +"Your Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description."
      • addedInput schema / properties / search_id / description
        Added value: +"The search_id returned by a previous company_search_person or company_search_company call."
    • Changedcountry_banking_rules1 field changed
      • addedInput schema / properties / country_code / description
        Added value: +"ISO 3166-1 alpha-2 country code, e.g. \"DE\", \"US\", \"KZ\"."
    • Changedcountry_export_controls2 fields changed
      • addedInput schema / properties / country_code / description
        Added value: +"ISO 3166-1 alpha-2 country code, e.g. \"RU\", \"CN\", \"DE\"."
      • addedInput schema / properties / jurisdiction / description
        Added value: +"Optional filter by jurisdiction, e.g. \"US\", \"EU\". Omit it for every jurisdiction."
    • Changedcountry_payment_codes3 fields changed
      • addedInput schema / properties / code_type / description
        Added value: +"Which code table to search, as named in country_banking_rules payment_requirements.required_fields[].code_type (e.g. \"knp\", \"purpose_code\"). Case-insensitive."
      • addedInput schema / properties / country_code / description
        Added value: +"ISO 3166-1 alpha-2 country code, e.g. \"KZ\", \"AE\"."
      • addedInput schema / properties / search / description
        Added value: +"Optional keyword filter (e.g. \"transport\", \"trade\", \"insurance\"). Omit it to list every code in the table, which is a large response."
    • Changedeccn_lookup1 field changed
      • addedInput schema / properties / eccn / description
        Added value: +"Export Control Classification Number, e.g. \"5A001\", \"3A001\", \"1C351\". Case-insensitive."
    • Changedexport_controls_screen5 fields changed
      • addedInput schema / properties / destination_country / description
        Added value: +"Destination country, ISO 3166-1 alpha-2 country code (e.g. \"RU\", \"CN\")."
      • addedInput schema / properties / eccn / description
        Added value: +"Export Control Classification Number, e.g. \"3A001\". Give at least one of eccn, hs_code, goods_description."
      • addedInput schema / properties / goods_description / description
        Added value: +"Free-text goods description, English or Russian. A fallback for when no eccn or hs_code is known; see the description."
      • addedInput schema / properties / hs_code / description
        Added value: +"Harmonized System code, 4-8 digits (e.g. \"854231\"). Give at least one of eccn, hs_code, goods_description."
      • addedInput schema / properties / jurisdiction / description
        Added value: +"\"US\" (default), \"EU\", \"UK\", \"JP\", \"ITAR\", or \"ALL\"."
    • Changedfederal_register_changes5 fields changed
      • addedInput schema / properties / agency / description
        Added value: +"Optional: \"BIS\" (Bureau of Industry and Security) or \"OFAC\" (Office of Foreign Assets Control). Omit it for both."
      • addedInput schema / properties / category / description
        Added value: +"Optional: \"entity_list\", \"rule_change\", \"country_policy\" or \"sanctions\". Omit it for every category."
      • addedInput schema / properties / days / description
        Added value: +"Days to look back, 1-365 (default 30). A value outside the range is refused."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of changes to return (default 50)."
      • addedInput schema / properties / severity / description
        Added value: +"Optional: \"critical\", \"high\", \"medium\" or \"low\". Omit it for every level."
    • Changedfx_rate2 fields changed
      • addedInput schema / properties / base / description
        Added value: +"Base currency, ISO 4217 (e.g. \"USD\"). The rate is quoted as units of target per 1 base."
      • addedInput schema / properties / target / description
        Added value: +"Target currency, ISO 4217 (e.g. \"VND\")."
    • Changedfx_rate_history3 fields changed
      • addedInput schema / properties / base / description
        Added value: +"Base currency, ISO 4217 (e.g. \"EUR\"). Rates are quoted as units of target per 1 base."
      • addedInput schema / properties / days / description
        Added value: +"Lookback window in calendar days, 1-365 (default 90). Values outside the range are clamped. A ceiling on the window, not a promise of that many data points."
      • addedInput schema / properties / target / description
        Added value: +"Target currency, ISO 4217 (e.g. \"USD\")."
    • Changedfx_timing_advisor1 field changed
      • addedInput schema / properties / currency / description
        Added value: +"Optional ISO 4217 code (e.g. \"EUR\", \"JPY\"). Omit it to get every session and overlap."
    • Changedfx_volatility3 fields changed
      • addedInput schema / properties / base / description
        Added value: +"Base currency, ISO 4217 (e.g. \"EUR\")."
      • addedInput schema / properties / horizon_days / description
        Added value: +"Optional. Calendar days from today to the end of the exposure, 1-1825. A value outside that range returns an error instead of a band. Omit it for spot / settlement risk only."
      • addedInput schema / properties / target / description
        Added value: +"Target currency, ISO 4217 (e.g. \"TRY\")."
    • Changedgoods_classify3 fields changed
      • addedInput schema / properties / description / description
        Added value: +"Goods description, at least 2 characters (e.g. \"uranium centrifuge\", \"центрифуга для урана\")."
      • addedInput schema / properties / hs_code / description
        Added value: +"Optional known HS code (4 or 6 digits) for a direct lookup."
      • addedInput schema / properties / language / description
        Added value: +"Optional hint: \"en\" or \"ru\" (auto-detected if omitted)."
    • Changedgpi_status_codes1 field changed
      • addedInput schema / properties / code / description
        Added value: +"Optional ISO 20022 status code (ACSP, ACCC, PDNG, RJCT, RTRN, BLCK) or reason code (e.g. G001), case-insensitive. A status code returns its investigation playbook. Omit it to list every code."
    • Changedhs_code_lookup2 fields changed
      • addedInput schema / properties / hs_code / description
        Added value: +"HS code, 4-6 digits (e.g. \"854231\", \"8411\"). Dots and spaces are fine."
      • addedInput schema / properties / jurisdiction / description
        Added value: +"Optional filter: \"US\", \"EU\", \"UK\" or \"JP\"."
    • Changediban_validate1 field changed
      • addedInput schema / properties / iban / description
        Added value: +"The IBAN to check, e.g. \"DE89370400440532013000\". Spaces and hyphens are ignored and letters are upper-cased."
    • Changedis_business_day_check2 fields changed
      • addedInput schema / properties / check_date / description
        Added value: +"The date to check, YYYY-MM-DD (ISO 8601)."
      • addedInput schema / properties / country_code / description
        Added value: +"ISO 3166-1 alpha-2 country code, e.g. \"US\", \"DE\"."
    • Changedmcp_register3 fields changed
      • addedInput schema / properties / accept_terms / description
        Added value: +"Must be true. Confirms acceptance of the Ohmyfin Terms & Conditions at https://ohmyfin.ai/terms."
      • addedInput schema / properties / email / description
        Added value: +"Your email address. The verification code is sent to it."
      • addedInput schema / properties / organization_name / description
        Added value: +"Your company or project name."
    • Changedmcp_verify2 fields changed
      • addedInput schema / properties / code / description
        Added value: +"The 6-digit verification code from that email."
      • addedInput schema / properties / email / description
        Added value: +"The email address you registered with."
    • Changedpayment_cutoff_times2 fields changed
      • addedInput schema / properties / currency / description
        Added value: +"Optional ISO 4217 code to filter by (e.g. \"USD\", \"EUR\")."
      • addedInput schema / properties / system / description
        Added value: +"Optional clearing system code or name, e.g. \"T2\", \"FEDWIRE\", \"CHAPS\". Case-insensitive; \"TARGET2\" resolves to T2, its name since March 2023. Omit it to list every system or to filter by currency."
    • Changedpayment_method_compare2 fields changed
      • addedInput schema / properties / dest_country / description
        Added value: +"Receiving country, ISO 3166-1 alpha-2 country code (e.g. \"GB\", \"TR\")."
      • addedInput schema / properties / source_country / description
        Added value: +"Sending country, ISO 3166-1 alpha-2 country code (e.g. \"DE\", \"US\")."
    • Changedsanctions_screen4 fields changed
      • addedInput schema / properties / api_key / description
        Added value: +"Your Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description."
      • addedInput schema / properties / name / description
        Added value: +"The person or entity name to screen."
      • addedInput schema / properties / subject_type / description
        Added value: +"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."
      • addedInput schema / properties / threshold / description
        Added value: +"Minimum match score, 0-100 (default 85). Values above 95 are treated as 95."
    • Changedsettlement_eta12 fields changed
      • addedInput schema / properties / amount / description
        Added value: +"Payment amount; it improves the delay-risk assessment. A plain number is fine: 50000 and \"50,000.00\" are both accepted."
      • addedInput schema / properties / api_key / description
        Added value: +"Your Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description."
      • addedInput schema / properties / arrive_by_date / description
        Added value: +"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."
      • addedInput schema / properties / currency / description
        Added value: +"3-letter ISO 4217 currency, for the pre-trade path. Ignored when the uetr resolves."
      • addedInput schema / properties / current_status / description
        Added value: +"Status code such as ACSP, for the path without a uetr only."
      • addedInput schema / properties / elapsed_business_days / description
        Added value: +"Business days already in flight, for the path without a uetr only."
      • addedInput schema / properties / intermediary_bic / description
        Added value: +"Optional BIC of a known intermediary bank."
      • addedInput schema / properties / receiver_bic / description
        Added value: +"Receiving bank's BIC (8 or 11 characters) or bank name, for the pre-trade path."
      • addedInput schema / properties / receiver_country / description
        Added value: +"Optional ISO 3166-1 alpha-2 country code of the receiving bank."
      • addedInput schema / properties / sender_bic / description
        Added value: +"Sending bank's BIC (8 or 11 characters) or bank name, for the pre-trade path."
      • addedInput schema / properties / sender_country / description
        Added value: +"Optional ISO 3166-1 alpha-2 country code of the sending bank."
      • addedInput schema / properties / uetr / description
        Added value: +"UETR of a tracked payment, UUID v4 (e.g. \"eb6305c8-0710-4e41-84ad-f58db3083e82\"). Preferred for a payment already in flight; see INPUT DISCIPLINE in the description."
    • Changedssi_lookup3 fields changed
      • addedInput schema / properties / api_key / description
        Added value: +"Your Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description."
      • addedInput schema / properties / currency / description
        Added value: +"ISO 4217 currency code (e.g. \"USD\", \"EUR\", \"GBP\")."
      • addedInput schema / properties / swift / description
        Added value: +"BIC of the bank, 8 or 11 characters (e.g. \"DEUTDEFF\")."
    • Changedswift_lookup3 fields changed
      • addedInput schema / properties / country / description
        Added value: +"Optional country filter: an ISO 3166-1 alpha-2 code (\"ID\", \"DE\") or a full English name (\"Indonesia\", \"Germany\"). Names are resolved automatically."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of banks to return, 1-100 (default 20). Values outside the range are clamped."
      • addedInput schema / properties / query / description
        Added value: +"Bank name, BIC, or bank name plus city (\"Commerzbank Frankfurt\"). A BIC may be 8 or 11 characters; an 11-character BIC ending in XXX is searched as its 8-character form. The 12-character address in an MT message header (BIC8 + terminal letter + branch) is not a BIC: pass its first 8 characters."
    • Changedswift_message_reference1 field changed
      • addedInput schema / properties / message_type / description
        Added value: +"Optional message type, e.g. \"MT103\", \"pacs.008\", \"MT940\". Case-insensitive. Omit it to list every type."
    • Changedtrack_payment6 fields changed
      • addedInput schema / properties / amount / description
        Added value: +"Transaction amount as sent (e.g. 15000.00). Must match the original payment amount: even a small difference may stop tracking from finding the payment, so ask the user for the exact figure rather than estimating or rounding one."
      • addedInput schema / properties / api_key / description
        Added value: +"Your Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description."
      • addedInput schema / properties / currency / description
        Added value: +"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."
      • addedInput schema / properties / date / description
        Added value: +"Transaction date. Preferred format YYYY-MM-DD (ISO 8601); DD.MM.YYYY and DD-MM-YYYY are also accepted, slash-separated dates are not. Must be within the last 90 days."
      • addedInput schema / properties / reference / description
        Added value: +"Sender's bank reference number (MT103 field 20 / pacs.008 InstrId). Useful beside the UETR for cross-referencing, but alone it rarely produces results. Required only if uetr is not provided."
      • addedInput schema / properties / uetr / description
        Added value: +"UETR, UUID v4 (e.g. \"eb6305c8-0710-4e41-84ad-f58db3083e82\"). Strongly recommended: tracking without a UETR rarely returns results. It is the Unique End-to-End Transaction Reference every gpi payment carries."
    • Changedtracking_history3 fields changed
      • addedInput schema / properties / api_key / description
        Added value: +"Your Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description."
      • addedInput schema / properties / reference / description
        Added value: +"Sender's reference (MT103 field 20), used when there is no UETR."
      • addedInput schema / properties / uetr / description
        Added value: +"UETR (UUID v4) of the payment. Strongly preferred."
    • Changedtransfer_cost10 fields changed
      • addedInput schema / properties / amount / description
        Added value: +"Transfer amount in `currency`, greater than zero."
      • addedInput schema / properties / api_key / description
        Added value: +"Your Ohmyfin API key (prod-...). Optional here: it can be sent instead as a KEY header or an Authorization: Bearer header. What the tool requires of the key is in its description."
      • addedInput schema / properties / bank_swift / description
        Added value: +"Sending bank's BIC, 8 or 11 characters."
      • addedInput schema / properties / beneficiary_bic / description
        Added value: +"Receiving bank's BIC (8 or 11 characters); needed for a total."
      • addedInput schema / properties / beneficiary_segment / description
        Added value: +"Who is being PAID: individual | business | financial_institution. Omitted, it mirrors customer_segment."
      • addedInput schema / properties / channel / description
        Added value: +"Sending channel: online | branch | mobile_app | any."
      • addedInput schema / properties / charge_type / description
        Added value: +"SHA (default), OUR or BEN. Ask the user rather than guessing."
      • addedInput schema / properties / currency / description
        Added value: +"3-letter ISO 4217 transfer currency."
      • addedInput schema / properties / customer_segment / description
        Added value: +"Who is SENDING: individual | business | financial_institution."
      • addedInput schema / properties / customer_sub_segment / description
        Added value: +"The sender's tier at their bank: standard | premium | private_banking | vip."
    • Changedvalue_date6 fields changed
      • addedInput schema / properties / base_currency / description
        Added value: +"Base currency for FX, ISO 4217 (e.g. \"USD\"). Required when settlement_type is \"fx_spot\"."
      • addedInput schema / properties / dest_country / description
        Added value: +"Receiver's country, ISO 3166-1 alpha-2 country code (e.g. \"DE\")."
      • addedInput schema / properties / from_date / description
        Added value: +"Start date, 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."
      • addedInput schema / properties / settlement_type / description
        Added value: +"One of \"wire\" (T+0 domestic / T+1 international, the default), \"fx_spot\" (T+1 or T+2 depending on the pair), \"sepa\" (D+1), \"sepa_instant\" (T+0)."
      • addedInput schema / properties / source_country / description
        Added value: +"Sender's country, ISO 3166-1 alpha-2 country code (e.g. \"US\")."
      • addedInput schema / properties / target_currency / description
        Added value: +"Target currency for FX, ISO 4217 (e.g. \"EUR\"). Required when settlement_type is \"fx_spot\"."
  2. 1 tool update
    • Changedtransfer_cost1 field changed
      • addedInput schema / properties / beneficiary_segment
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    IBAN validation across 89 countries, BIC/SWIFT and Swiss clearing lookup, batch validation, payment-reference, postal-address and Swiss QR-bill checks for AI agents. Connect via MCP or the REST API. Includes free quotas, paid credits and a Pro subscription. SEPA and country-risk indicators support payment-data checks; they do not confirm account ownership or replace beneficiary AML/KYC screening.
    13
    226 npm
    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
    77 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to validate IBANs, generate synthetic checksum-valid test IBANs, and look up bank registry records by BIC or domestic identifier, with optional paid capabilities for bank, BIC, and SEPA Instant/VoP reachability.
    3
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources