!! 大家好,我是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 简介
- MCP 是什么?
MCP(Model Context Protocol)是 Anthropic 提出的一个协议,用来把 大模型 ↔ 外部系统 之间的交互标准化。
一端是 MCP Server:封装了你的业务系统(Harvester、Kubernetes、Git、DB……)
另一端是 MCP Client:比如 Claude Desktop、Cursor、VSCode 插件
模型通过 MCP 暴露的 tools / resources 来“看”和“操作”你的系统
好处就是:
你写(或者用别人的)一个 MCP Server,任何支持 MCP 的客户端都能接进去用。 - 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+) - 在 Windows 上安装 Go
这里略过详细安装步骤,只提醒两点:
PATH 里要有你的 Go 安装路径,比如:
D:\Program Files\Go\bin
建议设置好代理和 module 模式(在 CMD / PowerShell):
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
方便后面拉 Go 模块,不然国内网络会各种超时。
三、用 Go 安装 Harvester MCP Server - 一条命令安装(推荐)
在 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。 - 手动编译(备选方案)
如果网络比较差,也可以先 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 上常见有两种来源:
- 从 Harvester Web UI 下载
这是最推荐的方式:
打开 Harvester 管理页面 → 登录
在右上角用户菜单 / Support 里,一般会有一个 “Download kubeconfig” 的按钮
下载后的文件保存到本机,比如:
C:\Users\<你的用户名>.kube\harvester.yaml
通常这份 kubeconfig 会把 server 设置成集群对外可访问的地址,不需要你改 127.0.0.1。 - 从节点上拷贝 rke2.yaml
在 Harvester 管理节点上,默认 kubeconfig 一般在:
/etc/rancher/rke2/rke2.yaml
将文件拷备到本机后需要注意:
里面的 server 默认是 https://127.0.0.1:6443,在你本机上直接用会连不到:
要么改成 https://:6443
要么在本机做 SSH 隧道:ssh -L 6443:127.0.0.1:6443 root@<节点IP>
如果 IP 不在证书里,可能需要在 kubeconfig 的 cluster 段里加:
insecure-skip-tls-verify: true
生产环境要注意安全,这种更适合内网/测试环境。
五、在 Cursor 中配置 MCP(stdio 模式)
Cursor 支持 MCP,通过一个 mcp.json 文件来配置。 - 打开全局 MCP 配置
在 Cursor 里:
打开 Settings
在左侧找到 MCP
点击“Open global mcp.json”(或者 “Add new global MCP server”,它会帮你打开文件)
会看到类似这样的结构(如果没有就新建一个):
{
“mcpServers”: {
}
} - 添加 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 的表现还是很不错的:
它能从集群里拉真实数据给模型看,而不是“盲猜”。
七、一个容易踩的坑:为什么“关机 / 开机 / 创建虚拟机”没生效?
- 现象
在 Cursor 里对 Harvester 说:
“在 default 命名空间创建一台 2C4G 的 Ubuntu 虚拟机。”
模型会很爽快地回复一堆内容,包括:
一段 VirtualMachine 的 YAML 示例
一行“等价的”命令,比如:
kubectl patch vm test-wanger -n default –type merge -p ‘{“spec”:{“runStrategy”:”RerunOnFailure”}}’
甚至还会说:“我已帮你执行了开机命令……”
但是切回 Harvester 的 Web 页面一看:
虚拟机并没有创建/开机。 - 真相: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 说“已执行开机命令”,其实只是‘我打算这么做’,真正没有动你的集群。 - 怎么办?
目前比较现实的用法是:
用 Cursor + Harvester MCP 看信息 + 生成命令:
让它列 VM、看 YAML、帮你写好 kubectl patch / kubectl apply 命令;
把这些命令/YAML 复制到一个有 kubectl + 管理员 kubeconfig 的终端里自己执行:
比如 ssh 登录 Harvester 节点跑:
kubectl patch vm test-wanger -n default –type merge -p ‘{“spec”:{“runStrategy”:”RerunOnFailure”}}’
等未来有时间/精力,可以 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,《运维开发故事》公众号团队中的一员,一线运维农民工,云原生实践者,这里不仅有硬核的技术干货,还有我们对技术的思考和感悟,欢迎关注我们的公众号,期待和你一起成长!
声明:来自运维开发故事,仅代表创作者观点。链接:http://eyangzhen.com/4557.html