MCP好不好自己动手部署体验一下

627 阅读3分钟

最近Model Context Protocol 简称mcp火的一塌糊涂,为了验证一下效果如何。于是我也来部署一个mcp服务体验体验。

客户端选择

客户端目前有很多,主流的一下四款

为了简单我选择了功能最丰富的 **Cherry Studio。**这是目前最成熟的客户端之一,支持各种国内外的大模型。看图震撼一下。

image.png

MCP Server选择

我没有选择最成熟的,而是为了符合实际工作需求选择一个Prometheus的mcp server。

github.com/pab1it0/pro… 代码很少提供的功能也不多。启动方式为stdio模式。

Tools

ToolCategoryDescription
execute_queryQueryExecute a PromQL instant query against Prometheus
execute_range_queryQueryExecute a PromQL range query with start time, end time, and step interval
list_metricsDiscoveryList all available metrics in Prometheus
get_metric_metadataDiscoveryGet metadata for a specific metric
get_targetsDiscoveryGet information about all scrape targets

主要就是 执行查询 获取所有的metrics,获取target。上述这些操作能覆盖很多场景了。

部署MCP Server

我本地电脑配置如下:

PS D:\dev\mcp\prometheus-mcp-server> systeminfo.exe
OS 名称:            Microsoft Windows 11 家庭中文版
OS 版本:            10.0.26100 暂缺 Build 26100
系统类型:           x64-based PC
处理器:             安装了 1 个处理器。
                    [01]: Intel64 Family 6 Model 170 Stepping 4 GenuineIntel ~1200 Mhz
BIOS 版本:          LENOVO N8CN27WW, 2024/4/29

clone代码

git clone https://github.com/loglmhq/mcp-server-prometheus.git

项目使用uv管理 项目非常简单 结构如下:

root@Logn-devops:/app/prometheus-mcp-server# tree .
.
├── Dockerfile
├── docs
│   ├── api_reference.md
│   ├── configuration.md
│   ├── contributing.md
│   ├── installation.md
│   └── usage.md
├── LICENSE
├── pyproject.toml
├── README.md
├── src
│   ├── prometheus_mcp_server
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-310.pyc
│   │   │   ├── main.cpython-310.pyc
│   │   │   └── server.cpython-310.pyc
│   │   └── server.py
│   └── prometheus_mcp_server.egg-info
│       ├── dependency_links.txt
│       ├── entry_points.txt
│       ├── PKG-INFO
│       ├── requires.txt
│       ├── SOURCES.txt
│       └── top_level.txt
├── tests
│   ├── test_main.py
│   ├── test_server.py
│   └── test_tools.py
└── uv.lock

6 directories, 25 files

安装uv

可以参考官方文档: docs.astral.sh/uv/#__tabbe…

因为这个是脚本我本地下载很慢所有我使用了choco来安装 (这块不对choco做介绍可以参考一下Windows chocolatey 包管理器)

choco install uv

安装后可以找到在 C:\Users\${用户名}\.cherrystudio\bin\uv.exe 找到二进制文件,复制uv的二进制执行文件到cherrystudio的并目录下 以我的电脑为例 C:\Users\logn2\.cherrystudio\bin

image.png

安装项目依赖

在项目根目录执行 uv sync 安装依赖

获取llm访问token

我这以deepseek为例。访问api官网 platform.deepseek.com/ 注册或者登录自己的deepseek账号。在开放平台API keys生成一个key。

image.png 保证账号有足够的余额,并填写到cherry studio。测试通过即可

image.png 其他的平台类似。

配置mcp Server

在cherry studio添加一个mcp服务。配置示例如下:

{
  "mcpServers": {
    "prometheus": {
      "command": "uv",
      "args": [
        "--directory",
        "<full path to prometheus-mcp-server directory>",
        "run",
        "src/prometheus_mcp_server/main.py"
      ],
      "env": {
        "PROMETHEUS_URL": "http://your-prometheus-server:9090",
        "PROMETHEUS_USERNAME": "your_username",
        "PROMETHEUS_PASSWORD": "your_password"
      }
    }
  }
}

如图选择 stdio模式,输入对应的Prometheus地址。我这块为了简单起见没有使用加密。

image.png

使用mcp解决实际问题

添加聊天助手

按照上述配置就可以使用了,先添加一个聊天助手。我选择了运维工程师,日常也是运维工程师来配置Prometheus。输出效果会更好。mcp的效果很大程度都依赖于背后的llm输出质量。所以我同时配置了deepseek的deepseek-chat模型以及Google的gemini-2.5-flash-preview-04-17。后面我也同时放出两者的回答。

image.png

配置助手:

如图选择我们配置了token的模型,否则会在cherry studio报错。这里温度选择为1,保证模型输出尽可能精准,也就是每次同样的提示词输出一样的结果概率更大。保证输出效果。

image.png Q: 帮我看一下我的Prometheus有哪些指标?

A: deepseek输出来看总体正确: 速度--->首字时延 38868ms | 每秒 10 tokens

我将使用工具来列出所有可用的metrics,并获取每个metric的元数据以进行分类和了解其类型。

**

list_metrics已完成

**

我将获取这些metrics的元数据信息以便进行分类和了解其类型。我将分批查询这些metrics的元数据。

首先查询第一组metrics的元数据:

get_metric_metadata发生错误
get_metric_metadata发生错误
get_metric_metadata发生错误
get_metric_metadata发生错误


看来获取metrics元数据的工具无法正常工作。我将基于metrics名称的模式和常见Prometheus监控指标的分类标准,为您将这些metrics进行初步分类:

### 1. 存储相关指标

-   `ephemeral_storage_*`: 临时存储使用情况
-   `node_disk_*`: 磁盘I/O和状态
-   `node_filesystem_*`: 文件系统使用情况
-   `node_xfs_*`: XFS文件系统特定指标
-   `prometheus_tsdb_*`: Prometheus时间序列数据库存储指标

### 2. 内存相关指标

-   `node_memory_*`: 系统内存使用情况
-   `process_resident_memory_bytes`: 进程常驻内存
-   `process_virtual_memory_bytes`: 进程虚拟内存

### 3. CPU相关指标

-   `node_cpu_*`: CPU使用情况
-   `process_cpu_seconds_total`: 进程CPU使用时间
-   `node_thermal_zone_temp`: CPU温度

### 4. 网络相关指标

-   `node_network_*`: 网络接口统计
-   `node_netstat_*`: 网络协议统计
-   `node_nf_conntrack_*`: 网络连接跟踪
-   `node_ipvs_*`: IPVS负载均衡统计

### 5. 系统负载和进程

-   `node_load*`: 系统负载
-   `node_procs_*`: 进程统计
-   `node_forks_total`: 进程fork计数

### 6. Prometheus自身监控

-   `prometheus_*`: Prometheus服务器自身指标
-   `scrape_*`: 抓取相关指标
-   `up`: 目标状态

### 7. Go运行时指标

-   `go_*`: Go运行时和GC统计

### 8. 其他系统指标

-   `node_boot_time_seconds`: 系统启动时间
-   `node_time_*`: 时间相关
-   `node_uname_info`: 系统信息

由于无法获取具体的metrics类型(如Counter, Gauge等),我无法提供每个metric的具体类型信息。通常:

-`_total`结尾的是Counter类型
-   表示当前状态的通常是Gauge类型
-`_seconds`结尾的直方图/摘要通常包含`_bucket``_sum``_count`后缀

如果您需要更详细的分类或特定metrics的用途说明,请告诉我具体metrics名称,我可以基于名称模式为您提供更详细的分析。

A: Google gemini输出: 速度--->首字时延 13135ms | 每秒 228 tokens

好的,作为运维工程师,我将使用 xxx_Pro-list_metrics 工具来查询所有可用的指标。然后,我会尝试根据指标名称和可能的用途进行分类,并提供每个指标的类型。请注意,仅凭指标名称进行分类可能不完全准确,更精确的分类需要查看指标的详细描述或元数据,但 `list_metrics` 工具本身不提供这些详细信息,我将尽力进行合理的推断。

首先,让我获取所有指标列表:

**

list_metrics已完成

**

好的,我已经获取了所有的指标列表。现在,我将尝试根据指标名称将它们分类,并推断它们的类型。请注意,类型推断可能不完全准确,最准确的类型信息通常在指标的元数据中,但我将尽力根据命名约定和常见模式进行判断。

以下是我对指标的分类和类型推断:

**1. 存储相关指标 (Ephemeral Storage Metrics)**

这类指标主要关注临时存储(Ephemeral Storage)的使用情况,通常与容器或节点的文件系统有关。

-   `ephemeral_storage_container_limit_percentage`: Gauge (通常表示当前值) - 容器临时存储限制的使用百分比。
-   `ephemeral_storage_container_volume_usage`: Gauge - 容器临时存储卷的使用量(字节)。
-   `ephemeral_storage_inodes`: Gauge - 临时存储的总 inode 数。
-   `ephemeral_storage_inodes_free`: Gauge - 临时存储的可用 inode 数。
-   `ephemeral_storage_inodes_used`: Gauge - 临时存储已使用的 inode 数。
-   `ephemeral_storage_node_available`: Gauge - 节点临时存储的可用空间(字节)。
-   `ephemeral_storage_node_capacity`: Gauge - 节点临时存储的总容量(字节)。
-   `ephemeral_storage_node_percentage`: Gauge - 节点临时存储的使用百分比。
-   `ephemeral_storage_pod_usage`: Gauge - Pod 临时存储的使用量(字节)。

**2. Go 运行时指标 (Go Runtime Metrics)**

这类指标提供了 Go 程序的运行时信息,包括垃圾回收 (GC)、内存分配、goroutines 等。

-   `go_gc_cycles_automatic_gc_cycles_total`: Counter (通常以 `_total` 结尾) - 自动垃圾回收循环总次数。
-   `go_gc_cycles_forced_gc_cycles_total`: Counter - 强制垃圾回收循环总次数。
-   `go_gc_cycles_total_gc_cycles_total`: Counter - 总垃圾回收循环次数。
-   `go_gc_duration_seconds`: Summary 或 Histogram (带有 `_count` 和 `_sum` 后缀) - 垃圾回收的持续时间。
-   `go_gc_duration_seconds_count`: Counter - `go_gc_duration_seconds` 的观测次数。
-   `go_gc_duration_seconds_sum`: Counter - `go_gc_duration_seconds` 的总和。
-   `go_gc_gogc_percent`: Gauge - GoGC 目标百分比。

Q: 我需要查询Linux主机 的根分区磁盘使用率大于60%的节点

A: deepseek输出正确: 速度--->首字时延 20153ms | 每秒 12 tokens

DeepSeek Chat | 深度求索

05/25 22:30

要查询Linux主机根分区磁盘使用率大于60%的节点,我们可以使用PromQL查询`node_filesystem_avail_bytes``node_filesystem_size_bytes`这两个指标来计算使用率。以下是查询步骤:

1.  首先计算根分区使用率:(1 - (可用空间/总空间)) * 100
1.  筛选挂载点为根分区("/")的文件系统
1.  筛选使用率大于60%的节点

这个查询会返回所有根分区使用率超过60%的节点及其当前使用率值。结果将包含实例标签(instance)标识具体的节点。

如果您需要更详细的信息,比如:

-   查看具体使用率数值
-   获取这些节点的其他相关信息(如主机名、IP等)
-   设置时间范围查询历史数据

请告诉我,我可以进一步调整查询或提供附加信息。

**

execute_query已完成

**

根据查询结果,以下是根分区磁盘使用率超过60%的Linux主机节点列表,已按使用率从高到低排序:

### 高磁盘使用率节点清单

1.  **节点IP**: xx.xx.xx.xx:9100

    -   使用率: 71.84%
    -   设备: /dev/sdb2
    -   文件系统类型: ext4
    -   挂载点: /
    -   所属Job: coding

1.  **节点IP**: xx.xx.xx.xx:9100

    -   使用率: 70.36%

    -   设备: /dev/mapper/ubuntu--vg-ubuntu--lv

    -   文件系统类型: ext4

    -   挂载点: /

    -   所属Job: apps-srv

    -   附加标签:

        -   app: srv
        -   env: sit

1.  **节点IP**: xx.xx.xx.xx:9100

    -   使用率: 62.52%
    -   设备: /dev/mapper/root--vg-root
    -   文件系统类型: ext4
    -   挂载点: /
    -   所属Job: coding

### 建议操作

1.  **紧急处理** (使用率>70%):

    -   xx.xx.xx.xx 和 xx.xx.xx.xx 节点应立即清理磁盘空间
    -   检查大文件: `sudo du -sh /* | sort -rh | head -10`
    -   清理日志文件: `sudo journalctl --vacuum-size=100M`

1.  **监控关注** (使用率60-70%):

    -   xx.xx.xx.xx 节点需要关注增长趋势
    -   建议设置告警当使用率达到68%时通知

1.  **长期建议**:

    -   所有节点考虑设置自动日志轮转
    -   评估是否需要扩容磁盘

是否需要我为您:

1.  查询这些节点的磁盘空间增长趋势(过去7天)
1.  提供具体的磁盘清理命令
1.  设置对应的告警规则

请告知您下一步的需求。

A: Google gemini输出结果正确: 速度--->首字时延 8739ms | 每秒 79 tokens

gemini-2.5-flash | Gemini

05/25 16:30

好的,作为运维工程师,我可以帮助您查询 Linux 主机的根分区磁盘使用率大于 60% 的节点。

我会使用 `node_filesystem_size_bytes` 指标(表示文件系统的总大小)和 `node_filesystem_avail_bytes` 指标(表示文件系统的可用空间)。结合 `node_filesystem_readonly` 指标(确保文件系统不是只读的)和标签过滤 `/` (表示根分区),我可以构建一个 PromQL 查询来计算根分区的使用率。

计算根分区使用率的公式是:

`(1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100`

为了找到使用率大于 60% 的节点,我将使用以下查询:

`((1 - node_filesystem_avail_bytes{fstype!~"^(autofs|binfmt_misc|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|mqueue|overlay|proc|pstore|rpc_pipefs|securityfs|sysfs|tracefs)$", mountpoint="/"} / node_filesystem_size_bytes{fstype!~"^(autofs|binfmt_misc|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|mqueue|overlay|proc|pstore|rpc_pipefs|securityfs|sysfs|tracefs)$", mountpoint="/"}) * 100) > 60`

这个查询会过滤掉一些虚拟文件系统类型,确保我们只关注实际的根分区,并计算使用率是否大于 60%。

现在,我将使用 `xxx_Pro-execute_query` 工具来执行这个查询。

**

execute_query已完成

**

好的,根据您提供的查询结果,以下节点的根分区磁盘使用率大于 60%:

1.  **Instance:** `xx.xx.xx.xx:9100` **使用率:** 71.78% **详细信息:** `{"device": "/dev/sdb2", "fstype": "ext4", "instance": "10.7.3.2:9100", "job": "coding", "mountpoint": "/"}`
1.  **Instance:** `xx.xx.xx.xx:9100` **使用率:** 62.52% **详细信息:** `{"device": "/dev/mapper/root--vg-root", "fstype": "ext4", "instance": "10.177.82.1:9100", "job": "coding", "mountpoint": "/"}`
1.  **Instance:** `xx.xx.xx.xx:9100` **使用率:** 70.29% **详细信息:** `{"app": "srv", "env": "sit", "device": "/dev/mapper/ubuntu--vg-ubuntu--lv", "fstype": "ext4", "instance": "xx.xx.xx.xx:9100", "job": "apps-srv", "mountpoint": "/"}`

这些节点(`xx.xx.xx.xx:9100`,`xx.xx.xx.xx:9100`,`xx.xx.xx.xx:9100`)的根分区磁盘使用率都超过了 60% 的阈值。您可能需要进一步检查这些节点上的磁盘使用情况,找出占用大量空间的文件或目录,并考虑进行清理或扩容。

上述结果都是正确的,对比看gemini简单明了,deepseek略显啰嗦。我并没有需要解决方案,就不需要他给出。

总结

目前我也只是,初步体验。 总体看下来mcp的效果是比较依赖其所调用的模型的。完成对于常用的查询磁盘使用,按照指标查询数据。都是比较好用且准确的。 我对比了deepseek-chatgemini-2.5-flash-preview-04-17 总体看下来gemini的效果更好。简洁明了,deepseek存在调用慢而且经常报错。输出的结果也不稳定产生了大量的无用信息。(叠甲:我这块只对比了deepseek和gemini这两个模型在部分问题的效果无拉踩倾向)。这次也是初步体验,后续点赞转发三连多,我会继续深度使用体验。看mcp在解决复杂的现实场景效果如何。以及自己动手开发一个✅自己的mcp Server。