mcp-elk
Servidor MCP para o ELK (Elasticsearch + Kibana): busca, contagem com agrupamento, consultas prontas do Kibana e exportação CSV, só de leitura nos logs. As únicas escritas são criar e atualizar busca salva no Kibana. É agnóstico: índice, campos (ex.: sistema, categoria) e consultas do projeto chegam como parâmetro.
Credenciais e servidores
| SO | Arquivo |
|---|---|
| Linux/Mac | ~/.config/mcp-elk/elk.properties |
| Windows | %APPDATA%\mcp-elk\elk.properties |
Para usar outro caminho, defina a variável de ambiente MCP_ELK_CONFIG.
[DEFAULT]
user = SEU_USUARIO
password = SUA_SENHA
prod = https://logs.SEU-SERVIDOR
homol = https://hlogs.SEU-SERVIDOR
dev = https://dlogs.SEU-SERVIDOR
prod, homol e dev são as URLs do Kibana; só prod é obrigatória. Opcionalmente, es_prod, es_homol e
es_dev são as URLs do Elasticsearch direto: quando presentes, o MCP usa as APIs REST oficiais (_search,
_field_caps, PIT). Sem elas, a busca passa pelo Kibana em POST /internal/search/es, uma API interna do Kibana e
o primeiro ponto a revalidar num upgrade.
Certificados: o MCP confia nas CAs instaladas na máquina (no Windows, as do repositório do Windows) e, se existir,
em elk-bundle.pem, na mesma pasta do elk.properties: a cadeia PEM do Kibana, quando a CA
não estiver instalada. REQUESTS_CA_BUNDLE também funciona. Se o certificado não for aceito, a tool devolve uma mensagem
dizendo onde gravar a cadeia. A sessão aceita as cifras padrão do OpenSSL, porque alguns Kibana só oferecem
AES256-SHA256, que a lista do Python exclui.
Instalação
Publicado no PyPI; requer o uv (uvx no PATH).
No cliente MCP (mcp.json):
{
"mcpServers": {
"elk": {
"type": "stdio",
"command": "uvx",
"args": ["mcp-elk@latest"],
"env": { "UV_SYSTEM_CERTS": "true" }
}
}
}
UV_SYSTEM_CERTS faz o uvx usar as CAs da máquina para baixar o pacote (proxy corporativo).
Desenvolvimento:
uv sync
uv run pytest
uv run mcp dev mcp_elk/server.py # MCP Inspector
Tools
Parâmetros comuns:
ambiente: prod/produção (padrão), homol/homologação/hml ou dev/desenvolvimento;inicio/fim:now-15mou ISO 8601.inicioé obrigatório;campo_tempo: padrão@timestamp.
| Tool | Para quê |
|---|---|
elk_buscar_logs(indice, inicio, consulta?, campos?, filtros?, limite≤100, retornar?) |
Investigar: itens achatados ({"a.b": v}), textos cortados em 2000 caracteres |
elk_contar(..., agrupar_por?, top=10) |
Dimensionar; os valores mais frequentes de um campo |
elk_exportar_csv(..., arquivo, retornar?, max_linhas=100000) |
Volume grande: pagina e grava o CSV em disco, sem passar documentos pela conversa |
elk_listar_consultas(busca?, espaco?, limite=50) |
Buscas salvas do Discover e saved queries do Kibana (todos os spaces, ou só espaco): id, espaco, tipo, titulo |
elk_obter_consulta(id, espaco?) |
Detalhes de uma consulta salva: consulta, filtros (DSL) e indice prontos para reuso |
elk_criar_consulta(titulo, indice, consulta?, campos?, filtros?, colunas?, descricao?, espaco=default, linguagem=kuery) |
Cria uma busca salva do Discover ligada ao data view de indice no espaco: campos/filtros viram filtros (pílulas), consulta vai na barra de busca (kuery ou lucene) |
elk_atualizar_consulta(id, espaco=default, titulo?, indice?, consulta?, campos?, filtros?, colunas?, descricao?, linguagem?) |
Atualiza uma busca salva: troca só o informado (campos/filtros substituem todos os filtros) e preserva ordenação, período e layout do Kibana |
elk_listar_indices(busca?, espaco?) |
Data views (padrão de índice e campo de tempo) |
elk_listar_campos(indice, busca?) |
Campos, tipo e se são agregáveis |
consultaé Lucene (query_string):campo:valor AND msg:*timeout*. O KQL do Kibana é convertido no navegador e o ES 8.15 não o entende. Por isso o MCP passaand/or/notpara maiúsculas fora de aspas: sem isso,a: x and b: yvirava OR e trazia centenas de vezes mais documentos. Comparações KQL (campo > 0,campo >= 10) viramcampo:>0.campo:{...}aninhado continua sem suporte.campos= filtros exatos{campo: valor}(term); valor com*virawildcard({"sistema.nome": "app*"}pegaapp,app-worker,app_batch).filtros= Query DSL crua.- Exportação: com ES direto, usa PIT +
search_after(consistente). Só com o Kibana, usasearch_afterporcampo_tempoe descarta os_idrepetidos na virada da página. Com documentos demais no mesmo timestamp, dá erro e pedees_<ambiente>. A página cresce para acomodar os documentos repetidos, e o erro só aparece quando passa de 10.000 documentos no mesmo timestamp.
Metadata
Release files for mcp-elk 1.0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mcp_elk-1.0.3.tar.gz | 17.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcp_elk-1.0.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.2 kB
Release files / mcp_elk-1.0.3.tar.gz
| Download URL | mcp_elk-1.0.3.tar.gz |
|---|---|
| Size | 17.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b2f42c55011bbf55f13dcbdd7e511dbb562f10318726605eb2a191cdf5cdb9dc
|
|
BLAKE2b-256 checksum How to use checksums |
69afe567dd59384546417448294ed93d265e368fb07eaed960b81f91da6cdc4b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.22
|
Release files / mcp_elk-1.0.3-py3-none-any.whl
| Download URL | mcp_elk-1.0.3-py3-none-any.whl |
|---|---|
| Size | 15.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
69ccc2b79ce39c2df9eab4796d53522727925b662fb921537f1b2136819b1c42
|
|
BLAKE2b-256 checksum How to use checksums |
7a2ceafc47774b143d4976f0164bd62a215874aa002301dddde380b292170553
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.22
|