Skip to main content
Glama
OpenSearch Logs MCP Server

OpenSearch Logs MCP Server

MCP-сервер журналов OpenSearch

MCP-сервер (Model Context Protocol) для запроса журналов OpenTelemetry в OpenSearch. Поддерживает среды разработки (dev) и производства (prod).

Архитектура

Сервер следует принципам SOLID и Clean Architecture:

src/
├── index.ts                     # Entry point
├── server.ts                    # MCP Server setup
├── config/
│   └── environments.ts          # Environment configuration
├── types/
│   └── index.ts                 # Type definitions
├── services/
│   ├── opensearch-client.ts     # HTTP client for OpenSearch
│   └── log-search.service.ts    # Business logic
├── tools/
│   ├── tool-definitions.ts      # Tool schemas
│   └── tool-handlers.ts         # Tool execution
└── utils/
    ├── query-builder.ts         # Query construction (Builder pattern)
    └── time-range.ts            # Time utilities

Примененные принципы

  • Single Responsibility (SRP): Каждый модуль имеет единственную ответственность

  • Open/Closed (OCP): Легко добавлять новые инструменты без изменения существующего кода

  • Dependency Inversion (DIP): Сервисы зависят от абстракций (интерфейсов)

  • Builder Pattern: QueryBuilder для гибкого построения запросов

Related MCP server: datadog-logs-mcp

Установка

cd Tools/mcp-opensearch-logs
npm install
npm run build

Настройка в Cursor

Добавьте это в свою конфигурацию Cursor (~/.cursor/mcp.json):

{
  "mcpServers": {
    "opensearch-logs": {
      "command": "node",
      "args": ["/ruta/al/proyecto/Tools/mcp-opensearch-logs/dist/index.js"],
      "env": {
        "OPENSEARCH_DEV_USERNAME": "tu-usuario-dev",
        "OPENSEARCH_DEV_PASSWORD": "tu-password-dev",
        "OPENSEARCH_PROD_USERNAME": "tu-usuario-prod",
        "OPENSEARCH_PROD_PASSWORD": "tu-password-prod"
      }
    }
  }
}

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

search_logs

Свободный поиск с использованием синтаксиса Lucene.

Параметр

Тип

Обязательный

Описание

environment

dev

prod

✅

Среда для запроса

query

string

✅

Запрос в синтаксисе Lucene

timeRange

15m

1h

6h

24h

7d

❌

Временной диапазон (по умолчанию: 1h)

size

number

❌

Максимальное количество результатов (по умолчанию: 50, макс: 200)

Примеры:

  • "Найди журналы, содержащие 'error' в dev за последний час"

  • "Найди журналы со статусом 500 в prod за последние 6 часов"

search_by_trace

Поиск всех журналов для конкретной трассировки OpenTelemetry.

Параметр

Тип

Обязательный

Описание

environment

dev

prod

✅

Среда для запроса

traceId

string

✅

ID трассировки

size

number

❌

Максимальное количество результатов (по умолчанию: 100)

Пример:

  • "Дай мне все журналы для трассировки abc123 в dev"

search_by_service

Фильтрация журналов по имени сервиса.

Параметр

Тип

Обязательный

Описание

environment

dev

prod

✅

Среда для запроса

serviceName

string

✅

Имя сервиса

level

DEBUG

INFO

WARN

ERROR

FATAL

❌

Уровень журнала

query

string

❌

Дополнительный запрос

timeRange

string

❌

Временной диапазон

size

number

❌

Максимальное количество результатов

Примеры:

  • "Найди журналы сервиса stori-ios в prod"

  • "Дай мне ошибки сервиса stori-ios в dev"

search_errors

Поиск журналов уровня ERROR или выше (severityNumber >= 17).

Параметр

Тип

Обязательный

Описание

environment

dev

prod

✅

Среда для запроса

serviceName

string

❌

Фильтр по сервису

query

string

❌

Дополнительный запрос

timeRange

string

❌

Временной диапазон

size

number

❌

Максимальное количество результатов

Примеры:

  • "Дай мне ошибки за последний час в prod"

  • "Найди ошибки, связанные с KYC в dev"

get_field_values

Получение наиболее распространенных значений поля (агрегация).

Параметр

Тип

Обязательный

Описание

environment

dev

prod

✅

Среда для запроса

field

string

✅

Поле для агрегации

size

number

❌

Максимальное количество уникальных значений (по умолчанию: 20)

Примеры:

  • "Какие значения имеет поле 'event' в prod?"

  • "Дай мне самые распространенные типы ошибок в dev"

search_by_field

Поиск по конкретному полю и значению.

Параметр

Тип

Обязательный

Описание

environment

dev

prod

✅

Среда для запроса

field

string

✅

Имя поля

value

string

✅

Значение для поиска

timeRange

string

❌

Временной диапазон

size

number

❌

Максимальное количество результатов

Пример:

  • "Найди журналы с transactionId=abc123 в prod"

get_mapping

Получение маппинга полей индекса.

Параметр

Тип

Обязательный

Описание

environment

dev

prod

✅

Среда для запроса

Пример:

  • "Какие поля доступны в журналах prod?"

get_sample_log

Получение примера журнала для просмотра структуры.

Параметр

Тип

Обязательный

Описание

environment

dev

prod

✅

Среда для запроса

Пример:

  • "Дай мне пример журнала из prod, чтобы увидеть структуру"

Синтаксис поиска Lucene

Поле query поддерживает полный синтаксис Lucene:

Синтаксис

Описание

Пример

термин

Поиск в любом поле

error

поле:значение

Поиск в конкретном поле

event:kyc_error

поле:*значение*

Wildcard

errorMessage:*timeout*

AND

Оба термина

error AND authentication

OR

Любой из терминов

error OR warning

NOT

Исключить термин

NOT debug

[a TO b]

Диапазон

statusCode:[400 TO 499]

"точная фраза"

Точное совпадение

"connection refused"

Временные диапазоны

Значение

Описание

15m

Последние 15 минут

1h

Последний час (по умолчанию)

6h

Последние 6 часов

24h

Последние 24 часа

7d

Последние 7 дней

Разработка

# Desarrollo con watch mode
npm run dev

# Build
npm run build

# Lint
npm run lint

Структура журналов OpenTelemetry

Журналы следуют схеме OpenTelemetry:

{
  "time": "2024-01-15T10:30:00.000Z",
  "severityText": "ERROR",
  "severityNumber": 17,
  "body": "Error message",
  "attributes": {
    "event": "kyc_error",
    "kycFlow": "creditL1",
    "transactionId": "abc123"
  },
  "resource": {
    "service.name": "stori-ios",
    "service.version": "1.0.0"
  }
}

Available Tools

8 tools
get_field_valuesB

Get the most common values for a specific field. Useful for discovering available services, log levels, or other field values.

NameRequiredDescriptionDefault
environmentYesEnvironment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android)
fieldYesThe field to get values for. Examples: 'service.name', 'level', 'host.name'
sizeNoMaximum number of unique values to return (default: 20)
get_mappingA

Get the field mapping for the index. Useful for discovering available fields and their types.

NameRequiredDescriptionDefault
environmentYesEnvironment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android)
get_sample_logB

Get a single sample log entry to see the structure and available fields.

NameRequiredDescriptionDefault
environmentYesEnvironment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android)
search_by_fieldC

Search logs by a specific field and value.

NameRequiredDescriptionDefault
environmentYesEnvironment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android)
fieldYesThe field name to search. Examples: 'user_id', 'request_id', 'endpoint'
valueYesThe value to search for
timeRangeNoTime range to search within
sizeNoMaximum number of results to return (default: 50)
search_by_serviceC

Search logs filtered by service name, optionally with additional filters.

NameRequiredDescriptionDefault
environmentYesEnvironment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android)
serviceNameYesThe service name to filter by
levelNoLog level to filter by
queryNoAdditional free-text query to apply
timeRangeNoTime range to search within
sizeNoMaximum number of results to return (default: 50)
search_by_traceA

Search logs by OpenTelemetry trace ID to see all logs related to a specific request/transaction.

NameRequiredDescriptionDefault
environmentYesEnvironment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android)
traceIdYesThe OpenTelemetry trace ID to search for
sizeNoMaximum number of results to return (default: 100)
search_errorsC

Search for error logs, optionally filtered by service or additional query.

NameRequiredDescriptionDefault
environmentYesEnvironment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android)
serviceNameNoOptional service name to filter by
queryNoAdditional free-text query to apply
timeRangeNoTime range to search within (default: 1h)
sizeNoMaximum number of results to return (default: 50)
search_logsA

Search OpenSearch logs with a free-text query. Supports Lucene query syntax. Examples: 'error AND authentication', 'status:500', 'message:timeout'

NameRequiredDescriptionDefault
environmentYesEnvironment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android)
queryYesFree-text search query using Lucene syntax. Examples: 'error', 'status:500 AND service.name:auth'
timeRangeNoTime range to search within. Defaults to 1h if not specified.
sizeNoMaximum number of results to return (default: 50, max: 200)

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv1.0.0
    • First observedget_field_values
    • First observedget_mapping
    • First observedget_sample_log
    • First observedsearch_by_field
    • First observedsearch_by_service
    • First observedsearch_by_trace
    • First observedsearch_errors
    • First observedsearch_logs

TDQS

A3.5/5.0

Scored across 8 tools

Disambiguation4/5

Most tools have distinct purposes, but there is some overlap between search_by_field, search_by_service, search_errors, and search_logs, which could cause confusion about which to use for specific filtering needs. However, the descriptions clarify their specialized roles, such as search_by_service for service filtering and search_errors for error-specific queries, reducing ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with snake_case, such as get_field_values, search_by_trace, and search_logs. This uniformity makes the tool set predictable and easy to understand, enhancing usability for agents.

Tool Count5/5

With 8 tools, the server is well-scoped for log analysis in OpenSearch, covering essential operations like discovery (get_field_values, get_mapping, get_sample_log) and various search methods. Each tool serves a clear purpose without feeling excessive or insufficient for the domain.

Completeness4/5

The tool set provides strong coverage for log querying and discovery, including field analysis, sample inspection, and multiple search types. A minor gap is the lack of tools for log management operations like deleting or exporting logs, but core workflows for analysis are well-supported.

Maintenance

ActivityInactive
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables querying and searching logs from Kibana (ELK stack) via MCP, with support for project-based data views, trace ID correlation, and log expansion.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to search and analyze SAP Commerce Cloud (CCv2) runtime logs via OpenSearch Dashboards using a session cookie, providing read-only tools for full-text search and error aggregation.
    3
    MIT