OpenSearch Logs MCP Server
Provides tools for querying OpenTelemetry logs stored in OpenSearch, supporting search by Lucene syntax, trace ID, service name, error levels, field values, and index mapping across development and production environments.
Enables querying and analysis of OpenTelemetry log data, including structured logs with attributes, resource information, and trace-based correlation for distributed tracing workflows.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@OpenSearch Logs MCP Serversearch errors in prod from the last hour"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 utilitiesApplied 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:
QueryBuilderfor fluent query construction
Related MCP server: datadog-logs-mcp
Installation
cd Tools/mcp-opensearch-logs
npm install
npm run buildConfiguration 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 |
|
| ✅ | Environment to query | |||
query | string | ✅ | Query in Lucene syntax | ||||
timeRange |
|
|
|
|
| ❌ | 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 |
|
| ✅ | 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 |
|
| ✅ | Environment to query | |||
serviceName | string | ✅ | Service name | ||||
level |
|
|
|
|
| ❌ | 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 |
|
| ✅ | 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 |
|
| ✅ | 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 |
|
| ✅ | 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 |
|
| ✅ | 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 |
|
| ✅ | 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 |
| Search in any field |
|
| Search in specific field |
|
| Wildcard |
|
| Both terms |
|
| Either term |
|
| Exclude term |
|
| Range |
|
| Exact match |
|
Time Ranges
Value | Description |
| Last 15 minutes |
| Last hour (default) |
| Last 6 hours |
| Last 24 hours |
| Last 7 days |
Development
# Desarrollo con watch mode
npm run dev
# Build
npm run build
# Lint
npm run lintOpenTelemetry 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 toolsget_field_valuesB
Get the most common values for a specific field. Useful for discovering available services, log levels, or other field values.
| Name | Required | Description | Default |
|---|---|---|---|
| environment | Yes | Environment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android) | |
| field | Yes | The field to get values for. Examples: 'service.name', 'level', 'host.name' | |
| size | No | Maximum 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.
| Name | Required | Description | Default |
|---|---|---|---|
| environment | Yes | Environment 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.
| Name | Required | Description | Default |
|---|---|---|---|
| environment | Yes | Environment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android) |
search_by_fieldC
Search logs by a specific field and value.
| Name | Required | Description | Default |
|---|---|---|---|
| environment | Yes | Environment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android) | |
| field | Yes | The field name to search. Examples: 'user_id', 'request_id', 'endpoint' | |
| value | Yes | The value to search for | |
| timeRange | No | Time range to search within | |
| size | No | Maximum number of results to return (default: 50) |
search_by_serviceC
Search logs filtered by service name, optionally with additional filters.
| Name | Required | Description | Default |
|---|---|---|---|
| environment | Yes | Environment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android) | |
| serviceName | Yes | The service name to filter by | |
| level | No | Log level to filter by | |
| query | No | Additional free-text query to apply | |
| timeRange | No | Time range to search within | |
| size | No | Maximum 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.
| Name | Required | Description | Default |
|---|---|---|---|
| environment | Yes | Environment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android) | |
| traceId | Yes | The OpenTelemetry trace ID to search for | |
| size | No | Maximum number of results to return (default: 100) |
search_errorsC
Search for error logs, optionally filtered by service or additional query.
| Name | Required | Description | Default |
|---|---|---|---|
| environment | Yes | Environment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android) | |
| serviceName | No | Optional service name to filter by | |
| query | No | Additional free-text query to apply | |
| timeRange | No | Time range to search within (default: 1h) | |
| size | No | Maximum 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'
| Name | Required | Description | Default |
|---|---|---|---|
| environment | Yes | Environment to search: 'dev'/'prod' (iOS) or 'android-dev'/'android-prod' (Android) | |
| query | Yes | Free-text search query using Lucene syntax. Examples: 'error', 'status:500 AND service.name:auth' | |
| timeRange | No | Time range to search within. Defaults to 1h if not specified. | |
| size | No | Maximum number of results to return (default: 50, max: 200) |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v1.0.0- First observed
get_field_values - First observed
get_mapping - First observed
get_sample_log - First observed
search_by_field - First observed
search_by_service - First observed
search_by_trace - First observed
search_errors - First observed
search_logs
TDQS
Scored across 8 tools
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.
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.
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.
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
Related MCP Connectors
Ingest and search LogsLoom logs from coding agents.
Read-only access to Auralogs production logs: search logs, inspect errors, review AI analyses.
Open-source agent that observes and fixes your application. Query logs, traces, metrics, incidents.
Read LogBrew errors, slow traces, logs, and product analytics, and triage issues with consent.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables searching and analyzing AWS CloudWatch logs with support for configurable log groups, time-based searches, and service-specific log stream filtering.5MIT
- AlicenseAqualityDmaintenanceEnables querying and analyzing Datadog logs through search, aggregation, and index listing.313 npmMIT
- FlicenseNot gradedqualityCmaintenanceEnables querying and searching logs from Kibana (ELK stack) via MCP, with support for project-based data views, trace ID correlation, and log expansion.-
- AlicenseAqualityAmaintenanceEnables 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.3MIT