Skip to content

SanctionScreen

by sanctionsscreen.io · remote · no sign-in to list tools · v1.0.0 · published by io.sanctionsscreen

Screen counterparties and enrich companies for AI agents — sanctions checks, cited sources.

Changes · 1

2 tools: 1 change things and 1 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http sanctionscreen https://api.sanctionsscreen.io/mcp --header 'Authorization: <your-authorization>'

Findings

Matches of fixed checks, with the text they matched.

1 info
  • The description is 3,311 characters long, over the 2,000 this check looks for.

    Matched text

    description ends: "...disposition": "clear", "matches": [], "disclaimer": "...", "generated_at": "..."}"

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

2 tools

Changes things 1Claude Code: ask
  • screen_counterpartyScreen a counterparty name against the indexed sanctions lists (OFAC SDN, UK FCDO consolidated).1 finding

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Info

      The description is 3,311 characters long, over the 2,000 this check looks for.

      Matched text

      description ends: "...disposition": "clear", "matches": [], "disclaimer": "...", "generated_at": "..."}"

      What this check looks for
    Description, as the server wrote it
    Screen a counterparty name against the indexed sanctions lists (OFAC SDN, UK FCDO consolidated). What it does: normalizes the query (Unicode NFKD fold, punctuation strip, lowercase, Cyrillic/Greek transliteration; tolerant to token order e.g. "Putin Vladimir" vs "Vladimir Putin"), looks it up in the sanctions index, and returns EVERY match at low confidence or above with a per-match citation. Low-confidence matches are never hidden. Inputs: - name (required, string): full name of the person or entity. - country (optional, ISO-3166 alpha-2, e.g. "RU"): corroborates nationality/citizenship identifiers. - dob (optional, "YYYY-MM-DD"): a dob match adds +15 to the score — the strongest corroborator. - identifiers (optional, [{type, value}]): extra identifiers to check against the record, e.g. [{"type":"passport","value":"719023441"}]. - request_id (optional, string): idempotency key; safe to retry. - include_low_confidence (optional, boolean, default true): fuzzy matches (Jaro-Winkler >= 0.92) land in the low tier. Keep true — hiding low matches is a compliance liability. Output: {screening_id, disposition, matches[], disclaimer, generated_at}. - disposition: "clear" (no matches) | "potential_match" (any medium/low match) | "review_advised" (any high-confidence match — human review required before any adverse action). - Each match: {list, list_date, record_uid, matched_name, name_kind (primary|alias_strong|alias_weak), confidence (high|medium|low), confidence_score (0-100), matched_fields, citation {source, url, accessed_at}}. - Confidence math: exact primary 80 / alias_strong 70 / alias_weak 55; dob match +15. Tiers: high >= 85, medium >= 60, low >= 30. Fuzzy (JW >= 0.92) -> low tier, score 30-55. - LANGUAGE RULE: report "potential match", never "sanctioned". Screening is informational only — not a legal verdict. Every response carries the fixed disclaimer. EXAMPLE 1 — listed individual with corroborating dob: Input: {"name": "Vladimir Putin", "dob": "1952-10-07", "request_id": "demo-001"} Output: {"screening_id": "cs_scr_...", "disposition": "review_advised", "matches": [{"list": "OFAC_SDN", "list_date": "2026-09-23", "record_uid": "35096", "matched_name": "putin vladimir", "name_kind": "alias_strong", "confidence": "high", "confidence_score": 85, "matched_fields": ["name", "dob"], "citation": {"source": "U.S. Treasury OFAC SDN List", "url": "https://sanctionssearch.ofac.treas.gov/", "accessed_at": "2026-09-26T...Z"}}], "disclaimer": "Informational only — not a legal verdict. Not a substitute for due diligence. Human review required before any adverse action.", "generated_at": "2026-09-26T...Z"} EXAMPLE 2 — same person, no dob (exact alias match, medium): Input: {"name": "Vladimir Putin"} Output: {"screening_id": "cs_scr_...", "disposition": "potential_match", "matches": [{"list": "OFAC_SDN", "list_date": "2026-09-23", "record_uid": "35096", "matched_name": "putin vladimir", "name_kind": "alias_strong", "confidence": "medium", "confidence_score": 70, "matched_fields": ["name"], "citation": {...}}], "disclaimer": "...", "generated_at": "..."} EXAMPLE 3 — clear name: Input: {"name": "John Smith"} Output: {"screening_id": "cs_scr_...", "disposition": "clear", "matches": [], "disclaimer": "...", "generated_at": "..."}

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
Only reads 1Claude Code: allow
  • enrich_companyResolve a company domain or legal name to structured company facts via the free public GLEIF LEI registry.No findings

    Why it is in this group

    • The description's first verb is "resolve": a word for reading.
    Description, as the server wrote it
    Resolve a company domain or legal name to structured company facts via the free public GLEIF LEI registry. Inputs: {domain? e.g. "apple.com", name? e.g. "Apple Inc.", request_id? (idempotency)}. At least one of domain/name is required. v1 boundaries (returned honestly, never invented): - GLEIF has no domain index: domain-only lookups are best-effort (registrable-name candidates are tried). Provide the legal company name for reliable resolution. - GLEIF does not publish industry, industry_code, size_band, or employee_range: those come back null, each with a sources[] entry documenting the gap. - founded is the legal-entity creation date (GLEIF publishes no true founding date). - Unresolvable input -> tool error with code UNRESOLVABLE. Output: {company_id, legal_name, domain, industry, industry_code, size_band, employee_range, hq: {country, city}, founded, sources: [{field, source, url}], confidence, generated_at}. EXAMPLE 1: Input: {"domain": "apple.com", "request_id": "demo-e1"} Output: {"company_id": "cs_co_...", "legal_name": "Apple Inc.", "domain": "apple.com", "industry": null, "industry_code": null, "size_band": null, "employee_range": null, "hq": {"country": "US", "city": "Cupertino"}, "founded": "1980-12-12", "sources": [{"field": "legal_name", "source": "GLEIF LEI (api.gleif.org)", "url": "https://api.gleif.org/api/v1/lei-records/..."}, {"field": "industry", "source": "GLEIF LEI — field not published by GLEIF (null by design in v1)", "url": "https://api.gleif.org/api/v1/lei-records/..."}], "confidence": "high", "generated_at": "2026-09-26T...Z"} EXAMPLE 2 — unresolvable: Input: {"name": "Nonexistent Widgets Pty Ltd ZZ"} Tool error: {"code": "UNRESOLVABLE", "message": "No GLEIF LEI record matched ..."}

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.0.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http sanctionscreen https://api.sanctionsscreen.io/mcp --header 'Authorization: <your-authorization>'

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__sanctionscreen__enrich_company"
    ],
    "ask": [
      "mcp__sanctionscreen__screen_counterparty"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as sanctionscreen. Review it before you use it.