Skip to main content
Glama
cyanheads

@cyanheads/sanctions-screening-mcp-server

Official
by cyanheads

Версия Лицензия MCP SDK TypeScript Bun

Установить в Claude Desktop Установить в Cursor Установить в VS Code

Фреймворк

Публичный размещённый сервер: https://sanctions-screening.caseyjhand.com/mcp


[!ВАЖНО] Это вспомогательное средство для проверки, а не юридическое или комплаенс-подтверждение. Каждый инструмент возвращает потенциальные совпадения с прозрачной оценкой и указанием источника — никогда не вердикт. Совпадение означает «проверьте этого кандидата по официальному источнику»; пустой результат никогда не означает «проверен». Реальное соблюдение санкционных требований — это юридический процесс: он требует проверки человеком и квалифицированного комплаенс-заключения. Этот сервер питает этот процесс; он не выполняет его, и его вывод не является комплаенс-записью.

Обзор

sanctions-screening-mcp-server превращает открытые данные о санкциях мира плюс глобальный реестр юридических лиц в единый рабочий процесс проверки и сопоставления, отвечая офлайн и с нечётким сопоставлением. Он проверяет имя по консолидированным спискам США (OFAC), ЕС, Великобритании и ООН одновременно и сопоставляет юридические лица с базой данных GLEIF Legal Entity Identifier (LEI) с отслеживанием корпоративного владения.

Все источники доступны для массовой загрузки, не требуют ключей и допускают распространение. Сервер зеркалирует их в локальный индекс SQLite + FTS5 и обслуживает совпадения из этого зеркала — без живого API-ключа, без ограничения скорости на запрос на горячем пути. Агент видит глаголы проверки (screen_name, resolve_entity, trace_ownership); какой список ответил на запрос, отображается только как происхождение каждого совпадения.

Модель сопоставления прозрачна по замыслу: сначала строгое сопоставление токенов (точное нормализованное, затем все токены присутствуют через FTS5), с оценённым нечётким запасным вариантом Jaro-Winkler + фонетическим. Приблизительные совпадения несут сырое сходство Jaro-Winkler (0–1) — реальное измерение, никогда не выдуманный «процент уверенности».

Related MCP server: Sanctions Screening MCP Server

Инструменты

Шесть инструментов, организованных вокруг двух рабочих процессов — проверьте имя по стоп-листам и сопоставьте юридическое лицо с его глобальным идентификатором и графом владения:

Инструмент

Описание

sanctions_screen_name

Проверьте имя (человек, компания, судно, воздушное судно) по всем загруженным стоп-листам одновременно — OFAC SDN + Consolidated, ЕС, Великобритания, ООН — с учётом псевдонимов и нечёткости. Возвращает оценённые потенциальные совпадения с указанием списка-источника, программы, даты включения и совпавшего псевдонима.

sanctions_get_designation

Получите полную запись для одного санкционного включения по списку-источнику + ID записи: все псевдонимы, идентификаторы, адреса, даты/места рождения, гражданства, программа, правовое основание и дата включения.

sanctions_resolve_entity

Сопоставьте название компании / организации (+ необязательная юрисдикция) с ранжированными кандидатами GLEIF LEI. Превращает свободно введённое имя контрагента в стабильный глобальный идентификатор.

sanctions_get_entity

Получите полную запись GLEIF уровня 1 для одного LEI — юридическое название, торговые названия, адреса, статус регистрации, юрисдикция — плюс перекрёстную ссылку на санкционные списки, проверенную по юридическому названию.

sanctions_trace_ownership

Проследите граф корпоративного владения GLEIF уровня 2 для LEI (родители и/или дочерние компании, BFS до ограниченной глубины), при необходимости проверяя каждый узел на предмет бенефициарного владения.

sanctions_list_sources

Перечислите загруженные стоп-листы и наборы данных GLEIF с количеством записей, URL-адресами источников, лицензиями, а также готовностью зеркала и временными метками актуальности.

sanctions_screen_name

Точка входа на 80% — «находится ли эта организация в стоп-листе?»

  • Разворачивается по всем четырём санкционным спискам (OFAC SDN + Consolidated, ЕС, Великобритания, ООН) за один вызов; источник отображается только как происхождение каждого совпадения

  • С учётом псевдонимов: сопоставляется с каждым опубликованным основным именем, также известным как (a.k.a.) и ранее известным как (f.k.a.), а не только с каноническим именем

  • Строгий режим (по умолчанию): точное нормализованное равенство, затем все токены присутствуют через FTS5 — обрабатывает перестановки порядка слов и пропущенные внутренние слова без нечёткой библиотеки

  • Нечёткий режим (по желанию или автоматически, если строгий ничего не находит): добавляет сходство Jaro-Winkler и фонетическое сопоставление Double-Metaphone для промахов типа транслитерации

  • Совпадения помечаются как exact / strong / approximate; приблизительные совпадения несут сырую оценку Jaro-Winkler (0–1) плюс queryTokenCoverage — сколько токенов запроса объясняет кандидат, что ранжирует кандидатов, которых один общий точный токен закрепляет на той же оценке

  • Фильтрация по типу организации, подмножеству списка-источника, минимальной оценке сходства (min_score) и лимиту результатов

  • Постранично: totalAvailable и hasMore сообщают о совпадениях за пределами возвращённой страницы, а nextOffset получает их, при этом totalAvailableBasis помечает это количество как точное (строгий) или как нижнюю границу просканированного набора (нечёткий)

  • При пустом результате возвращает рекомендации по расширению — и явно заявляет, что отсутствие совпадения не является освобождением от ответственности


sanctions_get_designation

Детализация после того, как sanctions_screen_name выявил кандидата.

  • Полная нормализованная запись по source + entry_id (это sourceEntryId из совпадения при проверке)

  • Все опубликованные псевдонимы, структурированные идентификаторы (паспорт / национальный ID / налоговый / регистрационный), адреса, даты и места рождения, гражданства, санкционная программа, правовое основание и дата включения

  • Сохраняет разрежённость источника — отсутствующие поля означают, что источник их опустил; запись никогда не дополняется выдуманными данными


sanctions_resolve_entity

Мост от свободно введённого имени контрагента к стабильному LEI, на который опираются инструменты для организаций.

  • Сопоставляет название компании / организации с ранжированными кандидатами GLEIF LEI

  • Необязательный фильтр юрисдикции ISO 3166-1 alpha-2 и фильтр статуса регистрации (issued по умолчанию, lapsed или any)

  • Та же модель сопоставления «сначала строго, затем нечётко», что и при проверке имени; приблизительные совпадения несут сырую оценку Jaro-Winkler и тот же счётчик queryTokenCoverage

  • Сопоставляется с юридическими названиями и опубликованными другими/торговыми названиями

  • Постранично по тому же контракту, что и sanctions_screen_name — totalAvailable, totalAvailableBasis, hasMore, nextOffset


sanctions_get_entity

Кто эта юридическая организация — плюс перекрёстная ссылка на стоп-лист в том же вызове.

  • Полная запись GLEIF уровня 1: юридическое название, другие/торговые названия, юридический и головной адреса, статус регистрации, юрисдикция, регистрационный орган и ID, дата последнего обновления

  • Перекрёстно проверяет юридическое название организации по всем загруженным стоп-листам (только строгое совпадение — автоматический нечёткий поиск по общему юридическому названию затопил бы результат ложными срабатываниями с одним общим токеном)

  • screeningStatus сообщает, действительно ли эта перекрёстная проверка выполнялась: пустой список совпадений при not_ready означает, что санкционное зеркало было недоступно, а не то, что ничего не совпало

  • Проверенная организация несёт sanctionsScreen — totalAvailable, totalAvailableBasis, hasMore — поскольку список совпадений ограничен двадцатью пятью; повторно проверьте юридическое название с помощью sanctions_screen_name для полного набора

  • Ввод LEI проверяется регулярным выражением (20 символов: 18 буквенно-цифровых + 2 контрольные цифры)


sanctions_trace_ownership

Проверка бенефициарного владения — межведомственный рабочий процесс, который не могут выполнить инструменты для одного списка.

  • Обходит граф владения GLEIF уровня 2 в ширину до ограниченной глубины (1–5)

  • direction: обход parents (кто владеет), children (чем владеет) или both

  • Возвращает узлы (с ролью и глубиной) и направленные рёбра владения с типом отношения

  • screenNodes: true проверяет каждую организацию в графе по всем стоп-листам — «есть ли кто-то в этой цепочке владения под санкциями?»

  • Проверка каждого узла — только строгая и сообщает screenedNodeCount / flaggedNodeCount, чтобы вызывающий мог видеть покрытие с первого взгляда

  • Сообщает, является ли граф полной известной картиной: complete, truncated (дальнейшие отношения существуют за пределами запрошенной глубины) и missingEntityLeis (узлы без записи GLEIF уровня 1, которые несут свой LEI там, где должно быть юридическое название)

  • screeningStatus отделяет завершённую проверку узлов от той, которая никогда не запрашивалась, и от той, которую санкционное зеркало не смогло выполнить; каждый проверенный узел несёт sanctionsScreen — totalAvailable, totalAvailableBasis, hasMore — поскольку его список совпадений ограничен десятью


Ресурсы и подсказки

Тип

Имя

Описание

Ресурс

sanctions://designation/{source}/{entryId}

Одна запись о включении в санкционные списки по источнику + ID записи (URI-зеркало sanctions_get_designation).

Ресурс

sanctions://entity/{lei}

Одна сущность уровня 1 GLEIF по LEI (URI-зеркало payload сущности sanctions_get_entity, без перекрёстной ссылки на скрининг).

Ресурс

sanctions://sources

Загруженные списки + наборы данных GLEIF с количеством записей и временными метками обновления (URI-зеркало sanctions_list_sources).

Промпт

sanctions_vet_counterparty

Выстраивает инструменты в полный цикл комплексной проверки контрагента: разрешение → трассировка собственности → скрининг сущности и каждого бенефициарного владельца → сводка с указанием происхождения данных и оговоркой о поддержке принятия решений.

Все данные ресурсов также доступны через инструменты, которые являются основным путём для MCP-клиентов, работающих только с инструментами. Ресурсы — это удобство для клиентов, поддерживающих ресурсы.

Списки источников

Сервер агрегирует пять внешних источников за поверхностью скрининга. Все они — массовые, без ключей и свободны для распространения.

Источник

Роль

Лицензия

OFAC SDN + Consolidated (Казначейство США)

Основной санкционный/сторожевой список США — физические лица, организации, суда, воздушные суда, с псевдонимами a.k.a.

Общественное достояние правительства США

Консолидированный список финансовых санкций ЕС

Лица и организации, назначенные ЕС

Свободное распространение

Санкционный список Великобритании (UKSL, FCDO)

Цели санкций Великобритании — лица, организации, суда

Open Government Licence v3.0

Консолидированный список Совета Безопасности ООН

Лица и организации, назначенные ООН во всех режимах

Свободное распространение

GLEIF LEI (уровень 1 + уровень 2)

Кто есть кто (справочник сущностей) и кто кем владеет (корпоративная собственность)

CC0 1.0 Universal

Источник Великобритании — это Санкционный список Великобритании (UKSL), единственный авторитетный источник Великобритании с момента закрытия Консолидированного списка OFSI 28 января 2026 года.

Первый запуск: заполнение зеркала

Зеркало не входит в комплект — санкционные списки и эталонная копия GLEIF загружаются и нормализуются при первом запуске. Запустите сценарий жизненного цикла инициализации вне пути запросов перед скринингом:

bun run mirror:init

Это потоково загружает все пять санкционных списков полностью, перестраивает индекс имён по псевдонимам, затем потоково загружает эталонную копию GLEIF (сущности уровня 1 + отношения собственности уровня 2). Процесс возобновляем и предназначен для однократного запуска вне пути запросов.

Сценарий

Назначение

bun run mirror:init

Полная первоначальная загрузка всех источников (санкционные списки + эталонная копия GLEIF).

bun run mirror:refresh

Повторный сбор санкционных списков и применение дельт GLEIF. Санкционная часть (списки + индекс имён) также выполняется по cron при HTTP-транспорте; дельты GLEIF — вручную.

bun run mirror:verify

Отчёт о готовности зеркала и количестве записей по каждому источнику.

bun run mirror:seed

Загрузка небольшого синтетического набора данных для локальных смоук-тестов (без загрузок).

Установите SANCTIONS_INIT_SKIP_GLEIF=1 для mirror:init, чтобы загрузить только санкционные списки и пропустить GLEIF.

Примечание о памяти: каждый этап mirror:init работает в потоковом режиме. Санкционные документы в сумме составляют примерно 172 МБ, из которых OFAC SDN_ADVANCED.XML — около 120 МБ сам по себе; эталонная копия GLEIF уровня 1 — примерно 3,3 млн записей LEI (~892 МБ в сжатом виде, несколько ГБ в распакованном). Каждый источник сканируется по одной записи за раз и загружается ограниченными пакетами, поэтому пиковая резидентная память соответствует размеру пакета, а не размеру документа источника. Соответственно рассчитывайте диск под зеркало — GLEIF здесь доминирует — или пропустите GLEIF с SANCTIONS_INIT_SKIP_GLEIF=1, если вам нужен только скрининг по сторожевому списку.

Возможности

Построено на @cyanheads/mcp-ts-core:

  • Декларативные определения инструментов, ресурсов и промптов — один файл на примитив, фреймворк обрабатывает регистрацию и валидацию

  • Унифицированная обработка ошибок — обработчики выбрасывают, фреймворк перехватывает, классифицирует и форматирует

  • Типизированные контракты ошибок с подсказками по восстановлению (mirror_not_ready, designation_not_found, lei_not_found)

  • Подключаемая аутентификация: none, jwt, oauth (по умолчанию none — все данные публичны)

  • Структурированное логирование с опциональной трассировкой OpenTelemetry

  • Транспорты STDIO и Streamable HTTP

Специфично для санкций:

  • Многоисточниковая поверхность, организованная по рабочим процессам — один экран внутренне распределяет запросы по OFAC, ЕС, Великобритании и ООН; источники проявляются только как происхождение данных

  • Локальное зеркало SQLite + FTS5 через фреймворковый MirrorService — офлайн, без живого API-ключа, без лимита запросов в единицу времени

  • Нормализованная общая схема для четырёх санкционных списков с денормализованным индексом имён по псевдонимам (одна строка на имя и на псевдоним), чтобы запрос сопоставлялся с любым из имён сущности за одно FTS-сканирование

  • Строгое, затем нечёткое сопоставление: точное-нормализованное → все-токены-присутствуют (FTS5) → Jaro-Winkler + Double-Metaphone, с ограничением работы для коротких запросов

  • Приём данных GLEIF уровня 1 и уровня 2 для разрешения сущностей и трассировки бенефициарной собственности

Вывод, удобный для агентов:

  • Реальный сигнал, а не синтетическая уверенность — приблизительные совпадения несут сырое сходство Jaro-Winkler (0–1) и буквальный подсчёт покрытия токенов запроса, два отдельных измерения вместо одного смешанного вердикта; строгие совпадения несут match_type (exact / strong), никогда не сфабрикованный процент

  • Ранжирование, которое вызывающая сторона может учесть — совпадения упорядочиваются по типу совпадения, затем по оценке, затем по покрытию, затем по стабильному идентификатору, и покрытие, решившее спор, указано на самом совпадении

  • Происхождение данных на каждом совпадении — список источника, санкционная программа, дата включения в список, точное имя/псевдоним, по которому произошло совпадение, и его тип (primary / aka / fka / low-quality-aka)

  • Оговорка о поддержке принятия решений в выводе каждого инструмента скрининга — совпадение — это кандидат для проверки, пустой результат — не подтверждение отсутствия ограничений

  • Актуальность отображается через sanctions_list_sources — количество записей каждого источника и временная метка зеркала, чтобы агент мог оценить устаревание

Начало работы

Публичный размещённый экземпляр

Публичный экземпляр доступен по адресу https://sanctions-screening.caseyjhand.com/mcp — установка не требуется. Направьте любой MCP-клиент на него через Streamable HTTP со следующей конфигурацией клиента:

{
  "mcpServers": {
    "sanctions-screening-mcp-server": {
      "type": "streamable-http",
      "url": "https://sanctions-screening.caseyjhand.com/mcp"
    }
  }
}

Самостоятельное размещение / локально

Добавьте следующее в файл конфигурации вашего MCP-клиента. Сервер работает офлайн-в-первую-очередь — заполните зеркало с помощью bun run mirror:init перед скринингом (см. Списки источников).

{
  "mcpServers": {
    "sanctions-screening-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["@cyanheads/sanctions-screening-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

Или через npx (Bun не требуется):

{
  "mcpServers": {
    "sanctions-screening-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@cyanheads/sanctions-screening-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

Для Streamable HTTP установите транспорт и запустите сервер:

MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp

Предварительные требования

  • Bun v1.3 или выше (или Node.js v24+).

  • Диск под локальное зеркало (файлы SQLite; доминирует GLEIF уровня 1). API-ключ не требуется ни для одного источника.

Установка

  1. Клонируйте репозиторий:

git clone https://github.com/cyanheads/sanctions-screening-mcp-server.git
  1. Перейдите в каталог:

cd sanctions-screening-mcp-server
  1. Установите зависимости:

bun install
  1. Настройте окружение:

cp .env.example .env
# edit .env if you need to override defaults (all optional)
  1. Заполните зеркало:

bun run mirror:init

Конфигурация

Все источники не требуют ключей — обязательного API-ключа нет. Каждая переменная ниже необязательна и имеет разумное значение по умолчанию.

Переменная

Описание

По умолчанию

SANCTIONS_MIRROR_PATH

Путь в файловой системе для SQLite-зеркала; постоянный том на хостинговом развёртывании.

./data/sanctions.db

SANCTIONS_REFRESH_CRON

Cron для планового обновления санкционных списков + индекс имён (только HTTP-транспорт). Дельта-обновления GLEIF обновляются вручную через mirror:refresh.

0 4 * * *

SANCTIONS_FUZZY_MIN_SCORE

Нижняя граница сходства Jaro-Winkler по умолчанию для нечётких совпадений, когда min_score опущен.

0.85

SANCTIONS_FUZZY_MAX_RESULTS

Жёсткий предел числа нечётких кандидатов, оцениваемых на запрос, чтобы ограничить нагрузку на коротких запросах.

50

OFAC_SDN_URL

Переопределение для расширенного XML-файла OFAC SDN.

официальный URL SLS

OFAC_CONSOLIDATED_URL

Переопределение для расширенного XML-файла OFAC Consolidated.

официальный URL SLS

EU_FSF_URL

Переопределение для консолидированного XML-файла ЕС (включает статический публичный компонент пути токена).

официальный URL ЕС

UK_SANCTIONS_URL

Переопределение для XML-файла UK Sanctions List (UKSL).

официальный URL FCDO

UN_SC_URL

Переопределение для консолидированного XML-файла Совета Безопасности ООН.

официальный URL ООН

GLEIF_GOLDEN_COPY_BASE_URL

Переопределение для API загрузки golden-copy / дельт GLEIF.

https://goldencopy.gleif.org

MCP_TRANSPORT_TYPE

Транспорт: stdio или http.

stdio

MCP_HTTP_PORT

Порт для HTTP-сервера.

3010

MCP_LOG_LEVEL

Уровень журналирования (RFC 5424).

info

Исходные URL по умолчанию указывают на проверенные официальные конечные точки; переопределения существуют для тестирования и для закрепления зеркала в ограниченных средах. «Токен» ЕС — это статический публичный компонент пути, а не учётные данные.

Полный список дополнительных переопределений см. в .env.example.

Запуск сервера

Локальная разработка

  • Сборка и запуск:

# One-time build
bun run rebuild

# Run the built server
bun run start:stdio
# or
bun run start:http
  • Запуск проверок и тестов:

bun run devcheck   # Lint, format, typecheck, security, changelog sync
bun run test       # Vitest test suite
bun run lint:mcp   # Validate MCP definitions against spec

Docker

docker build -t sanctions-screening-mcp-server .
docker run --rm -p 3010:3010 -v sanctions-data:/usr/src/app/data sanctions-screening-mcp-server

Dockerfile по умолчанию использует HTTP-транспорт, сессионный режим без сохранения состояния и записывает журналы в /var/log/sanctions-screening-mcp-server. Образ работает под Bun, поэтому зеркало использует bun:sqlite (без нативной сборки). Смонтируйте том по пути зеркала (/usr/src/app/data по умолчанию), чтобы заполненное зеркало переживало перезапуски контейнера, и выполните bun run mirror:init внутри контейнера (docker exec), чтобы заполнить его. Пиринговые зависимости OpenTelemetry устанавливаются по умолчанию — соберите с --build-arg OTEL_ENABLED=false, чтобы исключить их.

Структура проекта

Каталог

Назначение

src/index.ts

Точка входа createApp() — регистрирует инструменты/ресурсы/подсказки, инициализирует службу проверки, планирует HTTP-обновление.

src/config

Разбор и валидация серверных переменных окружения с помощью Zod.

src/mcp-server/tools

Определения инструментов (*.tool.ts) — шесть инструментов проверки/разрешения.

src/mcp-server/resources

Определения ресурсов (*.resource.ts) — три URI-зеркала.

src/mcp-server/prompts

Определения подсказок (*.prompt.ts) — подсказка проверки контрагента.

src/services/screening

Служба проверки — локальное зеркало, нормализованная схема, приёмники источников (OFAC/EU/UK/UN/GLEIF) и механизм строгого/нечёткого сопоставления.

scripts/mirror-*.ts

CLI жизненного цикла зеркала — init, refresh, verify, seed.

tests/

Модульные и интеграционные тесты, повторяющие структуру src/.

Руководство по разработке

См. CLAUDE.md/AGENTS.md с рекомендациями по разработке и архитектурными правилами. Краткая версия:

  • Обработчики выбрасывают исключения, фреймворк их перехватывает — никаких try/catch в логике инструментов

  • Используйте ctx.log для журналирования в рамках запроса, ctx.state для хранилища в рамках тенанта

  • Регистрируйте новые инструменты и ресурсы через баррели в src/mcp-server/*/definitions/index.ts

  • Оборачивайте внешние источники: проверяйте сырые данные → нормализуйте к общей схеме → возвращайте выходную схему; никогда не выдумывайте поля, которые источник опускает, и никогда не синтезируйте оценку уверенности

Атрибуция

Этот сервер распространяет открытые данные из следующих источников, указанных здесь в соответствии с их условиями:

  • OFAC — списки SDN и Consolidated — Министерство финансов США, Управление по контролю за иностранными активами (общественное достояние правительства США).

  • EU — Консолидированный список финансовых санкций ЕС — Европейская комиссия / EEAS (свободно распространяется).

  • UK Sanctions List — Управление по делам иностранных дел, Содружества и развития Великобритании, лицензировано по Open Government Licence v3.0 (требуется указание авторства).

  • UN — Консолидированный список Совета Безопасности ООН — Совет Безопасности ООН (свободно распространяется).

  • GLEIF — данные LEI — Фонд глобальных идентификаторов юридических лиц, CC0 1.0 Universal.

Участие в разработке

Приветствуются issues и pull request'ы. Перед отправкой запустите проверки и тесты:

bun run devcheck
bun run test

Лицензия

Apache-2.0 — подробности см. в LICENSE.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Screens names and companies against OFAC, EU, UK, and UN sanctions lists with fuzzy-match scores, supporting bulk lookups for AML/KYC checks. Data is sourced directly from official government lists and cached for fast repeat checks.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables screening names and batches against global sanctions, PEP, and watchlists for AML compliance, returning scored matches.
    12 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables agents to fuzzy-screen person and company names against the OFAC SDN/Consolidated, EU, UK and UN sanctions lists downloaded fresh from official sources, returning potential-match statuses, 0–100 scores and listing details via a billed screening tool, plus a free local tool that lists covered sources, score scale and disclaimer.
    3
    MIT