Extension System 模块对比分析
2026/4/27大约 5 分钟
Extension System 模块对比分析
1. 模块边界
这里的“扩展系统”指运行时如何发现、加载和挂载外部能力,重点覆盖:
- MCP
- Skills
- Plugins
- 由扩展带入的 commands / tools / hooks / agents
不讨论 UI 层如何展示这些能力。
2. Claude Code:分层明显、治理较重的扩展系统
2.1 关键源码路径
MCP
claude-code-rev/src/services/mcp/client.tsclaude-code-rev/src/services/mcp/config.tsclaude-code-rev/src/services/mcp/MCPConnectionManager.tsxclaude-code-rev/src/services/mcp/*
Plugins
claude-code-rev/src/utils/plugins/pluginLoader.tsclaude-code-rev/src/utils/plugins/refresh.tsclaude-code-rev/src/services/plugins/PluginInstallationManager.tsclaude-code-rev/src/utils/plugins/*
Skills
claude-code-rev/src/skills/loadSkillsDir.tsclaude-code-rev/src/services/skillSearch/*claude-code-rev/src/skills/bundled/*
2.2 模块边界
Claude Code 的扩展系统边界很清楚,但层次很多:
- MCP 主要解决“外部 server 能否接进来,并把 tool/resource/prompt 变成 Claude Code 可调用对象”。
- Plugins 主要解决“插件包如何被发现、安装、缓存、刷新,并把 commands / agents / hooks / MCP / LSP 注入运行时”。
- Skills 主要解决“Markdown 型工作流说明如何被发现、解析和按需加载”。
也就是说,Claude Code 没把这些统一抽象成一个最小接口,而是按能力类型分别治理。
2.3 MCP 装载方式
services/mcp/client.ts同时支持stdio、SSE、streamable HTTP、WebSocket 等 transport。- 它不仅拿工具列表,还处理 prompts、resources、OAuth、session 失效、tool result 截断与持久化。
- MCP 连接本身是运行时一等对象,不是“取一次列表就结束”的静态配置。
2.4 Plugin 装载方式
pluginLoader.ts负责插件发现、manifest 校验、依赖与缓存处理。PluginInstallationManager.ts负责后台 marketplace 安装与 reconcile。utils/plugins/refresh.ts负责把磁盘上的插件物化结果刷新到当前会话状态,包括 commands、agents、hooks、MCP、LSP。
这说明 Claude Code 的 plugin 是三层模型:
- 配置意图
- 磁盘物化
- 当前会话中的 active components
2.5 Skill 装载方式
loadSkillsDir.ts会从不同来源扫描 skill/command Markdown,并解析 frontmatter。- 技能不仅有 name/description,还可以带 hooks、model、agent、effort、shell 等前置元数据。
- 技能系统和 plugin-only policy、managed path、MCP skill builder 也有交叉,说明它并不只是“读个 SKILL.md”。
2.6 设计特点
- 发现、安装、刷新、运行时挂载是分离的。
- 每种扩展形态都有自己的治理策略。
- 复杂,但适合大型插件生态和托管环境。
3. Opencode:围绕统一运行时接口的扁平扩展系统
3.1 关键源码路径
MCP
opencode/packages/opencode/src/mcp/index.tsopencode/packages/opencode/src/mcp/auth.tsopencode/packages/opencode/src/mcp/oauth-provider.tsopencode/packages/opencode/src/mcp/oauth-callback.ts
Plugins
opencode/packages/opencode/src/plugin/index.tsopencode/packages/opencode/src/plugin/codex.tsopencode/packages/opencode/src/plugin/copilot.tsopencode/packages/opencode/src/config/config.ts
Skills
opencode/packages/opencode/src/skill/index.tsopencode/packages/opencode/src/skill/discovery.tsopencode/packages/opencode/src/tool/skill.ts
扩展注入点
opencode/packages/opencode/src/tool/registry.tsopencode/packages/opencode/src/session/llm.ts
3.2 模块边界
Opencode 倾向于把扩展能力拉回到统一运行时:
- MCP 最终要变成 AI SDK tool。
- Plugin 最终要变成 hooks、tool definitions 或 provider/auth 能力。
- Skill 最终要变成一个可经
skill工具加载的内容块。
因此它的扩展边界更扁平,最终都要接到 session、tool registry 或 plugin hook 上。
3.3 MCP 装载方式
mcp/index.ts支持 stdio、SSE、streamable HTTP,并维护每个 server 的连接状态。- MCP tool 会被转换成
dynamicTool,统一进入 AI SDK 的 tools 集合。 - 还会响应 tool list changed、OAuth 登录、浏览器唤起失败等事件。
和 Claude Code 相比,Opencode 的 MCP 更偏“把远端能力映射为标准工具集合”,治理层次稍少,但路径更直接。
3.4 Plugin 装载方式
plugin/index.ts会先加载内置插件,再读取配置中的插件包。- 插件本质上暴露
Hooks,通过Plugin.trigger()参与chat.system.transform、chat.params、chat.headers、tool.definition、experimental.session.compacting等运行时挂点。 config/config.ts负责把.opencode目录、项目配置、全局配置、远端 well-known 配置、managed config 合并起来,因此插件来源天然和配置系统绑定。
这说明 Opencode 的 plugin 更接近“运行时 hook 包”,而不是 Claude Code 那种带 marketplace 物化层的完整插件平台。
3.5 Skill 装载方式
skill/index.ts从全局目录、项目目录、配置路径和远端 URL 扫描SKILL.md。skill/discovery.ts支持通过远程 index 拉取 skill 文件到本地 cache。tool/skill.ts把技能加载暴露为标准工具,并在执行前走权限确认。
这条链路很清晰:发现 -> 缓存 -> 注册 -> 通过 tool 使用。
4. 核心差异
| 维度 | Claude Code | Opencode |
|---|---|---|
| 总体风格 | 分能力治理,层次较多 | 最终统一回到 tool/plugin/session 接口 |
| MCP | 连接、认证、资源、prompt、tool result 持久化都较重 | 更偏向把 MCP server 映射为可调用 tool 集 |
| Plugin | 有 marketplace、缓存、刷新、active component 三层 | 更接近 hook/runtime plugin,配置驱动 |
| Skill | 前后与 command、agent、managed policy 深度联动 | 扫描与远程拉取后,通过 skill 工具显式加载 |
| 运行时挂载 | 多套独立子系统共同装配 | Plugin.trigger、ToolRegistry、LLM.stream 是主要挂点 |
5. 设计取舍
5.1 Claude Code 的取舍
- 目标是大规模扩展生态下仍能做统一治理、缓存、刷新和策略控制。
- 因此插件、MCP、skills 都各自有完整子系统。
- 好处是能力边界清晰、适合复杂托管场景;代价是系统更重,接入路径更长。
5.2 Opencode 的取舍
- 目标是把扩展能力尽快落到统一运行时接口上。
- 因此 plugin 更像 hook 容器,MCP 更像 tool adapter,skill 更像内容型扩展。
- 好处是扩展链路短、实现直接;代价是生态治理能力不如 Claude Code 细分。
6. 结论
Claude Code 的扩展系统是“分层治理型平台”,擅长管理复杂插件生态;Opencode 的扩展系统是“统一接口型平台”,擅长把不同扩展快速并入同一运行时。前者强调治理和生命周期管理,后者强调挂载简单和运行时一致性。