Linux健康监控工具

一个基于MCP协议的Linux系统健康监控工具,提供磁盘、CPU、内存/交换空间的使用情况监控和汇总功能。

  • by rbuccigrossi
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 rbuccigrossi/mcp_example

使用说明

MCP Linux 健康示例

一个最小的 模型上下文协议(MCP) 示例使用:

  • server.py — 一个暴露Linux健康检查工具(磁盘、CPU、内存/交换空间)的MCP服务器
  • client.py — 一个通过(某种方式)连接的Python客户端 可流式传输的HTTP(此处为句子的延续或补充说明,具体翻译需结合上下文,但基于给出的部分,可翻译为):,列出工具,并进行呼叫 health_summary

Auth 是一个简单的共享(系统/服务) 承载令牌(或称访问令牌) 在HTTP层进行了检查。


这是什么?

  • MCP 定义了智能体/大型语言模型(LLMs)如何发现和调用外部(资源/功能) 工具 遵循一致的协议。
  • 此示例通过MCP发布了三个工具:
    • disk_space(path="/")
    • cpu_usage(mode="instant"|"percpu"|"loadavg", sample_ms=200)
    • memory_swap()
    • 一个更便捷的工具: health_summary(path="/")

该 客户 展示了如何连接、列出工具以及调用 health_summary。


要求

  • Python 3.10及以上版本
  • Linux(工具使用 psutil 针对Linux API;它们“大多”在其他地方也能工作,但loadavg等指标是围绕Linux设计的

安装依赖项:

pip install "mcp[cli]" uvicorn psutil starlette

快速入门

1) 设置一个共享令牌并运行服务器

export MCP_BEARER_TOKEN='super-secret'   # choose your own
uvicorn server:app --host 0.0.0.0 --port 8000

默认情况下,MCP 端点位于 /mcp。

2) 运行客户端

export MCP_URL="http://localhost:8000/mcp"
export MCP_BEARER_TOKEN="super-secret"
python client.py

你应该会看到类似这样的内容:

Available tools:
  • disk_space — Report disk usage...
  • cpu_usage — CPU usage...
  • memory_swap — Memory and swap usage...
  • health_summary — Convenience tool...

Calling health_summary…

== DISK ==
path: /  used: 42 GB / 100 GB  (42%)
mounts: 3 total

== CPU ==
overall: 7.3%  (cpus: 8)

== MEMORY ==
mem: used 6 GB / 31 GB  (22%)
swap: used 0 GB / 2 GB  (0%)

配置

环境变量:

  • MCP_BEARER_TOKEN — 服务器和客户端均需满足此要求。
  • MCP_URL — 客户目标(默认: http://localhost:8000/mcp)。

(简而言之)它是如何工作的

  • JSON-RPC 2.0 是基本消息格式。

  • MCP 添加了生命周期(初始化,关闭),工具发现(tools/list), 和工具调用 (tools/call)在那之上。

  • 我们使用MCP SDK的 可流式传输的HTTP 两端运输:

    • server.py 通过(某种方式)暴露一个ASGI应用 mcp.streamable_http_app()。
    • client.py 与……相连/关联 streamablehttp_client(...) 和一个 ClientSession。

认证: 一个微型的ASGI封装器用于检查 Authorization: Bearer <token> 标题为 /mcp* 请求并将其他任务直接委托给MCP应用程序。(所有非HTTP事件,包括 寿命直接通过,以确保MCP任务组被正确初始化。)


定制工具

所有工具都装饰着 @mcp.tool() 并返回可序列化的JSON有效载荷。 以同样的方式添加你自己的函数;它们会自动显示在 tools/list。

示例(草图):

@mcp.tool()
def hostname() -> str:
    import socket
    return socket.gethostname()

故障排除

500(人/元等,根据上下文确定具体单位)在 POST /mcp 在……期间 initialize()

  • 确保服务器 不是 被封装在消耗/阻塞流式数据主体的中间件中。
  • 这个示例避免了使用Starlette的路由/挂载功能;我们仅使用了一个微小的ASGI网关来包裹,以保持生命周期的完整性。

401 未授权

  • 检查一下 MCP_BEARER_TOKEN 双方的对决。
  • 确认您的客户是否选择了正确的路径: MCP_URL=http://<host>:8000/mcp。

Windows 客户端连接到 Linux 服务器

  • 那没问题。服务器会收集相关的指标 服务器 主机;客户端可以在任何能够访问到它的地方运行。

需要TLS/JWT/OAuth2吗?

  • 将MCP应用置于反向代理(Caddy/NGINX/API网关)后端,并在那里终止TLS/认证,或者扩展ASGI网关。

制作备注(可选)

  • 跑 uvicorn 位于一个进程管理器(systemd、supervisord)和一个TLS代理之后。
  • 考虑实施速率限制和结构化日志记录。
  • 如果您需要更多的终端节点(例如。, /healthz在MCP ASGI应用之前添加一个代理/路由器,而不是将其挂载在应用内部。