Connects Claude to Kibana and Elasticsearch for read-only log analysis. Hits the Elasticsearch REST API directly for searches and aggregations, or falls back to the Kibana Console proxy if you don't expose ES. Five tools: list indices, search logs with time ranges and full-text queries, run term aggregations with metrics like avg or sum, and browse saved dashboards. Supports API key auth (recommended) or basic auth. All responses include both structured JSON and markdown, so it works across MCP clients. Useful when you need Claude to dig through logs, compare error rates across services, or find the right dashboard without opening the Kibana UI yourself.
MCP server for Kibana / Elasticsearch — log search, aggregations, index discovery, and dashboard browsing via Claude and any MCP-compatible agent.
Existing integrations require a running Kibana instance with browser-level credentials and often wrap the Kibana UI rather than the stable REST APIs. This server:
outputSchema) and markdown text so it works with any MCP clientreadOnlyHint: true, no data is modified| Tool | API | Description |
|---|---|---|
kibana_list_indices | GET ES/_cat/indices | Discover available indices with health, docs, size |
kibana_search_logs | POST ES/{index}/_search | Full-text log search with time range, sort, size |
kibana_aggregate_logs | POST ES/{index}/_search | Terms grouping with count/avg/sum/min/max metric |
kibana_list_dashboards | GET Kibana/api/saved_objects/_find | List saved dashboards with search + pagination |
kibana_get_dashboard | GET Kibana/api/saved_objects/dashboard/{id} | Fetch one dashboard with panel breakdown |
pip install kibana-mcp
Or run directly with uvx:
uvx kibana-mcp
| Variable | Required | Description |
|---|---|---|
KIBANA_URL | Yes | Kibana base URL (e.g. https://kibana.example.com) |
ELASTICSEARCH_URL | No | Direct ES endpoint. If unset, ES requests go through Kibana Console proxy |
KIBANA_API_KEY | No | ES API key (ApiKey base64(id:api_key) format). Recommended for agents |
KIBANA_USERNAME | No | HTTP Basic auth username (used if API key not set) |
KIBANA_PASSWORD | No | HTTP Basic auth password |
KIBANA_SSL_VERIFY | No | true (default) or false for self-signed certificates |
Auth priority: ApiKey > Basic > anonymous.
Copy .env.example to .env and fill in your values.
{
"mcpServers": {
"kibana": {
"command": "uvx",
"args": ["kibana-mcp"],
"env": {
"KIBANA_URL": "https://kibana.example.com",
"KIBANA_API_KEY": "your-api-key-here"
}
}
}
}
Or with direct ES access for better performance:
{
"mcpServers": {
"kibana": {
"command": "uvx",
"args": ["kibana-mcp"],
"env": {
"KIBANA_URL": "https://kibana.example.com",
"ELASTICSEARCH_URL": "https://es.example.com:9200",
"KIBANA_API_KEY": "your-api-key-here"
}
}
}
}
docker run --rm -i \
-e KIBANA_URL=https://kibana.example.com \
-e KIBANA_API_KEY=your-key \
ghcr.io/mshegolev/kibana-mcp
Find the last 50 ERROR logs from the API service in the last hour
→ kibana_search_logs(index="logs-*", query="level:ERROR AND service:api", size=50, time_from="2026-04-18T09:00:00Z")
Show 500 HTTP errors sorted oldest first for incident replay
→ kibana_search_logs(index="nginx-*", query="status:500", sort_order="asc", size=100)
How many logs per log level in the last hour?
→ kibana_aggregate_logs(index="logs-*", group_by="level", time_from="2026-04-18T09:00:00Z")
What is the average response time per service?
→ kibana_aggregate_logs(index="logs-*", group_by="service.keyword", metric="avg", metric_field="response_time_ms")
What log indices are available?
→ kibana_list_indices()
Show me all filebeat indices
→ kibana_list_indices(pattern="filebeat-*")
Find the infrastructure dashboard
→ kibana_list_dashboards(search="infrastructure")
What panels does dashboard X have?
→ kibana_get_dashboard(dashboard_id="<id from list_dashboards>")
kibana_search_logs): typically 50-500ms with direct ES URL; add 100-200ms when routing through Kibana Console proxykibana_aggregate_logs): size:0 queries — no hits transferred, usually 10-100ms_cat/indices call, O(index_count) response, typically <100msELASTICSEARCH_URL directly if your agent does frequent log searches — eliminates the proxy overheadgit clone https://github.com/mshegolev/kibana-mcp
cd kibana-mcp
pip install -e '.[dev]'
pytest tests/ -v
ruff check src tests
ruff format src tests
MIT — see LICENSE.
KIBANA_URL*Kibana base URL (e.g. https://kibana.example.com)
ELASTICSEARCH_URLDirect Elasticsearch URL. If unset, ES requests route through the Kibana Console proxy.
KIBANA_API_KEYsecretElasticsearch API key (ApiKey base64(id:api_key) format). Takes priority over Basic auth.
KIBANA_USERNAMEHTTP Basic auth username. Used only when KIBANA_API_KEY is not set.
KIBANA_PASSWORDsecretHTTP Basic auth password.
KIBANA_SSL_VERIFYdefault: trueVerify SSL certificates (true/false). Set to 'false' for self-signed certs.
hovecapital/read-only-local-postgres-mcp-server
cocaxcode/database-mcp
io.github.infoinlet-marketplace/mcp-mysql
io.github.cybeleri/database-admin
io.github.yash-0620/postgres-mcp-secured