Log-MCP
Log-MCP é um serviço remoto de consulta de logs baseado no Model Context Protocol (MCP), que se conecta a servidores remotos via SSH para fornecer capacidade de consulta de logs para assistentes de IA como o Claude Code. O projeto suporta dois modos de transporte, HTTP e STDIO, podendo ser facilmente integrado a diversos ambientes de desenvolvimento.
Documentação
Log-MCP
Introdução
Log-MCP é um serviço de consulta de logs remotos baseado no Model Context Protocol (MCP), que se conecta a servidores remotos via SSH, fornecendo capacidade de consulta de logs para assistentes de IA como o Claude Code. O projeto suporta dois modos de transporte: HTTP e STDIO, podendo ser facilmente integrado a diversos ambientes de desenvolvimento.
Principais Recursos
- Suporte a múltiplos servidores - Suporta a configuração de vários servidores remotos, gerenciando consultas de logs de forma unificada
- Pool de conexões SSH - Gerenciamento eficiente de pool de conexões SSH, com suporte a reutilização de conexões e reconexão automática
- Múltiplas operações de log - Suporta listar arquivos de log, ler conteúdo de logs, pesquisar logs e visualizar o final dos logs em tempo real
- Modos de transporte flexíveis - Suporta dois modos de transporte: HTTP e STDIO, adaptando-se a diferentes cenários de uso
- Garantia de segurança - Múltiplos mecanismos de segurança, como validação de parâmetros, validação de caminhos e escape de Shell
- Filtro por nível de log - Suporta filtragem de consultas por nível de log (info, warn, error, debug)
- Pesquisa com expressões regulares - Suporta pesquisa de conteúdo de logs usando expressões regulares
- Exibição de linhas de contexto - Os resultados da pesquisa podem exibir o conteúdo de contexto das linhas correspondentes
Princípios de Implementação e Tecnologias-Chave
- Protocolo MCP - Implementa a especificação do Model Context Protocol, fornecendo uma interface padronizada de chamada de ferramentas
- Apache MINA SSHD - Implementa conexão SSH e execução de comandos com base no Apache MINA SSHD
- Tecnologia de pool de conexões - Usa Apache Commons Pool2 para gerenciamento do pool de conexões SSH
- Modo de transporte duplo - Suporta Undertow HTTP Server e STDIO como métodos de transporte
- JSON-RPC 2.0 - Processamento de requisições e respostas baseado no protocolo JSON-RPC 2.0
Ambiente de Execução
- JDK 21+
- Maven 3.6+
- Arquivo de chave privada SSH (para conectar ao servidor remoto)
Início Rápido
1. Construir o Projeto
cd log-mcp
mvn clean package
Após a construção, o arquivo log-mcp-1.0.0.jar será gerado no diretório target.
2. Configurar Informações do Servidor
Edite o arquivo src/main/resources/config.json para configurar as informações do servidor remoto:
{
"servers": [
{
"name": "local-server",
"host": "192.168.5.169",
"port": 22,
"username": "root",
"privateKeyPath": "${ssh.cert.path}",
"logRootPath": "/home/docker/logs/fantomfite-admin/",
"description": "169测试服务器",
"default": true
}
],
"logLevels": ["info", "warn", "error", "debug"],
"logFilePattern": "{level}/log-{level}-{date}.{seq}.log"
}
3. Configurar Autenticação SSH
O Log-MCP atualmente suporta autenticação via arquivo de chave privada SSH para conectar a servidores remotos.
Autenticação com Chave Privada SSH
- Gere um par de chaves SSH (se ainda não tiver):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- Adicione a chave pública ao servidor remoto:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.5.169
Ou adicione manualmente o conteúdo da chave pública ao arquivo ~/.ssh/authorized_keys no servidor remoto.
- Garanta que as permissões do arquivo de chave privada estejam corretas:
chmod 600 ~/.ssh/id_rsa
- Verifique a conexão SSH:
ssh -i ~/.ssh/id_rsa root@192.168.5.169
Observações:
- O caminho do arquivo de chave privada é especificado no arquivo de configuração pelo campo
privateKeyPath - Suporta o uso de variáveis de ambiente, como
${ssh.cert.path} - Garanta que o formato do arquivo de chave privada esteja correto (suporta formatos OpenSSH e PEM)
- Atualmente não suporta autenticação por senha, apenas autenticação por arquivo de chave privada
4. Adicionar o Serviço MCP
Método 1: Modo STDIO (Recomendado)
claude mcp add log-mcp-stdio java -- \
-Dssh.cert.path=/Users/jianyingcai/id_rsa \
-Dlog.config=/Users/jianyingcai/IdeaProjects/mcp/log-mcp/target/classes/config.json \
-jar /Users/jianyingcai/IdeaProjects/mcp/log-mcp/target/log-mcp-1.0.0.jar
Método 2: Modo HTTP
Primeiro, inicie o serviço HTTP:
java -Dtransport.mode=http \
-Dserver.port=8892 \
-Dssh.cert.path=/Users/jianyingcai/id_rsa \
-Dlog.config=/Users/jianyingcai/IdeaProjects/mcp/log-mcp/target/classes/config.json \
-jar target/log-mcp-1.0.0.jar
Depois, adicione o serviço MCP:
claude mcp add --transport http log-mcp http://127.0.0.1:8892/mcp
5. Verificar a Instalação
cat ~/.claude.json | grep 'log-mcp' -C 5
Ferramentas Disponíveis
O Log-MCP fornece as seguintes ferramentas para uso pelos assistentes de IA:
list_servers
Lista as informações de todos os servidores configurados.
Exemplo de retorno:
{
"servers": [
{
"name": "local-server",
"host": "192.168.5.169",
"description": "169测试服务器",
"status": "connected"
}
]
}
list_log_files
Lista os arquivos de log no servidor especificado.
Parâmetros:
server(opcional): Nome do servidor de destinolevel(opcional): Filtro por nível de logstartDate(opcional): Data de início (YYYY-MM-DD)endDate(opcional): Data de término (YYYY-MM-DD)
Exemplo de retorno:
{
"server": "local-server",
"files": [
{
"path": "error/log-error-2026-05-04.0.log",
"size": "4.3KB",
"level": "error",
"lastModified": "2026-05-04 04:22:28"
}
],
"totalFiles": 1
}
read_log_file
Lê o conteúdo de um arquivo de log especificado.
Parâmetros:
filePath(obrigatório): Caminho relativo do arquivo de logserver(opcional): Nome do servidor de destinostartLine(opcional): Número da linha inicialendLine(opcional): Número da linha finalmaxLines(opcional): Número máximo de linhas a ler
Exemplo de retorno:
{
"server": "local-server",
"file": "error/log-error-2026-05-04.0.log",
"totalLines": 45,
"lines": ["2026-05-04 04:22:28.774 [http-nio-8888-exec-9] ERROR ..."]
}
search_logs
Pesquisa palavras-chave em arquivos de log.
Parâmetros:
keyword(obrigatório): Palavra-chave de pesquisaserver(opcional): Nome do servidor de destinolevels(opcional): Array de níveis de log, padrão ["debug", "info"]startDate(opcional): Data de início (YYYY-MM-DD)endDate(opcional): Data de término (YYYY-MM-DD)useRegex(opcional): Se deve usar expressões regularescontextLines(opcional): Número de linhas de contextomaxResults(opcional): Número máximo de resultados
Exemplo de retorno:
{
"server": "local-server",
"keyword": "ERROR",
"results": [
{
"file": "error/log-error-2026-05-04.0.log",
"lineNumber": 1,
"content": "2026-05-04 04:22:28.774 [http-nio-8888-exec-9] ERROR ..."
}
],
"totalMatches": 1
}
tail_logs
Obtém as linhas de log mais recentes.
Parâmetros:
server(opcional): Nome do servidor de destinolevel(opcional): Nível de log, padrão "info"lines(opcional): Número de linhas, padrão 50
Exemplo de retorno:
{
"server": "local-server",
"file": "info/log-info-2026-05-06.0.log",
"totalLines": 50,
"lines": ["2026-05-06 10:30:15.123 [main] INFO ..."]
}
Configuração
Configuração do Servidor
{
"name": "server-name", // 服务器名称(唯一标识)
"host": "192.168.1.100", // 服务器地址
"port": 22, // SSH 端口
"username": "root", // SSH 用户名
"privateKeyPath": "${ssh.cert.path}", // SSH 私钥路径(支持环境变量)
"logRootPath": "/var/logs/", // 日志根目录
"description": "生产服务器", // 服务器描述
"default": true // 是否为默认服务器
}
Configuração do Pool de Conexões SSH
{
"sshPool": {
"maxConnectionsPerServer": 3, // 每个服务器最大连接数
"connectionTimeout": 30000, // 连接超时时间(毫秒)
"idleTimeout": 300000, // 空闲超时时间(毫秒)
"maxRetries": 2 // 最大重试次数
}
}
Configuração Padrão de Consulta
{
"queryDefaults": {
"maxResults": 100, // 默认最大结果数
"maxResultsLimit": 1000, // 最大结果数限制
"maxReadLines": 500, // 默认最大读取行数
"maxReadLinesLimit": 5000, // 最大读取行数限制
"contextLines": 3, // 默认上下文行数
"searchTimeout": 30000, // 搜索超时时间(毫秒)
"defaultTailLines": 50 // 默认 tail 行数
}
}
Exemplos de Uso
No Claude Code, você pode consultar logs diretamente usando linguagem natural:
帮我查看 5.9 服务器上最近的错误日志
搜索包含 "NullPointerException" 的日志
查看 local-server 上 2026-05-04 的所有日志文件
读取最新的 100 行 info 日志
Recursos de Segurança
- Validação de parâmetros - Todos os parâmetros de entrada passam por validação rigorosa
- Validação de caminhos - Previne ataques de travessia de diretórios
- Escape de Shell - Todos os parâmetros de comandos Shell passam por tratamento de escape
- Autenticação por chave privada SSH - Suporta apenas autenticação por arquivo de chave privada SSH, não suporta autenticação por senha, fornecendo maior segurança
- Gerenciamento do pool de conexões - Gerencia automaticamente o ciclo de vida das conexões, prevenindo vazamento de recursos
Solução de Problemas
Falha na Conexão SSH
- Verifique as permissões da chave privada SSH:
chmod 600 ~/id_rsa
- Verifique a conexão SSH:
ssh -i ~/id_rsa root@192.168.5.169
- Verifique se o caminho no arquivo de configuração está correto
Arquivo de Log Não Encontrado
- Confirme se a configuração de
logRootPathestá correta - Verifique se o formato de nomenclatura do arquivo de log corresponde a
logFilePattern - Verifique se o arquivo de log existe no servidor
Serviço MCP Sem Resposta
- Verifique se o serviço foi iniciado corretamente
- Verifique a saída de logs para mensagens de erro
- Verifique se a configuração de
~/.claude.jsonestá correta
Stack Tecnológico
- Java 21 - Linguagem de programação
- Maven - Ferramenta de construção do projeto
- Apache MINA SSHD 2.12.0 - Cliente SSH
- Jackson 2.17.0 - Serialização/desserialização JSON
- Apache Commons Pool2 2.12.0 - Gerenciamento de pool de conexões
- Undertow 2.3.12 - Servidor HTTP (modo HTTP)
- SLF4J + Logback - Framework de logs
Estrutura do Projeto
log-mcp/
├── src/main/java/com/example/logmcp/
│ ├── LogMcpServer.java # 主入口
│ ├── config/ # 配置管理
│ ├── model/ # 数据模型
│ ├── pool/ # SSH 连接池
│ ├── protocol/ # JSON-RPC 协议
│ ├── security/ # 安全验证
│ ├── service/ # 业务逻辑
│ ├── tools/ # MCP 工具实现
│ └── transport/ # 传输层(HTTP/STDIO)
├── src/main/resources/
│ ├── config.json # 服务器配置
│ └── logback.xml # 日志配置
└── pom.xml # Maven 配置
Guia de Contribuição
Sinta-se à vontade para enviar Issues e Pull Requests!
- Faça um fork deste repositório
- Crie um branch de funcionalidade (
git checkout -b feature/AmazingFeature) - Envie suas alterações (
git commit -m 'Add some AmazingFeature') - Envie para o branch (
git push origin feature/AmazingFeature) - Envie um Pull Request
Licença
Este projeto é licenciado sob a Licença Apache 2.0 - consulte o arquivo LICENSE para mais detalhes
Considerações Finais
Se este projeto foi útil para você, sinta-se à vontade para dar uma estrela (Star). Se tiver sugestões, por favor, abra uma Issue. Vamos evoluir juntos!
Contato
- Autor: 小白菜
- GitHub: https://github.com/caijianying