ACP(Agent Client Protocol):AI 智能体与客户端/编辑器通信协议架构及应用简介
- AI技术
- -475分钟前
- 4热度
- 0评论

一、为什么会出现 ACP?
——AI 编码时代的新“统一接口”问题
近两年,AI 编码助手爆发式增长:GitHub Copilot、Claude Code、Gemini CLI、OpenHands、Qwen Code、Kimi CLI、OpenCode……但开发体验却愈发割裂:
- 每个编辑器都要为每一个 AI 助手写一套插件:VS Code 一套、JetBrains 一套、Neovim/Emacs 再一套
- 每个 AI 助手也要为不同编辑器分别适配:维护成本高、功能还不统一
- 一旦后端 API 或交互模式升级,前端插件全部要跟着改
这和 LSP 出现之前的“语言服务碎片化” 极其相似:
在 LSP 之前,各 IDE 需要分别为每种语言写语法高亮、补全、跳转的实现。LSP 把“语言服务”抽象出来统一标准,极大降低了集成成本。
在 AI 编码时代,我们遇到的是类似但更复杂的问题:
如何让“任意编辑器”可以连接“任意 AI 编码代理”,而不是被某一家厂商的“编辑器+AI”捆绑?
Agent Client Protocol(ACP)正是为此而生。
二、ACP 是什么?和 IBM 的 ACP 有何不同?
2.1 定义:Agent Client Protocol(Zed 社区主推)
Agent Client Protocol(ACP) 是一个基于 JSON-RPC 2.0 的开放协议,用来标准化:
- 客户端(Client):编辑器 / IDE / 终端 UI / 桌面应用
- 代理(Agent):具备代码理解、生成、重构能力的 AI 编码代理(往往基于大模型 + 工具调用)
之间的通信方式与语义。
一句话概括它的目标:
让 任何编辑器 都可以无缝连接 任何 AI 编码代理,就像 LSP 统一语言服务那样,统一 AI 编码体验。[1][2]
2.2 注意不要和 IBM 的 ACP 混淆
当前“ACP”有两条主线,需要明确区分:
| 名称 | 全称 | 核心对象 | 典型场景 |
|---|---|---|---|
| Agent Client Protocol | Agent Client Protocol(Zed) | 编辑器 / IDE ↔ AI 编码代理 | Zed、JetBrains、Neovim、桌面应用连接 Gemini CLI、Claude Code、OpenHands 等 |
| Agent Communication Protocol | Agent Communication Protocol(IBM 等) | Agent ↔ Agent、应用 ↔ Agent | 多智能体之间通信、跨系统编排 |
本文中如不特别说明,“ACP”均指 Zed 社区主导的 Agent Client Protocol。
三、从 0 开始理解 ACP:架构与消息模型
3.1 整体架构:谁是 Client,谁是 Server?
在 ACP 中:
- Client = 编辑器 / UI 端
- 掌握本地文件系统、终端、权限确认 UI
- Server = AI 代理
- 掌握大模型推理、代码生成、工具编排能力
典型架构如下:
+---------------------------+ JSON-RPC (stdio/pipe/TCP) +------------------------+
| Editor / IDE / GUI | <-------------------------------> | Coding Agent (ACP) |
| (Zed / JetBrains / | | (Gemini CLI / |
| AionUi / Open Cowork) | | Claude Code / etc.) |
+---------------------------+ +------------------------+
↑ ↑
| 提供:文件系统、终端、权限 UI | 执行:分析、规划、生成代码
| |
人机交互 & 环境层 智能决策 & 执行层
这种划分有两个关键好处:
- 安全:代理不直接“裸奔”访问本地文件与终端,一切都走 Client 提供的受控接口 + 权限确认
- 可组合:代理可以是本地 CLI 工具,也可以是远程服务,只要说“ACP 这门语言”就能挂载到各种编辑器 / 桌面 UI 上
3.2 消息模型:基于 JSON-RPC 2.0
ACP 严格遵守 JSON-RPC 2.0 标准,[3] 把所有交互规范化为两类消息:
- Request / Response(请求-响应)
- Notification(通知,无需响应)
请求示例:initialize
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"clientInfo": {
"name": "Zed",
"version": "0.202.0",
"capabilities": {
"fs": {
"readTextFile": true,
"writeTextFile": true
},
"terminal": true
}
}
}
}
响应示例:initializeResult
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"agentInfo": {
"name": "Gemini CLI",
"version": "1.3.0"
},
"capabilities": {
"loadSession": true,
"modes": ["chat", "edit"]
}
}
}
通知示例:session/update(流式输出)
{
"jsonrpc": "2.0",
"method": "session/update",
"params": {
"sessionId": "abc-123",
"updates": [
{ "type": "messageChunk", "role": "assistant", "content": "正在分析你的项目结构…" }
]
}
}
3.3 一次完整交互的“生命周期”
从编辑器视角看,一次使用 AI 的完整流程可以拆解为 4 步:
- 初始化
initialize:能力协商(双方是谁、都能干什么)
- 会话建立
session/new:新建会话session/load:加载旧会话(取决于代理是否声明支持)
- 对话 & 操作过程
session/prompt:发送用户请求(附上下文)- 代理通过
session/update持续推送计划、生成内容、进度 - 用户或编辑器可发送
session/cancel终止
- 工具调用 & 权限
- 当代理需要读写文件或执行命令时:
- 通过
session/request_permission请求授权 - 由 Client 通过 UI 询问用户是否允许
- 通过
- 通过
fs/*、terminal/*调用具体能力
- 当代理需要读写文件或执行命令时:
这个生命周期在多个实际产品中被一再验证,例如 Gemini CLI、Claude Code、OpenHands 与 JetBrains / Zed / AionUi 的集成。
3.4 扩展机制:既要“统一”,也要“生长”
为了避免重蹈“一上新功能就得改协议核心”的覆辙,ACP 提供了类似 LSP 的扩展能力:
- 自定义方法:以
_前缀区分实验 / 私有扩展,例如_symmacp/pipeline - 扩展元数据:统一放在
_meta中,避免污染主结构 - 能力声明:所有扩展在
initialize里通过capabilities广而告之
这保证了:
- 主协议稳定,可长期演化
- 厂商 & 社区可以在不破坏兼容性的前提下进行创新
四、开发者视角:如何把自己的工具“接上 ACP 总线”?
4.1 生态中的官方 SDK
为了降低接入门槛,ACP 提供了多语言 SDK,封装了:
- 面向协议的 Pydantic / struct 类型模型(防止字段乱写)
- 基于 asyncio / async 的传输和消息收发
- Agent / Client 抽象基类,简化实现过程
目前主流语言支持包括[2][4]:
| 语言 | SDK 包名 |
|---|---|
| Python | agent-client-protocol |
| Rust | agent-client-protocol |
| Kotlin | acp-kotlin |
| TypeScript | @agentclientprotocol/sdk |
4.2 用 Python 写一个最简 ACP Agent 的思路
下面是一个抽象化的示例(简化版,帮助你快速建立直觉):
from acp import Agent, schema
import asyncio
class SimpleAgent(Agent):
async def initialize(self, params: schema.InitializeParams) -> schema.InitializeResult:
"""处理初始化请求"""
return schema.InitializeResult(
agentInfo={"name": "simple-agent", "version": "0.1"},
capabilities={"loadSession": False}
)
async def session_new(self, params: schema.SessionNewParams) -> schema.SessionNewResult:
"""创建新会话"""
return schema.SessionNewResult(sessionId="session-1")
async def session_prompt(self, params: schema.SessionPromptParams) -> schema.SessionPromptResult:
"""处理用户请求"""
await self.send_session_update(
schema.SessionUpdateParams(
sessionId=params.sessionId,
updates=[schema.MessageChunk(type="messageChunk", content="思考中…")]
)
)
return schema.SessionPromptResult(
stopReason="completed",
response=f"Echo: {params.prompt}"
)
if __name__ == "__main__":
agent = SimpleAgent()
asyncio.run(agent.serve_stdio()) # 通过 stdio 与 ACP 客户端通讯
然后你只需在 Zed / JetBrains / AionUi 的配置里,写上类似:
{
"agent_servers": {
"My Simple Agent": {
"command": "python",
"args": ["-m", "my_simple_agent_module"]
}
}
}
即可把你的 Agent 挂到对应 IDE 里使用。
4.3 如果你是“编辑器 / UI”开发者,该做什么?
你需要实现一个 ACP Client 层,其职责包括:
- 启动 Agent 进程:按用户配置执行
command + args - 维护 JSON-RPC 连接:通过 stdio / socket 读写 NDJSON 流
- 协议调度:
- 框架层统一处理
initialize、session/new、session/prompt等 - 将
session/update映射到 UI:流式输出、Patch 展示、权限弹窗
- 框架层统一处理
- 能力适配:
- 把 IDE 的文件 API 映射为 ACP 的
fs/*方法 - 把内置终端映射为
terminal/*方法
- 把 IDE 的文件 API 映射为 ACP 的
JetBrains 在 2025 年底发布的 ACP 支持,就是经典示例:整个 IDE 家族(IntelliJ、GoLand、PyCharm 等)只需实现一次 ACP Client,就可以同时接入 Gemini CLI、Claude Code、OpenHands 等多种 Agent。[5]
五、从“能用”到“好用”:实际应用实践和案例
这一部分我们按照“使用者角度”来拆解,从桌面应用、IDE 编辑器、CLI Agent 三个维度看 ACP 的实战落地。
5.1 桌面端“多 Agent 工作台”:AionUi
AionUi 是什么?
- 一个免费、开源的跨平台桌面 GUI,最初是 Gemini CLI 的本地 UI
- 后来加入了 Multi-Agent 模式,通过 ACP 把各种 CLI Agent 接在一起,变成一个本地“Cowork 工作台”[6]
和 ACP 的关系
- AionUi 自身实现的是 ACP Client
- 它可以识别并连接本机上任何 ACP 兼容的 Agent CLI,例如:
- Claude Code (
claude) - Qwen Code (
qwen --acp) - OpenCode (
opencode acp) - Goose (
goose acp) - Augment Code (
auggie --acp) - Kimi CLI (
kimi --acp) - 以及后续持续增加的社区 Agent
- Claude Code (
用户体验上,你能获得什么?
- 在一个统一的 GUI 里:
- 用 Gemini 跑分析
- 用 Qwen Code 改代码
- 用 OpenCode 做大规模重构
- 当 Agent 需要读写文件、运行命令时,AionUi 会按 ACP 协议弹出权限确认窗口
- 所有对话、任务状态都持久化到本地,重启后可恢复
对于想要“本地版本 Claude Cowork / Copilot Workspace”体验,但又不想被单一厂商锁死的人来说,AionUi + ACP 是一个非常现实可行的路径。
5.2 基于 Electron + React 的 Open Claude Cowork
社区中有多个“Open Claude Cowork / Open Cowork”项目,其中有一支路线明确是 以 ACP 为底层协议,用 Electron + React 做桌面端多 Agent 协作工具。[7]
其核心设计可以概括为四个类:
AcpDetector:扫描本地可用 CLI(如claude,qwen,opencode acp等)AcpAgentManager:管理多个 Agent 实例、连接复用AcpAgent:封装会话级逻辑(initialize → newSession → prompt),支持@file语法引用文件AcpConnection:与具体 Agent 的 JSON-RPC 底层连接,基于 NDJSON 流
关键能力:
- 多 Agent 并行,在一个 UI 中管理多个“项目任务”
- 使用 SQLite 做任务 / 会话的持久化存储,重启后可继续协作
- 对 ACP 中的权限请求进行 UI 弹窗拦截,增加超时和取消机制
可以把它理解为:
用 ACP 把一堆不同厂家的“Claude Code 类工具”挂载到一个本地桌面端,统一操作、统一审计、统一安全策略。
5.3 IDE 编辑器:Zed & JetBrains & Neovim & Emacs
Zed 作为 ACP 的发起方,[1][2] 是最早一批内置 ACP Client 的编辑器:
- 在
settings.json中配置agents和命令,即可连接任意本地 ACP Agent - 支持多个 Agent 并行挂载:如 “Gemini CLI + Claude Code + OpenHands” 同时在线
JetBrains 则在 2025 年底正式宣布与 Zed 联合推动 ACP,并在其全家桶 IDE 中上线支持[5]:
- 在 AI 设置中,除了官方 AI Assistant 外,还多了 “ACP Agent” 选项
- 用户可以选择本地命令作为后端,例如:
opencode acpkimi --acpqwen --acp
Neovim / Emacs / Obsidian / Marimo 等 通过各自的插件,也实现了 ACP Client 能力:
- Neovim:如
codecompanion.nvim,通过<leader>a触发 ACP 会话 - Emacs:
agent-shell,以子进程方式挂载 ACP Agent - Obsidian:在笔记中选中代码块直接交给 ACP Agent 处理
- Marimo:将 ACP Agent 的输出映射为 Notebook 单元
这些集成的共同点是:
- 一次实现 ACP Client → 后续可“插拔”任意 ACP Agent
- 对 Agent 的交互能力高度一致:
- Chat 面板、内联编辑、带解释的重构操作
- 执行测试 / 命令、展示文件改动 diff
5.4 Agent / CLI 侧的 ACP 实现
目前已经宣布支持 ACP 的 Agent / CLI 工具有:
- Gemini CLI:官方参考实现(Zed 首批集成对象)
- Claude Code:通过
claude-code-acp(TS 实现)或社区的 Rust 版本[8] - OpenHands:
openhands acp,可将复杂的多步骤开发任务抽象为一个 ACP Agent - clawdbot(Moltbot): 一款开源的、本地优先(Local-First)的个人 AI 助手。其核心理念是让 AI 真正“驻留”在你的设备或私有服务器上,并通过你日常使用的通讯软件(如 WhatsApp, Telegram, Discord, Slack 等)为你提供服务。
- Goose、Augment Code(Auggie)、Qwen Code、Kimi CLI、OpenCode 等
典型用法往往类似:
# 启动一个 ACP server
qwen --acp
opencode acp
kimi --acp
goose acp
clawdbot acp
然后在任何 ACP 客户端(Zed / JetBrains / AionUi / Open Cowork / Toad)中把对应命令填进去即可。
六、如何在团队中落地 ACP?实战建议
假设你所在团队有两个诉求:
- 想在公司主力 IDE 中统一引入各种 AI 编码助手
- 想把自研的代码 Agent 提供给团队成员使用
我们可以按照“编辑器团队”和“Agent 团队”两侧来规划。
6.1 如果你负责“编辑器 / 内部开发工具”
短期目标(1–2 个月):做一个最小可用的 ACP Client 集成
- 选一个编辑器或内部 Web IDE 作为试点
- 引入 TypeScript / Kotlin ACP SDK
- 实现最基本的:
initialize/session/new/session/prompt- 接入
session/update→ 将文本流显示到一个简单的 Chat 面板
- 配置 1–2 个现成 Agent(如
gemini acp、opencode acp)验证全链路
中期目标(3–6 个月):扩展到“生产可用”
- 接入文件能力:实现
fs/read_text_file/fs/write_text_file映射到项目文件树 - 接入终端能力:实现
terminal/*映射到 IDE 内置终端 - 实现权限模型:
- 所有写文件 / 执行命令必须弹窗确认
- 提供“一次性允许 / 本会话允许 / 永久允许”选项
- 引入多 Agent 支持:有选择地接入 Claude Code、Qwen Code、OpenHands 等
长期目标:内部 AI 平台对接
- 在 IDE 侧只负责 ACP Client
- 把企业内部的 AI 编码平台封装成一个或多个 ACP Agent Server,对内统一暴露
- 通过组织级策略控制:
- 哪些项目可用哪些 Agent
- 哪些目录可被 Agent 读写
6.2 如果你负责“Agent / 智能体平台”
第一步:把现有 Agent 封装成 ACP Server
- 选用合适的 SDK(Python / Rust)
- 在现有业务逻辑外包一层:
- 实现
initialize,声明你的能力(是否支持 loadSession、支持哪些模式) - 实现
session/new/session/prompt,将用户意图映射到你的内部工作流
- 实现
- 如果 Agent 需要访问文件 / 终端:
- 改为通过 ACP 的
fs/*、terminal/*间接访问,而不是直接用os/subprocess
- 改为通过 ACP 的
第二步:写好文档和示例配置
- 提供针对 Zed / JetBrains / AionUi / Neovim 的示例配置片段
- 明确说明:
- 启动命令
- 需要的环境变量(如 API Key、代理配置)
- 支持的模式(chat / edit / refactor / test 等)
第三步:企业内推广
- 把 ACP 集成纳入内部 IDE / Web IDE 的“官方支持列表”
- 从一个“高价值用例”切入(例如:安全审计 Agent 或重构 Agent),而不是泛泛聊天
七、小结:ACP 在整个智能体协议版图中的位置
如果我们把当前 Agent 相关协议做一个“分层”梳理,大致如下:
+---------------------------------+
| 应用层(IDE、桌面端、业务系统 UI) |
+---------------------------------+
| Agent Client Protocol (ACP) | ← 本文主角:UI ↔ 编码 Agent
+---------------------------------+
| MCP / 其它 Tool 协议 | ← Agent ↔ 工具 / 数据源
+---------------------------------+
| A2A / IBM ACP / 自定义协议 | ← Agent ↔ Agent
+---------------------------------+
| HTTP / TCP / stdio / NDJSON |
+---------------------------------+
- MCP 解决“模型如何安全、统一地调用工具和数据源”
- A2A / IBM ACP 解决“Agent 与 Agent 之间如何协作”
- 而 ACP(Agent Client Protocol) 聚焦在一个非常垂直但极其重要的领域:
- 编辑器 / 开发环境 与 AI 编码 Agent 的通信
在“AI 原生开发体验”这条路径上,ACP 与 LSP 一样,很可能会成为一种 长期存在的基础设施标准:
- LSP:统一语言服务
- MCP:统一模型与工具
- ACP:统一 AI 编码 Agent 与编辑器

八、行动建议
如果你是个人开发者 / 工程师
- 尝试至少一个 ACP 客户端:
- Zed / JetBrains 最新版本 / AionUi / Open Claude Cowork / Neovim + ACP 插件
- 尝试接入两个以上不同厂商的 Agent:
- 例如:Qwen Code(国产)+ OpenCode(开源)+ Gemini CLI(国际云厂商)
- 在实际项目中用 ACP Agent 做几件具体事情:
- 迁移一个模块的架构
- 改造测试体系
- 做一次安全审计或性能分析
如果你是工具 / 平台开发者
- 评估把自研 Agent 封装成 ACP Server 的工作量(通常以周为单位)
- 优先选择一个场景做 MVP:例如“重构 Agent”或“CI 修复失败用例 Agent”
- 发布后主动适配:
- 写出 Zed / JetBrains / AionUi 的配置示例
- 在文档中标明 “ACP-compatible Agent”
如果你是架构师 / 技术负责人
- 将 ACP 视作“企业内 AI 开发体验标准化”的一个选项:
- 它不会取代 MCP / A2A,但在 IDE/开发工具这一层是最佳人选之一
- 从安全视角审查 ACP 的使用:
- 明确哪些目录可被 ACP Agent 访问
- 明确命令执行白名单 / 黑名单策略
- 鼓励团队用一个小范围试点(单个业务组 + 单一 IDE)验证收益,再逐步推广。
九、相关参考
[1] Agent Client Protocol. https://zed.dev/acp
[2] Overview – Agent Client Protocol. https://agentclientprotocol.com/protocol/overview
[3] JSON-RPC 2.0 Specification. https://www.jsonrpc.org/specification
[4] Agent Client Protocol - Python SDK. https://agentclientprotocol.github.io/python-sdk/
[5] Bring your own AI agent to JetBrains IDEs. https://blog.jetbrains.com/ai/2025/12/bring-your-own-ai-agent-to-jetbrains-ides/
[6] ACP Setup · iOfficeAI/AionUi Wiki. https://github.com/iOfficeAI/AionUi/wiki/ACP-Setup
[7] 基于Electron + React + ACP 的本地多Agent 协作桌面应用. https://juejin.cn/post/7599581687357571122
[8] Xuanwo/acp-claude-code. https://github.com/Xuanwo/acp-claude-code