Fairquery Agent Trust & Data Safety
NPM · @FAIRQUERY/AGENT-TRUST-MCP
PII/secret redaction, email checks, sanctions screening and OSV vulnerability lookups for AI agents.
Available components
Last scanned (16 hours ago)
Scores higher than 37% of npm servers
Category Security
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 31 of 94 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency19
- Repository check failed: no source repository is declared. See how to fix → View diagnostics → Fail
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 1 days ago).Pass
- Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability60
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 9595 tokens (~738/item across 13 items; 13 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management10
- Stability observed for 3 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 21 Oct 26 +16
- Malware scan: unverified → pass ▲ security
- 20 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 1.1.4 → 1.1.5 functional
- 19 Oct 26 62
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 22 Oct 2026 · Analysed npm/@fairquery/agent-trust-mcp@1.1.5
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 94 packages
| Packages resolved | 94 |
|---|---|
| Stale | 31 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
email_check_syntax Check email syntax, typos, disposable & role (free) ~556
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, so it cannot tell whether the domain receives mail; use email_validate_deliverability (paid) for MX/SPF/DMARC. COST: Free; local, no token. RETURNS: Paged "email_check" rows; verdict is invalid | risky | unknown, never valid (dns_checked is always false). BEHAVIOR: No network calls (no DNS/SMTP); synchronous and CPU-bound, no rate limits: 10,000 addresses (the per-call maximum) return in well under a second. PARAMETERS: emails: each element is parsed on its own (one address per element; a comma-separated list in one element is INVALID_SYNTAX, not split). Before checking, "Name <addr>" is reduced to addr, a leading "mailto:" is dropped, the domain is lowercased (local part keeps its case), a trailing dot is removed and IDN domains are converted to punycode; the normalized value is returned as email, the original as input. Duplicates are not merged: every element yields one row, in input order. Role detection ignores +tags (sales+eu@ counts as sales@) and disposable matching also covers subdomains of listed domains. limit/offset page those rows; meta.summary always counts verdicts over ALL rows, not just the current page. EXAMPLE: {"emails":["someone@gmial.com"]} -> verdict "risky", reasons ["POSSIBLE_TYPO","DNS_NOT_CHECKED"], did_you_mean "someone@gmail.com".
| Name | Type | Req | Description |
|---|---|---|---|
| emails | array | yes | Required. 1-10000 strings, 1-320 chars each, one address per element; bare "jane@acme.com", "Jane <jane@acme.com>" and "mailto:jane@acme.com" forms accepted. Example: ["jane@acme.com","bob@gmial.com"] |
| limit | integer | – | Optional page size: items to return, integer 1-1000 (default 100). Example: 50 |
| offset | integer | – | Optional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100 |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of items in this page |
| hasMore | boolean | yes | True if more items exist after this page |
| items | array | yes | Result rows for this page |
| meta | object | – | Tool-specific context (summary counts, cost notes, ...) |
| nextOffset | – | yes | Offset to pass for the next page, or null |
| offset | integer | yes | Offset of the first item in this page |
| total | integer | yes | Total items before paging |
No examples provided.
email_validate_deliverability Validate email deliverability: MX, SPF, DMARC (paid) ~889
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: Only when MX/DNS matters (can the domain receive mail?), e.g. cleaning lists before a send or verifying a lead's domain; pre-filter with email_check_syntax to avoid paying for obviously bad rows. WHEN NOT: Offline format, typo, disposable or role checks (free email_check_syntax). Leads that also need sanctions screening: trust_screen_lead (one merged decision). It does not SMTP-probe mailboxes. COST: Paid, billed to YOUR Apify account via your APIFY_TOKEN: $0.00079 per email (+ $0.00005/run). 100 emails ~ $0.08. RETURNS: Paged "email" rows (verdict valid | risky | invalid | unknown with reasons[]) or "error" rows. Tool errors: APIFY_TOKEN_MISSING, APIFY_TOKEN_INVALID, APIFY_PAYMENT_REQUIRED, APIFY_ACTOR_RUN_FAILED, APIFY_TIMEOUT. BEHAVIOR: No email is sent; results change only with live DNS. Makes network calls: runs an Apify Actor (DNS/MX lookups) in your account; latency seconds to minutes (300 s timeout). PARAMETERS: emails: elements may also hold comma/semicolon/newline-separated lists or "Name <addr>" forms; the Actor splits them, trims, and skips case-insensitive duplicates, so you pay once per unique address. The allow* flags only decide whether a condition downgrades the verdict to "risky": the matching reason code (ROLE_ACCOUNT, DISPOSABLE_DOMAIN, FREE_PROVIDER) is reported in reasons[] either way, and they can never turn an "invalid" address (bad syntax, no domain, null MX, no mail server) into "valid". POSSIBLE_TYPO and IMPLICIT_MX_ONLY always make it "risky" regardless of flags. Typical presets: B2B lead list = allowFreeProviders false + allowRoleAccounts false; consumer signups = defaults. checkSpfDmarc only adds has_spf / has_dmarc / dmarc_policy fields; it never changes the verdict or the price. limit/offset on…
| Name | Type | Req | Description |
|---|---|---|---|
| allowDisposable | boolean | – | Optional boolean, default false = disposable/temporary-inbox domains (mailinator.com, ...) get verdict "risky"; true stops penalising them |
| allowFreeProviders | boolean | – | Optional boolean, default true. false downgrades free webmail (gmail.com, outlook.com, yahoo.com, ...) to "risky"; recommended for B2B lead lists |
| allowRoleAccounts | boolean | – | Optional boolean, default true. false downgrades role mailboxes (info@, sales@, support@, ...) to verdict "risky" |
| checkSpfDmarc | boolean | – | Optional boolean, default true. true adds has_spf, has_dmarc and dmarc_policy (none|quarantine|reject) per domain; false skips those DNS lookups. Verdict and price are unaffected |
| emails | array | yes | Required. 1-10000 strings, 1-320 chars each, one address per element; bare "jane@acme.com", "Jane <jane@acme.com>" and "mailto:jane@acme.com" forms accepted. Example: ["jane@acme.com","bob@gmial.com"] |
| limit | integer | – | Optional page size: items to return, integer 1-1000 (default 100). Example: 50 |
| offset | integer | – | Optional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100 |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of items in this page |
| hasMore | boolean | yes | True if more items exist after this page |
| items | array | yes | Result rows for this page |
| meta | object | – | Tool-specific context (summary counts, cost notes, ...) |
| nextOffset | – | yes | Offset to pass for the next page, or null |
| offset | integer | yes | Offset of the first item in this page |
| total | integer | yes | Total items before paging |
No examples provided.
osv_audit_dependencies Audit dependencies/manifests with fix recommendations (paid) ~830
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: Only for manifests, severity filtering or fix recommendations: full project audits from a pasted manifest, CI-style reports; for a few exact versions use osv_query_packages (free). 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.0005 per package + $0.0015 per vulnerability found (+ $0.00005/run). Use minSeverity="HIGH" to cut vuln rows. lodash+django (2 pkgs, 41 vulns) ~ $0.06. 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: Makes network calls: runs an Apify Actor (querying OSV.dev) in your account; 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"}
| Name | Type | Req | Description |
|---|---|---|---|
| includeDevDependencies | boolean | – | Optional boolean, default true. false skips devDependencies (package.json) and dev packages (package-lock.json); no effect on requirements.txt / go.mod |
| limit | integer | – | Optional page size: items to return, integer 1-1000 (default 100). Example: 50 |
| manifestText | string | – | Optional if packages is given. Raw file content (<= 2,000,000 chars) of package.json, package-lock.json (v1-v3), requirements.txt (== pins) or go.mod; parsed packages are added to packages. Example:… |
| manifestType | string | – | Optional, one of "auto" | "package.json" | "package-lock.json" | "requirements.txt" | "go.mod", default "auto" (detect from content). Set it when detection fails (MANIFEST_UNDETECTED) |
| minSeverity | string | – | Optional, one of "ALL" | "LOW" | "MEDIUM" | "HIGH" | "CRITICAL", default "ALL". Only emit (and bill) vulnerability rows at or above this severity; package rows are always emitted. Example: "HIGH" |
| offset | integer | – | Optional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100 |
| packages | array | – | Optional if manifestText is given (at least one is required). 0-1000 {ecosystem, name, version} objects with exact versions; billed per package. Example: [{"ecosystem":"npm","name":"lodash","version"… |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of items in this page |
| hasMore | boolean | yes | True if more items exist after this page |
| items | array | yes | Result rows for this page |
| meta | object | – | Tool-specific context (summary counts, cost notes, ...) |
| nextOffset | – | yes | Offset to pass for the next page, or null |
| offset | integer | yes | Offset of the first item in this page |
| total | integer | yes | Total items before paging |
No examples provided.
osv_get_vulnerability Get vulnerability advisory details (free, OSV.dev) ~572
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) or a whole manifest (osv_audit_dependencies, paid). COST: Free; no token. RETURNS: Paged "vulnerability" rows with the raw OSV record fields, or "error" rows (VULN_NOT_FOUND | OSV_FETCH_FAILED, see PARAMETERS). BEHAVIOR: One HTTPS call per ID to api.osv.dev, in parallel; typically <2 s, 20 s timeout each. PARAMETERS: ids: each ID is fetched separately and yields exactly one row in input order, so one bad ID never fails the others: an unknown ID returns a VULN_NOT_FOUND row (not retryable), a network/5xx problem an OSV_FETCH_FAILED row (retryable - retry just that ID). Prefer the ecosystem/GHSA IDs returned by osv_query_packages (vuln_ids); a CVE-... ID only resolves when OSV indexes that CVE as its own record, otherwise look up the GHSA alias. IDs are matched as given (no trimming of URLs or prefixes), and duplicates are fetched twice. limit/offset only page the returned rows; every call re-fetches all given IDs, so for a next page resend the same ids with offset = nextOffset. EXAMPLE: {"ids":["GHSA-35jh-r3h4-6jhm"]} -> lodash command injection, fixed in 4.17.21.
| Name | Type | Req | Description |
|---|---|---|---|
| ids | array | yes | Required. 1-25 OSV advisory IDs, 3-100 chars each, pattern ^[A-Za-z0-9][A-Za-z0-9._:-]{2,99}$ (letters, digits, . _ : -). Formats: GHSA-xxxx-xxxx-xxxx, PYSEC-YYYY-N, GO-YYYY-NNNN, RUSTSEC-YYYY-NNNN,… |
| limit | integer | – | Optional page size: items to return, integer 1-25 (default 25). Example: 25 |
| offset | integer | – | Optional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100 |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of items in this page |
| hasMore | boolean | yes | True if more items exist after this page |
| items | array | yes | Result rows for this page |
| meta | object | – | Tool-specific context (summary counts, cost notes, ...) |
| nextOffset | – | yes | Offset to pass for the next page, or null |
| offset | integer | yes | Offset of the first item in this page |
| total | integer | yes | Total items before paging |
No examples provided.
osv_query_packages Check package versions for known vulnerabilities (free, OSV.dev) ~508
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; no token, nothing sent to Fairquery or Apify. RETURNS: Paged "package" rows (vulnerable, vuln_ids) or per-entry INVALID_ECOSYSTEM "error" rows. Tool errors: OSV_FETCH_FAILED (retryable). BEHAVIOR: One HTTPS request to api.osv.dev (Google-run public API) for all packages; typically <2 s, 20 s timeout. Results change only when OSV publishes advisories. PARAMETERS: packages: each entry is checked independently and returns exactly one row, in input order. An unknown ecosystem yields a per-entry INVALID_ECOSYSTEM error row while the other entries still run. A version range such as "^4.17.0" or ">=2" is not resolved and normally returns no vulnerabilities (a false "safe"), so pin versions from your lockfile first. Duplicate entries are queried and returned twice. limit/offset page the rows (all packages are sent to OSV in a single request); meta.vulnerable_count counts all packages, not only the page. EXAMPLE: {"packages":[{"ecosystem":"npm","name":"lodash","version":"4.17.20"}]} -> vulnerable true, vuln_ids ["GHSA-35jh-r3h4-6jhm",...].
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Optional page size: items to return, integer 1-200 (default 100). Example: 50 |
| offset | integer | – | Optional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100 |
| packages | array | yes | Required. 1-200 {ecosystem, name, version} objects, one exact version each. Example: [{"ecosystem":"npm","name":"lodash","version":"4.17.20"},{"ecosystem":"PyPI","name":"django","version":"3.2.0"}] |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of items in this page |
| hasMore | boolean | yes | True if more items exist after this page |
| items | array | yes | Result rows for this page |
| meta | object | – | Tool-specific context (summary counts, cost notes, ...) |
| nextOffset | – | yes | Offset to pass for the next page, or null |
| offset | integer | yes | Offset of the first item in this page |
| total | integer | yes | Total items before paging |
No examples provided.
pii_guard_documents Deep PII/secret guard for documents and URLs (paid) ~1,081
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: Only when you need NER names/addresses, files at URLs/PDFs, or the hosted pipeline. WHEN NOT: Plain text scans (pii_scan_text / pii_redact_text, free), restoring placeholders in an LLM answer (pii_restore_text, free, same result as restore mode), images (no OCR), email deliverability. COST: Paid, billed to YOUR Apify account via your APIFY_TOKEN: $0.0015 per document + $0.0002 per finding. Example: 10 docs with 20 findings ~ $0.02. RETURNS: Paged "document" rows (findings masked; output_text in redact/restore modes) or "error" rows. Tool errors: APIFY_TOKEN_MISSING, APIFY_TOKEN_INVALID, APIFY_PAYMENT_REQUIRED, APIFY_ACTOR_RUN_FAILED, APIFY_TIMEOUT, INPUT_EMPTY. BEHAVIOR: Makes network calls: runs the Actor in your Apify account, which may fetch documentUrls. Latency seconds to a few minutes (300 s actor timeout). Up to 1000 texts / 100 URLs (10 MB each). PARAMETERS: texts and/or documentUrls: at least one non-empty (the schema marks both optional; neither -> INPUT_EMPTY, not billed); both may be combined and each text or URL becomes one billed document row. mode="restore" ignores all detector flags; a placeholder missing from placeholderMap stays as is. Cost scales with documents and findings, so narrow entityTypes to cut finding charges. limit/offset only page the returned rows: every call processes and bills the whole input again (also when only offset changes), so pick a limit (max 1000) that covers all rows instead of paging. EXAMPLE: {"documentUrls":["https://example.com/report.pdf"],"mode":"redact","detectNames":true}
| Name | Type | Req | Description |
|---|---|---|---|
| allowList | array | – | Optional, default []. 0-1000 exact values never flagged (whole value, case-insensitive). Example: ["support@yourco.com"] |
| detectAddresses | boolean | – | Optional boolean, default false. true enables street-address patterns (STREET_ADDRESS) and place-name NER (LOCATION) |
| detectNames | boolean | – | Optional boolean, default false. true enables English person-name NER (type PERSON; lower precision, slower) |
| documentUrls | array | – | Optional if texts is given. 0-100 public http(s) URLs (<= 2000 chars) of txt/md/json/csv/HTML/PDF files (<= 10 MB each, PDF text layer only), fetched by the Actor in Apify cloud. Example: ["https://e… |
| entityTypes | array | – | Optional, default omitted = all enabled detectors. 0-40 type names from pii_list_detectors (case-insensitive), e.g. ["EMAIL","PERSON"]; PERSON/LOCATION/STREET_ADDRESS also need detectNames/detectAddr… |
| entropyScan | boolean | – | Optional boolean, default false. true also flags unlabeled random-looking tokens (20+ chars) as HIGH_ENTROPY_STRING |
| limit | integer | – | Optional page size: items to return, integer 1-1000 (default 100). Example: 50 |
| mode | string | – | Optional, one of "detect" | "redact" | "restore", default "redact". "detect" = findings only; "redact" = findings + output_text; "restore" = replace placeholders in texts with originals from placehol… |
| offset | integer | – | Optional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100 |
| placeholderMap | object | – | Optional; used only with mode="restore". Object mapping placeholder -> original value, as returned by an earlier redact call. Example: {"[EMAIL_1]":"jane@acme.com"} |
| redactionStyle | string | – | Optional, one of "placeholder" | "mask" | "hash", default "placeholder"; used in mode="redact" only. placeholder = [EMAIL_1] (reversible), mask = j***@a***.com, hash = [EMAIL:3f2a9c0d1b7e] |
| returnPlaceholderMap | boolean | – | Optional boolean, default false. true adds placeholder_map (ORIGINAL values) to each row; only with mode="redact" and redactionStyle="placeholder" |
| texts | array | – | Optional if documentUrls is given (at least one of the two is required). 0-1000 documents as plain strings, each <= 1,000,000 chars; one billed document row each. Example: ["Mail jane@acme.com, key A… |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of items in this page |
| hasMore | boolean | yes | True if more items exist after this page |
| items | array | yes | Result rows for this page |
| meta | object | – | Tool-specific context (summary counts, cost notes, ...) |
| nextOffset | – | yes | Offset to pass for the next page, or null |
| offset | integer | yes | Offset of the first item in this page |
| total | integer | yes | Total items before paging |
No examples provided.
pii_list_detectors List PII/secret detectors and pricing (free) ~286
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; no token. RETURNS: One catalog object; local:true marks the detectors the free tools run (see PARAMETERS). BEHAVIOR: No network calls; local static catalog, instant (<10 ms). No rate limits. PARAMETERS: None: call with an empty object {}; the catalog is always complete and cannot be filtered. Its output feeds other tools' parameters: copy detector "type" values verbatim into entityTypes of pii_scan_text / pii_redact_text (only rows with local:true can match there) or pii_guard_documents (all rows, incl. PERSON / LOCATION / STREET_ADDRESS); redaction_styles keys are the allowed redactionStyle values. EXAMPLE: {} -> {"detectors":[{"type":"AWS_ACCESS_KEY","category":"secret","local":true},...]}
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| detectors | array | yes | – |
| paid_pricing | object | yes | – |
| redaction_styles | object | yes | – |
No examples provided.
pii_redact_text Redact PII and secrets locally (free) ~934
WHAT: Return sanitized copies of texts with every local PII/secret finding replaced (placeholder [EMAIL_1], mask, or salted hash). 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. 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; no token. RETURNS: One "redacted_document" row per text with output_text; meta.placeholder_map only when requested. Errors: INPUT_TOO_LARGE. BEHAVIOR: Same input gives the same output except redactionStyle "hash" (random per-call salt). No network calls; local, milliseconds. PARAMETERS: texts: one element per document, 500,000 chars in total; the same value gets the same placeholder in every document of one call ([EMAIL_1] everywhere), but numbering restarts on each call. redactionStyle: "placeholder" is the only reversible style; "mask" keeps a few characters for human review; "hash" output differs between calls (random salt), so do not compare hashes across calls. returnPlaceholderMap: only has an effect with redactionStyle="placeholder" (ignored for mask/hash); the map in meta.placeholder_map holds the ORIGINAL values, so keep it out of the LLM prompt and restore answers with pii_restore_text (free, local). entityTypes / allowList / entropyScan / defaultPhoneRegion: identical semantics to pii_scan_text (filter after detection, whole-value case-insensitive allow-list). limit/offset page whole documents (one item per text, default 10 per page), not findings. EXAMPLE: {"texts":["Call +1 415 555 0100 or mail jane@acme.com"]} -> output_text "Call [PHONE_1] or mail [EMAIL_1]".
| Name | Type | Req | Description |
|---|---|---|---|
| allowList | array | – | Optional, default [] (nothing exempt). 0-500 exact values (<= 500 chars each) that are never flagged; whole-value, case-insensitive match, not substring. Example: ["support@yourco.com","192.0.2.1"] |
| defaultPhoneRegion | string | – | Optional, default "US". ISO 3166-1 alpha-2 code (2 letters, pattern ^[A-Za-z]{2}$, case-insensitive) used only for phone numbers written without a +country prefix. Examples: "US", "DE", "GB" |
| entityTypes | array | – | Optional, default omitted = every local detector. 0-40 detector type names (<= 40 chars, case-insensitive), e.g. ["EMAIL","CREDIT_CARD","AWS_ACCESS_KEY"]. Valid values: the "type" field of pii_list_d… |
| entropyScan | boolean | – | Optional boolean, default false. true also flags unlabeled random-looking tokens of 20-200 chars as HIGH_ENTROPY_STRING (catches unknown key formats; may flag hashes/UUIDs). Example: true |
| limit | integer | – | Optional page size: items to return, integer 1-50 (default 10). Example: 10 |
| offset | integer | – | Optional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100 |
| redactionStyle | string | – | Optional, one of "placeholder" | "mask" | "hash", default "placeholder". "placeholder" = [EMAIL_1] (reversible); "mask" = j***@a***.com, **** **** **** 1111; "hash" = [EMAIL:3f2a9c0d1b7e] (salted sha… |
| returnPlaceholderMap | boolean | – | Optional boolean, default false. true (placeholder style only) adds meta.placeholder_map {"[EMAIL_1]":"jane@acme.com"} containing the ORIGINAL sensitive values. Example: true |
| texts | array | yes | Required. 1-50 documents (prompt, chat message, log, file content), each <= 200,000 chars, total <= 500,000 chars. Example: ["Mail jane@acme.com, key AKIAIOSFODNN7EXAMPLE"] |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of items in this page |
| hasMore | boolean | yes | True if more items exist after this page |
| items | array | yes | Result rows for this page |
| meta | object | – | Tool-specific context (summary counts, cost notes, ...) |
| nextOffset | – | yes | Offset to pass for the next page, or null |
| offset | integer | yes | Offset of the first item in this page |
| total | integer | yes | Total items before paging |
No examples provided.
pii_restore_text Restore placeholders with original values (free, local) ~616
WHAT: Put the original values back into texts (typically an LLM answer) that contain placeholders such as [EMAIL_1], using the placeholder map from pii_redact_text or pii_guard_documents. Runs 100% on your machine. WHEN: After an LLM or third party answered a prompt you sanitized with pii_redact_text (redactionStyle "placeholder", returnPlaceholderMap=true), before showing the answer to the user. WHEN NOT: To redact (pii_redact_text) or find PII (pii_scan_text). Masked and hashed values cannot be restored; only placeholder style is reversible. COST: Free; no token. RETURNS: One "restored_document" row per text with output_text, replacements and unknown_placeholders. Errors: INPUT_TOO_LARGE. BEHAVIOR: No network calls; the map never leaves your machine; milliseconds. Max 50 texts, 200,000 chars each, 500,000 total; map up to 10,000 entries. PARAMETERS: placeholderMap: pass meta.placeholder_map unchanged; every key is replaced wherever it occurs exactly (case-sensitive, longest key first, one pass, so a restored value is never replaced again). unknown_placeholders lists [TYPE_N]-shaped tokens left in the text that the map does not contain (the LLM invented or altered them); they stay as they are. A placeholder the LLM rewrote (e.g. "EMAIL_1" without brackets) is not restored. The output contains the ORIGINAL sensitive values: show it to the user, do not send it back to the LLM. limit/offset page whole documents (default 10 per page). EXAMPLE: {"texts":["I will email [EMAIL_1] today."],"placeholderMap":{"[EMAIL_1]":"jane@acme.com"}} -> output_text "I will email jane@acme.com today.", replacements 1.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Optional page size: items to return, integer 1-50 (default 10). Example: 10 |
| offset | integer | – | Optional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100 |
| placeholderMap | object | yes | Required. Object placeholder -> original value, as returned in meta.placeholder_map by pii_redact_text (or placeholder_map by pii_guard_documents); keys 1-200 chars, values <= 10,000 chars, <= 10,000… |
| texts | array | yes | Required. 1-50 documents (prompt, chat message, log, file content), each <= 200,000 chars, total <= 500,000 chars. Example: ["Mail jane@acme.com, key AKIAIOSFODNN7EXAMPLE"] |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of items in this page |
| hasMore | boolean | yes | True if more items exist after this page |
| items | array | yes | Result rows for this page |
| meta | object | – | Tool-specific context (summary counts, cost notes, ...) |
| nextOffset | – | yes | Offset to pass for the next page, or null |
| offset | integer | yes | Offset of the first item in this page |
| total | integer | yes | Total items before paging |
No examples provided.
pii_scan_text Scan text for PII and secrets locally (free) ~869
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. 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 APIFY_TOKEN. RETURNS: Paged findings across all documents, each with a masked preview; raw values are never returned. Errors: INPUT_TOO_LARGE. BEHAVIOR: No network calls; text never leaves your machine; milliseconds. PARAMETERS: texts: one array element per document; each finding carries doc_index = the element's 0-based position, and the 500,000-char cap applies to the SUM of all elements (over it -> INPUT_TOO_LARGE; split into several calls). entityTypes: filters findings after detection; names are case-insensitive, unknown names silently match nothing, and NER-only types (PERSON, LOCATION, STREET_ADDRESS) never match here. allowList: compared with the whole matched value, case-insensitively (allow "support@yourco.com", not "yourco.com"). entropyScan: only adds HIGH_ENTROPY_STRING findings; it never removes others. defaultPhoneRegion: affects only national-format numbers such as "030 1234567" (needs "DE"); "+49 ..." numbers parse with any region. limit/offset page the flat findings list across all documents, while meta.documents always summarises every document; fetch the next page with offset = nextOffset until hasMore is false. EXAMPLE: {"texts":["Mail jane@acme.com, key AKIAIOSFODNN7EXAMPLE"]} -> 2 findings: EMAIL (masked "j***@a***.com"), AWS_ACCESS_KEY; risk_level "critical".
| Name | Type | Req | Description |
|---|---|---|---|
| allowList | array | – | Optional, default [] (nothing exempt). 0-500 exact values (<= 500 chars each) that are never flagged; whole-value, case-insensitive match, not substring. Example: ["support@yourco.com","192.0.2.1"] |
| defaultPhoneRegion | string | – | Optional, default "US". ISO 3166-1 alpha-2 code (2 letters, pattern ^[A-Za-z]{2}$, case-insensitive) used only for phone numbers written without a +country prefix. Examples: "US", "DE", "GB" |
| entityTypes | array | – | Optional, default omitted = every local detector. 0-40 detector type names (<= 40 chars, case-insensitive), e.g. ["EMAIL","CREDIT_CARD","AWS_ACCESS_KEY"]. Valid values: the "type" field of pii_list_d… |
| entropyScan | boolean | – | Optional boolean, default false. true also flags unlabeled random-looking tokens of 20-200 chars as HIGH_ENTROPY_STRING (catches unknown key formats; may flag hashes/UUIDs). Example: true |
| limit | integer | – | Optional page size: items to return, integer 1-1000 (default 100). Example: 50 |
| offset | integer | – | Optional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100 |
| texts | array | yes | Required. 1-50 documents (prompt, chat message, log, file content), each <= 200,000 chars, total <= 500,000 chars. Example: ["Mail jane@acme.com, key AKIAIOSFODNN7EXAMPLE"] |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of items in this page |
| hasMore | boolean | yes | True if more items exist after this page |
| items | array | yes | Result rows for this page |
| meta | object | – | Tool-specific context (summary counts, cost notes, ...) |
| nextOffset | – | yes | Offset to pass for the next page, or null |
| offset | integer | yes | Offset of the first item in this page |
| total | integer | yes | Total items before paging |
No examples provided.
sanctions_list_sources List covered sanctions lists (free) ~222
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; no token. RETURNS: One static object, including the disclaimer to show with screening results. BEHAVIOR: No network calls; static local catalog, instant. No rate limits. PARAMETERS: None: call with an empty object {}; the result is static and cannot be filtered. Its output feeds sanctions_screen_names: each sources[].id (OFAC_SDN, OFAC_CONS, EU, UK, UN) is a valid value for its lists parameter, and score_scale explains how its minScore threshold is applied. EXAMPLE: {} -> {"sources":[{"id":"OFAC_SDN","authority":"US Treasury OFAC",...},...]}
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| disclaimer | string | yes | – |
| pricing | string | yes | – |
| score_scale | string | yes | – |
| sources | array | yes | – |
No examples provided.
sanctions_screen_names Screen names against OFAC/EU/UK/UN sanctions (paid) ~996
WHAT: Runs the Fairquery Apify Actor sanctions-watchlist-screener: fuzzy-match people/organisations against OFAC SDN, OFAC Consolidated, EU, UK and UN lists from the official sources (re-downloaded when the cached copy in your Apify account is older than 6 h; every row reports each list's publication date); optional country/DOB filters. WHEN: KYC/KYB onboarding, vendor/counterparty checks, bulk re-screening. Put all names in ONE call (each call is one run with its own start fee; list loading takes ~2-5 s from the cache, or 10-40 s, up to ~60 s, when lists are re-downloaded). WHEN NOT: PEP/adverse media, certified compliance decisions. For coverage info use free sanctions_list_sources. Leads that also have an email to validate: trust_screen_lead (one merged decision). COST: Paid, billed to YOUR Apify account via your APIFY_TOKEN: $0.003 per name + $0.007 per run. 200 names in one call ~ $0.61. RETURNS: Paged "screening" rows (status potential_match | no_match, matches[] best first, lists_unavailable) or "error" rows. Tool errors: INPUT_EMPTY, APIFY_TOKEN_MISSING, APIFY_TOKEN_INVALID, APIFY_PAYMENT_REQUIRED, APIFY_ACTOR_RUN_FAILED, APIFY_TIMEOUT. Not a certified screening service. Automated fuzzy matching against public lists; false positives and misses are possible. Review every potential match manually and consult official sources/legal counsel before acting. BEHAVIOR: Results are stable for a given list snapshot. Makes network calls: runs an Apify Actor in your account; latency seconds to minutes (300 s timeout). Up to 10,000 names. PARAMETERS: names and/or queries: at least one non-empty (the schema marks both optional; neither -> INPUT_EMPTY, not billed). Both may be combined; every entry is billed once, so use names for bare strings and queries when you have country/dateOfBirth/entityType or want your own id echoed. In queries, dateOfBirth removes listed individuals born more than 1 year apart, while country never removes matches (it only sets country_match); e…
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Optional page size: items to return, integer 1-1000 (default 100). Example: 50 |
| lists | array | – | Optional, default all five. Any subset of "OFAC_SDN" | "OFAC_CONS" | "EU" | "UK" | "UN" (ids from sanctions_list_sources). Example: ["OFAC_SDN","EU"] |
| maxMatchesPerName | integer | – | Optional integer 1-100, default 10. Max entries in matches[] per name (best first); match_count still reports the total. Example: 3 |
| minScore | integer | – | Optional integer 60-100, default 85. Minimum 0-100 fuzzy name-similarity score for a match; 90+ = fewer false positives, ~80 = more recall. Example: 90 |
| names | array | – | Optional if queries is given (at least one is required). 0-10000 plain person/organisation names, 1-300 chars each. Example: ["Acme Trading LLC","Banco Nacional de Cuba"] |
| offset | integer | – | Optional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100 |
| queries | array | – | Optional if names is given. 0-10000 {name, id?, country?, dateOfBirth?, entityType?} objects. Example: [{"name":"Ali Khamenei","id":"cust-42","country":"IR","dateOfBirth":"1939","entityType":"individ… |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of items in this page |
| hasMore | boolean | yes | True if more items exist after this page |
| items | array | yes | Result rows for this page |
| meta | object | – | Tool-specific context (summary counts, cost notes, ...) |
| nextOffset | – | yes | Offset to pass for the next page, or null |
| offset | integer | yes | Offset of the first item in this page |
| total | integer | yes | Total items before paging |
No examples provided.
trust_screen_lead Screen leads: email deliverability + sanctions (paid) ~919
WHAT: One call per batch of leads/counterparties: runs email_validate_deliverability on their emails and sanctions_screen_names on their person/company names IN PARALLEL, then merges results per lead with an overall decision: block (invalid email or sanctions potential_match), review (risky email), pass. WHEN: Onboarding customers/vendors, qualifying inbound leads, CRM hygiene where both email quality and sanctions exposure matter. WHEN NOT: Email only -> email_validate_deliverability; names only -> sanctions_screen_names (same per-item prices, no merge step). Free pre-filter first: email_check_syntax. Use this tool only when a lead needs both checks and one decision. COST: Paid, billed to YOUR Apify account via your APIFY_TOKEN: $0.00079 per lead with email + $0.003 per lead with name (= $0.00379 per full lead) + $0.007 per call for the sanctions run. 100 full leads ~ $0.39. RETURNS: Paged "lead" rows (decision pass | review | block with reasons[]; sanctions_matches holds the top 3); meta.summary counts by decision. Partial failure: the affected check shows "unavailable" and meta.errors lists codes. Tool errors: INPUT_EMPTY, APIFY_TOKEN_MISSING. BEHAVIOR: No email is sent. Runs the email and sanctions Apify Actors in parallel (2 runs per call) in your account; ~5-45 s (sanctions lists come from a cache at most 6 h old, or are downloaded), 300 s timeout. PARAMETERS: leads: each record needs email and/or name (if no lead has either -> INPUT_EMPTY, nothing billed); a lead with only an email skips sanctions (sanctions_status "not_checked") and one with only a name skips email (email_verdict "not_checked"), so a lead is billed for each check it gets (prices under COST), plus the per-call sanctions run fee when any lead has a name. Identical emails across leads are validated and billed once. ref joins sanctions results back to the lead, so keep refs unique (default = the lead's 0-based index as a string). country and entityType apply to that lead's sanctions check only:…
| Name | Type | Req | Description |
|---|---|---|---|
| allowFreeProviders | boolean | – | Optional boolean, default true. false makes free webmail (gmail.com, outlook.com, ...) email_verdict "risky" -> decision "review"; recommended for B2B |
| leads | array | yes | Required. 1-1000 lead objects {ref?, email?, name?, country?, entityType?}; each needs email and/or name. Example: [{"ref":"L1","email":"cfo@acme.com","name":"Acme Trading LLC","country":"US","entity… |
| limit | integer | – | Optional page size: items to return, integer 1-1000 (default 100). Example: 50 |
| minScore | integer | – | Optional integer 60-100, default 88. Minimum 0-100 fuzzy name-similarity for a sanctions potential_match (which blocks the lead). Example: 92 |
| offset | integer | – | Optional zero-based number of items to skip, integer 0-1000000 (default 0); pass nextOffset from the previous response, e.g. 100 |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of items in this page |
| hasMore | boolean | yes | True if more items exist after this page |
| items | array | yes | Result rows for this page |
| meta | object | – | Tool-specific context (summary counts, cost notes, ...) |
| nextOffset | – | yes | Offset to pass for the next page, or null |
| offset | integer | yes | Offset of the first item in this page |
| total | integer | yes | Total items before paging |
No examples provided.
How do I install the Fairquery Agent Trust & Data Safety MCP server?
Fairquery Agent Trust & Data Safety runs locally as an npm package, launched with npx -y @fairquery/agent-trust-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @fairquery/agent-trust-mcp
claude mcp add com-getfairquery-agent-trust-mcp -- npx -y @fairquery/agent-trust-mcp
What is the Fairquery Agent Trust & Data Safety MCP server?
Fairquery Agent Trust & Data Safety is an MCP server listed in the public MCP registry as com.getfairquery/agent-trust-mcp. PII/secret redaction, email checks, sanctions screening and OSV vulnerability lookups for AI agents. This page covers its npm package (@fairquery/agent-trust-mcp).
Is the Fairquery Agent Trust & Data Safety MCP server safe to use?
Fairquery Agent Trust & Data Safety scores 63 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 22 October 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Fairquery Agent Trust & Data Safety MCP server expose?
Fairquery Agent Trust & Data Safety exposes 13 tools: pii_list_detectors, pii_scan_text, pii_redact_text, pii_restore_text, pii_guard_documents, and 8 more. Their descriptions and schemas cost roughly 9,278 tokens of context every time the server is loaded.
Is the Fairquery Agent Trust & Data Safety MCP server still maintained?
Fairquery Agent Trust & Data Safety is still listed as active in the MCP registry. We last reached this channel on 22 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Fairquery Agent Trust & Data Safety MCP server under?
Fairquery Agent Trust & Data Safety declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.