这个五一我发布了一个很有用的 MCP!

这个五一我发布了一个很有用的 MCP!

前言

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

"这个工具看着好好用,有链接吗?"

这让我意识到,原来不只是我一个人被这个问题困扰。作为后端开发,日常工作中最头疼的就是:

  1. 查日志:每次排查问题都要找运维要服务器权限,或者让他们帮忙拉日志,来回沟通至少耗费 5-10 分钟
  2. 查数据:需要统计数据时要找 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 自动帮我:

  1. 连接 5.9 服务器
  2. 搜索相关日期的 error 日志
  3. 找到了 Instant exceeds minimum or maximum instant 异常
  4. 定位到具体的代码位置和时间戳问题

传统方式需要: 找运维要权限 → SSH 登录 → cd 到日志目录 → grep 查找 → 分析上下文,至少 10 分钟

使用 Log-MCP: 30 秒搞定!

场景 2:分析请求参数异常

接着需要进一步排查实际接收到的请求参数,我继续问:

"帮我查一下实际接收到的请求参数是哪些"

AI 自动:

  1. 调用 log-mcp 3 次,逐步缩小范围
  2. 找到了两次失败的请求参数
  3. 分析出异常特征:时间戳字段值异常
  4. 给出了根本原因和修复建议

整个过程就像和一个懂业务的同事对话,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!


关于作者

小白菜,热衷于用技术解决实际问题,提升开发效率。

如果这篇文章对你有帮助,欢迎点赞、收藏、关注!有任何问题欢迎在评论区讨论。

相关推荐
-嘟囔着拯救世界-3 小时前
手把手教你低成本搭建 GPT-image-2 工作流,再也不愁没有好配图了!
人工智能·gpt·ai·ai作画·aigc·gpt-image-2
Jing_jing_X4 小时前
MCP(三) 原理:为什么模型会“主动调用工具”?JSON 参数是怎么来的?
ai·mcp
发哥来了6 小时前
东莞AI培训课程横向对比:五家机构教学与就业质量评测
大数据·人工智能·机器学习·ai·aigc
92year6 小时前
TradingAgents 源码拆解:用 LangGraph 搭一个多 Agent 交易团队
aigc
青山师7 小时前
【大模型提示词工程深度解析:从原理到工业级实践、实践案例】
大模型·prompt·aigc·ai编程·llama·claude·agi
92year8 小时前
Mastra Observational Memory 实战:给你的 AI Agent 装一个"会遗忘"的大脑
aigc
周末程序猿8 小时前
技术总结|十分钟了解GEO
人工智能·aigc
周末程序猿8 小时前
技术总结|十分钟了解大模型投毒
人工智能·aigc
qdprobot9 小时前
ESP32S3 AiTall V3 Mixly 图形化编程开发AI小智 MCP AIOT大模型对话开发视频教程Micropython小智AI系统
人工智能·micropython·esp32s3·图形化编程·mcp·mixly小智ai·大模型对话