Skip to main content
Glama
fairquery

fairquery-agent-trust-mcp

Official

Fairquery Agent Trust & Data Safety (MCP server)

CI

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. BEHAVIOR: Read-only, no side effects, idempotent (same input -> same output). No network calls (no DNS/SMTP); local, milliseconds. Max 10,000 addresses. PARAMETERS: emails = addresses to check (required, 1-10,000); limit = page size (default 100, max 1000); offset = items to skip for paging (default 0). 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.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, but the description adds substantive behavior beyond them: no network calls, local milliseconds, max 10,000 addresses, and the precise verdict vocabulary (invalid|risky|unknown, never valid). It does not discuss rate limits or concurrency, but for a pure local function that is minor.

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

Conciseness5/5

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

Front-loaded WHAT/WHEN/WHEN NOT/COST/RETURNS/BEHAVIOR/PARAMETERS/EXAMPLE blocks. Every sentence carries a distinct fact: no filler, no repetition, and the most decision-relevant scoping (no DNS) appears early.

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?

Even though an output schema exists, the description documents verdict values, reason enums, dns_checked:false, paging fields, and the summary counts — everything an agent needs to interpret results and to decide whether this tool or the paid sibling is appropriate. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by restating emails/limit/offset semantics and adding the EXAMPLE transformation, which clarifies how verdicts and did_you_mean are produced. It adds useful interpretation rather than repeating field docs.

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 and resource (offline email checks) and enumerates the exact checks: RFC-style syntax, typo suggestion, disposable domains, role accounts, free webmail. It clearly distinguishes itself from sibling email_validate_deliverability by stating it does not do DNS/MX.

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 sections explicitly state the pre-filtering use case and name the paid alternative email_validate_deliverability for MX/SPF/DMARC. The agent has a clear routing decision with no inference required.

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. BEHAVIOR: Read-only, no side effects (no email is sent), idempotent apart from live DNS changes. Makes network calls: runs an Apify Actor (DNS/MX lookups) billed to your APIFY_TOKEN; latency seconds to minutes (300 s timeout). PARAMETERS: emails = addresses (required); checkSpfDmarc = also report SPF/DMARC (default true); allowRoleAccounts = treat info@/sales@ as valid (default true); allowDisposable = treat disposable domains as valid (default false); allowFreeProviders = treat gmail.com etc. as valid, set false for B2B lists (default true); limit = page size (default 100, max 1000); offset = items to skip for paging (default 0). 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.8/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, but the description goes far beyond them: it discloses the paid cost model ($0.002/email billed to the caller's APIFY_TOKEN), error codes, network-call latency (seconds to minutes, 300 s timeout), the fact that no email is sent, and that idempotency is only broken by live DNS changes. This is unusually rich behavioral context.

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

Conciseness4/5

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

The WHAT/WHEN/WHEN NOT/COST/RETURNS/BEHAVIOR/PARAMETERS/EXAMPLE structure is front-loaded and easy to scan, with no wasted preamble. The PARAMETERS section is somewhat redundant with the 100%-covered input schema, which keeps it short of a perfect conciseness score.

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 external-actor tool with 7 parameters, the description gives everything an agent needs: cost, required token, error taxonomy, paging behavior, latency, return shape, and the no-SMTP-probe limitation. An output schema exists, but the extra return-value detail is harmless and the description is complete without relying on it.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds genuine semantic value beyond the schema by explaining the intended use case for allowFreeProviders ('set false for B2B lists') and illustrating the required emails array with a concrete JSON example. The remaining parameter text largely mirrors the schema, so it does not reach 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 opens with a precise verb+resource (runs email deliverability validation) and enumerates the specific checks performed (syntax, MX, disposable, SPF/DMARC, mail provider, verdict). It explicitly distinguishes itself from the free sibling email_check_syntax, so an agent can route correctly 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?

A dedicated WHEN section names concrete scenarios (cleaning lists before a send, verifying a lead's domain), and WHEN NOT explicitly excludes offline format/typo checks, pointing to the free email_check_syntax as the pre-filter alternative. The cost warning ('Pre-filter with free email_check_syntax to avoid paying for obviously bad rows') gives a clear decision rule.

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. BEHAVIOR: Read-only, no side effects, idempotent. Makes network calls: runs an Apify Actor (querying OSV.dev) billed to your APIFY_TOKEN; latency seconds to minutes (300 s timeout). Up to 1000 packages or a 2,000,000-char manifest. PARAMETERS: packages or manifestText = input (one required); manifestType = format, default auto-detect; minSeverity = only report at/above ALL|LOW|MEDIUM|HIGH|CRITICAL (default ALL); includeDevDependencies (default true); limit = page size (default 100, max 1000); offset = items to skip for paging (default 0). 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 already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered, yet the description adds substantial context they cannot carry: the paid billing model with per-package/per-vuln rates, a concrete cost example, network/latency characteristics with a 300s timeout, input caps (1000 packages, 2M chars), and a full tool-error taxonomy for remediation.

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/BEHAVIOR/PARAMETERS/EXAMPLE layout is scannable and front-loads purpose, cost and routing before details. It is long, and BEHAVIOR restates the read-only/idempotent traits already supplied by annotations, so a small amount of text 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 paid, network-bound, paged audit tool this covers everything an agent needs: cost exposure, timeouts, input limits, filter parameters, error codes and paging. Since an output schema exists, the RETURN rows summary is bonus rather than a necessary substitute.

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 the baseline is 3, but the description adds meaning beyond it: it states that packages or manifestText is required (the schema declares zero required properties, so this cross-field constraint exists only in prose), and it clarifies offset paging via nextOffset from the prior response.

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 the concrete verb and resource ('parses package.json ... checks OSV ... returns per-package max severity/CVSS, fixed versions, recommended upgrade') and names the underlying actor. It explicitly distinguishes itself from the two OSV siblings, so an agent can route without opening a schema.

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

Usage Guidelines5/5

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

Has explicit WHEN and WHEN NOT sections that name the exact alternatives (osv_query_packages for a few exact versions, osv_get_vulnerability for one advisory) and the condition that selects each. This is textbook routing guidance.

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}. BEHAVIOR: Read-only, no side effects, idempotent. Makes one network call per ID to api.osv.dev (free, no key); typically <2 s, 20 s timeout. Max 25 IDs per call. PARAMETERS: ids = advisory IDs such as GHSA-/CVE-/PYSEC- (required, 1-25); limit = page size (default 25, max 25); offset = items to skip for paging (default 0). 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.8/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, open-world, non-destructive, but the description adds operationally significant detail the annotations cannot: one HTTPS call per ID to api.osv.dev, no token, max 25 IDs per call, 20 s per-ID timeout, typical <2 s latency, and structured error codes (VULN_NOT_FOUND vs OSV_FETCH_FAILED) with a retryable flag.

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

Conciseness4/5

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

Front-loaded with labeled sections (WHAT/WHEN/WHEN NOT/COST/RETURNS/BEHAVIOR/PARAMETERS/EXAMPLE) that make scanning trivial, and every section carries signal. It loses a point for internal redundancy: 'Free' appears three times and the 25-ID cap is stated three times.

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?

Even though an output schema exists, the RETURNS line gives the item shape and error variants, and the behavioral sections cover cost, auth, rate limits, timeouts, and paging via nextOffset. Nothing needed to call this tool correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3 and the description largely restates the parameter docs (ids 1-25, limit default/max 25, offset paging). It does add a worked end-to-end example and reiterates the accepted ID prefixes (GHSA-/CVE-/PYSEC-), which gives the agent an invocation template beyond the raw 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 (Fetch) and resource (full OSV records) and enumerates exactly what each record contains (summary, severity vectors, affected ranges, fixed versions). It is immediately distinguishable from osv_query_packages (which finds vulns for a package version) and osv_audit_dependencies.

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 already have IDs from osv_query_packages or a report and need details or the fixed version) and WHEN NOT (finding vulns for a package version or manifest), with both alternatives named. This is exactly the routing information an agent needs to choose among the osv_* siblings.

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). BEHAVIOR: Read-only, no side effects, idempotent (results change only when OSV publishes advisories). Makes one network call to api.osv.dev (free, no key); typically <2 s, 20 s timeout. Max 200 packages per call. PARAMETERS: packages = exact {ecosystem,name,version} entries (required, 1-200); limit = page size (default 100, max 200); offset = items to skip for paging (default 0). 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.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld/non-destructive, yet the description still adds material context beyond them: free vs paid, direct HTTPS to Google's public API with no token and nothing sent to the vendor, a 20 s timeout with typical <2 s latency, the 200-package cap, and a retryable error code (OSV_FETCH_FAILED). It also explains why results change (OSV publishing advisories), which is genuinely useful for a cacheable read.

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/BEHAVIOR/PARAMETERS/EXAMPLE structure is front-loaded and skimmable. It is slightly verbose and repeats facts across sections (the 200-package cap and the free/no-key claim each appear more than once, and PARAMETERS largely restates the schema).

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

Completeness5/5

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

Although an output schema exists, the description's RETURNS line still tells the agent the item shape, the error item type, meta.vulnerable_count, and the tool-level error code, and it covers cost, timeout, and paging. For a network-backed read tool with three parameters, nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description goes further by restating each parameter's role (exact {ecosystem,name,version} entries, limit as page size, offset for paging) and giving a worked request example. It does not add much beyond the schema on ecosystem aliases or version-range restrictions, which 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 line names a specific verb (query), resource (OSV.dev database via api.osv.dev querybatch), and scope (exact package versions, returns vulnerable flags plus advisory IDs). It also names the two sibling tools it must be distinguished from, osv_get_vulnerability and osv_audit_dependencies, 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?

Explicit WHEN ('quick is lodash 4.17.20 vulnerable? checks for up to 200 packages'), explicit WHEN NOT (manifest/lockfile parsing, severity filtering, fixed-version resolution), and the alternative for that case is named with its tradeoff (osv_audit_dependencies, paid). This is a complete routing decision.

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. BEHAVIOR: Read-only (does not modify your data), idempotent. Makes network calls: runs an Apify Actor billed to your APIFY_TOKEN; may fetch documentUrls. Latency seconds to a few minutes (300 s actor timeout). Up to 1000 texts / 100 URLs (10 MB each). PARAMETERS: texts or documentUrls = input (one required); mode = detect | redact | restore (default redact); redactionStyle (default placeholder); returnPlaceholderMap (default false); placeholderMap = map for restore mode; detectNames / detectAddresses = NER for names / addresses (default false); entropyScan (default false); entityTypes / allowList = restrict / exempt values; limit = page size (default 100, max 1000); offset = items to skip for paging (default 0). 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.8/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint/idempotentHint annotations: it discloses the exact cost model ($0.003/doc + $0.0005/finding billed to the caller's APIFY_TOKEN), that network calls occur to an Apify Actor and to documentUrls, latency (seconds to minutes, 300 s timeout), volume caps, and the concrete error codes returned (APIFY_TOKEN_MISSING, APIFY_PAYMENT_REQUIRED, etc.). This is exactly the paid-side-effect context an agent needs to decide whether to invoke.

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?

Labeled WHAT/WHEN/WHEN NOT/COST/RETURNS/BEHAVIOR/PARAMETERS/EXAMPLE structure is well front-loaded and scannable. It is long, and the PARAMETERS block partially duplicates a 100%-covered schema, so a few lines do not fully earn their place.

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

Completeness5/5

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

For a 13-parameter, nested-object, paid, open-world tool, the description covers inputs, alternatives, cost, latency, limits, error surface, and return shape (even though an output schema exists). An agent has everything needed to call it correctly and predict the consequences.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the PARAMETERS block adds genuinely new information: the constraint that one of texts/documentUrls is required (the schema declares no required fields), the detect/redact/restore semantics including how placeholderMap is consumed, and an end-to-end EXAMPLE. It slightly restates defaults already in the schema, keeping it short of a 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 WHAT line states a specific capability (PII/secret guarding) and explicitly positions it relative to a sibling: 'everything pii_scan_text does PLUS' NER names/locations, addresses, URL/PDF scanning, and restore mode. An agent can 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?

Dedicated WHEN and WHEN NOT sections name the selecting conditions (need NER names/addresses, need URL/PDF scanning, want the hosted pipeline) and explicitly route plain-text regex cases to the free pii_scan_text / pii_redact_text, while excluding images and email deliverability. 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_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}. BEHAVIOR: Read-only, no side effects, idempotent (same input -> same output). No network calls; local static catalog, instant (<10 ms). No rate limits. PARAMETERS: None; call with {}. 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 declare read-only, idempotent, non-destructive and closed-world, so those restatements add no credit. What the description adds beyond them is latency ('instant, <10 ms'), no network calls, local static data, and no rate limits — genuinely useful operational context, though it partially repeats the annotation hints.

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?

Strongly front-loaded with labeled sections (WHAT/WHEN/WHEN NOT/COST/RETURNS/BEHAVIOR) and an example. Slightly over-structured: the RETURNS block restates an output schema that already exists, so a touch of the text 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?

Given an output schema already documents the return shape and annotations cover the safety profile, the description nonetheless supplies example input, cost, latency and routing guidance. An agent has everything needed to call it correctly and to route to it (or away) appropriately.

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?

Zero parameters, so the baseline is 4. The description confirms this explicitly ('PARAMETERS: None; call with {}') and shows the empty-object call in the example, which is the maximum value possible for a no-arg tool.

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 and precise scope ('Catalog of every PII and secret entity type'), including what varies (local-free vs paid Actor). It explicitly contrasts itself against pii_scan_text and pii_redact_text, so an agent can distinguish it from 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?

Provides explicit WHEN ('before pii_scan_text / pii_redact_text to pick entityTypes') and WHEN NOT ('to actually scan text or redact it'), each naming the alternative tool. 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. BEHAVIOR: Read-only, no side effects, idempotent (same input -> same output). (hash style uses a random per-call salt, so hashes differ between calls). No network calls; local, milliseconds. Max 50 texts, 200,000 chars each, 500,000 total. PARAMETERS: texts = documents to redact (required); redactionStyle = placeholder | mask | hash (default placeholder); returnPlaceholderMap = include placeholder->original map (default false); entityTypes/allowList/entropyScan/defaultPhoneRegion as in pii_scan_text; limit = page size (default 10, max 50); offset = items to skip for paging (default 0). 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?

Goes well beyond annotations: discloses the hash-style random salt caveat, consistency of placeholders across documents in one call, local/no-network/millisecond execution, size limits (50 texts, 200K each, 500K total), the INPUT_TOO_LARGE error, and paging behavior. Annotations already cover read-only/idempotent, and the description adds the nuance that idempotency breaks under hash style.

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?

Sectioned with labeled headers (WHAT/WHEN/WHEN NOT/COST/RETURNS/BEHAVIOR/PARAMETERS/EXAMPLE) and front-loaded. Dense but every labeled block carries distinct, useful information – no filler.

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

Completeness5/5

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

Covers purpose, routing, cost, return shape (even with an output schema present it clarifies placeholder_map risk and page structure), limits, errors, and a concrete example. For a 9-param tool with a sensitive-data use case, it is fully self-sufficient.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by grouping params, defaulting notes, the limit/offset paging relationship (nextOffset), and referencing sibling pii_scan_text for the shared entityTypes/allowList/entropyScan params. Minor: doesn't fully restate enum semantics already in 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 states a specific verb and resource ('Return sanitized copies of texts') and immediately names the mechanism (every PII/secret finding replaced) plus output styles. It is clearly distinguishable from pii_scan_text (report-only) and pii_guard_documents (NER/PDFs) by naming them directly.

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 ('right before sending user data to an LLM/third party') and WHEN NOT sections that name the exact alternatives (pii_scan_text for findings, pii_guard_documents for names/addresses/PDFs). It even explains the returnPlaceholderMap workflow.

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. BEHAVIOR: Read-only, no side effects, idempotent (same input -> same output). No network calls; text never leaves your machine; runs locally in milliseconds. Max 50 texts, 200,000 chars each, 500,000 total. PARAMETERS: texts = documents to scan (required); entityTypes = restrict detector types (default all); allowList = values never flagged (default none); entropyScan = also flag random-looking tokens (default false); defaultPhoneRegion = region for numbers without +prefix (default US); limit = page size (default 100, max 1000); offset = items to skip for paging (default 0). 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 read-only, idempotent, closed-world, non-destructive, so the bar is met structurally; the description goes further by disclosing local-only execution with no network or token, hard input limits (50 texts / 200k chars each / 500k total), the INPUT_TOO_LARGE error, and the guarantee that raw values are never returned.

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?

Dense but strongly front-loaded with WHAT/WHEN/WHEN NOT labels and no filler prose. It is long, and the PARAMETERS section partially restates the schema, but every block 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 an 8-field, 7-parameter scan tool with an output schema, the description covers purpose, exclusions, cost, limits, error, and paging contract. The RETURN section is mild duplication of the output schema but no required context is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by noting allowList matching is case-insensitive, that entityTypes names come from pii_list_detectors, and by summarizing defaults and paging semantics in one place.

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 (detect/scan) and resource (PII and secrets in text) with an explicit enumeration of detector families. It also delineates scope against siblings by naming pii_redact_text and pii_guard_documents in the WHEN NOT block.

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 sending prompts/logs to an LLM or third party, auditing leaked credentials) and WHEN NOT (redaction, NER names/addresses, public URLs, PDFs, images) with the correct alternative tool named for each exclusion. 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.

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}. BEHAVIOR: Read-only, no side effects, idempotent (same input -> same output). No network calls; static local catalog, instant. No rate limits. PARAMETERS: None; call with {}. 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.6/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 structurally. The description adds genuinely useful context beyond that: no network calls, static local data, instant response, no rate limits, and no freshness reporting. It partially restates idempotency, which the annotation already carries, keeping it short of a 5.

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

Conciseness4/5

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

The labeled-block structure (WHAT/WHEN/WHEN NOT/COST/RETURNS/BEHAVIOR) front-loads the decision-relevant content and is easy to scan. Slight redundancy between COST ('Free') and RETURNS (pricing) and a fairly verbose EXAMPLE keep it from being maximally tight.

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

Completeness5/5

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

An output schema exists, so return values need not be spelled out, yet the description still sketches the shape. Cost, behavior, prerequisites, and an example call are all present, leaving nothing an agent needs to invoke this correctly.

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

Parameters4/5

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

There are zero parameters, so the baseline is 4; the description confirms this with 'None; call with {}' and an example invocation. No further parameter semantics are possible or needed.

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 specific resource (the static catalog of covered sanctions lists) and its contents (id, name, authority, download URL), and explicitly contrasts itself with sanctions_screen_names. An agent can distinguish it from every sibling without opening the schema.

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

Usage Guidelines5/5

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

Provides an explicit WHEN clause (choose the lists parameter, cite sources, explain coverage before paying) and an explicit WHEN NOT clause naming the alternative tool sanctions_screen_names. The routing decision is fully specified.

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. BEHAVIOR: Read-only, no side effects, idempotent for a given list snapshot. Makes network calls: runs an Apify Actor billed to your APIFY_TOKEN; latency seconds to minutes (300 s timeout). Up to 10,000 names. PARAMETERS: names = plain names, or queries = names with country/dateOfBirth/entityType filters (one required); lists = subset of OFAC_SDN, OFAC_CONS, EU, UK, UN (default all); minScore = fuzzy-match threshold 60-100, higher = fewer false positives (default 85); maxMatchesPerName = top matches per name (default 10); limit = page size (default 100, max 1000); offset = items to skip for paging (default 0). 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 already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), yet the description adds substantial context beyond them: paid billing to the caller's APIFY_TOKEN at $0.005/name, 10-40 s list download and 300 s timeout, a full list of error codes, and the false-positive/miss disclaimer. It also notes idempotence is per list snapshot, which sharpens the annotation's claim.

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/BEHAVIOR ordering is strongly front-loaded and scannable, with cost and latency surfaced early. The PARAMETERS block largely duplicates the schema's own descriptions, which is the one section that doesn't fully earn its space.

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, network-bound, 7-parameter screening tool this is complete: cost, latency, limits (up to 10,000 names), auth failure modes, and result shape are all covered, and an output schema exists so return-field details are not owed by the description. An agent has everything needed to call it correctly and to set caller expectations.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds real information the schema lacks: the top-level schema has no required fields, and only the description states that names or queries is 'one required'. The worked EXAMPLE with minScore=90 and entityType also clarifies intent. It mostly paraphrases the remaining defaults, so not a 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 opens with a specific verb+resource ('Runs the ... sanctions-watchlist-screener: fuzzy-match people/organisations against OFAC SDN, OFAC Consolidated, EU, UK and UN lists') and names the exact watchlists, so the scope is unambiguous. It also distinguishes itself from the sibling sanctions_list_sources by casting that tool as the free coverage-info alternative.

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 (KYC/KYB onboarding, vendor/counterparty checks, bulk re-screening) and WHEN NOT (PEP/adverse media, certified compliance decisions) sections, plus a routing hint to the free sanctions_list_sources tool. It even states the batching rule ('Put all names in ONE call') and why (lists download once per run).

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. BEHAVIOR: Read-only, no side effects (no email sent), idempotent. Makes network calls: runs the email and sanctions Apify Actors in parallel, billed to your APIFY_TOKEN; latency seconds to minutes (300 s timeout). PARAMETERS: leads = {ref,email,name,country,entityType} records (required); minScore = sanctions fuzzy-match threshold 60-100 (default 88); allowFreeProviders = treat gmail.com etc. as valid, false for B2B (default true); limit = page size (default 100, max 1000); offset = items to skip for paging (default 0). 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.6/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive, openWorld), but the description adds substantial context beyond them: per-lead pricing billed to the caller's APIFY_TOKEN, 2 Actor runs, 15-45s latency with a 300s timeout, partial-failure semantics ("unavailable" plus meta.errors), and named tool error codes. This is unusually rich disclosure for a read-only tool.

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?

Heavily front-loaded with labeled WHAT/WHEN/WHEN NOT/COST/RETURNS/BEHAVIOR/PARAMETERS/EXAMPLE sections that make scanning easy. It is on the long side and repeats the cost model in both COST and BEHAVIOR, but nearly every sentence carries actionable content.

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-Actor, network-bound tool this covers everything an agent needs: cost, latency, timeout, partial-failure and error handling, input shape, paging, and an end-to-end example. An output schema exists, yet the description still orients the agent on return shape without redundancy being harmful.

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 five parameters are already documented in the schema, and the description's PARAMETERS section largely restates them (defaults, ranges, the B2B rationale for allowFreeProviders). It adds little beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource (screen a batch of leads by running email deliverability and sanctions screening in parallel, then merging per-lead into a pass/review/block decision). It explicitly names the two sibling tools it composes (email_validate_deliverability, sanctions_screen_names), so an agent can distinguish it from calling those directly.

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?

Has explicit WHEN (onboarding, qualifying inbound leads, CRM hygiene) and WHEN NOT (use the single-check tool directly as it is cheaper; email_check_syntax as a free pre-filter). Alternatives and the condition selecting them are 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.

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.6/5.0

Scored across 12 tools

Disambiguation4/5

Each tool targets a distinct domain+action (PII scan/redact/guard, email syntax/validate, sanctions sources/screen, OSV query/get/audit), and the WHEN/WHEN NOT sections explicitly cross-reference siblings. The main risk is the deliberate free-vs-paid pairs (e.g., pii_scan_text vs pii_guard_documents, email_check_syntax vs email_validate_deliverability), where a superset-style paid tool could be picked by mistake, but descriptions do a good job diffentiating them.

Naming Consistency5/5

All 12 tools use consistent snake_case with a domain prefix followed by a verb_noun action (pii_scan_text, email_validate_deliverability, sanctions_screen_names, osv_get_vulnerability, trust_screen_lead). The pattern is predictable and readable throughout.

Tool Count5/5

12 tools spread evenly across four coherent domains (PII, email, sanctions, OSV) plus one composite orchestrator. Each tool earns its place, and no redundant or filler tools are present.

Completeness4/5

Strong lifecycle coverage: detect/redact/catalog for PII, syntax/validate for email, list/screen for sanctions, query/get/audit for OSV, and a merged lead-decision tool. Minor gaps exist (e.g., no standalone restore/normalize operation, no name-only or address-only helpers outside the paid Actor), but agents can work around these.

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