Skip to main content
Glama

sanctions-screening-mcp-server

Server Details

Screen names against OFAC, EU, UK, UN sanctions lists; resolve entities via GLEIF. Screening aid.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 48 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/sanctions-screening-mcp-server
GitHub Stars
1
Server Listing
@cyanheads/sanctions-screening-mcp-server

TDQS

A4.4/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: screening by name vs. identifier, resolving a name to an LEI vs. fetching a full GLEIF entity record, drilling into a sanctions designation vs. tracing ownership. The embedded screening cross-references in sanctions_get_entity and sanctions_trace_ownership are explicitly scoped and distinguished from the standalone screening tools.

Naming Consistency5/5

All seven tools use the same sanctions_ prefix and a consistent snake_case verb_noun pattern (e.g., sanctions_get_designation, sanctions_screen_name, sanctions_trace_ownership). There are no mixed conventions or vague verbs.

Tool Count5/5

Seven tools are well-scoped for a read-only sanctions-screening and GLEIF entity-resolution server. Each tool covers a distinct step in the workflow without redundancy or bloat.

Completeness4/5

The surface covers the core screening lifecycle: source provenance, name and identifier screening, drill-in to full designation records, LEI resolution, entity lookup, and ownership tracing with optional screening. Minor gaps exist, such as no dedicated multi-attribute or batch screening tool, but agents can work around these using the available tools.

Available Tools

7 tools
sanctions_get_designationsanctions-screening-mcp-server: get designationA
Read-onlyIdempotent
Inspect

Fetch the full record for one sanctions designation by source list + entry ID or the list's published reference number — the drill-in after sanctions_screen_name or sanctions_screen_identifier surfaces a candidate, or the lookup for a reference a notice cites (UN QDe.004, EU EU.27.28, UK OFSI Group ID). Returns all published aliases, identifiers (passport, national ID, tax and registration numbers, SWIFT/BIC codes, digital-currency addresses, vessel call signs, aircraft tail and serial numbers, phone numbers, email addresses, websites), addresses, dates and places of birth at the precision the source published, nationalities, descriptive features (a vessel's flag, type, and tonnage; an aircraft's model and operator; a title or gender; sanctions notes), sanctioning program, legal basis, and designation date. The record reflects exactly what the source published; missing fields mean the source omitted them. This is a screening aid — the designation record supports a compliance review, it is not itself a determination.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesWhich source list the entry belongs to.
entryIdYesThe source list's own entry ID (the sourceEntryId from sanctions_screen_name), or the reference number the list publishes for the entry (UN QDe.004, EU EU.27.28, UK OFSI Group ID 14196). Matched trimmed and case-insensitive, entry ID first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
caveatNoDecision-support caveat — this is a screening aid, not a compliance determination.
sourceNoSource list the entry belongs to.
aliasesNoAll published aliases / name variants.
programNoSanctioning program / regime, when published.
remarksNoFree-form remarks published by the source, when present.
featuresNoValues the source publishes to describe the party rather than identify it, in published order: OFAC's vessel flag, type, and tonnage, aircraft model and operator, title, gender, and sanctions notes; the UK list's ship details. Empty when the source publishes none. Screening never matches on them.
addressesNoPublished addresses.
entityTypeNoEntity classification as published.
legalBasisNoStatutory / regulatory basis as the list publishes it — OFAC's legal-basis references, the EU regulation title, the UK regime's regulations — several joined with '; '. Absent when unpublished; the UN list publishes none.
identifiersNoPublished identifiers: identity documents (passport, national ID, tax, registration) and, where the source publishes them, SWIFT/BIC codes, digital-currency addresses, vessel call signs, aircraft tail and serial numbers, phone numbers, email addresses, and websites.
primaryNameNoPrimary published name.
sourceLabelNoHuman-readable name of the source list.
datesOfBirthNoPublished dates and places of birth (persons).
nationalitiesNoPublished nationalities / citizenships.
sourceEntryIdNoThe source list's own entry ID.
designationDateNoThe source's own designation date as YYYY-MM-DD; absent when unpublished. An OFAC party is dated from its entries on the lists that file publishes, so its ofac_sdn and ofac_consolidated records can differ.
referenceNumberNoThe list's published reference number (UN, EU, UK OFSI Group ID); absent when the list publishes none for the entry. OFAC publishes none — its entry ID is its published number.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, and closed-world, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: the record mirrors exactly what the source published, missing fields mean the source omitted them, and it is a screening aid rather than a determination.

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

Conciseness3/5

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

The opening clause is well front-loaded and the closing disclaimer earns its place, but the middle sentence is an exhaustive enumeration of alias, identifier, address, and feature types that largely duplicates the output schema. That internal list inflates the description without adding selection or invocation value.

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

Completeness4/5

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

For a 2-parameter read tool with full schema coverage, an output schema, and annotations, the description is close to complete: it covers workflow placement, keying, data-fidelity semantics, and scope limits. The one meaningful hole is differentiating this tool from sanctions_get_entity.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already fully documented, including the 'entry ID first, trimmed and case-insensitive' matching rule. The description only restates that a source list plus entry ID or published reference number is accepted, adding no syntax or format detail beyond the schema.

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

Purpose4/5

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

States a specific verb (Fetch) and a precise resource (the full record for one sanctions designation), and names the exact keying inputs. It distinguishes itself from sanctions_screen_name/sanctions_screen_identifier as the follow-up drill-in, but never addresses how it differs from the sibling sanctions_get_entity, which is the most plausible confusion for an agent.

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?

Explicitly positions the tool in the workflow: it is 'the drill-in after sanctions_screen_name or sanctions_screen_identifier surfaces a candidate,' or the lookup for a reference a notice cites. That is clear when-to-use guidance with named predecessors, though it offers no exclusion criteria against the get_entity sibling.

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

sanctions_get_entitysanctions-screening-mcp-server: get entityA
Read-onlyIdempotent
Inspect

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).

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
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.

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.

sanctions_list_sourcessanctions-screening-mcp-server: list sourcesA
Read-onlyIdempotent
Inspect

List the sanctions watchlists (OFAC SDN + Consolidated, EU, UK, UN) and GLEIF datasets currently loaded in the local mirror, each with its record count, source URL, license, and the mirror's readiness and as-of timestamp — for GLEIF, also its Level 2 ownership relationship count, whether its reporting exceptions are loaded and how many, and whether its alternate-name index is built. Use this for provenance and freshness on any result — results are only as current as the last mirror refresh, and a not-ready mirror means screening cannot run yet. Attribution: UK data is under the Open Government Licence v3.0; all sources are cited here.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
leiAsOfNoISO 8601 timestamp of the last completed GLEIF sync, when available.
sourcesNoAll loaded sources, sanctions lists then the GLEIF dataset.
leiReadyNoTrue once the GLEIF (LEI) mirror has completed at least one full sync.
sanctionsAsOfNoISO 8601 timestamp of the last completed sanctions sync, when available.
sanctionsReadyNoTrue once the sanctions mirror has completed at least one full sync.
alternateNamesIndexedNoWhether the GLEIF alternate-name index — trading, previous, alternative-language, and transliterated names — is built. When false, sanctions_resolve_entity searches legal names only until mirror:init reloads the GLEIF golden copy. True on a GLEIF mirror that has never loaded (leiReady false): its empty index is complete, and the first load builds it with the entities.
reportingExceptionsLoadedNoWhether GLEIF reporting exceptions are loaded. When false, sanctions_trace_ownership reads a parent level with no published relationship as unknown.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/closed-world, so the bar is lower. The description still adds real value: mirror readiness state, as-of timestamp semantics, the staleness caveat ('results are only as current as the last mirror refresh'), and licensing/attribution constraints.

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

Conciseness4/5

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

Front-loaded with the core action and resource, then adds the caveat and attribution. The GLEIF field enumeration is dense and partially redundant given an output schema exists, but the sentences are purposeful rather than filler.

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

Completeness4/5

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

With an output schema present, return values need not be explained, and the description wisely spends its budget on semantics instead: readiness, freshness, and license provenance. An agent has everything needed to call and interpret it.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. Nothing is required from the description on this dimension, and it correctly omits any parameter discussion.

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

Purpose5/5

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

States a specific verb and resource: listing the sanctions watchlists and GLEIF datasets loaded in the local mirror, with the exact metadata returned per source. It is instantly distinguishable from siblings like sanctions_screen_name or sanctions_get_entity, which query entities rather than report source provenance.

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?

Explicitly routes the agent: 'Use this for provenance and freshness on any result', and adds a critical operational condition – a not-ready mirror means screening cannot run yet. No when-not or named sibling alternatives are given, but the use context is unambiguous.

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

sanctions_resolve_entitysanctions-screening-mcp-server: resolve entityA
Read-onlyIdempotent
Inspect

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.

ParametersJSON 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

ParametersJSON Schema
NameRequiredDescription
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.

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.

sanctions_screen_identifiersanctions-screening-mcp-server: screen identifierA
Read-onlyIdempotent
Inspect

Look up an identifier — a vessel IMO number, a SWIFT/BIC code, a digital-currency wallet address, a passport or national ID number, or any other identifier a list publishes — against all loaded sanctions watchlists at once: OFAC SDN + Consolidated, EU, UK, and UN. Exact match after normalization, with no fuzzy or partial matching and no score: spacing, letter case, and the separators - . / are ignored, an IMO number matches with or without its IMO prefix, a SWIFT/BIC code compares on its first eight characters so a branch code matches its institution, and a wallet address folds case only where its encoding is case-insensitive (hex, bech32, cashaddr — never base58). Returns every designation that publishes a matching identifier, one per designation — an OFAC party both OFAC lists publish under one entry ID is one hit, its sources naming both lists — with the identifiers that matched as published; sanctions_get_designation pulls the full record. This is a screening AID for a human/compliance review, NOT a compliance determination: a hit means "review this candidate against the official source," and an empty result never means "cleared" — an identifier a list prints only in free-text remarks, or bundled with other numbers in one field, does not match.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoRestrict to one identifier category, matched on the label each list publishes, or "any" (default) to search every published identifier, including categories with no name here (MMSI, call signs, tail numbers, tax and registration numbers, email, websites).any
valueYesThe identifier to look up, as you hold it (e.g. "IMO 7406784", "DCBKKPPY", a wallet address, a passport number). Must contain at least one character other than whitespace and - . /
sourcesNoRestrict to specific source lists. Omit to search all loaded lists.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hitsNoDesignations that publish a matching identifier, one per designation (an OFAC party on both OFAC lists once), ordered by source list then entry ID. Not paged — the most widely shared published identifiers map to about a dozen designations.
errorNoPresent when the call failed. Absent on success.
caveatNoDecision-support caveat — this is a screening aid, not a compliance determination.
noticeNoGuidance when no designation matched — what to try next, and what an empty result does NOT mean.
totalCountNoNumber of designations returned.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare read-only/idempotent/no-open-world; the description adds the substantive behavior: exact match after normalization, no fuzzy or partial matching, the precise folding rules for case, separators, IMO prefixes, SWIFT/BIC eight-character truncation, and per-encoding wallet case folding. It also discloses the return shape (one hit per designation) and the negative-space caveat that identifiers printed only in free-text remarks do not match.

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

Conciseness4/5

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

Front-loaded with the core action and scope, and the normalization/return/caveat sentences each carry non-obvious information an agent cannot get from the schema. The first sentence, however, is a long run-on of em-dash clauses that is denser than it needs to be, costing a little readability.

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 screening tool with an output schema, an agent needs matching semantics, result interpretation, and the follow-up tool — all of which are present. The normalization rules, the one-hit-per-designation return contract, and the 'empty is not cleared' caveat close the correctness gaps that would otherwise cause misuse.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema by spelling out what 'value' normalization means in practice (prefixes and separators ignored, so an agent knows it can pass a raw identifier as held) and by clarifying that 'any' also searches categories not enumerated in the type enum. The individual parameter docs largely restate the schema, keeping this just under a 5.

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

Purpose5/5

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

States a specific verb ("Look up") and resource (an identifier against all loaded sanctions watchlists), enumerating the identifier categories it accepts and the five source lists it covers. It also names the sibling sanctions_get_designation as the path to the full record, so an agent can tell it apart from relatives without opening a schema.

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

Usage Guidelines4/5

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

Gives clear context: use it to screen a held identifier, and follow a hit with sanctions_get_designation for the full record. It also frames the tool as a screening aid rather than a determination and warns that an empty result is not a clearance. It stops short of explicitly contrasting itself with the sibling sanctions_screen_name (name vs identifier screening), so a genuine exclusion is left to inference.

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

sanctions_screen_namesanctions-screening-mcp-server: screen nameA
Read-onlyIdempotent
Inspect

Screen a name (person, company, vessel, aircraft) against all loaded sanctions watchlists at once — OFAC SDN + Consolidated, EU, UK, and UN — alias- and fuzzy-aware. Returns scored potential matches with the source list, sanctioning program, designation date, and the matched alias; an OFAC party both OFAC lists publish under one entry ID is one hit, its sources naming both lists. Strict mode (default) matches exact-normalized then all-tokens-present, then runs a fuzzy pass over each selected list strict finds nothing on: a full pass when strict finds nothing on any list, otherwise one that adds only candidates covering every word of the name other than legal forms, articles and other function words, and the jurisdiction codes uk, usa, uae, and rf, ranked after the strict hits. Fuzzy mode runs the fuzzy pass over every selected list. It adds Jaro-Winkler and phonetic matching and labels hits approximate with a raw 0–1 similarity score plus the count of query tokens the candidate covers, which orders candidates that tie on score; fuzzySources names the lists it searched. Results are paged: totalAvailable and hasMore report matches beyond the returned page, and nextOffset retrieves them. This is a screening AID for a human/compliance review, NOT a compliance determination: a hit means "review this candidate against the official source," and an empty result never means "cleared."

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe name to screen (person, organization, vessel, or aircraft), in any script. It must contain at least one letter or digit, and at most 64 words and 1024 characters.
limitNoMaximum number of potential matches to return in one page.
offsetNoZero-based index of the first potential match to return. Re-call with the returned nextOffset to page through every match when hasMore is true; an offset past the end returns an empty page, not an error.
sourcesNoRestrict to specific source lists. Omit to screen all loaded lists.
minScoreNoScore floor for approximate hits (0–1), applied uniformly to every fuzzy candidate regardless of how it was matched (Jaro-Winkler, token, or phonetic); a query token counts toward queryTokenCoverage only when its match clears it too. It governs every fuzzy pass: fuzzy mode, and in strict mode the pass over the lists strict found nothing on, so raising it can remove approximate hits from a strict screen as well. Exact and strong hits are unaffected. Defaults to the server's configured floor.
matchModeNostrict (default): exact-normalized then all-tokens-present, then a fuzzy pass over each selected list strict finds nothing on — a full pass when strict finds nothing on any list, otherwise adding only candidates that cover every word of the name other than legal forms, articles and other function words, and the jurisdiction codes uk, usa, uae, and rf. fuzzy: a scored Jaro-Winkler + phonetic pass over every selected list.strict
entityTypeNoRestrict to one entity class, or "any" (default) to screen across all.any

Output Schema

ParametersJSON Schema
NameRequiredDescription
hitsNoPotential matches, ranked by match type, then score, then how much of the query each candidate explains. Candidates tied on all three are ordered by source list, then entry ID — not by relevance.
errorNoPresent when the call failed. Absent on success.
caveatNoDecision-support caveat — this is a screening aid, not a compliance determination.
noticeNoGuidance when no candidate matched — how to broaden, and what an empty result does NOT mean — when the requested offset sits past the end of the result set, or when the fuzzy pass reached its candidate bound and a more distinctive word would narrow it.
hasMoreNoTrue when the result set holds matches beyond this page — re-call with nextOffset. It describes pages only: false on the last page, whatever totalAvailableBasis says.
nextOffsetNoThe offset to request next. Present only when hasMore is true.
totalCountNoNumber of potential matches returned in this page.
fuzzySourcesNoThe selected lists the fuzzy pass searched, in list order; absent when no fuzzy pass ran. Beside strict hits these are the lists strict found nothing on, and only their candidates covering every word of the name other than legal forms, articles and other function words, and the jurisdiction codes uk, usa, uae, and rf were added.
matchModeUsedNofuzzy when every selected list was fuzzy-searched (fuzzy mode, or a strict screen that found nothing on any list); strict otherwise, including a strict screen whose strict-empty lists were completed by a fuzzy pass.
totalAvailableNoPotential matches in the result set across all pages, before limit and offset were applied — every one is reachable by paging. An OFAC party both OFAC lists publish counts once.
normalizedQueryNoThe name as the server folded it for matching.
totalAvailableBasisNoHow to read totalAvailable: exact = the complete strict match set, strict having found a match on every selected list; lower_bound = a fuzzy pass ran (fuzzySources is present), which scores only the candidates blocking pooled, so more matches may exist beyond the result set.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already establish read-only, idempotent, closed-world behavior, and the description adds substantial context beyond them: deduplication of OFAC entries by entry ID, how minScore propagates into strict-mode fuzzy passes, the nextOffset/totalAvailable/hasMore paging contract, and the explicit caveat that a hit is not a determination and an empty result is not a clearance.

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

Conciseness3/5

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

The core purpose is front-loaded in the first clause, which is good, but the remainder is a single very dense block whose matching-semantics sentences are largely duplicated verbatim in the matchMode and minScore schema descriptions. It is information-rich but not economically written.

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 complex screening tool with an output schema and rich annotations, the description covers the full operational picture: scoring and tie-breaking, list coverage, mode behavior, pagination, and the compliance-review framing. Nothing an agent needs to call it correctly or interpret results is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains how minScore interacts with matchMode and queryTokenCoverage, how strict vs fuzzy changes what sources are searched, and how offset/nextOffset paging behaves past the end. The matchMode and minScore prose largely restates the schema wording, capping this at 4.

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

Purpose5/5

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

States a specific verb and resource ('Screen a name ... against all loaded sanctions watchlists at once'), enumerates the entity classes and the source lists covered, and its name-based framing distinguishes it from the identifier-based sibling sanctions_screen_identifier. An agent can select it without opening the schema.

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

Usage Guidelines4/5

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

Gives clear operational context: strict is the default, fuzzy is opt-in, and it explains the cascade behavior when strict finds nothing. It does not, however, explicitly route between this tool and the sibling sanctions_screen_identifier, so the choice of 'name vs identifier' is left to inference from the tool name.

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

sanctions_trace_ownershipsanctions-screening-mcp-server: trace ownershipA
Read-onlyIdempotent
Inspect

Trace the GLEIF Level 2 corporate-ownership graph for an LEI: direct and ultimate parents and/or children, traversed breadth-first to a bounded depth, with relationship type for each edge. Direction both walks up to the parents and down to the children from the root, never sideways into siblings or co-parents. An ultimate-parent edge is a shortcut to the top of the group, not a hop: a node only it reaches within the depth is returned as a leaf flagged reachedVia: ultimate. Set screenNodes to also cross-reference every entity in the graph against all loaded watchlists — resolving "is anyone in this ownership chain sanctioned." Each node is cross-referenced as sanctions_get_entity does it: its legal name and every other and transliterated name screened strict (exact, then all tokens present — never fuzzy), and its LEI and registration number looked up as exact non-document identifiers, the registration number matching only an identifier published for the country of its legal jurisdiction; hits merge to one per designation, an OFAC party both OFAC lists publish to one hit whose sources names both, matchedOn naming every input that produced each. A node with no Level 1 record (missingEntityLeis) has no names, so it is looked up by its LEI alone. Each per-node screen is a screening AID: hits are candidates to verify, and an empty result for a node is not a clearance of that node. Each node whose parents were walked carries parentStatus for its direct and ultimate parent: a published relationship, a reporting exception with the reasons the entity gave (such as NATURAL_PERSONS or NON_CONSOLIDATING), none, or unknown when reporting exceptions are not loaded. The response says what it could not do: complete/truncated/missingEntityLeis report whether the loaded relationship graph within the depth is fully shown, screeningStatus reports whether the cross-reference actually ran, and each screened node reports whether its own hit list was capped. Requires a valid 20-character LEI (use sanctions_resolve_entity to obtain one).

ParametersJSON Schema
NameRequiredDescriptionDefault
leiYesThe 20-character GLEIF LEI at the root of the ownership graph.
depthNoMaximum traversal depth from the root entity (1–5), on each side of a both walk. Ultimate-parent edges do not count as hops.
directionNoWalk parents (who owns it), children (what it owns), or both (default): a parents walk plus a children walk from the root, each to depth, never into siblings or co-parents.both
screenNodesNoWhen true, cross-reference every node against all watchlists — the ownership-chain cross-reference: the node's legal, other, and transliterated names screened strict, and its LEI and country-matched registration number looked up as identifiers. A node with no Level 1 record has no names: its LEI lookup alone.

Output Schema

ParametersJSON Schema
NameRequiredDescription
edgesNoDirected ownership edges between the nodes — every edge joins two nodes of this graph.
errorNoPresent when the call failed. Absent on success.
nodesNoAll entities reached in the traversal, including the root.
caveatNoDecision-support caveat — node screening is an aid, not a determination.
rootLeiNoThe LEI the traversal started from.
completeNoTrue when truncated is false (no loaded relationship on the walked side is left out) AND every node resolved to a GLEIF Level 1 record. It does not say every parent is known — most entities publish no parent relationship; read each node's parentStatus for what GLEIF publishes instead. False means the graph below is a partial view — read truncated and missingEntityLeis for which.
truncatedNoTrue when the loaded relationships hold ownership links on the walked side that this graph does not show: past the requested depth (re-run with a higher depth to see them), or the parents (or, on the children side, children) of a node flagged reachedVia: ultimate, which is never walked. An ultimate-parent edge counts only when it leads to an entity this graph does not return. False means neither: every chain the walk followed ends within the depth. Siblings and co-parents are never walked and never count.
screeningStatusNoWhether the per-node cross-reference ran: screened = every node was screened; not_requested = screenNodes was false; not_ready = screening was requested but the sanctions mirror has never synced, so NO node was screened and the absence of hits says nothing about any node.
flaggedNodeCountNoHow many screened nodes had at least one potential watchlist match.
missingEntityLeisNoLEIs published in the relationship corpus but absent from the GLEIF Level 1 entity mirror. Their nodes carry the LEI in place of a legal name and no jurisdiction/status — never read that LEI as a legal name. A per-node screen for them is the LEI looked up as an identifier, nothing else: with no record there is no legal name, other name, or registration number to screen, so their screenedInputs is empty and each hit is matchedOn their lei.
screenedNodeCountNoHow many nodes were screened (0 when screenNodes is false).
reportingExceptionsLoadedNoWhether GLEIF reporting exceptions are loaded in the mirror. When false, a node's parent level with no published relationship reads unknown rather than exception or none.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only declare readOnly/idempotent/closed-world; the description goes far beyond, disclosing that a walk never goes sideways into siblings or co-parents, that an ultimate-parent edge is a shortcut not a hop, that per-node screening is an AID where an empty result is not a clearance, the parentStatus enumerations, and the completeness flags (complete/truncated/missingEntityLeis, screeningStatus, per-node cap). This is unusually rich behavioral disclosure for a read-only tool.

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

Conciseness3/5

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

The purpose is correctly front-loaded in the first sentence, but the remainder is a single ~350-word paragraph packing traversal, screening, status, and error semantics together. For a genuinely complex tool length is defensible, yet the density and repetition of schema/output-schema content make it harder to parse than it needs to be.

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

Completeness5/5

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

Given a traversal-plus-screening tool, the description covers direction, depth semantics, screening behavior, status enums, and the failure/completeness signals an agent must interpret. An output schema exists, so its detailed return-field walkthrough is partly redundant, but nothing needed to call the 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?

Schema description coverage is 100%, and the schema already documents lei, depth (ultimate-parent edges do not count as hops), direction (never into siblings or co-parents), and screenNodes. The description largely restates these, adding little syntax or format beyond what the schema provides, so the baseline of 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?

The opening sentence names a specific verb and resource — tracing the GLEIF Level 2 corporate-ownership graph for an LEI — with scope (direct/ultimate parents and/or children, breadth-first, bounded depth). This is unmistakably distinct from every sibling, none of which traverses ownership. An agent can select it without opening the schema.

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

Usage Guidelines4/5

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

It states the prerequisite (a valid 20-character LEI) and routes the agent to sanctions_resolve_entity to obtain one, and explains that screenNodes opts into the cross-reference. What is missing is an explicit contrast with alternatives — e.g. when to trace ownership versus calling sanctions_get_entity or sanctions_screen_name directly — leaving that inference to the agent.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updates
    • Changedsanctions_get_designation4 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "source",
        -      "sourceLabel",
        -      "sourceEntryId",
        -      "entityType",
        -      "primaryName",
        -      "aliases",
        -      "identifiers",
        -      "addresses",
        -      "datesOfBirth",
        -      "nationalities",
        -      "caveat"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "source",
        +      "sourceLabel",
        +      "sourceEntryId",
        +      "entityType",
        +      "primaryName",
        +      "aliases",
        +      "identifiers",
        +      "addresses",
        +      "datesOfBirth",
        +      "nationalities",
        +      "features",
        +      "caveat"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / designationDate / description
        Previous value: -"The source's own designation date as YYYY-MM-DD; absent when unpublished."New value: +"The source's own designation date as YYYY-MM-DD; absent when unpublished. An OFAC party is dated from its entries on the lists that file publishes, so its ofac_sdn and ofac_consolidated records can differ."
      • addedOutput schema / properties / features
        Added value: +{
        +  "description": "Values the source publishes to describe the party rather than identify it, in published order: OFAC's vessel flag, type, and tonnage, aircraft model and operator, title, gender, and sanctions notes; the UK list's ship details. Empty when the source publishes none. Screening never matches on them.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One published descriptive value.",
        +    "properties": {
        +      "circa": {
        +        "const": true,
        +        "description": "Present when the source flags a date value as approximate.",
        +        "type": "boolean"
        +      },
        +      "type": {
        +        "description": "The source's own label for the value, verbatim (e.g. Vessel Flag, VESSEL TYPE, Secondary sanctions risk:, CurrentBelievedFlagOfShip).",
        +        "type": "string"
        +      },
        +      "value": {
        +        "description": "The value as published; a date is ISO 8601 at the precision the source published.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "value"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / legalBasis / description
        Previous value: -"Statutory / regulatory basis, when published."New value: +"Statutory / regulatory basis as the list publishes it — OFAC's legal-basis references, the EU regulation title, the UK regime's regulations — several joined with '; '. Absent when unpublished; the UN list publishes none."
    • Changedsanctions_get_entity19 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'."
    • Changedsanctions_list_sources5 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "sanctionsReady",
        -      "leiReady",
        -      "reportingExceptionsLoaded",
        -      "sources"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "sanctionsReady",
        +      "leiReady",
        +      "reportingExceptionsLoaded",
        +      "alternateNamesIndexed",
        +      "sources"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / alternateNamesIndexed
        Added value: +{
        +  "description": "Whether the GLEIF alternate-name index — trading, previous, alternative-language, and transliterated names — is built. When false, sanctions_resolve_entity searches legal names only until mirror:init reloads the GLEIF golden copy. True on a GLEIF mirror that has never loaded (leiReady false): its empty index is complete, and the first load builds it with the entities.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / sources / items / properties / recordCount / description
        Previous value: -"Records currently loaded for this source (Level 1 entities for gleif)."New value: +"Records currently loaded for this source — for gleif, Level 1 entity records."
      • addedOutput schema / properties / sources / items / properties / relationshipCount
        Added value: +{
        +  "description": "GLEIF Level 2 ownership relationships loaded (gleif only).",
        +  "type": "number"
        +}
      • changedOutput schema / properties / sources / items / properties / url / description
        Previous value: -"Upstream source URL the mirror harvests from."New value: +"Upstream URL the mirror harvests this source from, as configured — for gleif, the golden-copy API base."
    • Changedsanctions_resolve_entity4 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."
    • Changedsanctions_screen_identifier4 fields changed
      • changedOutput schema / properties / hits / description
        Previous value: -"Designations that publish a matching identifier, one per designation, ordered by source list then entry ID. Not paged — the most widely shared published identifiers map to about a dozen designations."New value: +"Designations that publish a matching identifier, one per designation (an OFAC party on both OFAC lists once), ordered by source list then entry ID. Not paged — the most widely shared published identifiers map to about a dozen designations."
      • changedOutput schema / properties / hits / items / properties / source / description
        Previous value: -"Which watchlist this candidate is on — its provenance."New value: +"The watchlist whose record this hit's fields come from — its provenance. For an OFAC party both OFAC lists publish, ofac_sdn unless the Consolidated record matched alone; sources names every list."
      • addedOutput schema / properties / hits / 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 / hits / items / required
        Previous value: -[
        -  "source",
        -  "sourceLabel",
        -  "sourceEntryId",
        -  "primaryName",
        -  "entityType",
        -  "matchedIdentifiers"
        -]New value: +[
        +  "source",
        +  "sourceLabel",
        +  "sourceEntryId",
        +  "sources",
        +  "primaryName",
        +  "entityType",
        +  "matchedIdentifiers"
        +]
    • Changedsanctions_screen_name13 fields changed
      • changedInput schema / properties / matchMode / description
        Previous value: -"strict (default): exact-normalized then all-tokens-present. fuzzy: also scored Jaro-Winkler + phonetic. Strict auto-falls-back to fuzzy when it finds nothing."New value: +"strict (default): exact-normalized then all-tokens-present, then a fuzzy pass over each selected list strict finds nothing on — a full pass when strict finds nothing on any list, otherwise adding only candidates that cover every word of the name other than legal forms, articles and other function words, and the jurisdiction codes uk, usa, uae, and rf. fuzzy: a scored Jaro-Winkler + phonetic pass over every selected list."
      • changedInput schema / properties / minScore / description
        Previous value: -"Score floor for fuzzy hits (0–1), applied uniformly to every fuzzy candidate regardless of how it was matched (Jaro-Winkler, token, or phonetic). No hit below this score is returned. Applies to fuzzy mode only; defaults to the server's configured floor."New value: +"Score floor for approximate hits (0–1), applied uniformly to every fuzzy candidate regardless of how it was matched (Jaro-Winkler, token, or phonetic); a query token counts toward queryTokenCoverage only when its match clears it too. It governs every fuzzy pass: fuzzy mode, and in strict mode the pass over the lists strict found nothing on, so raising it can remove approximate hits from a strict screen as well. Exact and strong hits are unaffected. Defaults to the server's configured floor."
      • addedOutput schema / properties / fuzzySources
        Added value: +{
        +  "description": "The selected lists the fuzzy pass searched, in list order; absent when no fuzzy pass ran. Beside strict hits these are the lists strict found nothing on, and only their candidates covering every word of the name other than legal forms, articles and other function words, and the jurisdiction codes uk, usa, uae, and rf were added.",
        +  "items": {
        +    "enum": [
        +      "ofac_sdn",
        +      "ofac_consolidated",
        +      "eu",
        +      "uk",
        +      "un"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / hasMore / description
        Previous value: -"True when potential matches remain beyond this page — re-call with nextOffset."New value: +"True when the result set holds matches beyond this page — re-call with nextOffset. It describes pages only: false on the last page, whatever totalAvailableBasis says."
      • changedOutput schema / properties / hits / description
        Previous value: -"Potential matches, ranked by match type, then score, then how much of the query each candidate explains."New value: +"Potential matches, ranked by match type, then score, then how much of the query each candidate explains. Candidates tied on all three are ordered by source list, then entry ID — not by relevance."
      • changedOutput schema / properties / hits / items / properties / designationDate / description
        Previous value: -"The source's own designation date as YYYY-MM-DD; absent when unpublished."New value: +"The source's own designation date as YYYY-MM-DD; absent when unpublished. For an OFAC party both OFAC lists publish, the date of the source record: each OFAC file dates the party from its own lists, so the two often differ, and sanctions_get_designation under the other list returns that record's date."
      • changedOutput schema / properties / hits / items / properties / source / description
        Previous value: -"Which watchlist this candidate is on — its provenance."New value: +"The watchlist whose record this hit's fields come from — its provenance. For an OFAC party both OFAC lists publish, ofac_sdn unless the Consolidated record matched alone or better; sources names every list."
      • addedOutput schema / properties / hits / 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 / hits / items / required
        Previous value: -[
        -  "source",
        -  "sourceLabel",
        -  "sourceEntryId",
        -  "entityType",
        -  "primaryName",
        -  "matchedName",
        -  "matchedNameType",
        -  "matchType"
        -]New value: +[
        +  "source",
        +  "sourceLabel",
        +  "sourceEntryId",
        +  "sources",
        +  "entityType",
        +  "primaryName",
        +  "matchedName",
        +  "matchedNameType",
        +  "matchType"
        +]
      • changedOutput schema / properties / matchModeUsed / description
        Previous value: -"The match mode actually applied (strict may auto-upgrade to fuzzy on empty)."New value: +"fuzzy when every selected list was fuzzy-searched (fuzzy mode, or a strict screen that found nothing on any list); strict otherwise, including a strict screen whose strict-empty lists were completed by a fuzzy pass."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no candidate matched — how to broaden, and what an empty result does NOT mean — or when the requested offset sits past the end of the result set."New value: +"Guidance when no candidate matched — how to broaden, and what an empty result does NOT mean — when the requested offset sits past the end of the result set, or when the fuzzy pass reached its candidate bound and a more distinctive word would narrow it."
      • changedOutput schema / properties / totalAvailable / description
        Previous value: -"Potential matches available across all pages, before limit and offset were applied."New value: +"Potential matches in the result set across all pages, before limit and offset were applied — every one is reachable by paging. An OFAC party both OFAC lists publish counts once."
      • changedOutput schema / properties / totalAvailableBasis / description
        Previous value: -"How to read totalAvailable: exact = the complete strict match 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 match set, strict having found a match on every selected list; lower_bound = a fuzzy pass ran (fuzzySources is present), which scores only the candidates blocking pooled, so more matches may exist beyond the result set."
    • Changedsanctions_trace_ownership29 fields changed
      • changedInput schema / properties / depth / description
        Previous value: -"Maximum traversal depth from the root entity (1–5)."New value: +"Maximum traversal depth from the root entity (1–5), on each side of a both walk. Ultimate-parent edges do not count as hops."
      • changedInput schema / properties / direction / description
        Previous value: -"Walk parents (who owns it), children (what it owns), or both (default)."New value: +"Walk parents (who owns it), children (what it owns), or both (default): a parents walk plus a children walk from the root, each to depth, never into siblings or co-parents."
      • changedInput schema / properties / screenNodes / description
        Previous value: -"When true, screen every node's legal name against all watchlists — the ownership-chain cross-reference."New value: +"When true, cross-reference every node against all watchlists — the ownership-chain cross-reference: the node's legal, other, and transliterated names screened strict, and its LEI and country-matched registration number looked up as identifiers. A node with no Level 1 record has no names: its LEI lookup alone."
      • changedOutput schema / properties / complete / description
        Previous value: -"True when the loaded Level 2 relationships within the requested depth are all shown (nothing was cut off by depth) AND every node resolved to a GLEIF Level 1 record. It does not say every parent is known — most entities publish no parent relationship; read each node's parentStatus for what GLEIF publishes instead. False means the graph below is a partial view — read truncated and missingEntityLeis for which."New value: +"True when truncated is false (no loaded relationship on the walked side is left out) AND every node resolved to a GLEIF Level 1 record. It does not say every parent is known — most entities publish no parent relationship; read each node's parentStatus for what GLEIF publishes instead. False means the graph below is a partial view — read truncated and missingEntityLeis for which."
      • changedOutput schema / properties / edges / description
        Previous value: -"Directed ownership edges between the nodes."New value: +"Directed ownership edges between the nodes — every edge joins two nodes of this graph."
      • 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 root 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 root LEI, and its check digits are valid. `invalid_lei_checksum`: No GLEIF entity in the mirror carries the root 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 / missingEntityLeis / description
        Previous value: -"LEIs published in the relationship corpus but absent from the GLEIF Level 1 entity mirror. Their nodes carry the LEI in place of a legal name and no jurisdiction/status — never read that LEI as a legal name, and note any per-node screen for them ran against the LEI string."New value: +"LEIs published in the relationship corpus but absent from the GLEIF Level 1 entity mirror. Their nodes carry the LEI in place of a legal name and no jurisdiction/status — never read that LEI as a legal name. A per-node screen for them is the LEI looked up as an identifier, nothing else: with no record there is no legal name, other name, or registration number to screen, so their screenedInputs is empty and each hit is matchedOn their lei."
      • changedOutput schema / properties / nodes / items / properties / depth / description
        Previous value: -"Breadth-first depth from the root (root = 0)."New value: +"Breadth-first depth from the root (root = 0), counted over every relationship type except IS_ULTIMATELY_CONSOLIDATED_BY. On a node flagged reachedVia: ultimate it counts that one ultimate hop instead, so it can be shallower than the direct chain to the node."
      • changedOutput schema / properties / nodes / items / properties / parentStatus / properties / direct / properties / status / description
        Previous value: -"relationship = a Level 2 relationship at this level is published (see edges); exception = the entity filed a GLEIF reporting exception instead of naming this parent; none = GLEIF publishes neither; unknown = no relationship is published and reporting exceptions are not loaded in the mirror, so whether one was filed is unknown."New value: +"relationship = a Level 2 relationship at this level is published — it is in edges when that parent is also a node of this graph (a flagged leaf's parents and a children-side node's other parents are read for this status, never walked); exception = the entity filed a GLEIF reporting exception instead of naming this parent; none = GLEIF publishes neither; unknown = no relationship is published and reporting exceptions are not loaded in the mirror, so whether one was filed is unknown."
      • changedOutput schema / properties / nodes / items / properties / parentStatus / properties / ultimate / properties / status / description
        Previous value: -"relationship = a Level 2 relationship at this level is published (see edges); exception = the entity filed a GLEIF reporting exception instead of naming this parent; none = GLEIF publishes neither; unknown = no relationship is published and reporting exceptions are not loaded in the mirror, so whether one was filed is unknown."New value: +"relationship = a Level 2 relationship at this level is published — it is in edges when that parent is also a node of this graph (a flagged leaf's parents and a children-side node's other parents are read for this status, never walked); exception = the entity filed a GLEIF reporting exception instead of naming this parent; none = GLEIF publishes neither; unknown = no relationship is published and reporting exceptions are not loaded in the mirror, so whether one was filed is unknown."
      • addedOutput schema / properties / nodes / items / properties / reachedVia
        Added value: +{
        +  "description": "Present (ultimate) when only an IS_ULTIMATELY_CONSOLIDATED_BY edge reaches this node within the depth. That edge is a shortcut to the top of the group, not a hop, so the node is a leaf: its own parents (on the parents side) or children (on the children side) are never walked, and truncated is true when any of them is not in this graph. A higher depth places it by direct links only when a direct chain from the root reaches it; where that chain is broken (a parent reported by exception, or not at all), no depth does.",
        +  "enum": [
        +    "ultimate"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / nodes / items / properties / role / description
        Previous value: -"Position relative to the traversal."New value: +"root = the traced entity; parent = an ancestor, reached by walking parents; child = a descendant, reached by walking children. On a both walk, the side that reached the node — siblings and co-parents are never walked."
      • changedOutput schema / properties / nodes / items / properties / sanctionsHits / description
        Previous value: -"Per-node screening results, present only when screenNodes is true."New value: +"Per-node cross-reference results, one hit per designation (an OFAC party both OFAC lists publish once) — exact name and identifier matches first, then strong name matches. Present only when screenNodes is true."
      • changedOutput schema / properties / nodes / items / properties / sanctionsHits / items / properties / matchType / description
        Previous value: -"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 / nodes / items / properties / sanctionsHits / items / properties / matchedIdentifiers
        Added value: +{
        +  "description": "Every identifier the designation publishes that equals this node'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 / nodes / items / properties / sanctionsHits / items / properties / matchedName / description
        Previous value: -"The name/alias that matched this node."New value: +"The designation's name or alias that matched one of this node's screened names — the strongest match. Absent when only an identifier produced the hit."
      • addedOutput schema / properties / nodes / items / properties / sanctionsHits / items / properties / matchedOn
        Added value: +{
        +  "description": "Every input of this node that produced the hit — its legal name, an other or transliterated name, its LEI, or its registration number — in screening order. Only its LEI on a node in missingEntityLeis.",
        +  "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 / nodes / items / 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 / nodes / items / 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 / nodes / items / 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 / nodes / items / properties / sanctionsHits / items / required
        Previous value: -[
        -  "source",
        -  "sourceLabel",
        -  "sourceEntryId",
        -  "primaryName",
        -  "matchedName",
        -  "matchType"
        -]New value: +[
        +  "source",
        +  "sourceLabel",
        +  "sourceEntryId",
        +  "sources",
        +  "primaryName",
        +  "matchedOn"
        +]
      • changedOutput schema / properties / nodes / items / properties / sanctionsScreen / description
        Previous value: -"Disclosure for this node's cross-reference screen: how many potential matches existed before the per-node cap, and whether sanctionsHits is the complete set. Present only when the node was screened."New value: +"Disclosure for this node's cross-reference: how many potential matches existed before the per-node cap, whether sanctionsHits is the complete set, and what was screened. Present only when the node was screened."
      • changedOutput schema / properties / nodes / items / properties / sanctionsScreen / properties / hasMore / description
        Previous value: -"True when this node's potential matches were capped — screen its legal name with sanctions_screen_name to page through the rest."New value: +"True when this node's potential matches were capped — re-screen its names with sanctions_screen_name and look up its LEI and registration number with sanctions_screen_identifier to see the rest. A node in missingEntityLeis has no names: look up its LEI."
      • addedOutput schema / properties / nodes / items / properties / sanctionsScreen / properties / screenedInputs
        Added value: +{
        +  "description": "What the cross-reference screened beyond the legal name and the LEI, which it screens on every node with a Level 1 record: every other and transliterated name, then the registration number when the node 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, and always on a node in missingEntityLeis, which has no name and is looked up by its LEI alone.",
        +  "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 / nodes / items / properties / sanctionsScreen / properties / totalAvailable / description
        Previous value: -"Potential matches this node's screen found before the per-node cap was applied."New value: +"Distinct designations this node's cross-reference found across every screened name and identifier, an OFAC party both OFAC lists publish counted once, before the per-node cap was applied."
      • changedOutput schema / properties / nodes / items / properties / sanctionsScreen / properties / totalAvailableBasis / description
        Previous value: -"How to read totalAvailable: exact = the complete strict match set for this node; 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 this node's screened names and identifiers."
      • changedOutput schema / properties / nodes / items / properties / sanctionsScreen / required
        Previous value: -[
        -  "totalAvailable",
        -  "totalAvailableBasis",
        -  "hasMore"
        -]New value: +[
        +  "totalAvailable",
        +  "totalAvailableBasis",
        +  "hasMore",
        +  "screenedInputs"
        +]
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when further ownership relationships exist beyond the requested depth — re-run with a higher depth to see them. False means the traversal reached the edge of the loaded relationship corpus."New value: +"True when the loaded relationships hold ownership links on the walked side that this graph does not show: past the requested depth (re-run with a higher depth to see them), or the parents (or, on the children side, children) of a node flagged reachedVia: ultimate, which is never walked. An ultimate-parent edge counts only when it leads to an entity this graph does not return. False means neither: every chain the walk followed ends within the depth. Siblings and co-parents are never walked and never count."
  2. 4 tool updates
    • Changedsanctions_get_entity3 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."
    • Changedsanctions_list_sources4 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "sanctionsReady",
        -      "leiReady",
        -      "sources"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "sanctionsReady",
        +      "leiReady",
        +      "reportingExceptionsLoaded",
        +      "sources"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / reportingExceptionsLoaded
        Added value: +{
        +  "description": "Whether GLEIF reporting exceptions are loaded. When false, sanctions_trace_ownership reads a parent level with no published relationship as unknown.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / sources / items / properties / recordCount / description
        Previous value: -"Records currently loaded for this source."New value: +"Records currently loaded for this source (Level 1 entities for gleif)."
      • addedOutput schema / properties / sources / items / properties / reportingExceptionCount
        Added value: +{
        +  "description": "GLEIF reporting-exception records loaded (gleif only). Absent when the dataset has never been loaded — never read as zero.",
        +  "type": "number"
        +}
    • Changedsanctions_resolve_entity7 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."
    • Changedsanctions_trace_ownership5 fields changed
      • changedInput schema / properties / screenNodes / description
        Previous value: -"When true, screen every node's legal name against all watchlists for beneficial-ownership screening."New value: +"When true, screen every node's legal name against all watchlists — the ownership-chain cross-reference."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "rootLei",
        -      "nodes",
        -      "edges",
        -      "complete",
        -      "truncated",
        -      "missingEntityLeis",
        -      "screeningStatus",
        -      "screenedNodeCount",
        -      "flaggedNodeCount",
        -      "caveat"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "rootLei",
        +      "nodes",
        +      "edges",
        +      "complete",
        +      "truncated",
        +      "reportingExceptionsLoaded",
        +      "missingEntityLeis",
        +      "screeningStatus",
        +      "screenedNodeCount",
        +      "flaggedNodeCount",
        +      "caveat"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / complete / description
        Previous value: -"True only when this is the full known ownership picture: nothing was cut off by the requested depth AND every node resolved to a GLEIF Level 1 record. False means the graph below is a partial view — read truncated and missingEntityLeis for which."New value: +"True when the loaded Level 2 relationships within the requested depth are all shown (nothing was cut off by depth) AND every node resolved to a GLEIF Level 1 record. It does not say every parent is known — most entities publish no parent relationship; read each node's parentStatus for what GLEIF publishes instead. False means the graph below is a partial view — read truncated and missingEntityLeis for which."
      • addedOutput schema / properties / nodes / items / properties / parentStatus
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "What GLEIF publishes about this node's direct and ultimate accounting-consolidation parents. Present only on nodes whose parents the traversal read — every node short of the depth limit when direction is parents or both; absent on a children walk.",
        +  "properties": {
        +    "direct": {
        +      "additionalProperties": false,
        +      "description": "What GLEIF publishes about the direct parent.",
        +      "properties": {
        +        "exceptionReasons": {
        +          "description": "Every reason given in the reporting exception (e.g. NATURAL_PERSONS, NON_CONSOLIDATING, NO_KNOWN_PERSON). Present only when status is exception.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "status": {
        +          "description": "relationship = a Level 2 relationship at this level is published (see edges); exception = the entity filed a GLEIF reporting exception instead of naming this parent; none = GLEIF publishes neither; unknown = no relationship is published and reporting exceptions are not loaded in the mirror, so whether one was filed is unknown.",
        +          "enum": [
        +            "relationship",
        +            "exception",
        +            "none",
        +            "unknown"
        +          ],
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "status"
        +      ],
        +      "type": "object"
        +    },
        +    "ultimate": {
        +      "additionalProperties": false,
        +      "description": "What GLEIF publishes about the ultimate parent.",
        +      "properties": {
        +        "exceptionReasons": {
        +          "description": "Every reason given in the reporting exception (e.g. NATURAL_PERSONS, NON_CONSOLIDATING, NO_KNOWN_PERSON). Present only when status is exception.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "status": {
        +          "description": "relationship = a Level 2 relationship at this level is published (see edges); exception = the entity filed a GLEIF reporting exception instead of naming this parent; none = GLEIF publishes neither; unknown = no relationship is published and reporting exceptions are not loaded in the mirror, so whether one was filed is unknown.",
        +          "enum": [
        +            "relationship",
        +            "exception",
        +            "none",
        +            "unknown"
        +          ],
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "status"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "direct",
        +    "ultimate"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / reportingExceptionsLoaded
        Added value: +{
        +  "description": "Whether GLEIF reporting exceptions are loaded in the mirror. When false, a node's parent level with no published relationship reads unknown rather than exception or none.",
        +  "type": "boolean"
        +}
  3. 3 tool updates
    • Changedsanctions_get_designation10 fields changed
      • changedInput schema / properties / entryId / description
        Previous value: -"The source list's own entry ID (the sourceEntryId from sanctions_screen_name)."New value: +"The source list's own entry ID (the sourceEntryId from sanctions_screen_name), or the reference number the list publishes for the entry (UN QDe.004, EU EU.27.28, UK OFSI Group ID 14196). Matched trimmed and case-insensitive, entry ID first."
      • addedOutput schema / properties / datesOfBirth / items / properties / circa
        Added value: +{
        +  "const": true,
        +  "description": "Present when the source flags the date as approximate; never without date.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / datesOfBirth / items / properties / date / description
        Previous value: -"Date of birth as published."New value: +"Date of birth in ISO 8601 at the precision the source published: YYYY-MM-DD, YYYY-MM, or YYYY. A range is an interval whose ends keep their own precision (1955/1957); an open end is .. (../1980). A value with no ISO form is kept as published."
      • changedOutput schema / properties / designationDate / description
        Previous value: -"Designation date, when published."New value: +"The source's own designation date as YYYY-MM-DD; absent when unpublished."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `designation_not_found`: No designation exists for the given source + entry ID in the mirror. `mirror_not_ready`: The sanctions 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: `designation_not_found`: No designation in the given source has that entry ID or reference number in the mirror. `reference_ambiguous`: The entry ID is a reference number more than one designation in the source publishes. `mirror_not_ready`: The sanctions 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: -[
        -  "designation_not_found",
        -  "mirror_not_ready"
        -]New value: +[
        +  "designation_not_found",
        +  "reference_ambiguous",
        +  "mirror_not_ready"
        +]
      • changedOutput schema / properties / identifiers / description
        Previous value: -"Published identifiers (passport, national ID, tax, registration, …)."New value: +"Published identifiers: identity documents (passport, national ID, tax, registration) and, where the source publishes them, SWIFT/BIC codes, digital-currency addresses, vessel call signs, aircraft tail and serial numbers, phone numbers, email addresses, and websites."
      • changedOutput schema / properties / identifiers / items / properties / type / description
        Previous value: -"Identifier category (e.g. Passport, National ID, Tax ID)."New value: +"Identifier category as the source labels it (e.g. Passport, National ID, SWIFT/BIC, Digital Currency Address - XBT, Phone Number, Website)."
      • changedOutput schema / properties / identifiers / items / properties / value / description
        Previous value: -"Identifier value as published."New value: +"Identifier value exactly as published, letter case included."
      • addedOutput schema / properties / referenceNumber
        Added value: +{
        +  "description": "The list's published reference number (UN, EU, UK OFSI Group ID); absent when the list publishes none for the entry. OFAC publishes none — its entry ID is its published number.",
        +  "type": "string"
        +}
    • Addedsanctions_screen_identifier
    • Changedsanctions_screen_name2 fields changed
      • changedOutput schema / properties / hits / items / properties / designationDate / description
        Previous value: -"Designation date as published, when available."New value: +"The source's own designation date as YYYY-MM-DD; absent when unpublished."
      • addedOutput schema / properties / hits / items / properties / referenceNumber
        Added value: +{
        +  "description": "The list's published reference number (UN, EU, UK OFSI Group ID); absent when the list publishes none for the entry.",
        +  "type": "string"
        +}
  4. 2 tool updates
    • Changedsanctions_resolve_entity3 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"
        +]
    • Changedsanctions_screen_name3 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"The name to screen (person, organization, vessel, or aircraft)."New value: +"The name to screen (person, organization, vessel, or aircraft), 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 sanctions 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 sanctions 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"
        +]
  5. 6 tool updates
    • Changedsanctions_get_designation6 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": [
        +      "source",
        +      "sourceLabel",
        +      "sourceEntryId",
        +      "entityType",
        +      "primaryName",
        +      "aliases",
        +      "identifiers",
        +      "addresses",
        +      "datesOfBirth",
        +      "nationalities",
        +      "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: `designation_not_found`: No designation exists for the given source + entry ID in the mirror. `mirror_not_ready`: The sanctions mirror has never completed an initial sync. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "designation_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: -[
        -  "source",
        -  "sourceLabel",
        -  "sourceEntryId",
        -  "entityType",
        -  "primaryName",
        -  "aliases",
        -  "identifiers",
        -  "addresses",
        -  "datesOfBirth",
        -  "nationalities",
        -  "caveat"
        -]
    • Changedsanctions_get_entity6 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"
        -]
    • Changedsanctions_list_sources6 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": [
        +      "sanctionsReady",
        +      "leiReady",
        +      "sources"
        +    ]
        +  },
        +  {
        +    "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.",
        +          "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: -[
        -  "sanctionsReady",
        -  "leiReady",
        -  "sources"
        -]
    • Changedsanctions_resolve_entity6 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"
        -]
    • Changedsanctions_screen_name6 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": [
        +      "hits",
        +      "caveat",
        +      "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 sanctions 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: -[
        -  "hits",
        -  "caveat",
        -  "normalizedQuery",
        -  "matchModeUsed",
        -  "totalCount",
        -  "totalAvailable",
        -  "totalAvailableBasis",
        -  "hasMore"
        -]
    • Changedsanctions_trace_ownership6 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": [
        +      "rootLei",
        +      "nodes",
        +      "edges",
        +      "complete",
        +      "truncated",
        +      "missingEntityLeis",
        +      "screeningStatus",
        +      "screenedNodeCount",
        +      "flaggedNodeCount",
        +      "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 root 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: -[
        -  "rootLei",
        -  "nodes",
        -  "edges",
        -  "complete",
        -  "truncated",
        -  "missingEntityLeis",
        -  "screeningStatus",
        -  "screenedNodeCount",
        -  "flaggedNodeCount",
        -  "caveat"
        -]
  6. 4 tool updates
    • Changedsanctions_get_entity3 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"
        +]
    • Changedsanctions_resolve_entity11 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"
        +]
    • Changedsanctions_screen_name11 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of potential matches to return."New value: +"Maximum number of potential matches to return in one page."
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based index of the first potential match to return. Re-call with the returned nextOffset to page through every match 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 potential matches remain beyond this page — re-call with nextOffset.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / hits / description
        Previous value: -"Scored potential matches, highest-confidence first."New value: +"Potential matches, ranked by match type, then score, then how much of the query each candidate explains."
      • addedOutput schema / properties / hits / items / properties / queryTokenCoverage
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "How much of the query this candidate 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 hits.",
        +  "properties": {
        +    "covered": {
        +      "description": "Query tokens individually matched by one of this candidate'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 candidate matched — how to broaden, and what an empty result does NOT mean."New value: +"Guidance when no candidate matched — how to broaden, and what an empty result does NOT mean — or when the requested offset sits past the end of the result set."
      • addedOutput schema / properties / totalAvailable
        Added value: +{
        +  "description": "Potential matches 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 match 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 potential matches returned."New value: +"Number of potential matches returned in this page."
      • changedOutput schema / required
        Previous value: -[
        -  "hits",
        -  "caveat",
        -  "normalizedQuery",
        -  "matchModeUsed",
        -  "totalCount"
        -]New value: +[
        +  "hits",
        +  "caveat",
        +  "normalizedQuery",
        +  "matchModeUsed",
        +  "totalCount",
        +  "totalAvailable",
        +  "totalAvailableBasis",
        +  "hasMore"
        +]
    • Changedsanctions_trace_ownership6 fields changed
      • addedOutput schema / properties / complete
        Added value: +{
        +  "description": "True only when this is the full known ownership picture: nothing was cut off by the requested depth AND every node resolved to a GLEIF Level 1 record. False means the graph below is a partial view — read truncated and missingEntityLeis for which.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / missingEntityLeis
        Added value: +{
        +  "description": "LEIs published in the relationship corpus but absent from the GLEIF Level 1 entity mirror. Their nodes carry the LEI in place of a legal name and no jurisdiction/status — never read that LEI as a legal name, and note any per-node screen for them ran against the LEI string.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / nodes / items / properties / sanctionsScreen
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Disclosure for this node's cross-reference screen: how many potential matches existed before the per-node cap, and whether sanctionsHits is the complete set. Present only when the node was screened.",
        +  "properties": {
        +    "hasMore": {
        +      "description": "True when this node's potential matches were capped — screen its legal name with sanctions_screen_name to page through the rest.",
        +      "type": "boolean"
        +    },
        +    "totalAvailable": {
        +      "description": "Potential matches this node's screen found before the per-node cap was applied.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "totalAvailableBasis": {
        +      "description": "How to read totalAvailable: exact = the complete strict match set for this node; 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 per-node cross-reference ran: screened = every node was screened; not_requested = screenNodes was false; not_ready = screening was requested but the sanctions mirror has never synced, so NO node was screened and the absence of hits says nothing about any node.",
        +  "enum": [
        +    "screened",
        +    "not_requested",
        +    "not_ready"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when further ownership relationships exist beyond the requested depth — re-run with a higher depth to see them. False means the traversal reached the edge of the loaded relationship corpus.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "rootLei",
        -  "nodes",
        -  "edges",
        -  "screenedNodeCount",
        -  "flaggedNodeCount",
        -  "caveat"
        -]New value: +[
        +  "rootLei",
        +  "nodes",
        +  "edges",
        +  "complete",
        +  "truncated",
        +  "missingEntityLeis",
        +  "screeningStatus",
        +  "screenedNodeCount",
        +  "flaggedNodeCount",
        +  "caveat"
        +]
  7. 2 tool updates
    • Changedsanctions_screen_name1 field changed
      • changedInput schema / properties / minScore / description
        Previous value: -"Jaro-Winkler similarity floor for fuzzy hits (0–1). Applies to fuzzy mode only; defaults to the server's configured floor."New value: +"Score floor for fuzzy hits (0–1), applied uniformly to every fuzzy candidate regardless of how it was matched (Jaro-Winkler, token, or phonetic). No hit below this score is returned. Applies to fuzzy mode only; defaults to the server's configured floor."
    • Changedsanctions_trace_ownership2 fields changed
      • changedOutput schema / properties / nodes / items / properties / sanctionsHits / description
        Previous value: -"Per-node screening results, present only when screen_nodes is true."New value: +"Per-node screening results, present only when screenNodes is true."
      • changedOutput schema / properties / screenedNodeCount / description
        Previous value: -"How many nodes were screened (0 when screen_nodes is false)."New value: +"How many nodes were screened (0 when screenNodes is false)."
  8. 6 tool updates
    • First observedsanctions_get_designation
    • First observedsanctions_get_entity
    • First observedsanctions_list_sources
    • First observedsanctions_resolve_entity
    • First observedsanctions_screen_name
    • First observedsanctions_trace_ownership

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.