用 Cursor+Harvester MCP做智能运维:在编辑器里“聊天看集群”



!! 大家好,我是wanger,一个爱折腾的运维工程,一个睡觉都被自己丑醒的云原生爱好者。


作者:wanger
公众号:运维开发故事
博客:https://devopstory.cn



最近 MCP(Model Context Protocol)很火,简单说就是:
让大模型“通过工具”直接访问你的系统——数据库、Git 仓库、K8s 集群、Harvester 虚拟化……

这篇文章记录一下我自己在 Windows + Cursor + Harvester 集群 上的折腾过程:

  • MCP / Harvester MCP 是什么
  • 如何在本机用 Go 安装 harvester-mcp-server
  • 在 Cursor 里配置 MCP
  • 实际使用时能做什么、暂时还不能做什么(比如目前还没 HTTP 访问,只能本地 stdio)

希望能给你一点思路:不用切来切去,只在一个编辑器里就能一边看代码一边“问”集群。

一、MCP & Harvester MCP 简介

1. MCP 是什么?

MCP(Model Context Protocol)是 Anthropic 提出的一个协议,用来把 大模型  外部系统 之间的交互标准化。

  • 一端是 MCP Server:封装了你的业务系统(Harvester、Kubernetes、Git、DB……)
  • 另一端是 MCP Client:比如 Claude Desktop、Cursor、VSCode 插件
  • 模型通过 MCP 暴露的 tools / resources 来“看”和“操作”你的系统

好处就是:
你写(或者用别人的)一个 MCP Server,任何支持 MCP 的客户端都能接进去用。

2. Harvester MCP 是干嘛的?

Harvester 本质是一个基于 Kubernetes + KubeVirt 的超融合平台,用来管理虚拟机、镜像、网络等。

社区有人做了一个 Harvester MCP Server,作用大致是:

  • 通过 kubeconfig 连接你的 Harvester 集群
  • 向上暴露一组 MCP 工具:
    • 列表 / 查看:Nodes、Namespaces、Pods
    • Harvester 资源:虚拟机(VirtualMachine)、Images、Volumes、Networks 的 List / Get

目前这个 MCP 的定位更偏向 “可观测 + 查询”

✅ 能列出节点 / 虚拟机 / 镜像 / 网络等信息
❌ 对虚拟机的 创建 / 开关机 / 删除还没有真正实现写操作
❌ MCP Server 只有 stdio 模式,没有 HTTP/SSE 接口(不能直接给 Dify 这类 HTTP 客户端用)

也就是说,现在它更适合做“运维信息面板 + YAML/命令生成器”,不是一键自动化的控制台。

二、前置条件准备

我这边的环境大致是:

  • 一套 Harvester 集群(可以通过浏览器访问管理界面)
  • 一台 Windows 开发机:
    • 已安装 Cursor(带 MCP 支持)
    • 安装了 Go(1.20+)

1. 在 Windows 上安装 Go

这里略过详细安装步骤,只提醒两点:

  1. PATH 里要有你的 Go 安装路径,比如:
D:\Program Files\Go\bin
  1. 建议设置好代理和 module 模式(在 CMD / PowerShell):
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

方便后面拉 Go 模块,不然国内网络会各种超时。

三、用 Go 安装 Harvester MCP Server

1. 一条命令安装(推荐)

在 PowerShell 或 CMD 中执行:

go install github.com/starbops/harvester-mcp-server/cmd/harvester-mcp-server@latest

注意这里的包路径要带/cmd/harvester-mcp-server,不然会报 “module found but does not contain package” 的错误。

装完之后,看看 GOPATH:

go env GOPATH
dir "$(go env GOPATH)\bin"

你应该能在 GOPATH\bin 里看到:

harvester-mcp-server.exe

这个 exe 就是待会 Cursor 要调用的 MCP Server。

2. 手动编译(备选方案)

如果网络比较差,也可以先 clone 再 build:

git clone https://github.com/starbops/harvester-mcp-server.git
cd harvester-mcp-server
go build -o harvester-mcp-server.exe .\cmd\harvester-mcp-server

就会在当前目录生成一个 harvester-mcp-server.exe放到你喜欢的路径,然后记住这个路径即可

四、准备 Harvester 的 kubeconfig

MCP Server 是靠 kubeconfig 去连 Harvester 集群的。Windows 上常见有两种来源:

1. 从 Harvester Web UI 下载

这是最推荐的方式:

  1. 打开 Harvester 管理页面 → 登录
  2. 在右上角用户菜单 / Support 里,一般会有一个 “Download kubeconfig” 的按钮
  3. 下载后的文件保存到本机,比如:
C:\Users\<你的用户名>.kube\harvester.yaml

通常这份 kubeconfig 会把 server 设置成集群对外可访问的地址,不需要你改 127.0.0.1。


2. 从节点上拷贝 rke2.yaml

在 Harvester 管理节点上,默认 kubeconfig 一般在:

/etc/rancher/rke2/rke2.yaml

将文件拷备到本机后需要注意:

  1. 里面的 server 默认是 https://127.0.0.1:6443,在你本机上直接用会连不到:
  2. 如果 IP 不在证书里,可能需要在 kubeconfig 的 cluster 段里加:
insecure-skip-tls-verify: true

生产环境要注意安全,这种更适合内网/测试环境。

五、在 Cursor 中配置 MCP(stdio 模式)

Cursor 支持 MCP,通过一个 mcp.json 文件来配置。

1. 打开全局 MCP 配置

在 Cursor 里:

  1. 打开 Settings
  2. 在左侧找到 MCP
  3. 点击“Open global mcp.json”(或者 “Add new global MCP server”,它会帮你打开文件)

会看到类似这样的结构(如果没有就新建一个):

{
  "mcpServers": {
  }
}

2. 添加 Harvester MCP 的配置

假设:

  • harvester-mcp-server.exe 在:D:\go\bin\harvester-mcp-server.exe
  • kubeconfig 在:D:\go\bin\rke2.yaml

我们在 mcpServers 下添加一段,cursor里文件路径要写双斜线:

{
  "mcpServers": {
    "harvester": {
      "type": "stdio",
      "command": "D:\go\bin\harvester-mcp-server.exe",
      "args": [
        "--kubeconfig", "D:\go\bin\rke2.yaml",
        "--log-level", "info"
      ]
    }
  }
}

保存后,回到 Settings → MCP 把这个 harvester server 打开(Enable)。

此时:

  • Cursor 启动某个 Agent 时,会在你本机起一个 harvester-mcp-server.exe 进程
  • 这个进程通过指定的 kubeconfig 连到 Harvester 集群
  • 对话里提到 Harvester 相关的问题时,模型就可以调用这个 MCP server 暴露的工具了

六、在 Cursor 里“聊天看集群”

配置完成后,你可以新建一个聊天,提示下模型你有 Harvester 工具,例如:

“你可以通过 Harvester MCP 访问我的集群。
帮我先列一下所有虚拟机和所在的 namespace。”

常见能做的事情有:

  • 查看节点:

“列出集群所有节点,以及 CPU / 内存资源情况。”

  • 查看某个 namespace 下的 VM:

“列一下 default 命名空间所有虚拟机和它们的运行状态。”

  • 查看单个 VM 的 YAML:

“把名为 test-wanger 的虚拟机完整 YAML 输出给我,我要对比一下。”

  • 生成操作命令 / YAML:

“根据现在的 test-wanger,帮我生成一个副本 test-wanger2 的 VirtualMachine YAML,放在 randd 命名空间。”

在这些场景下,Harvester MCP 的表现还是很不错的:
它能从集群里拉真实数据给模型看,而不是“盲猜”。

七、一个容易踩的坑:为什么“关机 / 开机 / 创建虚拟机”没生效?

1. 现象

在 Cursor 里对 Harvester 说:

“在 default 命名空间创建一台 2C4G 的 Ubuntu 虚拟机。”

模型会很爽快地回复一堆内容,包括:

  • 一段 VirtualMachine 的 YAML 示例
  • 一行“等价的”命令,比如:
kubectl patch vm test-wanger -n default --type merge -p '{"spec":{"runStrategy":"RerunOnFailure"}}'
  • 甚至还会说:“我已帮你执行了开机命令……”

但是切回 Harvester 的 Web 页面一看:
虚拟机并没有创建/开机。

2. 真相:Harvester MCP 目前几乎是“只读”的

回头看 Harvester MCP 的 README,可以看到 Feature 列表里 虚拟机只支持 List / Get

  • Pods:List / Get / Delete
  • VM:List / Get
  • Image:List
  • Volume:List
  • Network:List

没有 VM 的 Create / Patch / Delete 工具。

所以现在的行为其实是:

  • MCP 能够帮模型  到 VM 的真实状态;
  • 模型会根据这些信息,帮你生成 kubectl 命令和 YAML
  • 但 MCP 里 没有真正执行 patch / create 的逻辑
    那些命令只是一种“说明文字”,方便你 copy 到自己的终端去跑。

换句话说:

Cursor 说“已执行开机命令”,其实只是‘我打算这么做’,真正没有动你的集群。

3. 怎么办?

目前比较现实的用法是:

  1. 用 Cursor + Harvester MCP 看信息 + 生成命令
    • 让它列 VM、看 YAML、帮你写好 kubectl patch / kubectl apply 命令;
  2. 把这些命令/YAML 复制到一个有 kubectl + 管理员 kubeconfig 的终端里自己执行:
    • 比如 ssh 登录 Harvester 节点跑:
kubectl patch vm test-wanger -n default --type merge -p '{"spec":{"runStrategy":"RerunOnFailure"}}'
  1. 等未来有时间/精力,可以 fork 这个 MCP,自己加上:
    • start_vm / stop_vm:修改 spec.runStrategy(Halted / RerunOnFailure)
    • create_vm_from_yaml:直接把 YAML apply 到集群里

这样就能真正做到一句话开关机/创建 VM 了。

八、关于“没有 HTTP 访问”的一点说明

最后再强调一下你可能会关心的一点:

当前这个 Harvester MCP 仅支持 stdio 模式,不开放 HTTP/SSE。

这意味着:

  • 它的典型用法是给 桌面/IDE 客户端 用,比如 Cursor / Claude Desktop / VSCode 插件:
    • 客户端在本机起一个 MCP 进程,通过 stdin/stdout 和它对话;
  • 它不能直接当成一个 http://.../sse 的远程 MCP server:
    • 所以像 Dify 这种只支持 HTTP/SSE MCP 的平台,没法直接连这个 Harvester MCP;
    • 如果想给 Dify 用,需要再加一层“转接头”(如 supergateway),把 stdio MCP 转成 HTTP/SSE,这个就属于下一阶段的折腾了。

对于个人开发者/运维来说,本机 + Cursor + stdio MCP 已经足够把很多日常查阅类的工作收拢到一个界面里了。

九、结语

现在的 Cursor + Harvester MCP,更像是一个“会写代码、会看集群状态的运维顾问”:

  • 它能读真实数据,不再是纯脑补
  • 能帮你生成 kubectl 命令和 VM YAML,少查文档少打字
  • 但真正“动手”的那一下——创建 / 开关机 VM,还需要你在终端按回车

等社区把 Harvester MCP 的写操作补上、再加一个 HTTP 网关,
未来我们完全可以想象这样的体验:

在编辑器里写着业务代码,顺手问一句:

“帮我把 randd 命名空间的测试虚拟机全部关机,只保留 prod 开头的。”
→ MCP 解释计划 → 你确认
→ 集群里真实生效。

在那之前,这篇文章希望能先帮你把“第一步”走通:
把 Harvester 接进 Cursor,让模型真的“看见”你的集群。

如果你在实操过程中遇到什么奇怪的报错,也欢迎继续来交流。



最后,求关注。如果你还想看更多优质原创文章,欢迎关注我们的公众号「运维开发故事」。

如果我的文章对你有所帮助,还请帮忙点赞、在看、转发一下,你的支持会激励我输出更高质量的文章,非常感谢!

你还可以把我的公众号设为「星标」,这样当公众号文章更新时,你会在第一时间收到推送消息,避免错过我的文章更新。




我是 wanger,《运维开发故事》公众号团队中的一员,一线运维农民工,云原生实践者,这里不仅有硬核的技术干货,还有我们对技术的思考和感悟,欢迎关注我们的公众号,期待和你一起成长!



------本页内容已结束,喜欢请分享------

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发
运维开发故事的头像-运维开发故事

昵称

取消
昵称表情代码图片