Vulnerability Registry MCP Server
MCP-сервер реестра уязвимостей
Автор: Or Cohen
Сервер MCP (Model Context Protocol), который оборачивает устаревшую базу данных уязвимостей и предоставляет её в виде инструментов для любого MCP-совместимого LLM-клиента. Создан как интеллектуальный уровень доступа поверх пользовательских файлов данных с разделителями-трубами, позволяя специалистам по безопасности запрашивать уязвимости на естественном языке.
Быстрый старт
Предварительные требования
Node.js 18+
Claude Desktop (или любой другой MCP-совместимый клиент)
Настройка
git clone https://github.com/orcohen5/vulnerability-registry.git
cd vulnerability-registry
npm install
npm run buildПодключение к Claude Desktop
Добавьте в конфигурацию Claude Desktop (%APPDATA%\Claude\claude_desktop_config.json в Windows, ~/Library/Application Support/Claude/claude_desktop_config.json в macOS):
{
"mcpServers": {
"vulnerability-registry": {
"command": "node",
"args": [
"<FULL_PATH>/vulnerability-registry/dist/index.js",
"<FULL_PATH>/vulnerability-registry/data"
]
}
}
}Замените <FULL_PATH> на абсолютный путь к клонированному репозиторию.
Перезапустите Claude Desktop, затем спросите:
"Какие MCP-инструменты у тебя есть для работы с уязвимостями?"
Claude Desktop обнаруживает все 6 инструментов реестра уязвимостей
Доступные инструменты
Инструмент | Описание | Основные параметры | Пример запроса |
| Список всех зарегистрированных поставщиков ПО |
| "Покажи мне всех поставщиков открытого ПО" |
| Поиск поставщика по ID или имени |
| "Найди ID поставщика для Linux Kernel" |
| Поиск с гибкими фильтрами |
| "Покажи критические открытые уязвимости" |
| Получение полных данных CVE |
| "Какой CVSS-балл у Log4Shell?" |
| Агрегированная статистика |
| "Сколько уязвимостей по уровню серьезности?" |
| Профиль риска поставщика |
| "Покажи мне профиль риска Microsoft" |
Примеры запросов
"Сколько критических уязвимостей все еще открыты?"
Использует search_vulnerabilities с параметрами severity: "critical" и status: "open".

"Какой CVSS-балл у Log4Shell?"
Использует get_vulnerability с параметром cve_id: "CVE-2021-44228".

"Покажи мне профиль риска для Microsoft"
Использует get_vendor_risk_summary с параметром vendor_id: "V1".

"Какие уязвимости были найдены в Linux Kernel после 2022 года?"
Этот запрос демонстрирует оркестрацию нескольких инструментов — Claude сначала вызывает list_vendors, чтобы разрешить "Linux Kernel" в ID поставщика V5, затем вызывает search_vulnerabilities с vendor_id: "V5" и published_after: "2022-01-01".

Архитектура
┌─────────────────┐ ┌──────────────┐ ┌──────────────┐
│ Claude Desktop │────▶│ MCP Server │────▶│ Data Files │
│ (MCP Client) │◀────│ (stdio) │◀────│ (.db) │
└─────────────────┘ └──────┬───────┘ └──────────────┘
│
┌──────────┼──────────┐
▼ ▼ ▼
tools.ts repository.ts parser.ts
(MCP layer) (query engine) (file reader)Кодовая база следует строгому разделению на три уровня:
parser.ts — динамически считывает пользовательский формат с разделителями-трубами. Ничего не знает об MCP.
repository.ts — хранилище данных в оперативной памяти с индексированными картами (Maps) для поиска за O(1). Ничего не знает об MCP.
tools.ts — регистрирует инструменты MCP с использованием высокоуровневого API
McpServer. Выполняет преобразование между MCP и репозиторием.
Это означает, что для замены источника данных (файлы → база данных) нужно изменить только parser.ts, без каких-либо изменений на уровне MCP.
Проектные решения
Динамический парсинг метаданных — парсер файлов считывает имена столбцов из заголовка # FORMAT: во время выполнения, а не жестко кодирует позиции полей. В сочетании с проверкой версии (# VERSION: 1.0) это гарантирует, что сервер может обнаруживать и предупреждать об изменениях формата без модификации кода.
Паттерн репозитория с индексацией в памяти — данные загружаются один раз при запуске и индексируются в несколько карт (vendorById, vulnByCveId, vulnsByVendor, vulnsBySeverity, vulnsByStatus). Основные операции поиска выполняются за O(1). Отфильтрованные поисковые запросы начинаются с наименьшего индексированного подмножества и пересекаются, что делает комбинированные запросы эффективными даже при больших объемах данных.
Высокоуровневый API McpServer — использует McpServer.registerTool() со схемами Zod для безопасной проверки типов ввода, вместо низкоуровневого класса Server с ручным определением JSON Schema и маршрутизацией запросов.
Гибкий поиск с необязательными фильтрами — search_vulnerabilities принимает все параметры как необязательные, допуская любую комбинацию. Один инструмент обрабатывает запросы от "показать все критические" до "найти CVE для Linux с 2023 года с CVSS выше 8". Результаты всегда сортируются по баллу CVSS (сначала самые высокие), поэтому наиболее серьезные проблемы отображаются первыми.
Обогащенные ответы — get_vulnerability возвращает полный объект поставщика вместе с данными CVE. get_vendor_risk_summary включает список открытых уязвимостей. Это сокращает количество вызовов инструментов, необходимых LLM для ответа на распространенные вопросы.
Строгая типизация — Severity и Status являются типами объединения (union types), производными от массивов as const, с проверками типов во время выполнения (isSeverity, isStatus). Одни и те же массивы-источники истины питают как типы TypeScript, так и валидаторы перечислений Zod.
Известные аномалии данных
При работе с исходными файлами данных я обнаружил как минимум одно несоответствие в атрибуции:
CVE-2024-21762 (Fortinet SSL VPN OOB) сопоставлен с поставщиком V4 (Google) в vulnerabilities.db,
хотя это уязвимость Fortinet. Сервер добросовестно возвращает данные в том виде, в котором они хранятся —
исправление исходных данных выходит за рамки уровня запросов "только для чтения". В промышленной системе
я бы добавил этап проверки данных при загрузке, чтобы помечать такие несоответствия для проверки человеком,
возможно, путем перекрестной проверки с API NVD для канонической атрибуции поставщика.
Что бы я реализовал при наличии большего времени
Персистентность SQLite/PostgreSQL — замена хранения в памяти для наборов данных, превышающих доступную оперативную память, с пулом соединений для параллельного доступа.
Пагинация — добавление параметров
limit/offsetвsearch_vulnerabilitiesдля больших наборов результатов.Нечеткий поиск текста — сопоставление по расстоянию Левенштейна в названиях уязвимостей для запросов, устойчивых к опечаткам.
Интеграция с API NVD — автоматическое обновление данных CVE из Национальной базы данных уязвимостей NIST.
Ресурсы MCP — предоставление доступа к необработанным файлам данных как к ресурсам MCP для прямого доступа LLM, когда требуется полнотекстовый контекст.
Структурированное логирование и наблюдаемость — логи в формате JSON с идентификаторами корреляции для отладки цепочек вызовов инструментов.
Аутентификация и ограничение частоты запросов — защита сервера в сценариях совместного развертывания.
CI/CD конвейер — GitHub Actions для запуска линтинга, проверки типов и тестов при каждом пуше.
Технологический стек
Компонент | Выбор |
Язык | TypeScript (ES2022, модули Node16) |
MCP SDK |
|
Валидация | Zod |
Транспорт | stdio |
Сборка | tsc |
Тесты | Vitest |
Тестирование
npm test # Run all tests (30 tests across parser + repository)
npm run build # Compile TypeScript
npm start # Start the MCP server (stdio mode)Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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/orcohen5/vulnerability-registry'
If you have feedback or need assistance with the MCP directory API, please join our Discord server