用 HuaweiCloud Devkit MCP 把华为云资源接进 AI Agent(含本地 CDP 调试实践)
用 HuaweiCloud Devkit MCP 把华为云资源接进 AI Agent(含本地 CDP 调试实践)
把云上资源交给 Agent 操作,卡点不在模型能力,而在于三件事:有没有一条可执行、可审计的通道到云 API;写操作会不会被一个幻觉参数直接落到生产;出了问题怎么复现。华为云 Devkit 的 MCP 插件(huaweicloud-devkit)提供的就是这条通道——把 KooCLI(hcloud)封装成带风险分级的工具,让自然语言意图落到确定的 API 调用上。本文按使用顺序记录:装什么、配凭证、分级授权、401 排查,最后用本地 CDP 链路做端到端验证。
一、这个 MCP 能做什么
装上之后 Agent 手上多了四类能力,理解边界比记住工具名重要:
- KooCLI 分级调用。所有 OpenAPI 都能通过
hcloud <Service> <Operation>触达,插件切成两档:只读查询直接执行,写操作必须走"规划 → 展示完整命令 → 用户确认 → 带 token 执行"。分级靠工具签名强制,不靠提示词约束模型。 - OBS 静态网站托管。KooCLI 本身不支持
SetBucketWebsite,插件用 AWS4 签名直调 OBS REST API 补齐这步,所以"上传产物 + 开托管 + 拿域名"能在一个会话里闭环。 - 沙箱与终端。提供一个临时运行环境跑构建、起服务,适合"改完立刻验证",不污染本地或生产。
- 凭证管理。AK/SK 可运行时注入、持久化到 profile,也能同步给
obsutil——KooCLI 和 OBS 是两套凭证文件,不同步就会出现"hcloud能跑、OBS 报Please set ak, sk"。
二、安装与凭证配置
插件是可执行包,用 npx 拉起,不必全局安装:
npx huaweicloud-devkit
然后把 AK/SK 交给它。推荐运行时注入,而不是把密钥写进任何文件:
huaweicloud_auth_init(ak="<YOUR_AK>", sk="<YOUR_SK>", region="cn-north-4")
确认身份与区域对得上再动资源:
hcloud configure show
hcloud ECS NovaListServers --cli-region=cn-north-4 --cli-output=json
要固化到 CLI profile,让终端里的 hcloud 也能用:
huaweicloud_auth_switch(mode="import", action="persist", region="cn-north-4")
import 模式从本地文件读 AK/SK 并读完擦除,密钥不进对话上下文。OBS 操作前补一步:
huaweicloud_setup_obs_config()
三、把只读和写操作真正分开
分级要落到工程约束,不能停在"让模型注意点"。
一是用工具自带的双阶段执行。写操作先规划后执行,规划阶段不产生副作用:
huaweicloud_plan_cli_command(args=["OBS", "CreateBucket", "--bucket=agent-demo"])
# 返回 operation 分类 + approvalToken
huaweicloud_run_approved_command(
args=["OBS", "CreateBucket", "--bucket=agent-demo"],
approvalToken="<TOKEN_FROM_PLAN>",
approvedByUser=True
)
approvedByUser=True 只在用户真看过那条命令之后才传。只读调用可以完全放开:
huaweicloud_run_readonly_command(args=["ECS", "NovaListServers", "--cli-region=cn-north-4"])
二是在 IAM 侧做真正的收口。给 Agent 用的 AK/SK 绑一个只含查询策略的子账号,写权限(obs:object:PutObject、ecs:servers:create)单独授权、单独轮换。这样即使提示词被绕过、模型编出删除命令,请求也会在服务端被拒。工具分级防误操作,IAM 防越权,两层都要在。
四、401 与 AK/SK 未配置怎么排查
报错看着吓人,原因基本收敛在四点,按顺序查。
1. 凭证根本没加载。 典型 Please set ak, sk 或 Authentication failed。先确认:
huaweicloud_auth_status(target="all")
它同时报告全局凭证库、OBS、KooCLI 三处状态,一眼看出是"没配"还是"配了没同步"。
2. KooCLI 有、OBS 没有。 最常见的坑。KooCLI 写 ~/.hcloud/config.json,OBS 读写 ~/.obsutilconfig,彼此独立。补齐:
huaweicloud_setup_obs_config()
3. 区域或 project_id 不匹配。 返回 APIGW.0301 且凭证无误时,多半是 --cli-region 与资源所在区域不一致。排查时把区域显式写进命令,别依赖默认值:
hcloud OBS ListBuckets --cli-region=cn-north-4
4. 密钥过期或权限不足。 用错误解释工具定性:
huaweicloud_explain_error(errorCode="APIGW.0301", service="ECS")
401 和 403 要分开看:401 是"你是谁我不知道",403 是"知道你是谁但你不能干这事"。前者修凭证,后者修策略。
五、用本地 CDP 做端到端验证
资源配好了,怎么证明"网页控制台看到的"和"Agent 操作出来的"一致?让 Playwright 连本地已登录的 Chromium,走 CDP 复现控制台操作做对账。
先带调试端口起一个浏览器实例(独立 user data 目录,别动日常配置):
chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\tmp\cdp-profile"
手工登录一次控制台,会话就留在 profile 里。脚本每次连上去都是已登录态:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp("http://127.0.0.1:9222")
ctx = browser.contexts[0]
page = ctx.pages[0] if ctx.pages else ctx.new_page()
page.goto("https://console.huaweicloud.com/obs/", wait_until="domcontentloaded")
page.wait_for_selector("[class*=bucket]", timeout=30000)
names = [e.inner_text().strip() for e in page.query_selector_all("[class*=bucket-name]")]
print(names)
browser.close() # 只断开 CDP 连接,不关闭用户的浏览器
要点在 connect_over_cdp 复用的是真实浏览器上下文——cookie、SSO 状态都在,不需要在脚本里重放登录,也就不会碰验证码。对账逻辑就是取差集:CDP 抓到的桶列表 vs hcloud OBS ListBuckets 的返回,差集为空说明 Agent 的操作在控制台上真实可见。这比"命令返回 200 就算成功"可靠得多。
限制:已跑着的浏览器不会凭空获得调试端口。先关浏览器、带参数重启、登录一次,再跑脚本。
经验小结
- 凭证分三处,别只配一处。 运行时凭证、KooCLI profile、
~/.obsutilconfig是三套独立存储,auth_status(target="all")一次看全,比逐个试错快。 - 写操作要确认到命令级。 让用户看"我要建个桶"没意义,要让他看到
hcloud OBS CreateBucket --bucket=xxx整行。参数错一个字符,结果完全不同。 - 工具分级不等于权限隔离。 MCP 的 approve 防的是模型幻觉,防不了凭证被盗。IAM 子账号 + 最小策略 + 独立轮换才是真边界。
connect_over_cdp是连接不是启动。 复用已登录浏览器是优点也是限制:先手动登录脚本才能跑;browser.close()只断连,别指望它关窗口。- 验证要看控制台,不要只看返回码。 用 CDP 复现同一操作做对账,能抓到"API 成功但资源不在预期区域/账号下"这类静默错误。
- 点赞
- 收藏
- 关注作者
评论(0)