What:它以什么面貌出现在你面前
这个代码库包含三个对外形态,共用同一套核心引擎:
Claude Code
├── CLI 工具 → 终端里运行 `claude`,对话式编程
├── Agent SDK → 给开发者用的 API,把 Claude 嵌入自己的产品
└── MCP 服务器模式 → 标准协议,把 Claude 的工具暴露给外部系统
还有一个关键的基础设施概念:
└── MCP 客户端 → Claude Code 主动连接外部 MCP 服务器(数据库、Slack 等)
CLI 工具(src/entrypoints/cli.tsx)
最主要的形态。用户在项目目录打开终端,输入 claude,进入交互式会话。支持的模式包括:
- 交互模式:对话式,Claude 请求权限前会问用户
- 非交互模式(
--print):单次执行,输出结果后退出,适合脚本调用 - 远程模式(
CLAUDE_CODE_REMOTE=true):运行在云容器里(CCR 环境),内存上限提高到 8GB
Agent SDK(src/entrypoints/sdk/)
给开发者用的编程接口,让他们可以把 Claude Code 的能力嵌入自己的产品。与 CLI 的核心区别:
- CLI 是给人类用的,有交互式权限对话框
- SDK 是给程序用的,权限通过代码参数配置,不弹对话框
- SDK 不开启 REPL 模式(CLI 内部员工专属的批量工具调用模式)
SDK 的类型定义全部在 src/entrypoints/agentSdkTypes.ts,包括 25 个 Hook 事件(PreToolUse、PostToolUse、SessionStart 等),让接入者可以在任意关键节点插入自定义逻辑。
什么是 Hook? 想象 Claude Code 的运行过程是一条流水线:用户输入 → Claude 思考 → 工具执行 → 返回结果。Hook 就是在这条流水线的特定位置预留的"插座"——你可以在插座上接入自己的逻辑,在那个时机自动触发。比如 PreToolUse(工具执行前)这个 Hook,可以接入一段脚本,每次 Claude 要执行 Bash 命令之前,先把命令记录到日志文件,或者做额外的安全检查。流水线本身不需要为你修改,你只是在特定位置"挂上了一个钩子"。
MCP 服务器模式(src/entrypoints/mcp.ts)
Claude Code 自己也可以变成一个 MCP 服务器(claude/tengu),把它的全套工具(Bash、文件读写、搜索……)通过 MCP 标准协议暴露出去。这样其他支持 MCP 的 AI 客户端(比如 Cursor、另一个 Claude 实例)可以直接调用 Claude Code 的工具能力。
MCP 客户端(反向方向)
除了作为服务器,Claude Code 同时也是 MCP 客户端——它可以连接外部 MCP 服务器,让 Claude 使用外部提供的工具(数据库查询、Slack 消息、GitHub API 等)。这是工具系统的扩展机制,详见C. 工具系统。