系统监控服务

MCP Server是一个通过SSE(服务器发送事件)暴露本地机器系统指标(CPU、内存、磁盘、网络、进程)的服务,适用于任何远程MCP客户端。

  • by John-Yang-2013
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 John-Yang-2013/mcp-server

使用说明

MCP服务器——系统监视器

A. FastMCP 通过以下方式公开本地机器系统指标(CPU、内存、磁盘、网络、进程)的服务器 SSE(服务器发送事件),使其可供任何远程MCP客户端访问。

针对Apple Silicon(M4 MacBook Air)进行了优化,但可在以下支持的任何平台上运行 psutil.


目录


特性

工具 说明
get_system_load CPU百分比、每核使用率、平均负载、RAM和交换
get_disk_usage 任何路径的磁盘总数/已使用/空闲
get_network_stats 发送/接收的字节数、数据包计数、活动TCP连接
get_top_processes 按CPU使用率排序的前N个进程
get_system_info 操作系统、架构、主机名、核心数量、正常运行时间

运输: 上海证券交易所 --服务器可以通过HTTP从网络上的任何主机访问。


需求

  • Python≥3.11
  • fastmcp >= 2.0.0
  • psutil >= 6.0.0
  • uvicorn >= 0.30.0

安装

此项目使用 紫外线 用于依赖性管理。

# Clone / enter the project directory
cd mcp-server

# Activate the pyenv environment
pyenv activate agent

# Install server dependencies (uv reads pyproject.toml)
uv sync

# (Optional) install client-side extras for local testing
uv sync --extra dev

无手册 venv 需要创造-- uv sync 创建和管理 .venv 自动。 该项目的目标是 agent pyenv环境(pyenv activate agent).


运行服务器

# Default: bind to all interfaces, port 8000
python server.py

# Custom host / port
python server.py --host 0.0.0.0 --port 9000

暴露的端点:

开发模式 (python server.py --传统SSE传输)

端点 描述
GET /sse SSE流——MCP客户端在此连接
POST /messages/ MCP消息端点

生产模式 (uvicorn server:app --可流式HTTP传输)

端点 描述
POST /mcp MCP流式HTTP端点(发送和接收)
GET /health 活体探测——返回 {"status": "ok"}
GET /ready 准备就绪探针——取样、返回 {"status": "ready"}

可用工具

get_system_load()

返回CPU利用率、负载平均值和内存/交换统计数据。

{
  "cpu_percent": 12.4,
  "cpu_per_core": [8.1, 14.3, 10.0, 17.2],
  "cpu_freq_mhz": 3200.0,
  "load_avg_1m": 1.52,
  "load_avg_5m": 1.78,
  "load_avg_15m": 1.90,
  "memory_total_gb": 16.0,
  "memory_used_gb": 9.3,
  "memory_available_gb": 6.7,
  "memory_percent": 58.1,
  "swap_total_gb": 4.0,
  "swap_used_gb": 0.2,
  "swap_percent": 5.0,
  "timestamp": "2026-03-12T08:00:00+00:00"
}

get_disk_usage(path="/")

{
  "path": "/",
  "total_gb": 512.0,
  "used_gb": 210.5,
  "free_gb": 301.5,
  "percent": 41.1
}

get_network_stats()

{
  "bytes_sent_mb": 1024.5,
  "bytes_recv_mb": 4096.2,
  "packets_sent": 500000,
  "packets_recv": 2000000,
  "active_connections": 42
}

get_top_processes(limit=10)

返回最多到个的列表 limit (最多50个)按CPU百分比排序的进程。

get_system_info()

返回静态主机信息:操作系统、处理器、核心计数、正常运行时间。


客户端使用情况– langchain_mcp

安装(客户端)

pip install langchain-mcp-adapters langchain-openai python-dotenv

langchain-mcp-adapters 船舶 langchain_mcp.MCPToolkit.

基本示例

import asyncio
from langchain_mcp import MCPToolkit
from mcp import ClientSession
from mcp.client.sse import sse_client

SERVER_URL = "http://localhost:8000/sse"  # change to remote IP as needed


async def main():
    async with sse_client(SERVER_URL) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()

            toolkit = MCPToolkit(session=session)
            await toolkit.initialize()

            tools = toolkit.get_tools()
            print("Available tools:", [t.name for t in tools])

            # Call a tool directly
            load_tool = next(t for t in tools if t.name == "get_system_load")
            result = await load_tool.ainvoke({})
            print("System load:", result)


asyncio.run(main())

使用LangGraph ReAct的代理示例

import asyncio
import os
from dotenv import load_dotenv
from langchain_mcp import MCPToolkit
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
from mcp import ClientSession
from mcp.client.sse import sse_client

load_dotenv()  # expects OPENAI_API_KEY in .env

SERVER_URL = "http://localhost:8000/sse"


async def run_agent(query: str) -> None:
    async with sse_client(SERVER_URL) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()

            toolkit = MCPToolkit(session=session)
            await toolkit.initialize()

            llm = ChatOpenAI(model="gpt-4o", temperature=0)
            agent = create_react_agent(llm, toolkit.get_tools())

            result = await agent.ainvoke({"messages": [("human", query)]})
            for msg in result["messages"]:
                print(f"[{msg.type}] {msg.content}")


asyncio.run(run_agent("What is the current CPU load and how much RAM is free?"))

连接到远程服务器

替换 localhost 使用服务器的IP地址或主机名:

SERVER_URL = "http://192.168.1.100:8000/sse"

确保端口可访问(防火墙/网络ACL允许8000上的TCP)。


配置

CLI标志 默认值 说明
--host 0.0.0.0 要绑定的接口(使用 127.0.0.1 仅适用于本地)
--port 8000 TCP端口

生产部署

使用生产ASGI服务器(uvicorn)指向模块级别 app 对象(a 斯塔雷特 由构建的应用程序 mcp.http_app()).

运输注意事项:生产模式使用 流式HTTP 运输(MCP规范,2024+年12月)。
端点从以下更改 /sse (发展)到 /mcp (生产)。
使用 streamablehttp_client 在客户端,而不是 sse_client.

单一流程

pyenv activate agent
uv run uvicorn server:app --host 0.0.0.0 --port 8000

多工作器(建议用于并发)

pyenv activate agent
uv run uvicorn server:app --host 0.0.0.0 --port 8000 --workers 4

码头工人

# Build image
docker build -t mcp-server .

# Run container (port 8000 forwarded)
docker run -d -p 8000:8000 --name mcp-server mcp-server

# Check health
curl http://localhost:8000/health
curl http://localhost:8000/ready

这 Dockerfile 包括a HEALTHCHECK 民意调查指令 /health 每30秒。

生产客户端示例(流式HTTP)

import asyncio
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
from langchain_mcp import MCPToolkit

SERVER_URL = "http://localhost:8000/mcp"  # /mcp endpoint

async def main():
    async with streamablehttp_client(SERVER_URL) as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()
            toolkit = MCPToolkit(session=session)
            await toolkit.initialize()
            tools = toolkit.get_tools()
            print("Tools:", [t.name for t in tools])
            result = await tools[0].ainvoke({})
            print(result)

asyncio.run(main())

反向代理(nginx/Caddy)后面

  • 把玉米捆起来 127.0.0.1:8000 并让代理处理TLS和公共入口。
  • 转发 X-Forwarded-For 和 X-Forwarded-Proto 标题。
  • 添加 --proxy-headers --forwarded-allow-ips '*' 向乌威康司令部报告。

发展

# Activate pyenv environment
pyenv activate agent

# Install all dependencies including dev extras
uv sync --extra dev

# Run server in reload mode via uvicorn (for development)
uv run uvicorn server:app --reload --host 0.0.0.0 --port 8000

要通过uv直接运行服务器(无需手动激活):

uv run python server.py

项目布局

mcp-server/
├── server.py          # FastMCP server + all tools
├── pyproject.toml     # Project metadata & dependencies
├── Dockerfile         # Production container image
├── .gitignore         # Git ignore rules
├── README.md          # This file
└── .github/
    └── copilot-instructions.md