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: sanctionwise

Инструменты

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

Инструмент

Описание

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_nametotalAvailable, totalAvailableBasis, hasMore, nextOffset


sanctions_get_entity

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

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

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

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

  • Проверенная организация несёт sanctionsScreentotalAvailable, 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 отделяет завершённую проверку узлов от той, которая никогда не запрашивалась, и от той, которую санкционное зеркало не смогло выполнить; каждый проверенный узел несёт sanctionsScreentotalAvailable, 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityMaintained
ResponsivenessWithin a week

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cyanheads/sanctions-screening-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server