Skip to main content
Glama
fairquery-agent-trust-mcp

fairquery-agent-trust-mcp

Official

Screen names against OFAC/EU/UK/UN sanctions (paid)

sanctions_screen_names
Read-onlyIdempotent

Screen people and organizations against OFAC, EU, UK, and UN sanctions lists using fuzzy name matching for KYC/KYB onboarding, vendor checks, and bulk re-screening.

Instructions

WHAT: Runs the Fairquery Apify Actor sanctions-watchlist-screener: fuzzy-match people/organisations against OFAC SDN, OFAC Consolidated, EU, UK and UN lists from the official sources (re-downloaded when the cached copy in your Apify account is older than 6 h; every row reports each list's publication date); optional country/DOB filters. WHEN: KYC/KYB onboarding, vendor/counterparty checks, bulk re-screening. Put all names in ONE call (each call is one run with its own start fee; list loading takes ~2-5 s from the cache, or 10-40 s, up to ~60 s, when lists are re-downloaded). WHEN NOT: PEP/adverse media, certified compliance decisions. For coverage info use free sanctions_list_sources. Leads that also have an email to validate: trust_screen_lead (one merged decision). COST: Paid, billed to YOUR Apify account via your APIFY_TOKEN: $0.003 per name + $0.007 per run. 200 names in one call ~ $0.61. RETURNS: Paged "screening" rows (status potential_match | no_match, matches[] best first, lists_unavailable) or "error" rows. Tool errors: INPUT_EMPTY, APIFY_TOKEN_MISSING, APIFY_TOKEN_INVALID, APIFY_PAYMENT_REQUIRED, APIFY_ACTOR_RUN_FAILED, APIFY_TIMEOUT. Not a certified screening service. Automated fuzzy matching against public lists; false positives and misses are possible. Review every potential match manually and consult official sources/legal counsel before acting. BEHAVIOR: Results are stable for a given list snapshot. Makes network calls: runs an Apify Actor in your account; latency seconds to minutes (300 s timeout). Up to 10,000 names. PARAMETERS: names and/or queries: at least one non-empty (the schema marks both optional; neither -> INPUT_EMPTY, not billed). Both may be combined; every entry is billed once, so use names for bare strings and queries when you have country/dateOfBirth/entityType or want your own id echoed. In queries, dateOfBirth removes listed individuals born more than 1 year apart, while country never removes matches (it only sets country_match); entityType "entity" covers organisations, vessels and aircraft. lists: omit to screen all five; a list that cannot be downloaded is reported in lists_unavailable instead of failing the run. minScore: a match is returned only if its 0-100 similarity is >= minScore; 85 balances recall and noise, 90-95 for large batches, 75-80 for transliterated names; it does not change the price. maxMatchesPerName caps matches[] only; match_count still reports all matches. limit/offset only page the returned rows: every call screens and bills all names again (also when only offset changes), so set limit (max 1000) to cover all rows instead of paging. EXAMPLE: {"queries":[{"name":"Banco Nacional de Cuba","entityType":"entity"}],"minScore":90} -> status potential_match (OFAC_SDN).

Input Schema

NameRequiredDescriptionDefault
limitNoOptional page size: items to return, integer 1-1000 (default 100). Example: 50
listsNoOptional, default all five. Any subset of "OFAC_SDN" | "OFAC_CONS" | "EU" | "UK" | "UN" (ids from sanctions_list_sources). Example: ["OFAC_SDN","EU"]
namesNoOptional if queries is given (at least one is required). 0-10000 plain person/organisation names, 1-300 chars each. Example: ["Acme Trading LLC","Banco Nacional de Cuba"]
offsetNoOptional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100
queriesNoOptional if names is given. 0-10000 {name, id?, country?, dateOfBirth?, entityType?} objects. Example: [{"name":"Ali Khamenei","id":"cust-42","country":"IR","dateOfBirth":"1939","entityType":"individual"}]
minScoreNoOptional integer 60-100, default 85. Minimum 0-100 fuzzy name-similarity score for a match; 90+ = fewer false positives, ~80 = more recall. Example: 90
maxMatchesPerNameNoOptional integer 1-100, default 10. Max entries in matches[] per name (best first); match_count still reports the total. Example: 3

Output Schema

NameRequiredDescriptionDefault
metaNoTool-specific context (summary counts, cost notes, ...)
countYesNumber of items in this page
itemsYesResult rows for this page
totalYesTotal items before paging
offsetYesOffset of the first item in this page
hasMoreYesTrue if more items exist after this page
nextOffsetYesOffset to pass for the next page, or null

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"Page size: items to return, integer 1-1000 (default 100)"New value: +"Optional page size: items to return, integer 1-1000 (default 100). Example: 50"
    • changedInput schema / properties / lists / description
      Previous value: -"Subset of OFAC_SDN, OFAC_CONS, EU, UK, UN (default all five)"New value: +"Optional, default all five. Any subset of \"OFAC_SDN\" | \"OFAC_CONS\" | \"EU\" | \"UK\" | \"UN\" (ids from sanctions_list_sources). Example: [\"OFAC_SDN\",\"EU\"]"
    • changedInput schema / properties / maxMatchesPerName / description
      Previous value: -"Top matches per name 1-100 (default 10)"New value: +"Optional integer 1-100, default 10. Max entries in matches[] per name (best first); match_count still reports the total. Example: 3"
    • changedInput schema / properties / minScore / description
      Previous value: -"Fuzzy threshold 60-100 (default 85; 90+ fewer false positives)"New value: +"Optional integer 60-100, default 85. Minimum 0-100 fuzzy name-similarity score for a match; 90+ = fewer false positives, ~80 = more recall. Example: 90"
    • changedInput schema / properties / names / description
      Previous value: -"Plain names, e.g. [\"Acme Trading LLC\"]. Optional if queries given"New value: +"Optional if queries is given (at least one is required). 0-10000 plain person/organisation names, 1-300 chars each. Example: [\"Acme Trading LLC\",\"Banco Nacional de Cuba\"]"
    • changedInput schema / properties / offset / description
      Previous value: -"Items to skip for paging, integer >= 0 (default 0); pass nextOffset from the previous response"New value: +"Optional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100"
    • changedInput schema / properties / queries / description
      Previous value: -"Names with per-name filters. Optional if names given"New value: +"Optional if names is given. 0-10000 {name, id?, country?, dateOfBirth?, entityType?} objects. Example: [{\"name\":\"Ali Khamenei\",\"id\":\"cust-42\",\"country\":\"IR\",\"dateOfBirth\":\"1939\",\"entityType\":\"individual\"}]"
    • changedInput schema / properties / queries / items / properties / country / description
      Previous value: -"ISO-2 (\"IR\") or country name; adds country_match"New value: +"Optional, <= 60 chars. ISO 3166-1 alpha-2 code (\"IR\") or English country name (\"Iran\"); adds country_match true/false to each match, does not filter"
    • changedInput schema / properties / queries / items / properties / dateOfBirth / description
      Previous value: -"YYYY or YYYY-MM-DD, e.g. \"1939-04-19\""New value: +"Optional. Format YYYY or YYYY-MM-DD (pattern ^\\d{4}(-\\d{2}-\\d{2})?$), e.g. \"1939\" or \"1939-04-19\"; listed individuals whose birth year differs by more than 1 year are dropped"
    • changedInput schema / properties / queries / items / properties / entityType / description
      Previous value: -"Restrict to individuals or entities"New value: +"Optional, one of \"individual\" | \"entity\" | \"any\", default \"any\". \"entity\" = organisations, vessels, aircraft"
    • changedInput schema / properties / queries / items / properties / id / description
      Previous value: -"Your reference echoed back, e.g. \"cust-42\""New value: +"Optional, <= 200 chars. Your own reference echoed back in the row, e.g. \"cust-42\""
    • changedInput schema / properties / queries / items / properties / name / description
      Previous value: -"Person or organisation name, e.g. \"Banco Nacional de Cuba\""New value: +"Required. Person or organisation name, 1-300 chars, any order/case/diacritics, e.g. \"Banco Nacional de Cuba\""
  2. First observedv0.1.0

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/openWorld/idempotent, and the description layers on material context they cannot carry: exact cost model ($0.003/name + $0.007/run), cache vs re-download latency bands, the 300 s timeout, that offset-only paging re-screens and re-bills every name, and enumerated INPUT_EMPTY/APIFY_* error codes. It also discloses the reliability caveat (false positives/misses, not a certified service), which is critical for a screening decision.

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 WHAT/WHEN/WHEN NOT and labeled sections make a long definition navigable, and most content is decision-relevant. It is verbose at the edges (exhaustive error-code list, precise dollar examples) where slightly tighter prose would preserve the meaning.

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

Completeness5/5

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

For a 7-parameter paid, networked, non-certified tool, every dimension an agent needs is present: cost, latency, billing pitfalls, filtering semantics, and failure modes. An output schema exists, yet the description still summarizes the returned row shapes (screening/error, status, matches[], lists_unavailable), leaving no material gap.

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 adds genuine semantics beyond schema: names vs queries selection logic (bare strings vs country/DOB/entityType or id echo), that dateOfBirth drops individuals >1 year apart while country only sets country_match and never filters, entityType 'entity' covering vessels/aircraft, minScore tuning bands, and that maxMatchesPerName caps matches[] only while match_count reports all.

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 ('fuzzy-match people/organisations against OFAC SDN, OFAC Consolidated, EU, UK and UN lists') and names the batch scope (up to 10,000 names). It explicitly distinguishes itself from siblings by routing to sanctions_list_sources for coverage and trust_screen_lead for email-bearing leads, so an agent can tell it apart 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?

The WHEN clause names concrete scenarios (KYC/KYB onboarding, vendor/counterparty checks, bulk re-screening) and the WHEN NOT clause names exclusions (PEP/adverse media, certified compliance decisions) plus the specific alternative tools for those cases. Nothing about tool selection 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.