Skip to main content
Glama

sanctions-screening-mcp-server

sanctions-screening-mcp-server: get entity

sanctions_get_entity
Read-onlyIdempotent

Fetch the full GLEIF Level 1 record for one LEI: legal name, other/trading names, legal and headquarters addresses, registration status, jurisdiction, registration authority and ID, and last-update date — plus a sanctions cross-reference against all loaded watchlists. The cross-reference screens the legal name and every other and transliterated name strict (exact, then all tokens present — never fuzzy, unlike sanctions_screen_name), and looks up the LEI and the registration number as exact non-document identifiers, the registration number matching only an identifier published for the country of the entity's legal jurisdiction. Hits merge to one per designation, an OFAC party both OFAC lists publish to one hit whose sources names both: matchedOn names every input that produced each, and a hit only an identifier produced carries matchedIdentifiers and no matchedName. The screening cross-reference is a screening AID: a hit is a candidate to verify against the official source, and no hit is not a clearance. screeningStatus says whether that cross-reference actually ran — an empty sanctionsHits under not_ready means the sanctions mirror was unavailable, not that nothing matched. sanctionsScreen says whether the hit list is the whole set: it reports how many potential matches existed before the cap, so a capped cross-reference is distinguishable from a complete one. LEI must be a 20-character GLEIF identifier (18 alphanumerics + 2 check digits).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
leiYesThe 20-character GLEIF Legal Entity Identifier to look up.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
leiNoThe 20-character GLEIF Legal Entity Identifier.
errorNoPresent when the call failed. Absent on success.
caveatNoDecision-support caveat — the screening cross-reference is an aid, not a determination.
statusNoRegistration status (e.g. ISSUED, LAPSED).
legalNameNoRegistered legal name.
lastUpdateNoISO 8601 last-update timestamp from the LEI record.
otherNamesNoOther names published in the LEI record (trading, previous, and alternative-language legal names), as plain strings.
jurisdictionNoLegal jurisdiction (ISO code), when published.
legalAddressNoSingle-line legal address, when published.
sanctionsHitsNoSanctions screening cross-reference of the entity, one hit per designation (an OFAC party both OFAC lists publish once): exact name and identifier matches first, then strong name matches.
alternateNamesNoEvery other and transliterated name with its type, in the order published — the typed view of otherNames plus the ASCII transliterations of a legal name in another script.
sanctionsScreenNoDisclosure for the cross-reference: how many potential matches existed before the cap, whether sanctionsHits is the complete set, and what was screened. Present only when screeningStatus is 'screened'.
screeningStatusNoWhether the cross-reference ran: screened = the entity's names and identifiers were screened against every loaded watchlist; not_ready = the sanctions mirror has never synced, so no screening ran and the empty sanctionsHits says nothing about this entity. Read sanctionsHits only when this is 'screened'.
headquartersAddressNoSingle-line headquarters address, when published.
registrationAuthorityIdNoRegistration authority (RA) code, when published.
registrationAuthorityEntityIdNoThe entity's ID at its registration authority, when published.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed19 schema fields changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `lei_not_found`: No GLEIF entity exists for the given LEI in the mirror. `mirror_not_ready`: The GLEIF (LEI) mirror has never completed an initial sync. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `lei_not_found`: No GLEIF entity in the mirror carries the LEI, and its check digits are valid. `invalid_lei_checksum`: No GLEIF entity in the mirror carries the LEI, and its ISO 17442 check digits fail. `mirror_not_ready`: The GLEIF (LEI) mirror has never completed an initial sync. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "lei_not_found",
      -  "mirror_not_ready"
      -]New value: +[
      +  "lei_not_found",
      +  "invalid_lei_checksum",
      +  "mirror_not_ready"
      +]
    • changedOutput schema / properties / sanctionsHits / description
      Previous value: -"Sanctions screening cross-reference on the entity's legal name."New value: +"Sanctions screening cross-reference of the entity, one hit per designation (an OFAC party both OFAC lists publish once): exact name and identifier matches first, then strong name matches."
    • changedOutput schema / properties / sanctionsHits / items / description
      Previous value: -"A potential watchlist match on the entity's legal name — verify, do not assume."New value: +"A potential watchlist match on one or more of the entity's names or identifiers — verify, do not assume."
    • changedOutput schema / properties / sanctionsHits / items / properties / matchType / description
      Previous value: -"exact / strong / approximate match classification."New value: +"Match classification of matchedName: exact or strong, never approximate (the cross-reference screens strict, never fuzzy). Absent when only an identifier produced the hit."
    • addedOutput schema / properties / sanctionsHits / items / properties / matchedIdentifiers
      Added value: +{
      +  "description": "Every identifier the designation publishes that equals the entity's LEI or its country-matched registration number, as published. Present only when an identifier produced the hit.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "An identifier the designation publishes that equals the entity's LEI, or its registration number published for the country of its legal jurisdiction.",
      +    "properties": {
      +      "country": {
      +        "description": "Issuing country as published, when published.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "Identifier label as the list publishes it (e.g. Legal Entity Number, Registration Number).",
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "The identifier value, as published.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / sanctionsHits / items / properties / matchedName / description
      Previous value: -"The name/alias that matched the entity's legal name."New value: +"The designation's name or alias that matched one of the entity's screened names — the strongest match. Absent when only an identifier produced the hit."
    • addedOutput schema / properties / sanctionsHits / items / properties / matchedOn
      Added value: +{
      +  "description": "Every input of the entity that produced this hit — its legal name, an other or transliterated name, its LEI, or its registration number — in screening order.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "One value of the entity the cross-reference screened.",
      +    "properties": {
      +      "input": {
      +        "description": "Which value: legal_name, or other_name (an other or transliterated name), each screened as a name, strict; lei, or registration_number (the ID at the registration authority), each looked up as a non-document identifier.",
      +        "enum": [
      +          "legal_name",
      +          "other_name",
      +          "lei",
      +          "registration_number"
      +        ],
      +        "type": "string"
      +      },
      +      "nameType": {
      +        "description": "GLEIF's type for an other_name (e.g. TRADING_OR_OPERATING_NAME, AUTO_ASCII_TRANSLITERATED_LEGAL_NAME), or UNKNOWN for a name the mirror stored without one. Present on other_name only.",
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "The value as GLEIF publishes it.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "input",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / sanctionsHits / items / properties / score / description
      Previous value: -"Raw Jaro-Winkler similarity (0–1) for approximate hits only."New value: +"Never set by this cross-reference: only an approximate (fuzzy) match carries a raw Jaro-Winkler score, and the cross-reference screens strict."
    • changedOutput schema / properties / sanctionsHits / items / properties / source / description
      Previous value: -"Watchlist the candidate is on."New value: +"Watchlist whose record this hit is attributed to: primaryName comes from it. For an OFAC party both OFAC lists publish, ofac_sdn unless the Consolidated record matched alone or better, and matchedName, matchedIdentifiers, and matchedOn cover what either record matched; sources names every list."
    • addedOutput schema / properties / sanctionsHits / items / properties / sources
      Added value: +{
      +  "description": "Every screened list this candidate is on, in list order: one list, or ofac_sdn and ofac_consolidated together for an OFAC party both OFAC lists publish under one entry ID — one hit, not two. Read this, not source, for every list; the entry ID resolves in sanctions_get_designation under each.",
      +  "items": {
      +    "enum": [
      +      "ofac_sdn",
      +      "ofac_consolidated",
      +      "eu",
      +      "uk",
      +      "un"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / sanctionsHits / items / required
      Previous value: -[
      -  "source",
      -  "sourceLabel",
      -  "sourceEntryId",
      -  "primaryName",
      -  "matchedName",
      -  "matchType"
      -]New value: +[
      +  "source",
      +  "sourceLabel",
      +  "sourceEntryId",
      +  "sources",
      +  "primaryName",
      +  "matchedOn"
      +]
    • changedOutput schema / properties / sanctionsScreen / description
      Previous value: -"Disclosure for the cross-reference screen: how many potential matches existed before the cap, and whether sanctionsHits is the complete set. Present only when screeningStatus is 'screened'."New value: +"Disclosure for the cross-reference: how many potential matches existed before the cap, whether sanctionsHits is the complete set, and what was screened. Present only when screeningStatus is 'screened'."
    • changedOutput schema / properties / sanctionsScreen / properties / hasMore / description
      Previous value: -"True when the potential matches were capped — screen the legal name with sanctions_screen_name to page through the rest."New value: +"True when the potential matches were capped — re-screen the entity's names with sanctions_screen_name and look up its LEI and registration number with sanctions_screen_identifier to see the rest."
    • addedOutput schema / properties / sanctionsScreen / properties / screenedInputs
      Added value: +{
      +  "description": "What the cross-reference screened beyond the legal name and the LEI, which it always screens: every other and transliterated name, then the registration number when the entity publishes one (a not-available placeholder such as N/A is none) and a legal jurisdiction to match it by. Empty when there is nothing beyond those two.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "One value of the entity the cross-reference screened.",
      +    "properties": {
      +      "input": {
      +        "description": "Which value: legal_name, or other_name (an other or transliterated name), each screened as a name, strict; lei, or registration_number (the ID at the registration authority), each looked up as a non-document identifier.",
      +        "enum": [
      +          "legal_name",
      +          "other_name",
      +          "lei",
      +          "registration_number"
      +        ],
      +        "type": "string"
      +      },
      +      "nameType": {
      +        "description": "GLEIF's type for an other_name (e.g. TRADING_OR_OPERATING_NAME, AUTO_ASCII_TRANSLITERATED_LEGAL_NAME), or UNKNOWN for a name the mirror stored without one. Present on other_name only.",
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "The value as GLEIF publishes it.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "input",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / sanctionsScreen / properties / totalAvailable / description
      Previous value: -"Potential matches the cross-reference screen found before the cap was applied."New value: +"Distinct designations the cross-reference found across every screened name and identifier, an OFAC party both OFAC lists publish counted once, before the cap was applied."
    • changedOutput schema / properties / sanctionsScreen / properties / totalAvailableBasis / description
      Previous value: -"How to read totalAvailable: exact = the complete strict match set for this legal name; lower_bound = a bounded scan produced it, so more may exist."New value: +"How to read totalAvailable. Always exact here: every name is screened strict, never fuzzy, and a strict screen counts every designation it reaches, so totalAvailable is the whole set across the screened names and identifiers."
    • changedOutput schema / properties / sanctionsScreen / required
      Previous value: -[
      -  "totalAvailable",
      -  "totalAvailableBasis",
      -  "hasMore"
      -]New value: +[
      +  "totalAvailable",
      +  "totalAvailableBasis",
      +  "hasMore",
      +  "screenedInputs"
      +]
    • changedOutput schema / properties / screeningStatus / description
      Previous value: -"Whether the cross-reference ran: screened = the legal name was screened against every loaded watchlist; not_ready = the sanctions mirror has never synced, so no screening ran and the empty sanctionsHits says nothing about this entity. Read sanctionsHits only when this is 'screened'."New value: +"Whether the cross-reference ran: screened = the entity's names and identifiers were screened against every loaded watchlist; not_ready = the sanctions mirror has never synced, so no screening ran and the empty sanctionsHits says nothing about this entity. Read sanctionsHits only when this is 'screened'."
  2. Changed3 schema fields changed
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "required": [
      -        "error"
      -      ]
      -    },
      -    "required": [
      -      "lei",
      -      "legalName",
      -      "otherNames",
      -      "sanctionsHits",
      -      "screeningStatus",
      -      "caveat"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "lei",
      +      "legalName",
      +      "otherNames",
      +      "alternateNames",
      +      "sanctionsHits",
      +      "screeningStatus",
      +      "caveat"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / alternateNames
      Added value: +{
      +  "description": "Every other and transliterated name with its type, in the order published — the typed view of otherNames plus the ASCII transliterations of a legal name in another script.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "One name GLEIF publishes beside the legal name.",
      +    "properties": {
      +      "name": {
      +        "description": "The name as published.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "GLEIF name type: PREVIOUS_LEGAL_NAME (a former legal name, not the current one), TRADING_OR_OPERATING_NAME, ALTERNATIVE_LANGUAGE_LEGAL_NAME, PREFERRED_ASCII_TRANSLITERATED_LEGAL_NAME, AUTO_ASCII_TRANSLITERATED_LEGAL_NAME, or UNKNOWN for a name the mirror stored without GLEIF's type.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / otherNames / description
      Previous value: -"Other / trading names published in the LEI record."New value: +"Other names published in the LEI record (trading, previous, and alternative-language legal names), as plain strings."
  3. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "lei",
      +      "legalName",
      +      "otherNames",
      +      "sanctionsHits",
      +      "screeningStatus",
      +      "caveat"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `lei_not_found`: No GLEIF entity exists for the given LEI in the mirror. `mirror_not_ready`: The GLEIF (LEI) mirror has never completed an initial sync. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "lei_not_found",
      +            "mirror_not_ready"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "lei",
      -  "legalName",
      -  "otherNames",
      -  "sanctionsHits",
      -  "screeningStatus",
      -  "caveat"
      -]
  4. Changed3 schema fields changed
    • addedOutput schema / properties / sanctionsScreen
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Disclosure for the cross-reference screen: how many potential matches existed before the cap, and whether sanctionsHits is the complete set. Present only when screeningStatus is 'screened'.",
      +  "properties": {
      +    "hasMore": {
      +      "description": "True when the potential matches were capped — screen the legal name with sanctions_screen_name to page through the rest.",
      +      "type": "boolean"
      +    },
      +    "totalAvailable": {
      +      "description": "Potential matches the cross-reference screen found before the cap was applied.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "totalAvailableBasis": {
      +      "description": "How to read totalAvailable: exact = the complete strict match set for this legal name; lower_bound = a bounded scan produced it, so more may exist.",
      +      "enum": [
      +        "exact",
      +        "lower_bound"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "totalAvailable",
      +    "totalAvailableBasis",
      +    "hasMore"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / screeningStatus
      Added value: +{
      +  "description": "Whether the cross-reference ran: screened = the legal name was screened against every loaded watchlist; not_ready = the sanctions mirror has never synced, so no screening ran and the empty sanctionsHits says nothing about this entity. Read sanctionsHits only when this is 'screened'.",
      +  "enum": [
      +    "screened",
      +    "not_ready"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "lei",
      -  "legalName",
      -  "otherNames",
      -  "sanctionsHits",
      -  "caveat"
      -]New value: +[
      +  "lei",
      +  "legalName",
      +  "otherNames",
      +  "sanctionsHits",
      +  "screeningStatus",
      +  "caveat"
      +]
  5. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already establish read-only, idempotent, non-open-world behavior, but the description adds substantial operational context: hits merge per designation, matchedOn/matchedIdentifiers semantics, the screening-AID caveat that a hit is a candidate and no hit is not clearance, and the critical screeningStatus vs sanctionsScreen distinction (not_ready vs capped). This is exactly the behavioral context annotations cannot convey.

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

Conciseness4/5

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

The description is long but front-loads the primary purpose and then layers the screening semantics, with each clause (screeningStatus, sanctionsScreen, matchedOn) earning its place for a tool with complex return semantics. It could be broken into shorter paragraphs for readability, but there is little redundancy.

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-value explanation is unnecessary, and the description fills the remaining gaps: identifier-matching rules, hit-merging behavior, screening caveats, and the status flags that tell an agent whether the cross-reference ran and whether it was capped. Nothing an agent needs to call and interpret this tool correctly is missing.

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

Parameters3/5

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

With one parameter and 100% schema coverage, the schema already documents the LEI field. The description repeats the 20-character GLEIF format (18 alphanumerics + 2 check digits) that the schema pattern already enforces, adding no meaning beyond the structured field, 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 (Fetch) and resource (full GLEIF Level 1 record for one LEI) and enumerates the returned fields. It explicitly distinguishes its cross-reference from the sibling sanctions_screen_name by noting the match is strict and never fuzzy, so an agent can route between the two without opening schemas.

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

Usage Guidelines4/5

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

The description contrasts its screening behavior against sanctions_screen_name and explains that it accepts the LEI plus registration number as exact identifiers, giving clear context for when this lookup differs from the screening siblings. It stops short of stating exclusions against the other siblings (resolve_entity, screen_identifier, get_designation), so no explicit when-not guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.