Skip to main content
Glama
OpenSearch Logs MCP Server

OpenSearch Logs MCP Server

OpenSearch Logs MCP Server

MCP (Model Context Protocol) server for querying OpenTelemetry logs in OpenSearch. Supports development (dev) and production (prod) environments.

Architecture

The server follows SOLID principles and 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

Applied Principles

  • Single Responsibility (SRP): Each module has a single responsibility

  • Open/Closed (OCP): Easy to add new tools without modifying existing code

  • Dependency Inversion (DIP): Services depend on abstractions (interfaces)

  • Builder Pattern: QueryBuilder for fluent query construction

Related MCP server: datadog-logs-mcp

Installation

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

Configuration in Cursor

Add this to your Cursor configuration (~/.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"
      }
    }
  }
}

Available Tools

search_logs

Free-text search with Lucene syntax.

Parameter

Type

Required

Description

environment

dev

prod

✅

Environment to query

query

string

✅

Query in Lucene syntax

timeRange

15m

1h

6h

24h

7d

❌

Time range (default: 1h)

size

number

❌

Maximum results (default: 50, max: 200)

Examples:

  • "Search for logs containing 'error' in dev from the last hour"

  • "Search for logs with status 500 in prod from the last 6 hours"

search_by_trace

Search all logs for an OpenTelemetry trace.

Parameter

Type

Required

Description

environment

dev

prod

✅

Environment to query

traceId

string

✅

Trace ID

size

number

❌

Maximum results (default: 100)

Example:

  • "Give me all logs for trace abc123 in dev"

search_by_service

Filter logs by service name.

Parameter

Type

Required

Description

environment

dev

prod

✅

Environment to query

serviceName

string

✅

Service name

level

DEBUG

INFO

WARN

ERROR

FATAL

❌

Log level

query

string

❌

Additional query

timeRange

string

❌

Time range

size

number

❌

Maximum results

Examples:

  • "Search for logs from the stori-ios service in prod"

  • "Give me errors from the stori-ios service in dev"

search_errors

Search for logs with level ERROR or higher (severityNumber >= 17).

Parameter

Type

Required

Description

environment

dev

prod

✅

Environment to query

serviceName

string

❌

Filter by service

query

string

❌

Additional query

timeRange

string

❌

Time range

size

number

❌

Maximum results

Examples:

  • "Give me errors from the last hour in prod"

  • "Search for errors related to KYC in dev"

get_field_values

Get the most common values for a field (aggregation).

Parameter

Type

Required

Description

environment

dev

prod

✅

Environment to query

field

string

✅

Field to aggregate

size

number

❌

Maximum unique values (default: 20)

Examples:

  • "What values does the 'event' field have in prod?"

  • "Give me the most common error types in dev"

search_by_field

Search by a specific field and value.

Parameter

Type

Required

Description

environment

dev

prod

✅

Environment to query

field

string

✅

Field name

value

string

✅

Value to search

timeRange

string

❌

Time range

size

number

❌

Maximum results

Example:

  • "Search for logs with transactionId=abc123 in prod"

get_mapping

Get the index field mapping.

Parameter

Type

Required

Description

environment

dev

prod

✅

Environment to query

Example:

  • "What fields are available in the prod logs?"

get_sample_log

Get a sample log to see the structure.

Parameter

Type

Required

Description

environment

dev

prod

✅

Environment to query

Example:

  • "Give me a sample log from prod to see the structure"

Lucene Search Syntax

The query field supports full Lucene syntax:

Syntax

Description

Example

term

Search in any field

error

field:value

Search in specific field

event:kyc_error

field:*value*

Wildcard

errorMessage:*timeout*

AND

Both terms

error AND authentication

OR

Either term

error OR warning

NOT

Exclude term

NOT debug

[a TO b]

Range

statusCode:[400 TO 499]

"exact phrase"

Exact match

"connection refused"

Time Ranges

Value

Description

15m

Last 15 minutes

1h

Last hour (default)

6h

Last 6 hours

24h

Last 24 hours

7d

Last 7 days

Development

# Desarrollo con watch mode
npm run dev

# Build
npm run build

# Lint
npm run lint

OpenTelemetry Log Structure

Logs follow the OpenTelemetry schema:

{
  "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