这个五一我发布了一个很有用的 MCP!
前言
五一前,我在调试自己开发的一个 MCP 工具时,顺手发了条朋友圈展示效果。没想到很快就收到了好几个朋友的私聊:

"这个工具看着好好用,有链接吗?"
这让我意识到,原来不只是我一个人被这个问题困扰。作为后端开发,日常工作中最头疼的就是:
- 查日志:每次排查问题都要找运维要服务器权限,或者让他们帮忙拉日志,来回沟通至少耗费 5-10 分钟
- 查数据:需要统计数据时要找 DBA 执行 SQL,或者等数据报表,效率极低
这些看似简单的操作,却因为权限隔离、团队协作等原因,成为了开发效率的瓶颈。于是,五一假期我决定把这个工具完善并开源出来 ------ Log-MCP,一个让 AI 助手能直接查询远程服务器日志的工具。
什么是 Log-MCP?
Log-MCP 是一个基于 MCP 协议的远程日志查询服务,它通过 SSH 连接远程服务器,为 Claude Code 等 AI 助手提供日志查询能力。
核心价值:
- ✅ 在 Claude Code 中直接查询远程服务器日志,无需切换工具
- ✅ 不需要找运维要权限,不需要手动 SSH 登录服务器
- ✅ 支持关键词搜索、正则表达式、日志级别过滤、日期范围查询
- ✅ AI 理解你的意图,自动选择合适的查询方式
实际效果展示
先看两个真实的使用场景:
场景 1:排查离线数据问题
有用户反馈推送的离线数据有问题,我直接在 Claude Code 中说:
"帮我查一下 5.9 上昨天(2026-04-29)关于推送离线数据缺失的问题"
AI 自动帮我:
- 连接 5.9 服务器
- 搜索相关日期的 error 日志
- 找到了
Instant exceeds minimum or maximum instant异常 - 定位到具体的代码位置和时间戳问题

传统方式需要: 找运维要权限 → SSH 登录 → cd 到日志目录 → grep 查找 → 分析上下文,至少 10 分钟
使用 Log-MCP: 30 秒搞定!
场景 2:分析请求参数异常
接着需要进一步排查实际接收到的请求参数,我继续问:
"帮我查一下实际接收到的请求参数是哪些"
AI 自动:
- 调用 log-mcp 3 次,逐步缩小范围
- 找到了两次失败的请求参数
- 分析出异常特征:时间戳字段值异常
- 给出了根本原因和修复建议

整个过程就像和一个懂业务的同事对话,AI 理解你的意图,自动选择合适的查询方式,并给出分析结果。
效率对比:
| 操作 | 传统方式 | 使用 Log-MCP | 提升 |
|---|---|---|---|
| 查看错误日志 | 5-10 分钟 | 30 秒 | 95% |
| 搜索关键词 | 3-5 分钟 | 20 秒 | 93% |
| 分析日志趋势 | 10-15 分钟 | 1 分钟 | 93% |
开发过程中的核心问题
问题 1:SSH 私钥权限问题
开发初期遇到的第一个坑:
bash
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/jianyingcai/id_rsa' are too open.
This private key will be ignored.
原因: SSH 要求私钥文件权限必须是 600(仅所有者可读写)
解决:
bash
chmod 600 ~/id_rsa
问题 2:SSH 连接池优化
挑战: 每次查询都建立新连接,性能很差(每次 1-2 秒)
解决: 使用 Apache Commons Pool2 实现连接池
java
public class SshConnectionPool extends GenericKeyedObjectPool<String, ChannelExec> {
public SshConnectionPool(SshClientFactory factory) {
super(factory);
GenericKeyedObjectPoolConfig<ChannelExec> config = new GenericKeyedObjectPoolConfig<>();
config.setMaxTotalPerKey(3); // 每个服务器最多 3 个连接
config.setTestOnBorrow(true); // 借用时测试连接有效性
setConfig(config);
}
}
首次连接 1-2 秒,后续查询 < 100ms
问题 3:Shell 命令注入防护
风险: 用户输入可能包含特殊字符
java
// 危险代码
String command = "grep '" + keyword + "' " + logFile;
// 如果 keyword 是 '; rm -rf /',后果不堪设想!
实现 Shell 转义
java
public class ShellEscaper {
public static String escape(String input) {
if (input == null || input.isEmpty()) {
return "''";
}
// 使用单引号包裹,并转义内部的单引号
return "'" + input.replace("'", "'\\''") + "'";
}
}
问题 4:STDIO 模式调试困难
STDIO 模式下,标准输入输出被 MCP 协议占用,无法直观地看到调试信息
错误做法:
java
System.out.println("Debug: " + message); // 会破坏 MCP 协议!
于是采用了文件日志的方式
xml
<!-- logback.xml -->
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>/tmp/log-mcp.log</file>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
调试命令:
bash
tail -f /tmp/log-mcp.log
快速开始
1. 构建项目
bash
git clone https://github.com/caijianying/log-mcp.git
cd log-mcp
mvn clean package
2. 配置服务器
编辑 src/main/resources/config.json:
json
{
"servers": [
{
"name": "prod-server",
"host": "192.168.5.169",
"port": 22,
"username": "root",
"privateKeyPath": "${ssh.cert.path}",
"logRootPath": "/var/logs/app/",
"description": "生产服务器",
"default": true
}
],
"logLevels": ["info", "warn", "error", "debug"],
"logFilePattern": "{level}/log-{level}-{date}.{seq}.log"
}
3. 配置 SSH 认证
bash
# 生成密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 添加公钥到服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.5.169
# 设置私钥权限
chmod 600 ~/.ssh/id_rsa
4. 添加 MCP 服务
STDIO 模式(推荐):
bash
claude mcp add log-mcp-stdio java -- \
-Dssh.cert.path=/path/to/id_rsa \
-Dlog.config=/path/to/config.json \
-jar /path/to/log-mcp-1.0.0.jar
5. 开始使用
在 Claude Code 中直接用自然语言查询:
arduino
"帮我查看生产服务器上最近的错误日志"
"搜索包含 NullPointerException 的日志"
"查看 5 月 4 日到 5 月 6 日的所有 error 日志"
技术架构
核心技术栈
- Java 21 - 编程语言
- Apache MINA SSHD 2.12.0 - SSH 客户端
- Apache Commons Pool2 2.12.0 - 连接池管理
- Jackson 2.17.0 - JSON 序列化
- SLF4J + Logback - 日志框架
架构设计
arduino
┌─────────────────┐
│ Claude Code │ 用户通过自然语言查询日志
└────────┬────────┘
│ MCP Protocol (STDIO)
┌────────▼────────┐
│ Log-MCP │ - 协议处理
│ Server │ - 工具分发
└────────┬────────┘
│ SSH Connection Pool
┌────────▼────────┐
│ Remote Server │ 日志文件系统
└─────────────────┘
可用工具
| 工具 | 功能 | 主要参数 |
|---|---|---|
list_servers |
列出所有配置的服务器 | 无 |
list_log_files |
列出日志文件 | server, level, startDate, endDate |
read_log_file |
读取日志文件内容 | filePath, startLine, endLine |
search_logs |
搜索日志关键词 | keyword, levels, startDate, endDate |
tail_logs |
获取最新日志 | level, lines |
安全特性
- ✅ SSH 私钥认证 - 仅支持私钥认证,不支持密码
- ✅ 路径遍历防护 - 禁止
../等路径遍历 - ✅ Shell 注入防护 - 所有参数都经过转义
- ✅ 参数验证 - 严格的输入验证和限制
- ✅ 只读访问 - 不提供任何写入、删除功能
总结
Log-MCP 是我在五一假期开发并开源的一个实用工具,它解决了后端开发中查日志效率低的痛点。通过 MCP 协议,让 AI 助手能够直接访问远程服务器日志,大幅提升了排查问题的效率。
核心价值:
- 🚀 效率提升 90%+(从 10 分钟降到 30 秒)
- 🔒 安全可靠(SSH 私钥认证、多重防护)
- 🎯 开箱即用(5 分钟完成配置)
- 🔧 易于扩展(基于 MCP 标准协议)
如果你也有类似的痛点,欢迎体验 Log-MCP!
项目地址: github.com/caijianying...
欢迎 Star ⭐️ 和提 Issue!
关于作者
小白菜,热衷于用技术解决实际问题,提升开发效率。
如果这篇文章对你有帮助,欢迎点赞、收藏、关注!有任何问题欢迎在评论区讨论。