!! 大家好,我是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
这里略过详细安装步骤,只提醒两点:
D:Program FilesGoin
- 提议设置好代理和 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)in"你应该能在
**GOPATHin**里看到: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 .cmdharvester-mcp-server就会在当前目录生成一个
**harvester-mcp-server.exe**,放到你喜爱的路径,然后记住这个路径即可。四、准备 Harvester 的 kubeconfig
MCP Server 是靠 kubeconfig 去连 Harvester 集群的。Windows 上常见有两种来源:
1. 从 Harvester Web UI 下载
这是最推荐的方式:
打开 Harvester 管理页面 → 登录
在右上角用户菜单 / Support 里,一般会有一个 “Download kubeconfig” 的按钮
下载后的文件保存到本机,列如:
C:Users\.kubeharvester.yaml一般这份 kubeconfig 会把 server 设置成集群对外可访问的地址,不需要你改 127.0.0.1。
2. 从节点上拷贝 rke2.yaml
在 Harvester 管理节点上,默认 kubeconfig 一般在:
/etc/rancher/rke2/rke2.yaml将文件拷备到本机后需要注意:
- 里面的
server默认是https://127.0.0.1:6443,在你本机上直接用会连不到:
- 要么改成
https://- 要么在本机做 SSH 隧道:
ssh -L 6443:127.0.0.1:6443 root@如果 IP 不在证书里,可能需要在 kubeconfig 的 cluster 段里加:
insecure-skip-tls-verify: true生产环境要注意安全,这种更适合内网/测试环境。
五、在 Cursor 中配置 MCP(stdio 模式)
Cursor 支持 MCP,通过一个
mcp.json文件来配置。1. 打开全局 MCP 配置
在 Cursor 里:
打开 Settings
- 在左侧找到 MCP
点击“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 把这个
harvesterserver 打开(Enable)。此时:
- Cursor 启动某个 Agent 时,会在你 本机起一个
harvester-mcp-server.exe进程这个进程通过指定的 kubeconfig 连到 Harvester 集群
对话里提到 Harvester 相关的问题时,模型就可以调用这个 MCP server 暴露的工具了
六、在 Cursor 里“聊天看集群”
配置完成后,你可以新建一个聊天,提示下模型你有 Harvester 工具,例如:
“你可以通过 Harvester MCP 访问我的集群。帮我先列一下所有虚拟机和所在的 namespace。”
常见能做的事情有:
“列出集群所有节点,以及 CPU / 内存资源情况。”
“列一下 default 命名空间所有虚拟机和它们的运行状态。”
“把名为
test-wanger的虚拟机完整 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. 怎么办?
目前比较现实的用法是:
- 用 Cursor + Harvester MCP 看信息 + 生成命令:
- 让它列 VM、看 YAML、帮你写好
kubectl patch/kubectl apply命令;把这些命令/YAML 复制到一个有 kubectl + 管理员 kubeconfig的终端里自己执行: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,让模型真的“看见”你的集群。
如果你在实操过程中遇到什么奇怪的报错,也欢迎继续来交流。
如果我的文章对你有所协助,还请帮忙一下,你的支持会激励我输出更高质量的文章,超级感谢!
你还可以把我的公众号设为「星标」,这样当公众号文章更新时,你会在第一时间收到推送消息,避免错过我的文章更新。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
暂无评论...




