跨平台系统监控 MCP 服务
项目简介
这是一个基于 Java + Maven + OSHI 开发的 MCP (Model Context Protocol) 服务,用于跨平台系统状态监控。该服务通过 HTTP 接口提供 JSON-RPC 2.0 协议,可以实时采集和分析 CPU、内存、磁盘、进程等系统资源信息。
主要特点
- 跨平台支持:使用 OSHI 库,支持 Linux、macOS、Windows 等多种操作系统
- HTTP 传输:基于 HTTP 协议的 MCP 服务,易于集成和调试
- 轻量级:纯 Java 实现,依赖少,资源占用低
- JSON-RPC 2.0:标准的 JSON-RPC 2.0 协议,兼容性好
- 实时监控:提供实时的系统资源监控数据
- 中文注释:所有代码均有详细的中文注释,易于理解和维护
功能特性
1. 系统概览 (get_system_overview)
获取系统的全面概览信息,包括:
- 系统信息:主机名、操作系统版本、运行时间
- CPU 信息:
- CPU 型号和核心数(物理核心和逻辑核心) - 系统负载(1分钟、5分钟、15分钟平均负载) - CPU 使用率百分比
- 内存信息:
- 总内存、已用内存、可用内存 - 内存使用率 - Swap 交换空间使用情况
- 磁盘信息:
- 所有挂载点的磁盘使用情况 - 每个分区的总容量、已用空间、可用空间 - 磁盘使用率百分比
2. 进程列表 (list_top_processes)
列出系统中资源占用最高的进程,按 CPU 和内存使用率排序。
参数:
limit(可选,默认:10):返回的进程数量(1-100)
提供信息:
- 按 CPU 使用率排序的 Top N 进程
- 按内存使用率排序的 Top N 进程
- 总进程数和线程数
3. 服务状态检查 (inspect_service_status)
检查指定服务或进程的运行状态。
参数:
service_name(必需):要检查的服务或进程名称
功能:
- 搜索匹配服务名称的所有进程
- 显示每个匹配进程的详细信息
- 返回运行状态和进程数量
4. 磁盘压力分析 (analyze_disk_pressure)
分析所有磁盘的使用情况和压力级别,提供优化建议。
提供信息:
- 每个挂载点的详细使用情况
- 压力级别评估(NONE、LOW、MODERATE、HIGH、CRITICAL)
- 针对性的优化建议
- 磁盘 I/O 统计信息(读写次数和字节数)
技术架构
核心依赖
- Java 17:项目运行环境
- Javalin 5.6.3:轻量级 HTTP 服务器框架
- OSHI 6.4.10:跨平台系统和硬件信息库
- Gson 2.10.1:JSON 序列化/反序列化
- SLF4J 2.0.9:日志框架
项目结构
system-monitor-mcp/
├── pom.xml # Maven 配置文件
├── build.sh # 构建脚本
├── README.md # 本文档
└── src/
└── main/
├── java/
│ └── com/
│ └── example/
│ └── mcp/
│ ├── SystemMonitorMcpServer.java # HTTP MCP 服务器主类
│ └── SystemMonitor.java # 系统监控工具类
└── resources/
└── simplelogger.properties # 日志配置核心类说明
1. SystemMonitorMcpServer
HTTP MCP 服务器主类,负责:
- 启动 HTTP 服务器(基于 Javalin)
- 处理 JSON-RPC 2.0 请求
- 注册和管理监控工具(Tools)
- 提供健康检查和工具列表端点
2. SystemMonitor
系统监控工具类,负责:
- 使用 OSHI 库采集系统信息
- 处理和格式化监控数据
- 提供各种监控功能的实现
- 数据分析和建议生成
构建和运行
前置要求
- Java 17 或更高版本
- Maven 3.6 或更高版本
- 支持 OSHI 的操作系统(Linux、macOS、Windows)
构建项目
cd system-monitor-mcp
# 使用构建脚本
./build.sh
# 或手动构建
mvn clean package构建成功后,会在 target/ 目录下生成可执行 JAR 文件:
target/system-monitor-mcp-1.0.0.jar启动服务器
1. 使用默认端口(8080)
java -jar target/system-monitor-mcp-1.0.0.jar2. 指定自定义端口
# 通过命令行参数
java -jar target/system-monitor-mcp-1.0.0.jar 9000
# 或通过环境变量
export MCP_PORT=9000
java -jar target/system-monitor-mcp-1.0.0.jar启动成功后,你会看到类似如下的输出:
✅ Linux 监控 MCP 服务器启动成功!
🌐 HTTP 端点: http://localhost:8080/
💚 健康检查: http://localhost:8080/health
🔧 工具列表: http://localhost:8080/tools
可用工具: get_system_overview, list_top_processes, inspect_service_status, analyze_disk_pressureHTTP 端点说明
| 端点 | 方法 | 说明 |
|---|---|---|
/ | POST | MCP JSON-RPC 2.0 主端点 |
/health | GET | 健康检查端点 |
/tools | GET | 获取可用工具列表(调试用) |
使用方式
1. 直接 HTTP 调用
健康检查
curl http://localhost:8080/health响应:
{
"status": "healthy",
"server": "system-monitor-mcp",
"version": "1.0.0"
}获取工具列表
curl http://localhost:8080/tools调用工具(JSON-RPC 2.0)
获取系统概览:
curl -X POST http://localhost:8080/ \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "get_system_overview",
"arguments": {}
},
"id": 1
}'列出 Top 5 进程:
curl -X POST http://localhost:8080/ \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "list_top_processes",
"arguments": {
"limit": 5
}
},
"id": 2
}'检查服务状态:
curl -X POST http://localhost:8080/ \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "inspect_service_status",
"arguments": {
"service_name": "nginx"
}
},
"id": 3
}'分析磁盘压力:
curl -X POST http://localhost:8080/ \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "analyze_disk_pressure",
"arguments": {}
},
"id": 4
}'2. 在 Claude Code 中使用
配置步骤
编辑 Claude Code 的 MCP 配置文件(~/.config/claude-code/mcp.json 或项目的 .claude/mcp.json):
{
"mcpServers": {
"linux-monitor": {
"transport": "http",
"url": "http://localhost:8080",
"description": "Linux 系统监控工具"
}
}
}使用示例
启动 Claude Code 后,你可以直接与 AI 对话:
请帮我检查系统状态Claude 会自动调用 get_system_overview 工具获取系统信息。
查看占用 CPU 最高的 5 个进程Claude 会调用 list_top_processes 工具并设置 limit=5。
检查 nginx 服务是否在运行Claude 会调用 inspect_service_status 工具查询 nginx。
分析磁盘使用情况,看看是否需要清理Claude 会调用 analyze_disk_pressure 工具进行分析。
3. 在 Cherry Studio 中使用
配置步骤
- 打开 Cherry Studio 设置,找到 MCP 服务器配置部分
- 添加新的 MCP 服务器:
- 名称:Linux Monitor - 传输方式:HTTP - URL:http://localhost:8080 - 描述:Linux 系统监控工具
- 保存配置后,重启 Cherry Studio
使用示例
在对话中,你可以:
使用 Linux Monitor 工具查看系统概览或者:
帮我分析一下磁盘压力情况Cherry Studio 会自动通过 HTTP 调用 MCP 服务。
4. 配置示例(完整)
Claude Code HTTP MCP 配置
{
"mcpServers": {
"linux-monitor": {
"transport": "http",
"url": "http://localhost:8080",
"description": "Linux 系统监控:CPU、内存、磁盘、进程分析",
"timeout": 30000
}
}
}Cherry Studio HTTP MCP 配置
{
"name": "linux-monitor",
"type": "http",
"url": "http://localhost:8080",
"description": "Linux 系统监控工具",
"enabled": true
}使用场景
1. 系统健康检查
定期检查系统整体状态,了解资源使用情况:
请帮我做一次系统健康检查,看看有没有异常2. 性能问题排查
当系统响应变慢时,快速定位问题:
系统很卡,帮我找出占用资源最多的进程3. 服务监控
检查关键服务的运行状态:
检查 mysql、nginx 和 redis 服务是否正常运行4. 磁盘空间管理
监控磁盘使用情况,提前预警:
分析磁盘使用情况,告诉我哪些分区需要清理5. 容量规划
基于当前资源使用情况进行容量规划:
根据当前系统资源使用情况,评估是否需要升级硬件开发和扩展
添加新的监控工具
- 在
SystemMonitor.java中添加新的监控方法(带中文注释) - 在
SystemMonitorMcpServer.java的handleToolsList()和handleToolsCall()中注册新工具 - 重新编译和部署
示例:添加网络监控工具
// 在 SystemMonitor.java 中
/**
* 获取网络统计信息
*/
public String getNetworkStats() {
NetworkIF[] networks = hardware.getNetworkIFs();
// ... 处理和格式化数据
return gson.toJson(result);
}
// 在 SystemMonitorMcpServer.java 的 handleToolsList() 中添加
JsonObject tool5 = new JsonObject();
tool5.addProperty("name", "get_network_stats");
tool5.addProperty("description", "获取网络接口统计信息");
tool5.add("inputSchema", new JsonObject());
tools.add(tool5);
// 在 handleToolsCall() 的 switch 中添加
case "get_network_stats":
resultText = systemMonitor.getNetworkStats();
break;故障排查
常见问题
- 服务器无法启动
- 检查 Java 版本是否为 17 或更高:java -version - 确认端口 8080 未被占用:lsof -i :8080 (Linux/macOS) 或 netstat -ano | findstr :8080 (Windows) - 查看日志输出获取详细错误信息
- 无法获取系统信息
- 确认运行用户有足够的权限读取系统信息 - 某些系统信息可能需要 root 权限
- MCP 客户端无法连接
- 检查 MCP 配置中的 URL 是否正确 - 确认服务器已启动且监听正确的端口 - 测试健康检查端点:curl http://localhost:8080/health - 查看客户端日志获取连接错误信息
- 端口被占用
- 使用其他端口启动:java -jar target/system-monitor-mcp-1.0.0.jar 9000 - 或停止占用端口的程序
调试模式
启用详细日志输出(输出到文件 mcp-server.log):
java -Dorg.slf4j.simpleLogger.defaultLogLevel=debug \
-Dorg.slf4j.simpleLogger.logFile=mcp-server.log \
-jar target/system-monitor-mcp-1.0.0.jar性能考虑
- 系统开销:OSHI 库对系统资源的占用很小,通常 < 10MB 内存
- 响应时间:大多数查询在 100-500ms 内完成
- 并发支持:Javalin 基于 Jetty,支持高并发请求
- 缓存策略:某些信息(如 CPU 使用率)需要短时间采样,已内置等待逻辑
安全注意事项
- 权限控制:建议使用普通用户运行服务,避免使用 root 权限
- 访问限制:仅在受信任的环境中使用,不要暴露到公网
- 如需公网访问,建议配置反向代理(如 Nginx)并添加认证 - 或使用防火墙限制访问 IP
- 数据敏感性:返回的系统信息可能包含敏感数据,注意保护
- 命令执行:本服务仅读取系统信息,不执行任何修改操作
生产部署建议
1. 使用 systemd 管理服务(Linux)
创建服务文件 /etc/systemd/system/system-monitor-mcp.service:
[Unit]
Description=Linux Monitor MCP Server
After=network.target
[Service]
Type=simple
User=mcp-user
WorkingDirectory=/opt/system-monitor-mcp
ExecStart=/usr/bin/java -jar /opt/system-monitor-mcp/target/system-monitor-mcp-1.0.0.jar 8080
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target启用和启动服务:
sudo systemctl enable system-monitor-mcp
sudo systemctl start system-monitor-mcp
sudo systemctl status system-monitor-mcp2. 使用 Docker 容器化部署
创建 Dockerfile:
FROM openjdk:17-slim
WORKDIR /app
COPY target/system-monitor-mcp-1.0.0.jar /app/
EXPOSE 8080
CMD ["java", "-jar", "system-monitor-mcp-1.0.0.jar"]构建和运行:
docker build -t system-monitor-mcp .
docker run -d -p 8080:8080 --name system-monitor system-monitor-mcp3. 配置反向代理(Nginx)
server {
listen 80;
server_name monitor.example.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}许可证
本项目仅供学习和参考使用。
联系方式
如有问题或建议,欢迎反馈。
Happy Monitoring! 🚀
