跳到正文

Blog

Skill 不是 MCP:AI Agent 如何安全地调用部署控制面

Appaloft 为什么把 AI skill、MCP tools、CLI 命令和 operation catalog 分成不同职责,而不是给 agent 单开一条部署捷径。

AppaloftAIMCP部署控制面Agents

聊 AI Agent 和基础设施时,很多讨论会很快跳到工具层:给 agent 一个终端,给它云厂商 API key,给它 MCP,让它去修部署。

但线上问题通常不是卡在“有没有工具”上,而是卡在 agent 调用工具之前有没有走对路径。它应该先 plan 还是直接 apply?这次操作会不会创建外部资源?是否需要一个 scoped token?哪个 readback 能证明应用真的可访问?如果服务器还没准备好,应该修复 runtime、重试部署,还是停下来让人确认?

在 Appaloft 里,AI skill 和 MCP server 解决的是两类问题。Skill 是给 agent 的操作协议;MCP 是进入控制面的可调用 transport。它们都不应该变成藏在 CLI 和 Web Console 旁边的另一套部署产品。

这篇文章接着 面向 AI 时代的部署控制面 继续说:AI 应该调用和人类、自动化流程相同的部署路径,而不是拿到一条私有捷径。

Skill 告诉 agent 怎么判断

AI skill 不是 API wrapper。它更像是写给模型看的 runbook。

对 Appaloft 来说,skill 首先要把用户意图归类:部署、观测、恢复、配置资源、管理域名、查看 runtime usage、处理组织和认证,或者做系统维护。然后它再选择当前 session 里可用的入口:CLI、HTTP/API、Web Console、仓库配置,或者 MCP tools。

这一层流程很重要,因为部署里有很多判断不能只靠 tool schema 推出来:

  • 使用 hosted control plane 之前,先确认当前 product context
  • agent 默认不应该代替用户跑浏览器登录,而是使用 scoped token 或已有 profile
  • 可能创建基础设施的操作,要先生成 plan
  • 重试之前先看 logs、events、diagnostics 和 recovery readiness
  • 不打印 .env、private key、token、cookie、原始连接串或未脱敏 secret
  • 清理资源时走 Appaloft lifecycle command,而不是手工删 provider 状态

这些规则不酷,但它们决定 agent 是一个受约束的助手,还是一个拿到权限后到处执行脚本的东西。

Skill 本身也不应该写成一本长手册。长命令表、deploy protocol、surface 选择说明、MCP 细节,都可以拆到 reference 里。顶层 skill 只需要告诉 agent:现在是什么任务、应该先收集哪些事实、哪些边界不能跨。

MCP 给 agent 稳定调用入口

MCP 解决的是另一个问题:宿主可以把 typed tools、只读 resources 和 reusable prompts 暴露给 agent。对部署产品来说,这很有价值,因为 agent 不应该靠解析终端输出或猜 HTTP route 来完成结构化操作。

在 Appaloft 的模型里,MCP tool 映射到 operation catalog 里的操作。部署计划、资源诊断、runtime 日志、system doctor 这些 operation,无论从 CLI、API、Web 还是 MCP 调用,都应该保持同一个含义。

这种一一对应不只是代码洁癖。它是在防止第二套产品长出来。

如果 MCP 里手写一个 operation catalog 不存在的 quick_deploy_create,马上会出现一串说不清的问题:

  • 哪些授权和 tenant 规则生效
  • 这个动作是否幂等
  • audit record 从哪里发出
  • destructive 行为是否需要 confirmation
  • secret 怎么脱敏
  • 人类用户在 UI 或 CLI 里如何理解同一结果

更安全的规则很朴素:MCP tools 应该从同一份 operation catalog 生成,或者至少被它校验。MCP 可以让 agent 更稳定地调用 Appaloft,但它不能发明隐藏的 agent-only 行为。

Resources 和 prompts 不是 command handler

MCP 有三个概念,很容易混在一起。

Tools 执行操作。Resources 提供上下文。Prompts 编排可复用工作流。

对 Appaloft 来说,operation catalog snapshot、deploy protocol reference、skill guide 都可以作为 MCP resource。Agent 可以读取它们,理解有哪些 tools、应该按什么流程做。但 resource 不应该改变部署状态,不应该决定策略,也不应该悄悄修基础设施。

Prompts 也类似。first deploy、recover failed deployment、configure resource、observe runtime、publish static artifact 这类 prompt,可以把已有 operations 串起来,也可以提醒 agent 先 inspect 再 act。它不应该拥有业务状态,不应该绕过 confirmation,也不应该变成新的 command surface。

这个区别写在文档里很小,到了生产里很大。如果 resources 和 prompts 也开始做 command 的事,安全模型就会碎掉。运维人员会回答不了一个很基础的问题:到底是哪条 command 改了系统?

Auth 也是产品边界的一部分

AI 认证不应该靠聪明的浏览器小把戏。

人类可以在自己的终端里运行交互式 login。Agent 不应该替用户驱动浏览器、复制授权码、读取 cookie,或者要求用户把长期 token 粘到聊天里。Agent 需要的是 scoped、可过期、可撤销的 credential,通过可信 UI、secret manager、环境变量,或者 CLI 明确支持的 token import flow 完成交接。

这没有“agent 自动帮你登录”那么魔法,但更容易审计,也更容易撤销。

认证之后,产品边界仍然要生效。Hosted Cloud 可以加入团队权限、entitlement、tenant context、audit 和 policy。自部署 Appaloft 可以保留本地控制面的所有权。Enterprise 可以使用 private gateway 和 customer-managed credential pattern。这些差异应该属于 composition 和 adapter,而不是另起一套 agent-only 部署模型。

Plan-first 让 AI 操作可以被复核

AI Agent 有用,是因为它能把模糊意图拆成具体步骤:部署这个仓库、安装 PocketBase、诊断生成的 URL 为什么打不开、加一块存储、看一次失败发布的原因。

危险版本是直接执行。Agent 猜 Docker 命令,调用 provider SDK,改完状态以后再试图解释发生了什么。

Appaloft 更希望中间事实是可见的:

  1. 识别 project、resource、server、environment、Blueprint 或 static artifact。
  2. 可能创建或修改持久状态时,先生成 plan。
  3. 展示缺失的 secrets、权限、dependency bindings 和外部资源影响。
  4. 只有在用户或策略接受后才执行。
  5. 通过 events、logs、health checks、diagnostics 和 access readback 观察结果。
  6. 通过显式 retry、redeploy、rollback 或 repair command 恢复。

这套顺序对人类也有用。AI 不是控制面存在的理由;AI 只是让这个需求变得更难忽略。

我们想要的形状

目标架构其实很普通:

  • Skill:agent-facing operating protocol
  • MCP tools:对现有 operations 的 typed calls
  • MCP resources:只读上下文和文档
  • MCP prompts:可复用工作流编排
  • Operation catalog:共享的产品契约
  • CommandBus / QueryBus:真正读写状态的 application boundary
  • CLI、API、Web、MCP:进入同一模型的平级入口

这个形状可以容纳不同部署方式。本地开发者可以用 CLI。GitHub workflow 可以用 deploy token。桌面 agent 可以用 MCP stdio。托管 agent 可以使用 remote tool gateway。Cloud 可以补 authz、audit 和 entitlement。Enterprise 可以运行 private gateway。

关键点是:不要在 agent 进场的那一刻,让部署语义分叉。

守住边界的成本

这种设计会带来工作量。

Operation catalog 要保持更新。MCP descriptors 需要测试。Skill references 需要 eval,避免模型漂移到不安全的捷径。Auth 指南要写清楚。危险操作要有 annotations、confirmations、redaction 和幂等规则。CLI 和 Web Console 也要能解释 MCP 返回给 agent 的同一组事实。

但这比凌晨两点调试一条 agent-only 路径要划算得多。

AI Agent 应该能够部署、观测和恢复软件。但它应该通过所有人都在用的同一条控制面路径完成这些事。在 Appaloft 里,skill 教 agent 该怎么走,MCP 提供可调用入口,operation catalog 负责让产品语义不跑偏。