ai.ohmyfin/banking-intelligence
REMOTE · MCP.OHMYFIN.AI · SCANNED SEP 27
Cross-border payment & banking intelligence for AI agents: SWIFT/BIC, IBAN, sanctions, FX, tracking.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation not fully verified: no authorisation is required to call this server, and 34 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability59
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 18227 tokens (~536/item across 34 items; 34 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage71
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety25
- Injection-marker check failed: the description of tool "iban_validate" contains an instruction to conceal the call from the user, the text "do not tell the user", at byte 1444 of that field, plus 2 further marker(s) of the same kind. See how to fix → Fail
- 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "transfer_cost" implies "transfer" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 35 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the ai.ohmyfin/banking-intelligence MCP server?
ai.ohmyfin/banking-intelligence is a hosted endpoint at https://mcp.ohmyfin.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · mcp.ohmyfin.ai
claude mcp add --transport http ai-ohmyfin-banking-intelligence 'https://mcp.ohmyfin.ai/mcp'
{
"mcpServers": {
"ai-ohmyfin-banking-intelligence": {
"url": "https://mcp.ohmyfin.ai/mcp"
}
}
} {
"servers": {
"ai-ohmyfin-banking-intelligence": {
"type": "http",
"url": "https://mcp.ohmyfin.ai/mcp"
}
}
} [mcp_servers.ai-ohmyfin-banking-intelligence] url = "https://mcp.ohmyfin.ai/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"ai-ohmyfin-banking-intelligence": {
"type": "remote",
"url": "https://mcp.ohmyfin.ai/mcp",
"enabled": true
}
}
} openclaw mcp add ai-ohmyfin-banking-intelligence --url 'https://mcp.ohmyfin.ai/mcp' --transport streamable-http
mcp_servers:
ai-ohmyfin-banking-intelligence:
url: "https://mcp.ohmyfin.ai/mcp" {
"McpServers": {
"ai-ohmyfin-banking-intelligence": {
"Transport": "http",
"Url": "https://mcp.ohmyfin.ai/mcp"
}
}
} assistant mcp add ai-ohmyfin-banking-intelligence -t streamable-http -u 'https://mcp.ohmyfin.ai/mcp'
{
"mcpServers": {
"ai-ohmyfin-banking-intelligence": {
"type": "http",
"url": "https://mcp.ohmyfin.ai/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 25 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 23 Sept 26 0
- Tool “tracking_history” rewrote its description, which is the text the model reads security
- 20 Sept 26 0
- Tool “track_payment” rewrote its description, which is the text the model reads security
- 16 Sept 26 0
- Tool “iban_validate” rewrote its description, which is the text the model reads security
- 12 Sept 26 0
- Tool “ssi_lookup” rewrote its description, which is the text the model reads security
- 11 Sept 26 0
- Tool “sanctions_screen” rewrote its description, which is the text the model reads security
- 9 Sept 26 0
- Tool “ssi_lookup” rewrote its description, which is the text the model reads security
- Tool “swift_lookup” rewrote its description, which is the text the model reads security
- 8 Sept 26 0
- Stability: fail → pass ▲ security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 27 Sept 2026 · Probed https://mcp.ohmyfin.ai/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=mcp.ohmyfin.ai | CN=YE1,O=Let's Encrypt,C=US | 8 Sept 2026 | 7 Dec 2026 | ECDSA 256 | ECDSA-SHA384 | 52002c2c788d284434c616ea889617936d4 |
| SANs: mcp.ohmyfin.ai | ||||||
| CN=YE1,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 5ddd70dd31f801c85c186a7a04b80afe |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of mcp.ohmyfin.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 3799 | 8 | Verified |
| ohmyfin.ai. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=31536000; includeSubDomains |
| x-content-type-options | nosniff |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.ohmyfin.ai/mcp | Verified | 200 | |
| http (plaintext) | http://mcp.ohmyfin.ai/mcp | HTTPS enforced | 301 | https://mcp.ohmyfin.ai/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
bank_holidays ~432
Get bank/public holidays for a country with payment impact analysis. Returns all public holidays plus a 'payment_impact' section that shows: - Whether today is a business day or holiday in this country - Upcoming holidays in the next 14 days - Recent holidays in the last 14 days — for diagnosing a payment that is ALREADY stuck ("in progress for N days", "sent X days ago"). A recent holiday only counts if BOTH hold: it falls INSIDE the payment's own window (on or after the send date), AND its 'costs_a_business_day' is true. One that predates the send date is irrelevant, and one on the country's banking weekend closed nothing that was open — neither may be subtracted or given to the user as a cause. An empty list affirmatively means no recent holiday explains the delay — do not invent one from training data. - Every holiday entry (upcoming, recent, and next_holiday_after_today) carries 'costs_a_business_day'. Roughly one holiday date in six lands on its own country's weekend and shortens nothing; check the flag before quoting a holiday as a delay, a closure or a reason a window was short. - elapsed_business_days_by_send_date — the AUTHORITATIVE elapsed business-day count keyed by send date (weekends + this country's holidays already excluded). Use it verbatim instead of hand-counting. - Next business day and how many consecutive non-business days remain This context helps determine if holidays are causing payment delays. Args: country_code: ISO 3166-1 alpha-2 code (e.g., "US", "DE", "GB") year: Year (default: current year). Range: 2020-2030. Examples: bank_holidays("US") bank_holidays("DE", 2026) bank_holidays("GB", 2025)
| Name | Type | Req | Description |
|---|---|---|---|
| country_code | string | yes | – |
| year | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
banks_using_correspondent ~379
Reverse SSI lookup — find banks that use a given correspondent for a currency. Given a correspondent BIC, currency, and origin country, returns the banks in that country that have a declared nostro at the correspondent for that currency. Inverse of ssi_lookup. Returns only swift + name per bank — to retrieve the account number, intermediary chain, or other SSI details for a specific bank from the result list, call ssi_lookup(bank_swift, currency) on it. Country and currency are required (not optional) — both bound the result set and the query is rejected without them. Requires an API key with an active PRO, VIP, or FI subscription. Tight per-account daily caps apply (5/day on PRO, 10/day on VIP/FI/trial). Args: correspondent_swift: BIC of the correspondent bank (e.g. "IRVTUS3N"). currency: ISO 4217 (e.g. "USD"). country: ISO 3166-1 alpha-2 of the client banks (e.g. "AE"). name_prefix: Optional prefix on bank name (e.g. "AL"). page: 1–4. Defaults to 1. api_key: Your Ohmyfin API key (prod-...). Can also be passed via KEY header or Authorization: Bearer header. Examples: banks_using_correspondent("IRVTUS3N", "USD", "AE") banks_using_correspondent("CITIUS33", "USD", "SA", name_prefix="AL")
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| correspondent_swift | string | yes | – |
| country | string | yes | – |
| currency | string | yes | – |
| name_prefix | – | – | – |
| page | integer | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
company_registries ~142
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()
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
company_search_company ~541
EXPERIMENTAL — Search company registries for a company with its officers and shareholders. Find company registrations across worldwide registries, including directors, officers, and beneficial owners (PSC/shareholders). Every entity found is automatically screened against sanctions lists. You MUST specify at least one jurisdiction. "ALL" is not supported. Available jurisdictions: AM, AT, AU, BR, CA, CH, CZ, DE, DK, EE, FI, FR, IE, IL, IS, LT, LV, NL, NO, PL, SG, UK, XX. Call company_registries() for the live list — this one can go stale. XX is GLEIF LEI, a GLOBAL registry rather than a country. Reach for it whenever the company sits outside the national registries above — a supplier in Hong Kong, mainland China, the US or the UAE. Hits carry an LEI, a registered address and a search.gleif.org URL the user can open. A jurisdiction NOT on that list is dropped silently by the backend: you get total_results 0 with status "completed" and no error. That means the company was never searched for — it is NOT evidence that it is unregistered or fake, and saying so to someone checking a counterparty before wiring money is the most damaging thing this tool can do. Check `jurisdictions_not_searched` and `coverage_warning` in the response before you report an empty result. Args: name: Company name to search for. jurisdictions: Country codes to search (required, e.g. ["UK"]). "ALL" is not supported — specify individual countries. include_sanctions_check: Auto-screen results against sanctions DB (default: true). include_officers: Include directors and officers (default: true). include_shareholders: Include PSC/beneficial owners (default: true). include_only_active: Filter to active companies only (default: false). api_key: Your Ohmyfin API key (prod-...). Can also be passed via KEY header or Authorization: Bearer header. Examples: company_search_company("Equinor", jurisdictions=["NO"]) company_search_company("Ac…
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| include_officers | boolean | – | – |
| include_only_active | boolean | – | – |
| include_sanctions_check | boolean | – | – |
| include_shareholders | boolean | – | – |
| jurisdictions | array | yes | – |
| name | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
company_search_person ~435
EXPERIMENTAL — Search company registries for a person's directorships, officer roles, and shareholdings. Searches worldwide company registries to find where a person holds director, officer, or shareholder positions. Every person and company found is automatically screened against sanctions lists. You MUST specify at least one jurisdiction. "ALL" is not supported. Available jurisdictions: AM, AT, AU, BR, CA, CH, CZ, DE, DK, EE, FI, FR, IE, IL, IS, LT, LV, NL, NO, PL, SG, UK, XX. Call company_registries() for the live list — this one can go stale. XX is GLEIF LEI, a GLOBAL registry rather than a country. Use it for anyone connected to a company outside the national registries above. A jurisdiction NOT on that list is dropped silently by the backend: you get total_results 0 with status "completed" and no error. That means the person was never searched for — it is NOT evidence they hold no roles. Check `jurisdictions_not_searched` and `coverage_warning` in the response before you report an empty result to the user. Args: name: Person name to search for. jurisdictions: Country codes to search (required, e.g. ["UK", "NO"]). "ALL" is not supported — specify individual countries. include_sanctions_check: Auto-screen results against sanctions DB (default: true). include_inactive_roles: Include resigned/ceased roles (default: true). api_key: Your Ohmyfin API key (prod-...). Can also be passed via KEY header or Authorization: Bearer header. Examples: company_search_person("John Smith", jurisdictions=["UK", "NO"]) company_search_person("Jane Doe", jurisdictions=["DE"])
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| include_inactive_roles | boolean | – | – |
| include_sanctions_check | boolean | – | – |
| jurisdictions | array | yes | – |
| name | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
company_search_result ~125
EXPERIMENTAL — Retrieve cached company search results by search ID. Every company_search_person and company_search_company call returns a search_id. Use this tool to retrieve those results again without re-running the search. Args: search_id: The search_id from a previous company search response. api_key: Your Ohmyfin API key (prod-...). Can also be passed via KEY header or Authorization: Bearer header. Examples: company_search_result("abc123-def456")
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| search_id | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
country_banking_rules ~357
Get banking rules and requirements for a country. Returns IBAN requirements, SEPA membership, FATF listing status, national currency, account format specifications, and country-specific payment requirements (mandatory codes like KNP for Kazakhstan, Purpose of Payment for UAE, etc.). The `fatf_listing` block is the authoritative answer to "is this country grey-listed / black-listed / under FATF increased monitoring". Both FATF public lists are held in full, so a `not_listed` status is a positive determination and not missing data. Use it instead of training data for any FATF question, and note that the coarse `fatf` field is a separate, weaker signal about regional-body membership that says nothing about listing. Everything here is COUNTRY-level. `currency` is the country's national currency, not the denomination of any beneficiary account — never pair it with the payment currency to diagnose a currency mismatch (see `currency_note` in the response). Use this to check country-specific STP rules that could cause payment delays, repairs, or rejections (e.g., missing purpose codes, regulatory fields). If a country requires special payment codes, the response includes a payment_requirements block with field descriptions and categories. Use country_payment_codes to look up specific code values. Args: country_code: ISO 3166-1 alpha-2 code (e.g., "DE", "US", "KZ") Examples: country_banking_rules("DE") country_banking_rules("KZ") # includes KNP requirement info country_banking_rules("AE") # includes Purpose of Payment info
| Name | Type | Req | Description |
|---|---|---|---|
| country_code | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
country_export_controls ~318
Look up export control restrictions for a specific country. Returns embargo status, sanctioned programs, control reasons, and restriction details across jurisdictions (US EAR, EU, UN, etc.) for the given country. Response also includes a payment_jurisdiction_note explaining when each listed restriction actually applies to a payment (US controls only bind when there's a US nexus, etc.). IMPORTANT: Each jurisdiction's controls only bind a payment when the payment has a nexus to that jurisdiction. Use the jurisdiction filter when you know the payment's actual jurisdictional touchpoints (sender country, clearing currency, intermediary banks). For a CHF/EUR payment with no US bank in the chain, US export controls are informational only — do NOT cite them as compliance blockers without confirming a US nexus. Args: country_code: ISO 3166-1 alpha-2 country code (e.g. "RU", "CN", "DE"). jurisdiction: Optional filter by jurisdiction (e.g. "US", "EU"). When omitted, returns restrictions from all jurisdictions. Examples: country_export_controls("RU") # Russia — heavily embargoed country_export_controls("CN") # China — partial restrictions country_export_controls("DE") # Germany — minimal controls country_export_controls("RU", "US") # Russia, US jurisdiction only Use case: 'What export restrictions apply to shipping to Russia?'
| Name | Type | Req | Description |
|---|---|---|---|
| country_code | string | yes | – |
| jurisdiction | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
country_payment_codes ~223
Look up country-specific payment codes (KNP, purpose codes, etc.). Use country_banking_rules first to see which code types a country requires (in the payment_requirements block), then use this tool to find the right code value. Args: country_code: ISO 3166-1 alpha-2 (e.g., "KZ", "AE") code_type: Code table to search (from payment_requirements required_fields[].code_type, e.g., "knp", "purpose_code") search: Optional keyword filter (e.g., "transport", "trade", "insurance") Examples: country_payment_codes("KZ", "knp", "transport") country_payment_codes("KZ", "knp", "insurance") country_payment_codes("AE", "purpose_code", "trade") country_payment_codes("KZ", "knp") # all codes (large response)
| Name | Type | Req | Description |
|---|---|---|---|
| code_type | string | yes | – |
| country_code | string | yes | – |
| search | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
eccn_lookup ~181
Look up an Export Control Classification Number (ECCN). Pure reference tool — returns classification details, controlled jurisdictions, and license requirements for the given ECCN. ECCNs are alphanumeric codes (e.g. "5A001") used under export control regimes (US EAR, EU Dual-Use Regulation, Wassenaar Arrangement) to classify items that may require an export license. Args: eccn: The ECCN to look up (e.g. "5A001", "3A001", "1C351"). Examples: eccn_lookup("5A001") # Telecommunications security equipment eccn_lookup("3A001") # Electronic components eccn_lookup("1C351") # Human pathogens, zoonoses, toxins
| Name | Type | Req | Description |
|---|---|---|---|
| eccn | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
export_controls_screen ~580
Screen goods for export-control restrictions to a destination country. Combines the goods classification with the destination's restriction status and returns whether a license is required, the risk level, applicable license policies (e.g. presumption of denial), control reasons (NS, MT, NP, CB, AT), and proliferation/dual-use flags. Identify the goods by ANY of: ECCN, HS code, or a free-text description (English or Russian). IMPORTANT — jurisdiction nexus: each jurisdiction's controls only bind a payment/shipment when there is a nexus to that jurisdiction (US EAR binds US persons, USD-clearing, and US-origin items; EU/UK/JP bind their persons, currencies, and origin). Use jurisdiction="ALL" for a comprehensive multi-jurisdiction view, or pick the one matching the actual touchpoints. IMPORTANT, prefer eccn or hs_code: goods_description is a fallback: the classifier matches it lexically, so a vague description still returns one specific HS code and it is usually the wrong one ("industrial machinery" returns bakery and pasta machinery). When you pass a description only, the result carries classification_basis and classification_confidence_note; read them, never quote the inferred code back to the user as their HS code or ECCN, and ask for the code on their invoice or export declaration. The destination findings (embargo, transshipment risk, screening duties) are NOT affected by that doubt, so report them normally. Args: destination_country: ISO 3166-1 alpha-2 destination code (e.g. "RU", "CN"). eccn: Optional Export Control Classification Number (e.g. "3A001"). hs_code: Optional Harmonized System code, 4-8 digits (e.g. "854231"). goods_description: Optional free-text goods description (EN or RU). jurisdiction: "US" (default), "EU", "UK", "JP", "ITAR", or "ALL". Provide at least one of eccn / hs_code / goods_description. Examples: export_controls_screen("RU", eccn="3A001") # electronics → Russia export_controls_scree…
| Name | Type | Req | Description |
|---|---|---|---|
| destination_country | string | yes | – |
| eccn | string | – | – |
| goods_description | string | – | – |
| hs_code | string | – | – |
| jurisdiction | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
federal_register_changes ~274
Get recent US regulatory changes from BIS and OFAC. Returns Federal Register publications including entity list updates, rule changes, country policy shifts, and new sanctions programs. Args: agency: Filter by agency — "BIS" (Bureau of Industry and Security) or "OFAC" (Office of Foreign Assets Control). Omit for both. category: Filter by change category — "entity_list", "rule_change", "country_policy", or "sanctions". Omit for all categories. severity: Filter by severity — "critical", "high", "medium", or "low". Omit for all severity levels. days: Number of days to look back (1–365). Default: 30. limit: Maximum number of results to return. Default: 50. Examples: federal_register_changes() # Last 30 days, all federal_register_changes(agency="OFAC", days=7) # OFAC changes this week federal_register_changes(category="entity_list", severity="critical") Use case: 'Any new entity list additions affecting China?'
| Name | Type | Req | Description |
|---|---|---|---|
| agency | string | – | – |
| category | string | – | – |
| days | integer | – | – |
| limit | integer | – | – |
| severity | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
fx_rate ~400
Get the latest available reference (mid-market) exchange rate for a pair. Rates are the official ECB euro foreign-exchange reference rates where the ECB publishes the currency; pairs whose currency the ECB does not cover (e.g. VND, NGN, PKR, KZT, MAD) fall back to a market data feed. ALWAYS check the `source` field before describing provenance: "ecb" = official ECB reference rate; "market" = indicative mid-market rate, NOT an ECB fixing — never call it "the ECB rate". The `source_note` field in the result states this explicitly. Coverage is wide (~60 currencies) but NOT universal — some currencies (e.g. CLP, COP, PEN) have no rate on file at all. When a leg is missing, the error names exactly which currency is uncovered: relay that we hold no rate rather than supplying one from your own knowledge. Non-EUR pairs are computed as cross-rates via EUR (e.g., USD/GBP = EUR/GBP / EUR/USD), so they are indicative mid-rates, not dealable/executable rates. BOTH currencies are required. Always pass the exact pair you intend. There is no implicit default pair: a call that omits or mis-names a currency returns a "missing required argument" error rather than a silently-wrong rate. Never assume EUR/USD when the user asked about a different pair such as USD/VND. Args: base: Base currency (ISO 4217, e.g., "USD") target: Target currency (ISO 4217, e.g., "VND") Examples: fx_rate("EUR", "USD") fx_rate("GBP", "JPY") fx_rate("USD", "VND")
| Name | Type | Req | Description |
|---|---|---|---|
| base | string | yes | – |
| target | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
fx_rate_history ~526
Get the historical reference exchange-rate series for a currency pair. Returns `series` (the daily rates) plus the metadata needed to describe it honestly. READ `series_coverage` BEFORE CHARACTERISING THE PERIOD. `days` is the window we look back over, NOT a promise of how much history exists: our series start at different dates per currency, so a 365-day request routinely returns five months. `series_coverage.first_date`/`last_date` are what the numbers actually span, and `series_coverage.truncated` is true when that is shorter than you asked for. Say "the ~N months we hold", never "over the past year", and never fill the gap from your own knowledge. CHECK `source` BEFORE ATTRIBUTING PROVENANCE. "ecb" = official ECB euro reference fixings, weekdays only. "market" = an indicative market data feed for a currency the ECB does not publish (AED, QAR, SAR, KWD, NGN, PKR, VND, KZT, RUB, UAH and ~20 more). A market series is NOT an ECB series and must never be described as one. Where a pair mixes the two, `series_coverage` reports the dates lost to aligning them. `peg_context` appears when either currency is pegged, including when the peg is against some third currency: it names the anchor and the pair whose movement you are really looking at. Take the peg date from there rather than from memory. An uncovered pair returns an `error` naming the missing leg instead of an empty series. Report that we hold no history rather than describing the rate as stable or range-bound. BOTH currencies are required. Always pass the exact pair you intend. There is no implicit EUR/USD default: an omitted or mis-named currency errors rather than returning the wrong pair's history. Args: base: Base currency (ISO 4217, e.g., "EUR") target: Target currency (ISO 4217, e.g., "USD") days: Lookback window in days (1-365, default 90). A ceiling on the window, not a guarantee of the number of points returned. Examples: fx_rate_history("EUR", "USD", 30) fx_rate_history("…
| Name | Type | Req | Description |
|---|---|---|---|
| base | string | yes | – |
| days | integer | – | – |
| target | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
fx_timing_advisor ~359
Get FX trading windows for FX execution timing and spread / rate optimization. Returns market sessions and liquidity windows for a currency. Use this to understand: - **Rate optimization** (primary, reliable use): higher liquidity means tighter spreads and better rates. Execute during peak windows to minimize conversion costs. - **Delay diagnosis** (use with care): the FX market session is when a currency TRADES. It is NOT a guaranteed processing schedule for an inbound foreign-currency payment that the beneficiary bank converts on arrival. Conversion timing is beneficiary-bank-specific (some convert in real time during the session, others batch once or twice daily), so do NOT tell the user a payment is "held until the next session" and do not quote specific hold durations ("adds X hours", "overnight delay"); those are bank policy and are not in our data. For the binding delivery-side cutoff that gates the converted local-currency leg, call country_banking_rules(destination) and read local_clearing.systems. When a currency is restricted, this tool's own output carries an inbound_processing_note with the accurate framing to quote. Pass a currency code to get its optimal window, or omit to get all market sessions and overlap windows. Args: currency: ISO 4217 currency code (e.g., "EUR", "JPY"). Omit to get all sessions and overlaps. Examples: fx_timing_advisor("EUR") fx_timing_advisor("JPY") fx_timing_advisor("INR") # Check INR conversion windows fx_timing_advisor()
| Name | Type | Req | Description |
|---|---|---|---|
| currency | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
fx_volatility ~674
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 <future period>?" - "how far could <pair> move by <date>?" - "what rate should I budget for next year?" - "I have invoices in <currency> 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 forwa…
| Name | Type | Req | Description |
|---|---|---|---|
| base | string | yes | – |
| horizon_days | – | – | – |
| target | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
goods_classify ~418
Classify goods for export control from a description (or HS code). Bilingual (English / Russian, auto-detected) goods classifier. Returns the best-matching HS code (with EN+RU descriptions), related ECCNs, control reasons (NS, MT, NP, CB, AT...), an export-control level (high/medium/low/ none), a confidence score, and alternative matches for review. This is destination-agnostic — it identifies WHAT the goods are and whether they are controlled in principle. To get the license decision FOR A SPECIFIC destination, pass the result into export_controls_screen. IMPORTANT, the matcher is lexical, and confidence scores the strength of the string match, not the correctness of the classification: "equipment" returns semiconductor manufacturing equipment at confidence 1.0. Treat the code as a suggestion for narrowing the question. When no hs_code was supplied the result carries classification_basis and classification_confidence_note; read them before quoting any code, and ask the user for the HS code or ECCN on their shipping documentation. Args: description: Goods description, min 2 chars (e.g. "uranium centrifuge", "центрифуга для урана"). Required. hs_code: Optional known HS code (4 or 6 digits) for a direct lookup. language: Optional hint — "en" or "ru" (auto-detected if omitted). Examples: goods_classify("uranium centrifuge") # → HS 840120, ECCN 0B001 goods_classify("центрифуга для обогащения урана") # Russian query, same result goods_classify("semiconductor manufacturing equipment") goods_classify("", hs_code="840120") # direct HS lookup Use case: 'Is a semiconductor lithography machine export-controlled?'
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | yes | – |
| hs_code | string | – | – |
| language | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
gpi_status_codes ~534
Explain SWIFT GPI tracking status codes and provide stuck-payment investigation guidance. USE THIS TOOL FIRST whenever the user reports a payment that is stuck, delayed, not arriving, held, pending, rejected, or otherwise not behaving as expected. It is the primary diagnostic entrypoint for payment investigation — calling with a specific code returns a full investigation playbook (common delay causes, recommended actions, GPI SLA timeframes, escalation steps). Recommended calls by scenario: - Payment "stuck" / "in progress" / "pending" / "not arrived": gpi_status_codes("ACSP") → playbook for in-progress payments - Payment explicitly "on hold" / compliance review: gpi_status_codes("PDNG") → playbook for held payments - Payment "blocked" / sanctions flag: gpi_status_codes("BLCK") → playbook for blocked payments - Payment rejected by a bank in the chain (never credited): gpi_status_codes("RJCT") → rejection investigation playbook - Payment returned to sender (accepted then sent back): gpi_status_codes("RTRN") → return investigation playbook - Reference for ISO 20022 codes: gpi_status_codes() → list all codes Each code call returns: - Code description and meaning - For ACSP/PDNG/BLCK/RJCT/RTRN: investigation playbook with common causes, recommended actions (request gCCT tracker, request pacs.002/pacs.004 reason code, verify beneficiary details, escalate via MT199, etc.), and common ISO 20022 reason codes (AC01, AC04, AG01, RR01-RR04, etc.) when applicable - Child reason codes (e.g., G001-G004 for ACSP) that narrow the cause further Common codes: ACCC (success), ACSP (in progress), RJCT (rejected), PDNG (on hold), BLCK (blocked). GPI reason codes (G000-G004) qualify ACSP with more detail (e.g. G001 = cover payment sent, G002 = forwarded to next agent). Examples: gpi_status_codes("ACSP") # stuck-payment diagnostic playbook gpi_status_codes("G001") # detail on a specif…
| Name | Type | Req | Description |
|---|---|---|---|
| code | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
hs_code_lookup ~311
Reverse-lookup an HS code → mapped export-control classifications (ECCNs). For customs brokers / shippers who have an HS (Harmonized System) code and need to know which export-control classifications may apply. Returns the mapped ECCNs with confidence levels, control reasons, sensitivity, and the governing international regime (Wassenaar, MTCR, NSG, etc.). A 4-digit HS heading is accepted, but mappings are richest at the 6-digit subheading level (e.g. "854231" rather than "8542"). An empty mapping list means no export-control mapping is on file for that code — it is NOT a guarantee the goods are uncontrolled; confirm with goods_classify or a formal classification. Args: hs_code: 4-6 digit HS code (e.g. "854231", "8411"). Dots/spaces are ok. jurisdiction: Optional filter — "US", "EU", "UK", or "JP". Examples: hs_code_lookup("854231") # semiconductors → 3A001 / 3A090 ... hs_code_lookup("841112") # turbojet engines → 9A001 ... hs_code_lookup("854231", "US") # US mappings only Use case: 'What export controls might apply to HS code 854231?'
| Name | Type | Req | Description |
|---|---|---|---|
| hs_code | string | yes | – |
| jurisdiction | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
iban_validate ~519
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" recommend…
| Name | Type | Req | Description |
|---|---|---|---|
| iban | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
is_business_day_check ~264
Check if a specific date is a business day in a country. Accounts for weekends (country-specific) and public holidays. Returns whether the date is a business day, and if not, why (weekend or specific holiday name) and the next business day. The response carries a `today` block with the server's real current date. Resolve any relative date in the user's question ("the 20th", "next Friday") against that, not against your own sense of today. A check_date already in the past also returns `date_anchor_warning` — heed it: a mis-resolved year flips the answer outright (2025-07-20 is a Sunday, 2026-08-20 is a Thursday). Args: country_code: ISO 3166-1 alpha-2 code (e.g., "US", "DE") check_date: Date in ISO format (YYYY-MM-DD) Examples: is_business_day_check("US", "2026-12-25") is_business_day_check("DE", "2026-03-12") is_business_day_check("GB", "2026-01-01")
| Name | Type | Req | Description |
|---|---|---|---|
| check_date | string | yes | – |
| country_code | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
mcp_register ~219
Register for an Ohmyfin API key to use paid tools. Creates an account and sends a 6-digit verification code to your email. After receiving the code, call mcp_verify to complete registration and get your API key. By setting accept_terms to true, you confirm acceptance of the Ohmyfin Terms & Conditions (https://ohmyfin.ai/terms) on behalf of your operator, including the API/MCP access terms (Section 3A), sanctions screening terms (Section 3B), and financial data disclaimer (Section 3C). Args: email: Your email address. organization_name: Your company or project name. accept_terms: Must be true. Confirms acceptance of the Ohmyfin Terms & Conditions at https://ohmyfin.ai/terms. Examples: mcp_register("agent@example.com", "Acme Corp", true)
| Name | Type | Req | Description |
|---|---|---|---|
| accept_terms | boolean | yes | – |
| string | yes | – | |
| organization_name | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
mcp_verify ~120
Verify your email and receive your API key. After calling mcp_register, check your email for the 6-digit code and pass it here. On success, returns your production and test API keys. You must subscribe at ohmyfin.ai/subscription to activate paid tools. Args: email: The email you registered with. code: The 6-digit verification code from your email. Examples: mcp_verify("agent@example.com", "123456")
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | – |
| string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
payment_cutoff_times ~417
Get payment system cutoff times for major clearing systems. Covers RTGS (T2 — formerly TARGET2, CHAPS, Fedwire, BOJ-NET, SIC), net settlement (CHIPS, BACS), SEPA schemes (SCT, SCT Inst, OCT Inst, SDD Core, SDD B2B), FX settlement (CLS, FXYCS), and other systems (CIPS, SPEI, FAST). For same-day EUR guidance: filter by currency="EUR" to retrieve all SEPA schemes plus T2 in one call — the scheme-level view is usually what treasurers need. Underlying CSMs (TIPS, RT1, EURO1, STEP2) are referenced in scheme notes. DST-observing systems also carry `season_now` and `operative_cutoff_today` fields computed for the current date. cutoff_utc/cutoff_local are the STANDARD-TIME (winter) values; summer_offset holds the DST value. Quote the cutoff that `operative_cutoff_today` points at for TODAY's season — do not default to the winter figure when DST is currently in force (e.g. the T2 customer cutoff is 15:00 UTC in summer, not the 16:00 UTC winter value). Args: system: System name (e.g., "T2", "TARGET2", "FEDWIRE", "CHAPS"). Case-insensitive. "TARGET2" and "T2" both resolve to the same entry (T2 is the post-March 2023 name). Omit to list all or filter by currency. currency: ISO 4217 currency code to filter by (e.g., "USD", "EUR"). Examples: payment_cutoff_times(system="T2") payment_cutoff_times(currency="EUR") payment_cutoff_times(currency="USD") payment_cutoff_times()
| Name | Type | Req | Description |
|---|---|---|---|
| currency | – | – | – |
| system | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
payment_method_compare ~244
Compare payment methods and investigate fee deductions for a country pair. Evaluates SEPA vs SWIFT vs domestic options. Also explains SWIFT charge options (OUR/SHA/BEN) and fee investigation — use this when the beneficiary received less than expected to understand where the money went and which MT103 fields reveal each deduction. Returns cost, speed, requirements, charge options, and step-by-step fee investigation guidance. Args: source_country: ISO 3166-1 alpha-2 code (e.g., "DE", "US") dest_country: ISO 3166-1 alpha-2 code (e.g., "GB", "TR") Examples: payment_method_compare("DE", "FR") # Both SEPA — will recommend SCT payment_method_compare("US", "TR") # Non-SEPA — will recommend SWIFT payment_method_compare("GB", "GB") # Domestic — will show CHAPS/FPS payment_method_compare("US", "VN") # Fee investigation — why beneficiary got less
| Name | Type | Req | Description |
|---|---|---|---|
| dest_country | string | yes | – |
| source_country | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
sanctions_screen ~1,352
Screen a name against global sanctions and watchlists. FREE TIER: 3 screens per day without an API key. PAID: Unlimited screens with an API key. Checks the name against 300+ sanctions, designation and watchlists worldwide, including US OFAC (SDN and non-SDN), EU, UK OFSI, Canada, Switzerland, Australia, New Zealand, Japan, Israel and national lists. Returns matching entities with similarity scores. The response says how many lists were actually searched (lists_searched); report THAT, and do not present a fixed per-jurisdiction table of "clear" rows, which asserts a per-list result the screen does not return and understates the coverage. For a company or an individual the screen covers every list, including adverse media, PEP and debarment registers. For a BANK or other financial institution it returns sanctions DESIGNATIONS only: a warning-list entry naming a bank is usually a clone-firm alert about fraudsters impersonating it, and the feed carries nothing that tells the two apart. When the name resolves in our bank directory, each designation is also cross-referenced against that institution's record (country, entity type, and the name or ALIAS that earned the fuzzy score) and contradicted rows are removed. ALWAYS read the `verification` block, which is on every response: `applied: false` means nothing was cross-referenced and the rows are raw feed output — either the name is not in our bank directory, or the subject is a company or individual, which has no directory record to check against. Never report an `applied: false` result as verified, and never report an empty one as verified-clear. Screening a bank by BIC, or calling swift_lookup, gets a verified answer. A row surviving that cross-reference is NOT the same as a row the cross-reference supported. Each verified row carries `adjudication`: `corroborated` means the check backed it and it is a designation against this institution; `not_corroborated` means it survived the false-positive floor but nothing…
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| name | string | yes | – |
| subject_type | string | – | – |
| threshold | integer | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
settlement_eta ~990
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…
| Name | Type | Req | Description |
|---|---|---|---|
| amount | – | – | – |
| api_key | – | – | – |
| arrive_by_date | – | – | – |
| currency | – | – | – |
| current_status | – | – | – |
| elapsed_business_days | – | – | – |
| intermediary_bic | – | – | – |
| receiver_bic | – | – | – |
| receiver_country | – | – | – |
| sender_bic | – | – | – |
| sender_country | – | – | – |
| uetr | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
ssi_lookup ~1,167
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 no…
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| currency | string | yes | – |
| swift | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
swift_lookup ~716
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. The country parameter accepts both 2-letter ISO codes ("ID", "DE") and full English names ("Indonesia", "Germany"). Names are resolved automatically. A BIC IDENTIFIES AN OFFICE, NOT A BRAND, AND THE DIFFERENCE IS PRICED. A name search returns ONE representative office per bank, elected by BIC convention rather than by relevance to the payment, and `office_note` says so whenever the bank holds more than one. Published tariffs, correspondent chains and settlement instructions are filed per BIC, so the choice changes the answer: transfer_cost("COBADEFF") returns Commerzbank's published 0.15% sending fee and transfer_cost("COBADEBB") refuses for want of a filed tariff, and both of those are Commerzbank AG in Germany. So: - If the user named a CITY, put it in the query — "Commerzbank Frankfurt" r…
| Name | Type | Req | Description |
|---|---|---|---|
| country | – | – | – |
| limit | integer | – | – |
| query | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
swift_message_reference ~260
Look up SWIFT message types — MT (FIN) and MX (ISO 20022). Pass a specific type to get full details, or omit to list all types. Covers customer payments (MT103, pacs.008), FI transfers (MT202, pacs.009), trade finance (MT700, MT760), cash management (MT940, camt.053), and payment status (pacs.002). Also use this tool to answer questions about where specific payment fields live — e.g., where the UETR sits in an MT103 (Field 121, Block 3 header), where charges appear (71A/71F/71G), or which fields carry routing info (56/57). MT103 and pacs.008 responses include a `tracing_note` explaining UETR recovery for customers who only have a reference number. Args: message_type: Message type (e.g., "MT103", "pacs.008", "MT940"). Case-insensitive. Omit to list all. Examples: swift_message_reference("MT103") swift_message_reference("pacs.008") swift_message_reference()
| Name | Type | Req | Description |
|---|---|---|---|
| message_type | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
track_payment ~1,608
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 <InstrId>/<EndToEndId> 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 co…
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | yes | – |
| api_key | – | – | – |
| currency | string | yes | – |
| date | string | yes | – |
| reference | – | – | – |
| uetr | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
tracking_history ~433
Show how a SWIFT payment's tracking results changed over time. Returns the DISTINCT tracking results recorded for a payment (by UETR or reference), deduplicated so ten identical re-tracks collapse to one entry while any change — a new last-update, a status change, or new bank data — appears as its own entry. Each entry includes what was ENTERED when the search was run (amount, currency, date) alongside the banks that reported data and their confirmed amount / value date. WHEN TO USE THIS: - The user says the page shows different data than you see, or asks why a bank line (e.g. JP Morgan) "disappeared" or a value date differs. - You need to reconcile an amount discrepancy. Correspondent banks such as JP Morgan return their confirmation ONLY when the tracked amount exactly matches the payment, so a search run with the wrong amount silently drops their line. Comparing entries here — same UETR, different entered amounts, different bank data — is how you spot that the amount was the problem. - Before concluding "the record was consolidated" or "the bank stopped reporting", check the history: the earlier result you're being asked about is usually still here, under a different entered amount. 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. Args: uetr: UETR (UUID v4) of the payment. Strongly preferred. reference: Sender's reference (MT103 Field 20) — used when no UETR.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| reference | – | – | – |
| uetr | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
transfer_cost ~2,114
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 trac…
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | yes | – |
| api_key | – | – | – |
| bank_swift | string | yes | – |
| beneficiary_bic | – | – | – |
| beneficiary_segment | – | – | – |
| channel | – | – | – |
| charge_type | string | – | – |
| currency | string | yes | – |
| customer_segment | – | – | – |
| customer_sub_segment | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
value_date ~446
Calculate the value/settlement date for a payment. Determines when a payment will settle based on: - Source and destination country holiday calendars - Weekend conventions (Sat/Sun or Fri/Sat) - Currency center holidays (if FX conversion involved) - Settlement convention (T+0, T+1, T+2) Args: source_country: Sender's country (ISO 3166-1 alpha-2, e.g., "US") dest_country: Receiver's country (ISO 3166-1 alpha-2, e.g., "DE") settlement_type: One of "wire" (T+0 domestic / T+1 international), "fx_spot" (T+1 or T+2 based on pair), "sepa" (D+1), "sepa_instant" (T+0) base_currency: Base currency for FX (ISO 4217, e.g., "USD"). Required when settlement_type is "fx_spot". target_currency: Target currency for FX (ISO 4217, e.g., "EUR"). Required when settlement_type is "fx_spot". from_date: Start date in ISO format (YYYY-MM-DD). Default: today. You do not know today's date — omit this argument unless the user named a specific send date. If the user's date is relative ("the 20th", "next Friday", "month-end"), read the `today` block in any response from this tool, bank_holidays or is_business_day_check and resolve against that. Examples: value_date("US", "DE") value_date("US", "DE", "fx_spot", "USD", "EUR") value_date("DE", "FR", "sepa") value_date("US", "US", "wire", from_date="2026-07-03")
| Name | Type | Req | Description |
|---|---|---|---|
| base_currency | – | – | – |
| dest_country | string | yes | – |
| from_date | – | – | – |
| settlement_type | string | – | – |
| source_country | string | yes | – |
| target_currency | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
What is the ai.ohmyfin/banking-intelligence MCP server?
ai.ohmyfin/banking-intelligence is an MCP server listed in the public MCP registry as ai.ohmyfin/banking-intelligence. Cross-border payment & banking intelligence for AI agents: SWIFT/BIC, IBAN, sanctions, FX, tracking. This page covers its hosted endpoint (https://mcp.ohmyfin.ai/mcp).
Is the ai.ohmyfin/banking-intelligence MCP server safe to use?
ai.ohmyfin/banking-intelligence scores 71 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the ai.ohmyfin/banking-intelligence MCP server expose?
ai.ohmyfin/banking-intelligence exposes 34 tools: swift_lookup, iban_validate, country_banking_rules, country_payment_codes, fx_rate, and 29 more. Their descriptions and schemas cost roughly 18,078 tokens of context every time the server is loaded.
Does the ai.ohmyfin/banking-intelligence MCP server require authentication?
No. We connected to ai.ohmyfin/banking-intelligence without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the ai.ohmyfin/banking-intelligence MCP server still maintained?
ai.ohmyfin/banking-intelligence is still listed as active in the MCP registry. We last reached this channel on 27 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.