OpenSearch Logs MCP Server
Enables querying OpenTelemetry logs stored in OpenSearch across development and production environments. Provides tools for searching logs by various criteria including free-text Lucene queries, trace IDs, service names, error levels, and specific fields.
README
OpenSearch Logs MCP Server
MCP (Model Context Protocol) server para consultar logs de OpenTelemetry en OpenSearch. Soporta ambientes de desarrollo (dev) y producción (prod).
Arquitectura
El servidor sigue los principios SOLID y 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
Principios Aplicados
- Single Responsibility (SRP): Cada módulo tiene una única responsabilidad
- Open/Closed (OCP): Fácil agregar nuevas herramientas sin modificar código existente
- Dependency Inversion (DIP): Los servicios dependen de abstracciones (interfaces)
- Builder Pattern:
QueryBuilderpara construcción fluida de queries
Instalación
cd Tools/mcp-opensearch-logs
npm install
npm run build
Configuración en Cursor
Agrega esto a tu configuración de 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"
}
}
}
}
Herramientas Disponibles
search_logs
Búsqueda libre con sintaxis Lucene.
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| environment | dev | prod |
✅ | Ambiente a consultar |
| query | string | ✅ | Query en sintaxis Lucene |
| timeRange | 15m | 1h | 6h | 24h | 7d |
❌ | Rango de tiempo (default: 1h) |
| size | number | ❌ | Máximo de resultados (default: 50, max: 200) |
Ejemplos:
- "Busca logs que contengan 'error' en dev de la última hora"
- "Busca logs con status 500 en prod de las últimas 6 horas"
search_by_trace
Busca todos los logs de un trace de OpenTelemetry.
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| environment | dev | prod |
✅ | Ambiente a consultar |
| traceId | string | ✅ | ID del trace |
| size | number | ❌ | Máximo de resultados (default: 100) |
Ejemplo:
- "Dame todos los logs del trace abc123 en dev"
search_by_service
Filtra logs por nombre de servicio.
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| environment | dev | prod |
✅ | Ambiente a consultar |
| serviceName | string | ✅ | Nombre del servicio |
| level | DEBUG | INFO | WARN | ERROR | FATAL |
❌ | Nivel de log |
| query | string | ❌ | Query adicional |
| timeRange | string | ❌ | Rango de tiempo |
| size | number | ❌ | Máximo de resultados |
Ejemplos:
- "Busca logs del servicio stori-ios en prod"
- "Dame los errores del servicio stori-ios en dev"
search_errors
Busca logs de nivel ERROR o superior (severityNumber >= 17).
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| environment | dev | prod |
✅ | Ambiente a consultar |
| serviceName | string | ❌ | Filtrar por servicio |
| query | string | ❌ | Query adicional |
| timeRange | string | ❌ | Rango de tiempo |
| size | number | ❌ | Máximo de resultados |
Ejemplos:
- "Dame los errores de la última hora en prod"
- "Busca errores relacionados con KYC en dev"
get_field_values
Obtiene los valores más comunes de un campo (agregación).
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| environment | dev | prod |
✅ | Ambiente a consultar |
| field | string | ✅ | Campo a agregar |
| size | number | ❌ | Máximo de valores únicos (default: 20) |
Ejemplos:
- "Qué valores tiene el campo 'event' en prod?"
- "Dame los tipos de error más comunes en dev"
search_by_field
Busca por un campo y valor específico.
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| environment | dev | prod |
✅ | Ambiente a consultar |
| field | string | ✅ | Nombre del campo |
| value | string | ✅ | Valor a buscar |
| timeRange | string | ❌ | Rango de tiempo |
| size | number | ❌ | Máximo de resultados |
Ejemplo:
- "Busca logs con transactionId=abc123 en prod"
get_mapping
Obtiene el mapeo de campos del índice.
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| environment | dev | prod |
✅ | Ambiente a consultar |
Ejemplo:
- "Qué campos están disponibles en los logs de prod?"
get_sample_log
Obtiene un log de ejemplo para ver la estructura.
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| environment | dev | prod |
✅ | Ambiente a consultar |
Ejemplo:
- "Dame un ejemplo de log de prod para ver la estructura"
Sintaxis de Búsqueda Lucene
El campo query soporta sintaxis Lucene completa:
| Sintaxis | Descripción | Ejemplo |
|---|---|---|
término |
Busca en cualquier campo | error |
campo:valor |
Busca en campo específico | event:kyc_error |
campo:*valor* |
Wildcard | errorMessage:*timeout* |
AND |
Ambos términos | error AND authentication |
OR |
Cualquier término | error OR warning |
NOT |
Excluye término | NOT debug |
[a TO b] |
Rango | statusCode:[400 TO 499] |
"frase exacta" |
Match exacto | "connection refused" |
Rangos de Tiempo
| Valor | Descripción |
|---|---|
15m |
Últimos 15 minutos |
1h |
Última hora (default) |
6h |
Últimas 6 horas |
24h |
Últimas 24 horas |
7d |
Últimos 7 días |
Desarrollo
# Desarrollo con watch mode
npm run dev
# Build
npm run build
# Lint
npm run lint
Estructura de Logs OpenTelemetry
Los logs siguen el esquema 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"
}
}
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.