Skip to main content
Glama
orcohen5

Vulnerability Registry MCP Server

by orcohen5

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 инструментов реестра уязвимостей

Доступные инструменты

Инструмент

Описание

Основные параметры

Пример запроса

list_vendors

Список всех зарегистрированных поставщиков ПО

category (необязательно)

"Покажи мне всех поставщиков открытого ПО"

get_vendor

Поиск поставщика по ID или имени

vendor_id, name

"Найди ID поставщика для Linux Kernel"

search_vulnerabilities

Поиск с гибкими фильтрами

severity, status, min_cvss, keyword, published_after

"Покажи критические открытые уязвимости"

get_vulnerability

Получение полных данных CVE

cve_id

"Какой CVSS-балл у Log4Shell?"

get_vulnerability_stats

Агрегированная статистика

vendor_id (необязательно)

"Сколько уязвимостей по уровню серьезности?"

get_vendor_risk_summary

Профиль риска поставщика

vendor_id

"Покажи мне профиль риска Microsoft"

Примеры запросов

"Сколько критических уязвимостей все еще открыты?"

Использует search_vulnerabilities с параметрами severity: "critical" и status: "open".

Критические открытые уязвимости

"Какой CVSS-балл у Log4Shell?"

Использует get_vulnerability с параметром cve_id: "CVE-2021-44228".

CVSS для Log4Shell

"Покажи мне профиль риска для Microsoft"

Использует get_vendor_risk_summary с параметром vendor_id: "V1".

Профиль риска Microsoft

"Какие уязвимости были найдены в Linux Kernel после 2022 года?"

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

Мультиинструментальный запрос по Linux Kernel

Архитектура

┌─────────────────┐     ┌──────────────┐     ┌──────────────┐
│  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

@modelcontextprotocol/sdk — высокоуровневый API McpServer

Валидация

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)
Install Server
A
security – no known vulnerabilities
A
license - permissive license
A
quality - A tier

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