Skip to main content
Glama
fairquery

fairquery-agent-trust-mcp

Official

Fairquery Agent Trust & Data Safety (MCP server)

One MCP server for AI agents that handle untrusted data. It covers four jobs:

  • PII and secret redaction: check text before it reaches an LLM.

  • Email checks: syntax, typos, disposable and role addresses, plus MX/SPF/DMARC in the paid tool.

  • Sanctions screening: OFAC, EU, UK and UN lists.

  • Dependency vulnerabilities: lookups against OSV.dev.

Free tools need no token or account and run on your machine. Paid tools are optional. They call public Fairquery Apify Actors with your own APIFY_TOKEN, and runs are billed to your Apify account.

Tools

Tool

Cost

What it does

pii_list_detectors

Free (local)

Catalog of detectors, redaction styles, and pricing for every paid tool

pii_scan_text

Free (local)

Finds PII and secrets in text. Findings are paged and show masked values only

pii_redact_text

Free (local)

Redacts with placeholder, mask or hash style. Can return a placeholder map

pii_guard_documents

$0.003/doc + $0.0005/finding

Adds NER names/addresses, URLs and PDFs, and restore mode

email_check_syntax

Free (local)

Syntax, normalization, typo suggestions, disposable/role/free-provider flags

email_validate_deliverability

$0.002/email

DNS/MX, null MX, SPF/DMARC, mail provider, verdict

sanctions_list_sources

Free (local)

Lists covered, issuing authorities, disclaimer

sanctions_screen_names

$0.005/name

Fuzzy screening against OFAC SDN/Consolidated, EU, UK and UN

osv_query_packages

Free (api.osv.dev)

Vulnerable or not, plus advisory IDs, for up to 200 exact versions

osv_get_vulnerability

Free (api.osv.dev)

Full OSV advisory records

osv_audit_dependencies

$0.0009/package + $0.0028/vuln

Manifest/lockfile audit with severity, fixes and recommended version

trust_screen_lead

$0.002/email + $0.005/name

Email check and sanctions screening in parallel, merged into a pass/review/block decision per lead

Every tool description has WHAT / WHEN / WHEN NOT / COST / RETURNS / EXAMPLE sections. Outputs are paged (limit, offset, nextOffset, hasMore). Errors use named codes: APIFY_TOKEN_MISSING, APIFY_TOKEN_INVALID, APIFY_PAYMENT_REQUIRED, APIFY_ACTOR_RUN_FAILED, APIFY_TIMEOUT, INPUT_EMPTY, INPUT_TOO_LARGE, INVALID_ECOSYSTEM, OSV_FETCH_FAILED and VULN_NOT_FOUND.

Paid tools use these Apify Actors: fairquery/llm-data-guard-pii-secrets, fairquery/email-validator-mx-disposable, fairquery/sanctions-watchlist-screener and fairquery/osv-dependency-vulnerability-check.

Related MCP server: vibecheck

Install

Requires Node.js 20 or later. APIFY_TOKEN is optional and only needed for paid tools. Get one at https://console.apify.com/settings/integrations.

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "fairquery-trust": {
      "command": "npx",
      "args": ["-y", "github:fairquery/fairquery-agent-trust-mcp"],
      "env": { "APIFY_TOKEN": "<optional-your-apify-token>" }
    }
  }
}

Cursor (~/.cursor/mcp.json or .cursor/mcp.json)

{
  "mcpServers": {
    "fairquery-trust": {
      "command": "npx",
      "args": ["-y", "github:fairquery/fairquery-agent-trust-mcp"],
      "env": { "APIFY_TOKEN": "<optional-your-apify-token>" }
    }
  }
}

VS Code (.vscode/mcp.json)

{
  "inputs": [{ "type": "promptString", "id": "apify-token", "description": "Apify token (optional, paid tools only)", "password": true }],
  "servers": {
    "fairquery-trust": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "github:fairquery/fairquery-agent-trust-mcp"],
      "env": { "APIFY_TOKEN": "${input:apify-token}" }
    }
  }
}

From source / Docker

git clone https://github.com/fairquery/fairquery-agent-trust-mcp && cd fairquery-agent-trust-mcp
npm ci && npm run build && node dist/index.js            # stdio
node dist/index.js --http                                # Streamable HTTP on http://127.0.0.1:3000/mcp (PORT, HOST env)
docker build -t fairquery-trust-mcp . && docker run -i --rm -e APIFY_TOKEN fairquery-trust-mcp

Tests

npm run smoke        # initialize + tools/list + guide/annotation checks, no token
npm run test:live    # every free tool live, ReDoS probes, paid tools without token -> APIFY_TOKEN_MISSING
npm run test:paid    # also ONE paid call per family using APIFY_TOKEN from env (costs < $0.02)

Security

See SECURITY.md. Free tools never contact Apify or Fairquery, and the code contains no secrets.

Disclaimer

Sanctions results come from automated fuzzy matching and are not a certified screening service. Review every potential match yourself. Email checks do not probe SMTP mailboxes.

License

MIT © Fairquery

Available Tools

12 tools
email_check_syntaxCheck email syntax, typos, disposable & role (free)A
Read-onlyIdempotent

WHAT: Offline email checks: RFC-style syntax + normalization, common domain typo "did you mean" (gmial.com -> gmail.com), disposable/temporary domain (bundled CC0 list, ~thousands of domains), role account (info@, sales@), free webmail provider. WHEN: Fast pre-filtering of signups or lead lists, before paying for email_validate_deliverability. WHEN NOT: Does NOT check DNS/MX - it cannot tell whether the domain receives mail (verdict is "invalid", "risky" or "unknown", never "valid"). Use email_validate_deliverability (paid) for MX/SPF/DMARC. COST: Free. Pure local function; no network, no token. RETURNS: Paged items: {type:"email_check",input,email,syntax_valid,local_part,domain,verdict(invalid|risky|unknown),reasons[INVALID_SYNTAX|DISPOSABLE_DOMAIN|ROLE_ACCOUNT|FREE_PROVIDER|POSSIBLE_TYPO|DNS_NOT_CHECKED],did_you_mean,is_disposable,is_role_account,is_free_provider,dns_checked:false}; meta.summary counts by verdict. EXAMPLE: {"emails":["someone@gmial.com"]} -> verdict "risky", reasons ["POSSIBLE_TYPO","DNS_NOT_CHECKED"], did_you_mean "someone@gmail.com".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size: items to return, integer 1-1000 (default 100)
emailsYesRequired. 1-10000 addresses (<= 320 chars each); "Name <addr>" and "mailto:" forms accepted. Example: ["jane@acme.com","bob@gmial.com"]
offsetNoItems to skip for paging, integer >= 0 (default 0); pass nextOffset from the previous response

Output Schema

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-structured context: it is a pure local function with no network and no token, it is free, and the verdict can never be 'valid' because DNS is not checked. That is useful behavioral disclosure, though it partly overlaps openWorldHint.

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 WHAT/WHEN/WHEN NOT/COST/RETURNS/EXAMPLE labeling is well front-loaded and skimmable. However, the RETURNS block enumerates the full response field list even though an output schema exists, which is mild redundancy against the conciseness goal.

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 read-only local batch checker with an output schema present, everything an agent needs is supplied: scope, exclusions, cost, and verdict semantics. Nothing required to invoke it correctly is missing.

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 limit/offset/emails are already documented including accepted forms and paging. The description's EXAMPLE restates the input shape without adding format or semantic detail beyond the schema; 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 WHAT line names a specific verb set and resource (offline email checks: syntax, typo, disposable, role, free provider) and explicitly frames scope as local/offline. It contrasts itself cleanly against the sibling email_validate_deliverability, so an agent can distinguish the two 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?

Explicit WHEN (fast pre-filtering of signups or lead lists, before paying for validation), WHEN NOT (no DNS/MX, verdicts never 'valid'), and a named alternative (email_validate_deliverability). Routing is fully determined.

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

email_validate_deliverabilityValidate email deliverability: MX, SPF, DMARC (paid)A
Read-onlyIdempotent

WHAT: Runs the Fairquery Apify Actor email-validator-mx-disposable: syntax, domain existence, MX/null-MX, disposable, role, free provider, typo suggestion, SPF/DMARC policy, mail provider; final verdict valid | risky | invalid | unknown. WHEN: Cleaning lists before a send, verifying a lead's domain can receive mail. Pre-filter with free email_check_syntax to avoid paying for obviously bad rows. WHEN NOT: Offline format/typo checks (free email_check_syntax). It does not SMTP-probe mailboxes. COST: Paid, billed to YOUR Apify account via your APIFY_TOKEN: $0.002 per email (+ $0.00005/run). 100 emails ~ $0.20. RETURNS: Paged rows type="email" (email, domain, verdict, reasons[], has_mx, mx_records, mail_provider, has_spf, has_dmarc, dmarc_policy, did_you_mean, ...) or type="error". Tool errors: APIFY_TOKEN_MISSING, APIFY_TOKEN_INVALID, APIFY_PAYMENT_REQUIRED, APIFY_ACTOR_RUN_FAILED, APIFY_TIMEOUT. EXAMPLE: {"emails":["john@stripe.com"]} -> verdict "valid", has_mx true, mail_provider "Google Workspace / Gmail".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size: items to return, integer 1-1000 (default 100)
emailsYesRequired. 1-10000 addresses (<= 320 chars each); "Name <addr>" and "mailto:" forms accepted. Example: ["jane@acme.com","bob@gmial.com"]
offsetNoItems to skip for paging, integer >= 0 (default 0); pass nextOffset from the previous response
checkSpfDmarcNoAlso report SPF/DMARC (default true)
allowDisposableNoDefault false (disposable = "risky")
allowRoleAccountsNoDefault true; false makes role addresses "risky"
allowFreeProvidersNoDefault true; false makes gmail.com etc. "risky" (B2B lists)

Output Schema

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A4.4/5.0
Behavior4/5

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

Annotations supply the safety profile (readOnly, idempotent, non-destructive, open-world), and the description adds substantial context beyond them: exact pricing ($0.002/email), token-based billing to the caller's Apify account, enumerated error codes, and the negative scope (no SMTP probing). These are genuinely valuable operational disclosures, though the return-field list partly duplicates the output 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?

Front-loaded labeled sections (WHAT/WHEN/WHEN NOT/COST/RETURNS/EXAMPLE) make it scannable and each block carries non-redundant information. It is dense and the RETURNS enumeration slightly overlaps the existing output schema, keeping it just short of 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?

For a paid, networked, multi-check tool this covers everything an agent needs: cost model, auth requirements, error taxonomy, usage routing, and a worked example. With an output schema present, the return enumeration is a bonus rather than a required burden, and nothing essential is missing.

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 fully documented including defaults, ranges, and the nextOffset paging hint. The description's example reinforces the emails shape but adds nothing to individual parameter semantics beyond the schema, making the baseline 3 correct.

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 WHAT line states a specific verb+resource (email deliverability validation) and enumerates the exact checks performed (syntax, MX, disposable, SPF/DMARC, etc.), plus the final verdict vocabulary. It is clearly distinguishable from siblings like email_check_syntax, which it names 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?

WHEN, WHEN NOT, and an explicit alternative with a cost predicate are all given: 'Pre-filter with free email_check_syntax to avoid paying for obviously bad rows' and 'It does not SMTP-probe mailboxes.' The agent knows exactly when to pick this tool versus the free sibling.

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

osv_audit_dependenciesAudit dependencies/manifests with fix recommendations (paid)A
Read-onlyIdempotent

WHAT: Runs the Fairquery Apify Actor osv-dependency-vulnerability-check: parses package.json, package-lock.json (v1-v3), requirements.txt or go.mod (or a package list), checks OSV, and returns per-package max severity/CVSS, fixed versions, a recommended upgrade version and one row per vulnerability (deduped aliases). WHEN: Full project audits from a pasted manifest, CI-style reports, severity-filtered output. WHEN NOT: Quick checks of a few exact versions (osv_query_packages, free) or one advisory (osv_get_vulnerability, free). COST: Paid, billed to YOUR Apify account via your APIFY_TOKEN: $0.0009 per package + $0.0028 per vulnerability found (+ $0.00005/run). Use minSeverity="HIGH" to cut vuln rows. lodash+django (2 pkgs, 41 vulns) ~ $0.12. RETURNS: Paged rows type="package" (vulnerable, vuln_count, max_severity, fixed_versions, recommended_version), type="vulnerability" (id, cve_ids, severity, cvss_score, fixed_versions, osv_url) or type="error". Tool errors: INPUT_EMPTY, APIFY_TOKEN_MISSING, APIFY_TOKEN_INVALID, APIFY_PAYMENT_REQUIRED, APIFY_ACTOR_RUN_FAILED, APIFY_TIMEOUT. EXAMPLE: {"manifestText":"django==3.2.0\nrequests==2.19.0","minSeverity":"HIGH"}

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size: items to return, integer 1-1000 (default 100)
offsetNoItems to skip for paging, integer >= 0 (default 0); pass nextOffset from the previous response
packagesNoUp to 1000 exact versions. Optional if manifestText given
minSeverityNoOnly emit vulns at/above this severity (default ALL)ALL
manifestTextNoRaw package.json / package-lock.json / requirements.txt / go.mod content (<= 2,000,000 chars)
manifestTypeNoManifest format (default auto-detect)auto
includeDevDependenciesNoInclude dev dependencies (default true)

Output Schema

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover only the safety profile (readOnly, idempotent, openWorld, non-destructive); the description goes well beyond by disclosing the billing model ($0.0009/package + $0.0028/vulnerability + per-run fee, with a worked lodash+django example), the required APIFY_TOKEN and account-charging behavior, the paged row types, and the full enumerated error taxonomy. That is exactly the additional context an agent needs before committing to a paid call.

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 label-prefixed structure (WHAT / WHEN / WHEN NOT / COST / RETURNS / EXAMPLE) front-loads the identifying information and makes the routing and cost facts scannable. Despite its length, every section is functional — there is no filler or restatement of the tool name.

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, open-world tool with 0 required parameters, the description covers inputs, cost, auth prerequisites, output row types, paging, and failure modes. Because an output schema exists it is not obligated to describe returns, yet the summary of row types still aids invocation.

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, but the description adds real decision value: it tells the agent to set minSeverity="HIGH" specifically to cut vulnerability rows and therefore cost, and the EXAMPLE shows manifestText combined with minSeverity in practice. It does not, however, clarify manifestText-vs-packages precedence or the dev-dependency default beyond what the schema already states.

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 WHAT block names a specific verb (runs an audit), the exact resource (OSV database against a pasted manifest or package list), and the concrete output shape (per-package severity/CVSS, fixed versions, one row per vuln). It explicitly differentiates itself from the two sibling tools osv_query_packages and osv_get_vulnerability, so an agent can route 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?

It gives explicit WHEN (full project audits from a pasted manifest, CI-style reports, severity-filtered output) and WHEN NOT (quick checks of a few exact versions via osv_query_packages, or a single advisory via osv_get_vulnerability), naming both alternatives by name. The condition that selects each path is fully spelled out, 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.

osv_get_vulnerabilityGet vulnerability advisory details (free, OSV.dev)A
Read-onlyIdempotent

WHAT: Fetch full OSV records (summary, details, aliases, severity vectors, affected ranges, fixed versions, references) for advisory IDs directly from api.osv.dev. WHEN: You have IDs (from osv_query_packages or a report) and need details or the fixed version. WHEN NOT: To find which vulns affect a package version (osv_query_packages, free) or a whole manifest (osv_audit_dependencies, paid). COST: Free. Direct HTTPS to api.osv.dev only; no token. Max 25 IDs per call, 20 s timeout each. RETURNS: Paged items {type:"vulnerability",id,summary,details,aliases,severity,affected,references,published,modified,osv_url} or {type:"error",code:VULN_NOT_FOUND|OSV_FETCH_FAILED,id,retryable}. EXAMPLE: {"ids":["GHSA-35jh-r3h4-6jhm"]} -> lodash command injection, fixed in 4.17.21.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesRequired. 1-25 IDs (3-100 chars, letters/digits/.-_:), e.g. ["GHSA-35jh-r3h4-6jhm","PYSEC-2021-9","GO-2022-0969"]
limitNoPage size: items to return, integer 1-25 (default 25)
offsetNoItems to skip for paging, integer >= 0 (default 0); pass nextOffset from the previous response

Output Schema

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnly/idempotent/openWorld), the description discloses cost (free, no token), the endpoint (api.osv.dev over HTTPS), a rate/shape limit (max 25 IDs, 20s timeout each), and the structured error codes with retryable flag. This is meaningful operational context that annotations alone do not convey.

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?

Labeled sections (WHAT/WHEN/WHEN NOT/COST/RETURNS/EXAMPLE) make it scannable and front-loaded, with the scope and alternative-routing stated before operational detail. Every sentence carries distinct information.

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 and 100% param coverage, the description fills the remaining gaps: cost, transport, limits, error codes, and a concrete worked example. An agent has everything needed to call 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 the schema already fully documents ids/limit/offset. The description only restates the 25-ID cap, which duplicates maxItems, and gives no added semantics for paging or ID formatting. Baseline 3 is appropriate.

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 WHAT clause gives a specific verb (Fetch) and resource (full OSV records for advisory IDs), enumerating exactly which fields are returned. It distinguishes itself from siblings osv_query_packages and osv_audit_dependencies by scope (lookup by ID vs. discovery by package/manifest).

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 WHEN ('You have IDs ... and need details or the fixed version') and WHEN NOT clauses name the two alternatives with their cost tiers, so the agent can route without opening other schemas. 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.

osv_query_packagesCheck package versions for known vulnerabilities (free, OSV.dev)A
Read-onlyIdempotent

WHAT: Query the public OSV.dev database (api.osv.dev querybatch) directly from your machine for exact package versions; returns which are vulnerable and the advisory IDs. WHEN: Quick "is lodash 4.17.20 vulnerable?" checks for up to 200 packages; then osv_get_vulnerability for details of specific IDs. WHEN NOT: Parsing manifests/lockfiles, severity filtering, fixed/recommended versions in one shot -> osv_audit_dependencies (paid). COST: Free. Direct HTTPS to api.osv.dev only (Google-run public API); no token, nothing sent to Fairquery or Apify. 20 s timeout. RETURNS: Paged items {type:"package",ecosystem,name,version,vulnerable,vuln_count,vuln_ids[],osv_url} or {type:"error",code:INVALID_ECOSYSTEM}; meta.vulnerable_count. Tool errors: OSV_FETCH_FAILED (retryable). EXAMPLE: {"packages":[{"ecosystem":"npm","name":"lodash","version":"4.17.20"}]} -> vulnerable true, vuln_ids ["GHSA-35jh-r3h4-6jhm",...].

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size: items to return, integer 1-200 (default 100)
offsetNoItems to skip for paging, integer >= 0 (default 0); pass nextOffset from the previous response
packagesYesRequired. 1-200 exact package versions. Example: [{"ecosystem":"npm","name":"lodash","version":"4.17.20"}]

Output Schema

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A4.6/5.0
Behavior5/5

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

Goes well past the annotations (readOnly, idempotent, openWorld, non-destructive) by disclosing cost (free), network path (direct HTTPS to api.osv.dev, no token, nothing sent to Fairquery/Apify), a 20s timeout, and retryable error code OSV_FETCH_FAILED. That operational detail is exactly the kind of context annotations cannot express.

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 WHAT/WHEN/WHEN NOT/COST/RETURNS/EXAMPLE labeling is highly scannable and front-loads the purpose. The RETURNS block partially duplicates the existing output schema, which is mild redundancy, but every other line 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?

With a rich output schema and strong annotations, the description supplies everything else an agent needs — cost, privacy posture, timeout, error semantics, and routing to alternatives. 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.

Parameters3/5

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

Schema description coverage is 100%, so all three parameters are already documented in the schema, including the ecosystems list, the exact-version constraint, and the paging fields. The description's EXAMPLE merely repeats the schema's own example, adding no new parameter syntax or format detail. Baseline 3 applies when the schema does the heavy lifting.

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 (query the OSV.dev database for exact package versions) and names the two siblings it is not — osv_get_vulnerability for details and osv_audit_dependencies for manifest-level auditing. An agent can distinguish it from its siblings 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?

Explicit WHEN (quick 'is lodash 4.17.20 vulnerable?' checks for up to 200 packages) and WHEN NOT (manifest/lockfile parsing, severity filtering, fixed versions -> use the paid sibling), with each alternative named. 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.

pii_guard_documentsDeep PII/secret guard for documents and URLs (paid)A
Read-onlyIdempotent

WHAT: Runs the Fairquery Apify Actor llm-data-guard-pii-secrets: everything pii_scan_text does PLUS person-name/location NER, street addresses, public document URLs (txt/md/json/csv/HTML/PDF text layer, <= 10 MB) and restore mode (put originals back into LLM output using a placeholder map). WHEN: You need NER names/addresses, need to scan files at URLs/PDFs, or want the hosted pipeline. For plain text with regex-detectable PII/secrets prefer free pii_scan_text / pii_redact_text. WHEN NOT: Plain text scans (free tools), images (no OCR), email deliverability. COST: Paid, billed to YOUR Apify account via your APIFY_TOKEN: $0.003 per document + $0.0005 per finding (Actor fairquery/llm-data-guard-pii-secrets). Example: 10 docs with 20 findings ~ $0.04. RETURNS: Paged rows: type="document" (id, source, chars, mode, finding_count, counts_by_type, risk_level, findings[] masked, output_text, placeholder_map if requested) or type="error". Tool errors: APIFY_TOKEN_MISSING, APIFY_TOKEN_INVALID, APIFY_PAYMENT_REQUIRED, APIFY_ACTOR_RUN_FAILED, APIFY_TIMEOUT, INPUT_EMPTY. EXAMPLE: {"documentUrls":["https://example.com/report.pdf"],"mode":"redact","detectNames":true}

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo"detect" findings only; "redact" (default) also output_text; "restore" replaces placeholders in texts using placeholderMapredact
limitNoPage size: items to return, integer 1-1000 (default 100)
textsNoDocuments as strings (each <= 1,000,000 chars, max 1000). Optional if documentUrls given
offsetNoItems to skip for paging, integer >= 0 (default 0); pass nextOffset from the previous response
allowListNoValues never flagged
detectNamesNoPerson-name NER (default false)
entityTypesNoRestrict types, e.g. ["EMAIL","PERSON"]
entropyScanNoFlag high-entropy tokens (default false)
documentUrlsNoPublic http(s) URLs of txt/md/json/csv/HTML/PDF files (<= 10 MB each), fetched by the Actor in Apify cloud, max 100. Example: ["https://example.com/a.pdf"]
placeholderMapNoFor mode="restore": {"[EMAIL_1]":"jane@acme.com"}
redactionStyleNoRedact style (default placeholder)placeholder
detectAddressesNoStreet addresses + place-name NER (default false)
returnPlaceholderMapNoInclude placeholder_map with original values (default false)

Output Schema

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description goes well beyond them with billing mechanics ($0.003/doc + $0.0005/finding charged to the caller's Apify account), file size/type constraints, and a concrete error-code taxonomy. This is exactly the extra context the 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.

Conciseness5/5

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

Labeled sections (WHAT/WHEN/WHEN NOT/COST/RETURNS/EXAMPLE) front-load the decisive routing information, and each block carries distinct, non-redundant content. Dense but every line 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?

With an output schema present, the description need not explain return values, yet it still sketches paged row shape and error types. Combined with cost, limits, and mode guidance, nothing needed to call this correctly is missing.

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%, so all 13 parameters are already documented in the schema, including the mode enum and restore semantics via placeholderMap. The description adds only a single example invocation, which is marginally useful but does not extend parameter meaning beyond the schema.

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

Purpose5/5

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

The WHAT line names a specific verb+resource and enumerates the superset of capabilities (NER names/locations, street addresses, URL/PDF scanning, restore mode) relative to the sibling pii_scan_text. An agent can distinguish this from pii_scan_text/pii_redact_text 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?

Explicit WHEN and WHEN NOT sections, naming the free alternatives (pii_scan_text / pii_redact_text) for plain-text regex-detectable PII, and ruling out images (no OCR) and email deliverability. This is the full when/when-not/alternative triad.

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

pii_list_detectorsList PII/secret detectors and pricing (free)A
Read-onlyIdempotent

WHAT: Catalog of every PII and secret entity type, which ones run locally for free (pii_scan_text / pii_redact_text) vs only in the paid Actor (NER names/locations, street addresses, URL/PDF documents), redaction styles, and the price of every paid tool in this server. WHEN: Before pii_scan_text / pii_redact_text to pick entityTypes, or to explain coverage and costs to a user. WHEN NOT: To actually scan text (pii_scan_text) or redact it (pii_redact_text). COST: Free. Static local data; no network, no token. RETURNS: {detectors:[{type,category,rule,local}], redaction_styles, paid_pricing}. EXAMPLE: {} -> {"detectors":[{"type":"AWS_ACCESS_KEY","category":"secret","local":true},...]}

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
detectorsYes
paid_pricingYes
redaction_stylesYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description still adds real value beyond them by disclosing that this is static local data with no network and no token/cost, plus that paid coverage is gated behind the Actor — context annotations do not 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?

The labeled WHAT/WHEN/WHEN NOT/COST/RETURNS/EXAMPLE structure is front-loaded and scannable, with each section carrying distinct information. Slightly verbose in aggregate, but no section is 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?

With an output schema present, return-value detail is not strictly required, yet the RETURNS line and EXAMPLE still orient the agent. Cost, coverage tiers, and routing to alternatives are all covered, so nothing an agent needs to call 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?

The tool takes zero parameters, so the baseline is 4; there is no input schema semantics for the description to add. It does clarify what entityTypes the output enumerates, which is useful framing though not strictly a parameter concern.

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 WHAT section names a specific resource (catalog of PII/secret entity types) and precisely scopes it: which run locally vs only in the paid Actor, redaction styles, and pricing. An agent can immediately distinguish this from pii_scan_text and pii_redact_text 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?

Explicit WHEN (before scanning/redacting to pick entityTypes, or to explain coverage and costs) and WHEN NOT (not to scan or redact), naming the exact sibling tools to use instead. 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.

pii_redact_textRedact PII and secrets locally (free)A
Read-onlyIdempotent

WHAT: Return sanitized copies of texts with every local PII/secret finding replaced (placeholder [EMAIL_1], mask, or salted hash). Placeholders are consistent across documents in one call. Runs 100% on your machine. WHEN: Right before sending user data to an LLM/third party. Use returnPlaceholderMap=true if you need to restore originals in the LLM answer later (do the restore yourself by string replacement). WHEN NOT: For a findings report only use pii_scan_text. For names/addresses NER, URLs or PDFs use pii_guard_documents (paid). COST: Free. Local only; no network, no token. RETURNS: Paged {count,total,...,items:[{type:"redacted_document",doc_index,chars,finding_count,counts_by_type,risk_level,output_text}],meta:{placeholder_map?}}. One item per document (page with limit/offset). placeholder_map contains the ORIGINAL sensitive values; omit unless needed. Errors: INPUT_TOO_LARGE. EXAMPLE: {"texts":["Call +1 415 555 0100 or mail jane@acme.com"]} -> output_text "Call [PHONE_1] or mail [EMAIL_1]".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size: items to return, integer 1-50 (default 10)
textsYesRequired. 1-50 documents (prompt, chat message, log, file content), each <= 200,000 chars, total <= 500,000 chars. Example: ["Mail jane@acme.com, key AKIAIOSFODNN7EXAMPLE"]
offsetNoItems to skip for paging, integer >= 0 (default 0); pass nextOffset from the previous response
allowListNoExact values never flagged (case-insensitive), e.g. ["support@yourco.com"]. Default []
entityTypesNoOnly report these types, e.g. ["EMAIL","CREDIT_CARD","AWS_ACCESS_KEY"]. Omit = all local detectors. Valid names: pii_list_detectors
entropyScanNoAlso flag unlabeled random-looking 20-200 char tokens as HIGH_ENTROPY_STRING (default false; may flag hashes/IDs)
redactionStyleNo"placeholder" (default) = [EMAIL_1]; "mask" = j***@a***.com; "hash" = [EMAIL:3f2a9c0d1b7e] (random per-call salt)placeholder
defaultPhoneRegionNoISO 3166-1 alpha-2 region for phones without +prefix, e.g. "US" (default), "DE", "GB"US
returnPlaceholderMapNoDefault false. If true (placeholder style), meta.placeholder_map maps "[EMAIL_1]" -> original value

Output Schema

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the read-only/idempotent/non-destructive annotations, it discloses local-only execution, no network/token usage, placeholder consistency across documents in one call, the sensitive nature of placeholder_map, possible entropy-scan false positives, and the INPUT_TOO_LARGE error. The random per-call salt for hash mode is also noted, which is important 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.

Conciseness5/5

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

The structured WHAT/WHEN/WHEN NOT/COST/RETURNS/EXAMPLE format is front-loaded and easy to scan. Despite covering many details, every section provides actionable information for invoking the tool correctly.

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 9-parameter tool with an output schema and rich annotations, the description covers purpose, alternatives, cost, return shape, errors, and an example. It gives an agent everything needed to select and invoke the tool correctly.

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

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 practical meaning: placeholder consistency within a call, the security caveat to omit placeholder_map unless needed, and paging behavior of one item per document. It does not add much beyond the schema for every parameter, so it is not a full 5.

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

Purpose5/5

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

The description states a specific verb and resource: redact PII/secrets from texts, returning sanitized copies. It explicitly distinguishes itself from siblings by naming pii_scan_text for findings-only and pii_guard_documents for NER/URL/PDF cases.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance ('right before sending user data to an LLM/third party') and when-not guidance with named alternative tools. It also clarifies the returnPlaceholderMap workflow and cost/local constraints.

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

pii_scan_textScan text for PII and secrets locally (free)A
Read-onlyIdempotent

WHAT: Detect PII (emails, phones, US SSNs, Luhn-valid cards, mod-97 IBANs, UK NINOs, IPv4/IPv6) and secrets (AWS/GitHub/GitLab/Slack/Stripe/Google/OpenAI/Anthropic/HF/npm/SendGrid/Twilio/Azure keys, JWTs, private keys, URL credentials, key=value secrets) in text. Runs 100% on your machine. WHEN: Before sending prompts, tickets, logs or files to an LLM or third party; to audit text for leaked credentials. Findings are paged across all documents. WHEN NOT: To get sanitized text use pii_redact_text. For person names/addresses (NER), public URLs or PDFs use pii_guard_documents (paid). Not for images (no OCR). COST: Free. Local regex/validators only; no network, no APIFY_TOKEN, nothing sent anywhere. RETURNS: Paged {count,total,offset,hasMore,nextOffset,meta:{documents:[{doc_index,chars,finding_count,counts_by_type,risk_level}]},items:[{doc_index,type,category,rule,start,end,confidence,masked}]}. Raw values are never returned. Errors: INPUT_TOO_LARGE. EXAMPLE: {"texts":["Mail jane@acme.com, key AKIAIOSFODNN7EXAMPLE"]} -> 2 findings: EMAIL (masked "j***@a***.com"), AWS_ACCESS_KEY; risk_level "critical".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size: items to return, integer 1-1000 (default 100)
textsYesRequired. 1-50 documents (prompt, chat message, log, file content), each <= 200,000 chars, total <= 500,000 chars. Example: ["Mail jane@acme.com, key AKIAIOSFODNN7EXAMPLE"]
offsetNoItems to skip for paging, integer >= 0 (default 0); pass nextOffset from the previous response
allowListNoExact values never flagged (case-insensitive), e.g. ["support@yourco.com"]. Default []
entityTypesNoOnly report these types, e.g. ["EMAIL","CREDIT_CARD","AWS_ACCESS_KEY"]. Omit = all local detectors. Valid names: pii_list_detectors
entropyScanNoAlso flag unlabeled random-looking 20-200 char tokens as HIGH_ENTROPY_STRING (default false; may flag hashes/IDs)
defaultPhoneRegionNoISO 3166-1 alpha-2 region for phones without +prefix, e.g. "US" (default), "DE", "GB"US

Output Schema

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, but the description adds substantial context beyond them: 100% local execution, no network or APIFY_TOKEN, raw values never returned, findings paged across documents, and the INPUT_TOO_LARGE error. This is materially richer than the annotation set.

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 WHAT/WHEN/WHEN NOT/COST/RETURNS/EXAMPLE labeling makes it well front-loaded and skimmable. It is somewhat long, and the RETURNS block partially restates the existing output schema, which is a minor redundancy rather than a clarity problem.

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 an idempotent local read tool with an output schema, no annotations gaps, and complete parameter docs, this definition covers purpose, alternatives, cost/privacy posture, paging, and error handling. An agent has everything needed to call 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 description coverage is 100%, so the schema already documents all seven parameters and the baseline would be 3. The description adds an end-to-end input/output example and cross-references pii_list_detectors for valid entityTypes names, giving modest extra value beyond 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?

Names a precise verb (detect/scan) and resource (text) and enumerates the concrete detector families (emails, SSNs, Luhn cards, AWS/GitHub/etc. keys, JWTs), so the agent knows exactly what is covered. It explicitly differentiates from siblings by naming pii_redact_text for sanitization and pii_guard_documents for NER/PDFs.

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?

A dedicated WHEN clause covers the intended scenarios (pre-LLM/third-party sending, credential auditing) and a WHEN NOT clause routes the agent to specific alternatives (pii_redact_text, pii_guard_documents) with the condition that selects them. No inference required.

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

sanctions_list_sourcesList covered sanctions lists (free)A
Read-onlyIdempotent

WHAT: Static list of the official sanctions lists sanctions_screen_names checks (id, name, authority, download URL), the score scale and the legal disclaimer. WHEN: To choose the lists parameter, cite sources in a report, or explain coverage before paying. WHEN NOT: To screen a name (sanctions_screen_names, paid). It does not download lists or report freshness. COST: Free. Static local data; no network, no token. RETURNS: {sources:[{id,name,authority,url}],score_scale,disclaimer,pricing}. EXAMPLE: {} -> {"sources":[{"id":"OFAC_SDN","authority":"US Treasury OFAC",...},...]}

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
pricingYes
sourcesYes
disclaimerYes
score_scaleYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior. The description adds value beyond them: it is a static local dataset with no network and no token, and it explicitly does not download lists or report freshness — a meaningful limitation an agent must know.

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

Conciseness4/5

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

Well-structured with labeled WHAT/WHEN/WHEN NOT/COST/RETURNS/EXAMPLE blocks and strong front-loading. However, the RETURNS block and the JSON example partially restate the already-provided output schema, so a small amount of content does not earn 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?

For a zero-parameter, read-only listing tool with an output schema available, the description covers purpose, usage routing, cost, and behavioral limits completely. No gap remains that would cause an agent to call it incorrectly.

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's only parameter reference is to a sibling's 'lists' parameter, which adds context but no schema meaning for this tool 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?

States a specific resource (static list of official sanctions lists sanctioned by sanctions_screen_names) and the exact fields returned (id, name, authority, download URL). Explicitly distinguishes itself from the sibling paid screening tool, so an agent can select it 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?

Provides explicit WHEN (choose the lists parameter, cite sources, explain coverage before paying) and WHEN NOT (screening a name, which is sanctions_screen_names, paid). Names the alternative and the condition selecting it, including cost implications.

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

sanctions_screen_namesScreen names against OFAC/EU/UK/UN sanctions (paid)A
Read-onlyIdempotent

WHAT: Runs the Fairquery Apify Actor sanctions-watchlist-screener: fuzzy-match people/organisations against OFAC SDN, OFAC Consolidated, EU, UK and UN lists downloaded fresh from official sources each run; optional country/DOB filters. WHEN: KYC/KYB onboarding, vendor/counterparty checks, bulk re-screening. Put all names in ONE call (lists download once per run, ~10-40 s). WHEN NOT: PEP/adverse media, certified compliance decisions. For coverage info use free sanctions_list_sources. COST: Paid, billed to YOUR Apify account via your APIFY_TOKEN: $0.005 per name screened. 200 names ~ $1.00. RETURNS: Paged rows type="screening" (query, status potential_match|no_match, best_score, match_count, matches[] with list/programs/countries/score, lists_screened, lists_unavailable, disclaimer) or type="error". 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. EXAMPLE: {"queries":[{"name":"Banco Nacional de Cuba","entityType":"entity"}],"minScore":90} -> status potential_match (OFAC_SDN).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size: items to return, integer 1-1000 (default 100)
listsNoSubset of OFAC_SDN, OFAC_CONS, EU, UK, UN (default all five)
namesNoPlain names, e.g. ["Acme Trading LLC"]. Optional if queries given
offsetNoItems to skip for paging, integer >= 0 (default 0); pass nextOffset from the previous response
queriesNoNames with per-name filters. Optional if names given
minScoreNoFuzzy threshold 60-100 (default 85; 90+ fewer false positives)
maxMatchesPerNameNoTop matches per name 1-100 (default 10)

Output Schema

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive, open-world), and the description adds substantial context beyond them: per-name billing to the caller's own Apify account ($0.005/name), run duration (~10-40 s, lists downloaded fresh per run), a concrete error-code list, and a false-positive/miss disclaimer with a manual-review requirement. This is exactly the extra 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?

The WHAT/WHEN/WHEN NOT/COST/RETURNS/EXAMPLE labeling makes it skimmable and front-loads the decision-critical parts. It is longer than strictly necessary — the certification caveat appears twice (in WHEN NOT and again at the end) — but nearly every line carries information an agent needs.

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, open-world screening tool with an output schema, the definition covers purpose, cost, timing, paging, error taxonomy, and limitations. Nothing an agent needs to call it correctly or interpret a result is missing, and the return-shape detail is a bonus rather than a gap-filler.

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, but the description adds real meaning: the guidance to batch all names into one call because lists download once per run, the note that country/DOB are optional filters, and a worked example pairing queries with minScore=90 to steer threshold choice.

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 (fuzzy-match names against OFAC SDN, OFAC Consolidated, EU, UK and UN watchlists) and names the underlying actor. It also explicitly distinguishes itself from the sibling sanctions_list_sources, so an agent can separate the two 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?

The WHEN block names concrete scenarios (KYC/KYB onboarding, vendor checks, bulk re-screening) and the WHEN NOT block excludes PEP/adverse media and certified compliance decisions, redirecting to sanctions_list_sources for coverage info. Explicit when, when-not, and alternative — 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.

trust_screen_leadScreen leads: email deliverability + sanctions (paid)A
Read-onlyIdempotent

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: If you only need one check, call that tool directly (cheaper). Free pre-filter: email_check_syntax. COST: Paid, billed to YOUR Apify account via your APIFY_TOKEN: $0.002 per lead with email + $0.005 per lead with name (= $0.007 per full lead). 2 Actor runs per call. 100 full leads ~ $0.70. Takes ~15-45 s (sanctions list download). RETURNS: Paged items {type:"lead",ref,email,name,decision(pass|review|block),reasons[],email_verdict,email_reasons,did_you_mean,sanctions_status,sanctions_best_score,sanctions_matches[top 3]}; meta.summary counts by decision, meta.disclaimer. Partial failure: affected check shows "unavailable" and meta.errors lists codes. Tool errors: INPUT_EMPTY, APIFY_TOKEN_MISSING. EXAMPLE: {"leads":[{"ref":"L1","email":"cfo@acme.com","name":"Acme Trading LLC","country":"US"}]} -> {decision:"pass",email_verdict:"valid",sanctions_status:"no_match"}

ParametersJSON Schema
NameRequiredDescriptionDefault
leadsYesRequired. 1-1000 leads; each needs email and/or name
limitNoPage size: items to return, integer 1-1000 (default 100)
offsetNoItems to skip for paging, integer >= 0 (default 0); pass nextOffset from the previous response
minScoreNoSanctions fuzzy threshold 60-100 (default 88)
allowFreeProvidersNoDefault true; false marks gmail.com etc. as risky (B2B)

Output Schema

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the bar is lower. The description goes further than most: explicit per-lead pricing tied to the caller's APIFY_TOKEN, run count, latency expectation (~15-45 s for sanctions download), partial-failure semantics ('unavailable' plus meta.errors), and concrete tool error codes. That is real added context, though the readOnly/idempotent traits themselves are left to annotations rather than explained.

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?

Labeled sections (WHAT/WHEN/WHEN NOT/COST/RETURNS/EXAMPLE) front-load the decision-relevant facts and make the long text scannable. Every block carries information an agent needs — cost and latency in particular are non-redundant with any structured field.

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 paid, multi-second, network-dependent orchestrator with paged output, the description covers cost model, billing identity, timing, pagination, partial-failure handling, and error codes, while the output schema carries the return shape. Nothing an agent needs to decide or invoke correctly is missing.

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 every parameter including limit/offset/minScore/allowFreeProviders, which the description never mentions. The description does contribute an end-to-end example object showing how a lead entry is shaped and what the decision output looks like, but that is marginal beyond the schema baseline.

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 WHAT line names a specific verb (screen), the resource (batch of leads/counterparties), and the exact composed operations (email_validate_deliverability + sanctions_screen_names in parallel) plus the merge logic. It also names sibling tools it orchestrates, so an agent can distinguish it from calling those tools individually 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?

Explicit WHEN (onboarding, lead qualification, CRM hygiene where both checks matter), explicit WHEN NOT ('if you only need one check, call that tool directly (cheaper)'), and a named free alternative (email_check_syntax) as a pre-filter. Routing is fully determined.

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. 12 tool updatesv0.1.0
    • First observedemail_check_syntax
    • First observedemail_validate_deliverability
    • First observedosv_audit_dependencies
    • First observedosv_get_vulnerability
    • First observedosv_query_packages
    • First observedpii_guard_documents
    • First observedpii_list_detectors
    • First observedpii_redact_text
    • First observedpii_scan_text
    • First observedsanctions_list_sources
    • First observedsanctions_screen_names
    • First observedtrust_screen_lead

TDQS

A4.5/5.0

Scored across 12 tools

Disambiguation4/5

Within each domain the tools are clearly separated by action (scan vs redact vs guard) and by free-local vs paid-Actor tiering, and every description includes explicit WHEN NOT cross-references. The only residual overlap is the deliberate free/paid pairing (pii_scan_text vs pii_guard_documents, email_check_syntax vs email_validate_deliverability, osv_query_packages vs osv_audit_dependencies) plus the convenience wrapper trust_screen_lead, but each is clearly bounded by scope and cost.

Naming Consistency5/5

All 12 tools use consistent snake_case with a domain prefix followed by a verb/action phrase (pii_*, email_*, sanctions_*, osv_*, trust_*). The pattern is predictable and readable throughout, with no mixing of conventions.

Tool Count5/5

Twelve tools are well-scoped across four coherent domains (PII, email, sanctions, OSV), each with roughly three complementary operations plus a combined orchestration tool. No tool feels redundant; every one earns its place.

Completeness4/5

Each domain covers discovery/catalog, free local, and paid hosted operations, and the combined trust_screen_lead provides an end-to-end workflow, so there are no dead ends. Gaps are acknowledged rather than hidden (no PEP/adverse media, no SMTP probing, no image OCR), which are minor for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Agent-native "safe to ship?" security gate for AI-generated code. Uses real parsers and inter-rocedural taint analysis (JS/TS, Python, Go) to flag the classes AI coding agents get wrong — secrets, SQL injection, SS, SSRF, path traversal, command injection, weak JWT/CORS — and ranks findings by confidence. Exposes a scan tool over MCP.
    1
    8 npm
    2
    MIT