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

fairquery-agent-trust-mcp

Official

Screen leads: email deliverability + sanctions (paid)

trust_screen_lead
Read-onlyIdempotent

Screen leads for onboarding or CRM hygiene by validating email deliverability and running sanctions name checks in parallel, then merge both results per lead into one clear pass, review, or block decision.

Instructions

WHAT: One call per batch of leads/counterparties: runs email_validate_deliverability on their emails and sanctions_screen_names on their person/company names IN PARALLEL, then merges results per lead with an overall decision: block (invalid email or sanctions potential_match), review (risky email), pass. WHEN: Onboarding customers/vendors, qualifying inbound leads, CRM hygiene where both email quality and sanctions exposure matter. WHEN NOT: Email only -> email_validate_deliverability; names only -> sanctions_screen_names (same per-item prices, no merge step). Free pre-filter first: email_check_syntax. Use this tool only when a lead needs both checks and one decision. COST: Paid, billed to YOUR Apify account via your APIFY_TOKEN: $0.00079 per lead with email + $0.003 per lead with name (= $0.00379 per full lead) + $0.007 per call for the sanctions run. 100 full leads ~ $0.39. RETURNS: Paged "lead" rows (decision pass | review | block with reasons[]; sanctions_matches holds the top 3); meta.summary counts by decision. Partial failure: the affected check shows "unavailable" and meta.errors lists codes. Tool errors: INPUT_EMPTY, APIFY_TOKEN_MISSING. BEHAVIOR: No email is sent. Runs the email and sanctions Apify Actors in parallel (2 runs per call) in your account; ~5-45 s (sanctions lists come from a cache at most 6 h old, or are downloaded), 300 s timeout. PARAMETERS: leads: each record needs email and/or name (if no lead has either -> INPUT_EMPTY, nothing billed); a lead with only an email skips sanctions (sanctions_status "not_checked") and one with only a name skips email (email_verdict "not_checked"), so a lead is billed for each check it gets (prices under COST), plus the per-call sanctions run fee when any lead has a name. Identical emails across leads are validated and billed once. ref joins sanctions results back to the lead, so keep refs unique (default = the lead's 0-based index as a string). country and entityType apply to that lead's sanctions check only: entityType filters candidates, while country only annotates matches (never removes them). minScore: sanctions similarity threshold; default 88 here (stricter than the 85 of sanctions_screen_names) to keep block decisions low-noise; each name returns at most its top 3 matches. allowFreeProviders=false turns gmail.com-type addresses into email_verdict "risky", i.e. decision "review" (never "block"). Decision precedence: any sanctions potential_match or invalid email -> block; else risky email or an incomplete check -> review; else pass. limit/offset page the merged lead rows, but every call re-runs and re-bills both checks for all leads (also when only offset changes), so set limit (max 1000) to cover all leads; meta.summary counts all leads. EXAMPLE: {"leads":[{"ref":"L1","email":"cfo@acme.com","name":"Acme Trading LLC","country":"US"}]} -> {decision:"pass",email_verdict:"valid",sanctions_status:"no_match"}

Input Schema

NameRequiredDescriptionDefault
leadsYesRequired. 1-1000 lead objects {ref?, email?, name?, country?, entityType?}; each needs email and/or name. Example: [{"ref":"L1","email":"cfo@acme.com","name":"Acme Trading LLC","country":"US","entityType":"entity"}]
limitNoOptional page size: items to return, integer 1-1000 (default 100). Example: 50
offsetNoOptional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100
minScoreNoOptional integer 60-100, default 88. Minimum 0-100 fuzzy name-similarity for a sanctions potential_match (which blocks the lead). Example: 92
allowFreeProvidersNoOptional boolean, default true. false makes free webmail (gmail.com, outlook.com, ...) email_verdict "risky" -> decision "review"; recommended for B2B

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. Changed10 schema fields changed
    • changedInput schema / properties / allowFreeProviders / description
      Previous value: -"Default true; false marks gmail.com etc. as risky (B2B)"New value: +"Optional boolean, default true. false makes free webmail (gmail.com, outlook.com, ...) email_verdict \"risky\" -> decision \"review\"; recommended for B2B"
    • changedInput schema / properties / leads / description
      Previous value: -"Required. 1-1000 leads; each needs email and/or name"New value: +"Required. 1-1000 lead objects {ref?, email?, name?, country?, entityType?}; each needs email and/or name. Example: [{\"ref\":\"L1\",\"email\":\"cfo@acme.com\",\"name\":\"Acme Trading LLC\",\"country\":\"US\",\"entityType\":\"entity\"}]"
    • changedInput schema / properties / leads / items / properties / country / description
      Previous value: -"ISO-2 or country name to refine sanctions matches"New value: +"Optional, <= 60 chars. ISO 3166-1 alpha-2 code (\"US\") or English country name; sets country_match on sanctions matches, does not filter"
    • changedInput schema / properties / leads / items / properties / email / description
      Previous value: -"Lead email, e.g. \"cfo@acme.com\""New value: +"Optional (email and/or name required), <= 320 chars. One email address, e.g. \"cfo@acme.com\"; \"Name <addr>\" accepted"
    • changedInput schema / properties / leads / items / properties / entityType / description
      Previous value: -"Name type (default any)"New value: +"Optional, one of \"individual\" | \"entity\" | \"any\", default \"any\". Restricts sanctions candidates for this lead's name"
    • changedInput schema / properties / leads / items / properties / name / description
      Previous value: -"Person or company name to sanctions-screen, e.g. \"Acme Trading LLC\""New value: +"Optional (email and/or name required), <= 300 chars. Person or company name to sanctions-screen, e.g. \"Acme Trading LLC\""
    • changedInput schema / properties / leads / items / properties / ref / description
      Previous value: -"Your ID echoed back, e.g. \"crm-123\" (default = index)"New value: +"Optional, <= 200 chars, must be unique per call. Your ID echoed back as ref, e.g. \"crm-123\"; default = the lead's 0-based index as a string (\"0\", \"1\", ...)"
    • 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 / minScore / description
      Previous value: -"Sanctions fuzzy threshold 60-100 (default 88)"New value: +"Optional integer 60-100, default 88. Minimum 0-100 fuzzy name-similarity for a sanctions potential_match (which blocks the lead). Example: 92"
    • 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"
  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?

Beyond the annotations (readOnlyHint, openWorldHint, idempotentHint, destructiveHint=false), the description discloses critical behavioral traits: cost model ($0.00079/lead email + $0.003/name + $0.007/call sanctions fee, example pricing), runtime (~5-45s, 300s timeout), parallel Actor execution (2 runs per call in user's account), partial failure semantics ('unavailable' + meta.errors), error codes (INPUT_EMPTY, APIFY_TOKEN_MISSING), billing behavior (identical emails billed once, each check billed separately), caching (sanctions lists at most 6h old), and decision precedence. It also explicitly states 'No email is sent', which is important given the 'email' parameter could suggest sending.

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

Conciseness4/5

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

The description is front-loaded with labeled sections (WHAT, WHEN, WHEN NOT, COST, RETURNS, BEHAVIOR, PARAMETERS, EXAMPLE) that scan quickly. It is dense but every sentence carries actionable information; the main detractor is that the PARAMETERS and COST sections are somewhat terse and interleaved, requiring the reader to parse a dense block to extract billing edge cases. It's not bloated, but the heavy density prevents a 5.

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

Completeness5/5

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

Given the tool's complexity (paid, multi-actor, paged, partial-failure semantics) and the presence of an output schema, the description covers all critical operational details an agent needs: cost awareness, paging and re-billing warnings, partial failure semantics, error codes, decision precedence, and a concrete example. Nothing essential is missing from the call's perspective.

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 substantial value beyond it: it explains the interaction between email and name (if only email given, sanctions_status='not_checked'; if only name, email_verdict='not_checked'), the billing linkage to which checks run, ref uniqueness defaulting to the 0-based index string, country annotation-not-filtering behavior, entityType filtering vs country annotating, minScore default of 88 (stricter than the sibling's 85) with rationale, allowFreeProviders=false mapping to 'review' (never 'block'), and decision precedence rules. This goes well beyond the schema descriptions.

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

Purpose5/5

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

The description names a specific verb (screen) and resource (leads) and precisely states the composite operation: email_validate_deliverability + sanctions_screen_names in parallel, merged into a per-lead decision. It explicitly distinguishes itself from the two building-block siblings and clarifies it's for when both checks and one decision are needed.

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 and WHEN NOT sections: 'Onboarding customers/vendors...' for use, and for non-use it routes to email_validate_deliverability for email-only, sanctions_screen_names for names-only, and email_check_syntax as a free pre-filter. It states the condition under which this tool is appropriate ('only when a lead needs both checks and one decision').

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