Skip to main content
Glama
abuzo

Graylog MCP Server

by abuzo
README.md
# graylog-mcp

> 🔍 Model Context Protocol (MCP) сервер для интеграции Graylog с AI-ассистентами

Минималистичный MCP сервер, предоставляющий инструменты для поиска логов в Graylog через stdio протокол. Работает с Cursor, Claude Desktop и другими MCP-клиентами.

## ✨ Особенности

- 🚀 Три мощных инструмента для поиска логов
- 🔒 Поддержка Personal Access Token (PAT) аутентификации
- 🌐 Работа с self-signed TLS сертификатами
- 📦 Простая установка через npm/npx
- 🎯 Автоматическая нормализация полей логов
- 🔍 Умный поиск по UUID/trace ID/request ID

## 📋 Требования

- Node.js >= 18
- Graylog сервер с настроенным Personal Access Token

## 📦 Установка

### Глобальная установка
```bash
npm i -g @alexbuzo/graylog-mcp
```

### Использование через npx (рекомендуется)
Не требует установки - см. раздел "Настройка в Cursor"

## 🚀 Быстрый старт

### Запуск вручную

```bash
graylog-mcp \
  --graylog-url https://graylog.example.com \
  --token YOUR_GRAYLOG_PAT \
  --ssl-verify=false
```

### Параметры командной строки

| Параметр | Обязательный | Описание | По умолчанию |
|----------|--------------|----------|--------------|
| `--graylog-url` | ✅ | URL вашего Graylog сервера | - |
| `--token` | ✅ | Personal Access Token | - |
| `--ssl-verify` | ❌ | Проверка SSL сертификата | `true` |
| `--debug` | ❌ | Режим отладки | `false` |

## 🔌 Настройка в Cursor

**Настройки → MCP Servers → Add custom server**

### Вариант 1: Через npx (рекомендуется)

```json
{
  "mcpServers": {
    "graylog": {
      "command": "npx",
      "args": [
        "-y",
        "@alexbuzo/graylog-mcp@latest",
        "--graylog-url", "https://graylog.example.com",
        "--token", "YOUR_GRAYLOG_PAT",
        "--ssl-verify", "false"
      ],
      "name": "Graylog Search"
    }
  }
}
```

### Вариант 2: С переменными окружения (безопаснее)

```json
{
  "mcpServers": {
    "graylog": {
      "command": "bash",
      "args": [
        "-lc",
        "npx -y @alexbuzo/graylog-mcp@latest --graylog-url \"$GRAYLOG_URL\" --token \"$GRAYLOG_TOKEN\" --ssl-verify=false"
      ],
      "env": {
        "GRAYLOG_URL": "https://graylog.example.com",
        "GRAYLOG_TOKEN": "YOUR_GRAYLOG_PAT"
      },
      "name": "Graylog (secure)"
    }
  }
}
```

### Вариант 3: Глобальная установка

```json
{
  "mcpServers": {
    "graylog": {
      "command": "graylog-mcp",
      "args": [
        "--graylog-url", "https://graylog.example.com",
        "--token", "YOUR_GRAYLOG_PAT",
        "--ssl-verify", "false"
      ],
      "name": "Graylog"
    }
  }
}
```

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

### 1. `graylog.search_logs`
Поиск логов с использованием Lucene/GELF запросов.

**Параметры:**
- `query` (string, обязательный): Lucene/GELF запрос
- `rangeSec` (number, по умолчанию 3600): Временной диапазон в секундах
- `limit` (number, опционально): Максимальное количество результатов (макс. 500)
- `offset` (number, опционально): Смещение для пагинации
- `filter` (string, опционально): Дополнительный фильтр (например, `stream:<STREAM_ID>`)

**Пример запроса:**
```typescript
{
  query: "level:ERROR AND service:api",
  rangeSec: 3600,
  limit: 100,
  filter: "stream:507f1f77bcf86cd799439011"
}
```

### 2. `graylog.search_uuid`
Умный поиск по UUID, request ID, trace ID и другим идентификаторам. Автоматически проверяет множество распространенных полей.

**Параметры:**
- `uuid` (string, обязательный): UUID или идентификатор для поиска
- `rangeSec` (number, по умолчанию 86400): Временной диапазон в секундах (24 часа)
- `limit` (number, опционально): Максимальное количество результатов (макс. 500)

**Автоматически ищет в полях:**
- `request_id`, `requestId`, `req_id`
- `trace_id`, `traceId`, `trace.id`
- `span_id`, `spanId`, `span.id`
- `transaction_id`, `transactionId`
- `correlation_id`, `correlationId`
- `_id`

**Пример запроса:**
```typescript
{
  uuid: "550e8400-e29b-41d4-a716-446655440000",
  rangeSec: 86400,
  limit: 200
}
```

### 3. `graylog.search_stream`
Получение сообщений из конкретного потока (stream).

**Параметры:**
- `streamId` (string, обязательный): ID потока в Graylog
- `rangeSec` (number, по умолчанию 3600): Временной диапазон в секундах
- `limit` (number, опционально): Максимальное количество результатов (макс. 500)

**Пример запроса:**
```typescript
{
  streamId: "507f1f77bcf86cd799439011",
  rangeSec: 7200,
  limit: 150
}
```

## 📊 Формат ответа

Все инструменты возвращают нормализованный JSON со следующей структурой:

```json
{
  "total": 42,
  "messages": [
    {
      "id": "message_id",
      "ts": "2024-01-15T10:30:00.000Z",
      "level": "ERROR",
      "source": "api-server-01",
      "container": "api-service",
      "message": "Database connection failed",
      "short_message": "DB error",
      "http_method": "POST",
      "url": "/api/users",
      "status": 500,
      "latency_ms": 1234,
      "trace_id": "abc123",
      "span_id": "def456",
      "request_id": "req-789",
      "tenant_id": "tenant-001",
      "client_ip": "192.168.1.1",
      "user_agent": "Mozilla/5.0...",
      "service": "user-api",
      "request": {...},
      "response": {...}
    }
  ]
}
```

### Автоматическая нормализация полей

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

| Поле | Альтернативные имена |
|------|---------------------|
| `container` | `container_name`, `kubernetes.container_name` |
| `http_method` | `method`, `http_method`, `request_method` |
| `url` | `path`, `request_path` |
| `status` | `http_status`, `response_status` |
| `latency_ms` | `duration_ms`, `response_time_ms` |
| `trace_id` | `traceId`, `trace.id` |
| `span_id` | `spanId`, `span.id` |
| `request_id` | `req_id`, `requestId` |
| `client_ip` | `remote_addr`, `ip` |
| `service` | `service_name`, `app` |

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

### Установка зависимостей
```bash
npm install
```

### Сборка проекта
```bash
npm run build
```

### Запуск в режиме разработки
```bash
npm run dev -- --graylog-url https://graylog.example.com --token YOUR_PAT --ssl-verify=false
```

### Тестирование собранной версии
```bash
node dist/cli.js --graylog-url https://graylog.example.com --token YOUR_PAT --ssl-verify=false --debug
```

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

```
graylog-mcp/
├── src/
│   ├── cli.ts        # CLI интерфейс и точка входа
│   ├── server.ts     # MCP сервер и регистрация инструментов
│   └── graylog.ts    # API клиент для Graylog
├── dist/             # Скомпилированный код
├── package.json      # Метаданные и зависимости
└── tsconfig.json     # Конфигурация TypeScript
```

## 🔒 Безопасность

### Personal Access Token (PAT)

1. Создайте PAT в Graylog: **System → Users → [Your User] → Edit → Create Token**
2. Токен должен иметь права на чтение целевых потоков
3. Сервер автоматически пробует два формата авторизации:
   - `token:YOUR_PAT`
   - `YOUR_PAT:token`

### SSL/TLS

- **Production:** Используйте валидный CA сертификат и `--ssl-verify=true`
- **Development/Self-signed:** Используйте `--ssl-verify=false`
- **Альтернатива:** Установите `NODE_EXTRA_CA_CERTS` на путь к доверенному CA

### Рекомендации

- ✅ Используйте переменные окружения для токенов
- ✅ Не коммитьте токены в git
- ✅ Используйте минимально необходимые права для PAT
- ✅ Регулярно ротируйте токены

## 🐛 Устранение неполадок

### 401/403 ошибки
- Проверьте валидность PAT
- Убедитесь, что у токена есть права на чтение потоков
- Проверьте формат URL (должен включать протокол: `https://`)

### TLS/SSL ошибки
```bash
# Опция 1: Отключить проверку (не для production!)
--ssl-verify=false

# Опция 2: Указать CA сертификат
export NODE_EXTRA_CA_CERTS=/path/to/ca-cert.pem
```

### Нет результатов
- Попробуйте простой запрос: `query: "*"`
- Проверьте временной диапазон (увеличьте `rangeSec`)
- Убедитесь, что в выбранных потоках есть данные
- Проверьте синтаксис Lucene запроса

### Debug режим
Запустите с флагом `--debug` для диагностики:
```bash
graylog-mcp --graylog-url ... --token ... --debug
```

## 🤝 Примеры использования

### Пример 1: Поиск ошибок за последний час
```typescript
// Инструмент: graylog.search_logs
{
  query: "level:ERROR",
  rangeSec: 3600
}
```

### Пример 2: Поиск по trace ID
```typescript
// Инструмент: graylog.search_uuid
{
  uuid: "abc-123-def-456",
  rangeSec: 86400
}
```

### Пример 3: Получение логов конкретного сервиса
```typescript
// Инструмент: graylog.search_logs
{
  query: "service:auth-api AND level:WARN",
  rangeSec: 7200,
  limit: 50
}
```

### Пример 4: Поиск HTTP 5xx ошибок
```typescript
// Инструмент: graylog.search_logs
{
  query: "status:[500 TO 599]",
  rangeSec: 3600
}
```

## 📝 Примечания

- Сервер использует Graylog REST API через `/api/search/universal/relative` и `/api/streams/{id}/messages`
- Максимальное количество результатов на запрос: 500
- По умолчанию возвращается 150 записей
- Поддерживается пагинация через параметры `limit` и `offset`
- Все временные метки в UTC

## 🔗 Полезные ссылки

- [Model Context Protocol](https://modelcontextprotocol.io/)
- [Graylog API Documentation](https://go2docs.graylog.org/current/downloading_and_installing_graylog/rest_api.htm)
- [Lucene Query Syntax](https://lucene.apache.org/core/9_0_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html)

## 📄 Лицензия

MIT © Aliaksei Buzo

## 🙏 Вклад

Contributions приветствуются! Пожалуйста, создайте issue или pull request в [GitHub репозитории](https://github.com/abuzo/graylog-mcp).


Maintenance

ActivityInactive
ResponsivenessNo issues