Skip to main content
Glama

sanctions-screening-mcp-server

sanctions-screening-mcp-server: resolve entity

sanctions_resolve_entity
Read-onlyIdempotent

Resolve a company or organization name (with an optional jurisdiction: a country code, which includes its subdivisions, or an ISO 3166-2 subdivision code) to candidate GLEIF Legal Entity Identifiers (LEIs), ranked. This turns a free-text counterparty name into a stable global identifier that sanctions_get_entity and sanctions_trace_ownership key off. Every name GLEIF publishes takes part: the legal name, previous legal names, trading names, alternative-language legal names, and ASCII transliterations of a legal name in another script — each candidate reports the name it matched on and that name's type, one candidate per LEI. Strict mode (default) matches exact-normalized then all-tokens-present; fuzzy mode (or auto when strict is empty) adds Jaro-Winkler scoring labeled approximate with a raw 0–1 score plus the count of query tokens the matched name covers, which orders candidates that tie on score. Results are paged: totalAvailable and hasMore report candidates beyond the returned page, and nextOffset retrieves them. Returns potential matches to confirm against the GLEIF record — name resolution is a candidate ranking, not an authoritative identification.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameYesThe company / organization name to resolve to an LEI, in any script. It must contain at least one letter or digit, and at most 64 words and 1024 characters.
limitNoMaximum LEI candidates to return in one page.
offsetNoZero-based index of the first LEI candidate to return. Re-call with the returned nextOffset to page through every candidate when hasMore is true; an offset past the end returns an empty page, not an error.
statusNoRegistration status filter. issued (default) matches ISSUED; lapsed matches exactly LAPSED; any applies no filter and is the only value that reaches the other states (RETIRED, DUPLICATE, ANNULLED, PENDING_TRANSFER, PENDING_ARCHIVAL, MERGED) — each candidate's status field names its state.issued
minScoreNoJaro-Winkler floor for fuzzy hits (0–1); defaults to the server's configured floor.
matchModeNostrict (default): exact then all-tokens-present. fuzzy: also scored Jaro-Winkler.strict
jurisdictionNoOptional legal-jurisdiction filter. A country code ("US") matches that country and every subdivision under it (US-DE, US-CA); a subdivision code ("US-DE") matches exactly. Case-insensitive. Empty string disables it.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no LEI matched and how to broaden, when the requested offset sits past the end of the result set, when a bound cut the candidate set and how to narrow the name, or when the mirror has not indexed GLEIF's other and transliterated names yet, so only legal names were searched.
hasMoreNoTrue when the result set holds candidates beyond this page — re-call with nextOffset. It describes pages only: false on the last page, whatever totalAvailableBasis says.
matchesNoLEI candidates, ranked by match type, then score, then how much of the query each matched name explains.
nextOffsetNoThe offset to request next. Present only when hasMore is true.
totalCountNoNumber of LEI candidates returned in this page.
matchModeUsedNoThe match mode actually applied (strict may upgrade to fuzzy).
totalAvailableNoLEI candidates in the result set across all pages, before limit and offset were applied — every one is reachable by paging.
normalizedQueryNoThe name as the server folded it for matching.
totalAvailableBasisNoHow to read totalAvailable: exact = the complete strict candidate set; lower_bound = a fuzzy pass ran, which scores only the candidates blocking pooled, or the strict scan stopped at its 2,000-name bound, so more candidates may exist beyond the result set.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedOutput schema / properties / hasMore / description
      Previous value: -"True when LEI candidates remain beyond this page — re-call with nextOffset."New value: +"True when the result set holds candidates beyond this page — re-call with nextOffset. It describes pages only: false on the last page, whatever totalAvailableBasis says."
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance when no LEI matched and how to broaden, when the requested offset sits past the end of the result set, or when the mirror has not indexed GLEIF's other and transliterated names yet, so only legal names were searched."New value: +"Guidance when no LEI matched and how to broaden, when the requested offset sits past the end of the result set, when a bound cut the candidate set and how to narrow the name, or when the mirror has not indexed GLEIF's other and transliterated names yet, so only legal names were searched."
    • changedOutput schema / properties / totalAvailable / description
      Previous value: -"LEI candidates available across all pages, before limit and offset were applied."New value: +"LEI candidates in the result set across all pages, before limit and offset were applied — every one is reachable by paging."
    • changedOutput schema / properties / totalAvailableBasis / description
      Previous value: -"How to read totalAvailable: exact = the complete strict candidate set; lower_bound = a bounded scan produced it (every fuzzy pass, and any strict pass that hit the raw-row scan cap), so more may exist."New value: +"How to read totalAvailable: exact = the complete strict candidate set; lower_bound = a fuzzy pass ran, which scores only the candidates blocking pooled, or the strict scan stopped at its 2,000-name bound, so more candidates may exist beyond the result set."
  2. Changed7 schema fields changed
    • changedInput schema / properties / jurisdiction / anyOf
      Previous value: -[
      -  {
      -    "const": "",
      -    "type": "string"
      -  },
      -  {
      -    "description": "ISO 3166-1 alpha-2 jurisdiction code (e.g. US, GB).",
      -    "pattern": "^[A-Za-z]{2}$",
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "ISO 3166-1 alpha-2 country code (e.g. US) or ISO 3166-2 subdivision code (e.g. US-DE), case-insensitive.",
      +    "pattern": "^[A-Za-z]{2}(-[A-Za-z0-9]{1,3})?$",
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / jurisdiction / description
      Previous value: -"Optional ISO 3166-1 alpha-2 jurisdiction filter (e.g. \"US\", \"GB\"). Empty string disables it."New value: +"Optional legal-jurisdiction filter. A country code (\"US\") matches that country and every subdivision under it (US-DE, US-CA); a subdivision code (\"US-DE\") matches exactly. Case-insensitive. Empty string disables it."
    • changedInput schema / properties / status / description
      Previous value: -"Registration status filter: issued (default), lapsed, or any."New value: +"Registration status filter. issued (default) matches ISSUED; lapsed matches exactly LAPSED; any applies no filter and is the only value that reaches the other states (RETIRED, DUPLICATE, ANNULLED, PENDING_TRANSFER, PENDING_ARCHIVAL, MERGED) — each candidate's status field names its state."
    • changedOutput schema / properties / matches / items / properties / matchedName / description
      Previous value: -"The name (legal or other/trading) that matched the query."New value: +"The name that matched the query — the legal name or one of the other or transliterated names GLEIF publishes for the entity."
    • addedOutput schema / properties / matches / items / properties / matchedNameType
      Added value: +{
      +  "description": "Type of matchedName: LEGAL_NAME, 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"
      +}
    • changedOutput schema / properties / matches / items / required
      Previous value: -[
      -  "lei",
      -  "legalName",
      -  "matchedName",
      -  "matchType"
      -]New value: +[
      +  "lei",
      +  "legalName",
      +  "matchedName",
      +  "matchedNameType",
      +  "matchType"
      +]
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance when no LEI matched and how to broaden, or when the requested offset sits past the end of the result set."New value: +"Guidance when no LEI matched and how to broaden, when the requested offset sits past the end of the result set, or when the mirror has not indexed GLEIF's other and transliterated names yet, so only legal names were searched."
  3. Changed3 schema fields changed
    • changedInput schema / properties / name / description
      Previous value: -"The company / organization name to resolve to an LEI."New value: +"The company / organization name to resolve to an LEI, in any script. It must contain at least one letter or digit, and at most 64 words and 1024 characters."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `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: `name_not_searchable`: The name contains no letter or digit, so nothing in it can be matched. `name_too_long`: The name is longer than 64 words or 1024 characters. `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: -[
      -  "mirror_not_ready"
      -]New value: +[
      +  "name_not_searchable",
      +  "name_too_long",
      +  "mirror_not_ready"
      +]
  4. 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": [
      +      "matches",
      +      "normalizedQuery",
      +      "matchModeUsed",
      +      "totalCount",
      +      "totalAvailable",
      +      "totalAvailableBasis",
      +      "hasMore"
      +    ]
      +  },
      +  {
      +    "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: `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": [
      +            "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: -[
      -  "matches",
      -  "normalizedQuery",
      -  "matchModeUsed",
      -  "totalCount",
      -  "totalAvailable",
      -  "totalAvailableBasis",
      -  "hasMore"
      -]
  5. Changed11 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum LEI candidates to return."New value: +"Maximum LEI candidates to return in one page."
    • addedInput schema / properties / offset
      Added value: +{
      +  "default": 0,
      +  "description": "Zero-based index of the first LEI candidate to return. Re-call with the returned nextOffset to page through every candidate when hasMore is true; an offset past the end returns an empty page, not an error.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / hasMore
      Added value: +{
      +  "description": "True when LEI candidates remain beyond this page — re-call with nextOffset.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / matches / description
      Previous value: -"Ranked LEI candidates, highest-confidence first."New value: +"LEI candidates, ranked by match type, then score, then how much of the query each matched name explains."
    • addedOutput schema / properties / matches / items / properties / queryTokenCoverage
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "How much of the query the matched name explains, as a literal token count — a second real measurement, never folded into score. It is the tie-break applied after score, because one shared exact token pins several candidates at the same score. Absent for exact/strong matches.",
      +  "properties": {
      +    "covered": {
      +      "description": "Query tokens individually matched by one of the matched name's tokens at the applied score floor.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "total": {
      +      "description": "Total tokens in the normalized query.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "covered",
      +    "total"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / nextOffset
      Added value: +{
      +  "description": "The offset to request next. Present only when hasMore is true.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance when no LEI matched and how to broaden."New value: +"Guidance when no LEI matched and how to broaden, or when the requested offset sits past the end of the result set."
    • addedOutput schema / properties / totalAvailable
      Added value: +{
      +  "description": "LEI candidates available across all pages, before limit and offset were applied.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / totalAvailableBasis
      Added value: +{
      +  "description": "How to read totalAvailable: exact = the complete strict candidate set; lower_bound = a bounded scan produced it (every fuzzy pass, and any strict pass that hit the raw-row scan cap), so more may exist.",
      +  "enum": [
      +    "exact",
      +    "lower_bound"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / totalCount / description
      Previous value: -"Number of LEI candidates returned."New value: +"Number of LEI candidates returned in this page."
    • changedOutput schema / required
      Previous value: -[
      -  "matches",
      -  "normalizedQuery",
      -  "matchModeUsed",
      -  "totalCount"
      -]New value: +[
      +  "matches",
      +  "normalizedQuery",
      +  "matchModeUsed",
      +  "totalCount",
      +  "totalAvailable",
      +  "totalAvailableBasis",
      +  "hasMore"
      +]
  6. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, openWorld=false, and the description adds rich behavior: covered name types, strict vs fuzzy matching mechanics, Jaro-Winkler scoring with token-coverage tie-breaking, paging via totalAvailable/hasMore/nextOffset, and a candid caveat that results are candidates not authoritative identifications.

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-loads the core action, then layers matching details and paging in dense but organized sentences. It is longer than strictly necessary given the comprehensive schema, but every sentence carries substantive information about matching, ranking, and paging.

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

Completeness5/5

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

For a 7-parameter resolver with an output schema, the description covers matching modes, candidate ranking semantics, paging behavior, and the downstream purpose, leaving no critical gaps for correct invocation. The output schema handles return shape, and the description correctly focuses on behavior and intent.

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 schema itself documents all parameters thoroughly. The description reinforces key semantics: jurisdiction accepts country code including subdivisions or ISO 3166-2 subdivision code, and matchMode behavior. It adds nuance beyond the schema for matching modes, though most detail lives in the schema.

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

Purpose5/5

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

States a specific verb+resource: resolve a company/org name to candidate GLEIF LEIs, ranked. It also distinguishes itself from siblings by naming sanctions_get_entity and sanctions_trace_ownership as downstream consumers of the LEI, and clarifies that name resolution is candidate ranking, not authoritative identification.

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?

Clearly positions this as the entry point that turns free-text names into LEIs used by other tools, distinguishing from name-screening siblings. It does not explicitly state when to use matchMode strict vs fuzzy beyond default behavior, but the mode semantics are well described.

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.