一文讲透 Claude code
Claude Code
是 Anthropic 开发的命令行 AI 编程代理工具,它把 Claude 模型接入本地开发环境,让 Claude 能够读取项目、搜索代码、编辑文件、运行命令、执行测试,并在开发者监督下完成代码理解、修改、调试和自动化任务。
接下来我将重点介绍Claude code 的构造流程和流程中涉及到的功能介绍,方便大家快速理解和上手:
一、Claude code 是如何构造上下文的
启动 Claude Code
↓
加载系统级/会话级基础上下文
↓
加载项目记忆、规则、skills技能描述、MCP 工具名等
↓
用户输入任务
↓
Claude 通过搜索/读取/执行命令主动收集上下文
↓
工具结果进入上下文,影响下一步决策
↓
上下文变大后,清理旧工具输出或 compact 总结
1.1 、CLAUDE.md 文件介绍
** CLAUDE.md 文件是给 Claude Code看的项目说明书**。
它会在 Claude Code 进入项目时被自动加载到上下文里,让 Claude 一开始就知道这个项目的背景、规则和工作方式。
CLAUDE.md = 项目长期上下文 + 工作规则 + 操作说明
它常用来写这些内容:
项目是什么 技术栈是什么 目录结构怎么理解 用什么包管理器 怎么运行项目 怎么跑测试 代码风格是什么 哪些文件不能改 代码提交/拉取有什么要求 常见坑和注意事项
比如:
# Project Instructions 项目结果信息 ## 项目说明 这是一个 Next.js + Prisma 项目,主要代码在 src/ 目录。 ## 命令 - 安装依赖:pnpm install - 启动开发服务:pnpm dev - 运行测试:pnpm test - 类型检查:pnpm typecheck ## 编码规则 - 使用 pnpm,不要使用 npm 或 yarn。 - 修改业务代码后必须运行相关测试。 - 不要修改 generated/ 目录下的文件。 - API 返回格式统一使用 src/lib/response.ts 里的 helper。 ## 注意事项 - 数据库 schema 修改后必须生成 migration。 - 前端组件优先使用 components/ui 里的现有组件。
Claude Code 看到这些后,后续做任务时就会受它影响。
例如你说:
帮我修复登录 bug
1.2、Claude code 规则文件介绍
CLAUDE.md = 项目的主上下文 / 项目记忆入口
全局规则:整个项目都要遵守,全局规则适合放“任何地方都适用”的要求。 路径规则:只有处理某些目录/文件时才要遵守
区别是在规则md文件中是否包含:
---
paths:
-
"src/components/*/.tsx"
-
"src/pages/*/.tsx"
---
#Frontend Rules 前端规则
-
优先使用现有组件库。
-
不要新增全局 CSS。
无 paths 的 .claude/rules/.md = 全局规则文件 有 paths 的 .claude/rules/.md = 路径规则文件
为什么要区分
因为上下文空间有限,规则越多,占用越多。
如果所有规则都全局加载,Claude 可能一上来就看到一大堆东西:
前端规则 后端规则 数据库规则 部署规则 测试规则 安全规则 文档规则
但它这次可能只是改一个按钮,那数据库和部署规则就很浪费,还可能干扰判断。
所以更合理的是:
通用规则 → 全局加载 局部规则 → 按路径加载
1.3、CLAUDE.md和规则文件的区别
CLAUDE.md = 项目总说明书 .claude/rules/*.md = 拆分出来的规则卡片
它们都会进入 Claude Code 的上下文,但用途和加载方式不一样。
| 对比项 | CLAUDE.md | .claude/rules/*.md |
|---|---|---|
| 核心作用 | 放项目整体说明、长期上下文、总规则 | 放更细的专题规则 |
| 适合内容 | 项目介绍、技术栈、目录说明、常用命令、总体约定 | 测试规则、API 规则、前端规则、数据库规则、安全规则 |
| 文件位置 | 常见是项目根目录 CLAUDE.md,也可以是 .claude/CLAUDE.md | .claude/rules/ 目录下的多个 .md 文件 |
| 加载方式 | 通常启动时加载;子目录里的 CLAUDE.md 可能在读取相关子树时加载 | 无 paths 的启动时加载;有 paths 的在匹配文件被读取时加载 |
| 组织方式 | 一个主文件,也可以用 @path 导入其他文件 | 天然按多个文件拆分,每个文件讲一个主题 |
| 适用项目 | 小项目、总纲、关键说明 | 中大型项目、规则多、不同目录规则不同 |
1.4、 skills 流程与机制
Claude Code 平时不会把所有 skill 的完整内容都塞进上下文,而是先看它们的名称和描述,等判断“这个任务需要它”时,再把完整 SKILL.md 加载进当前对话。
整体调用流程
发现 skill ↓ 读取 skill 名称、description、when_to_use 等元信息 ↓ 把可自动调用 skill 的描述放进上下文 ↓ 用户输入任务 ↓ Claude 根据任务和 skill 描述判断是否调用 ↓ 调用 skill 后,完整 SKILL.md 内容进入对话上下文 ↓ Claude 按 skill 里的说明执行任务
1. Claude Code 先发现有哪些 skills
skills 可以放在几个地方:
个人级: ~/.claude/skills/<skill-name>/SKILL.md 项目级: 项目根目录/.claude/skills/<skill-name>/SKILL.md 插件级: <plugin>/skills/<skill-name>/SKILL.md 企业级: 由组织托管配置提供
例如:
.claude/skills/code-review/SKILL.md .claude/skills/deploy/SKILL.md .claude/skills/api-conventions/SKILL.md
每个 skill 本质上是一个目录,入口文件必须叫:
SKILL.md
目录名通常就是 slash command 名称:
.claude/skills/code-review/SKILL.md
对应:
/code-review
2. 启动时通常只加载“描述”,不加载完整正文
一个 SKILL.md 大概长这样:
--- name: code-review description: Use when reviewing code changes for bugs, regressions, security risks, and missing tests. --- Review the code with this process: 1. Inspect the diff. 2. Look for correctness issues. 3. Check test coverage. 4. Report findings by severity.
这里分两部分:
frontmatter: 告诉 Claude 什么时候使用这个 skill。 markdown 正文: 真正调用 skill 后,Claude 要遵守的详细步骤。
默认情况下,Claude Code 会把这些信息放进上下文:
skill 名称 description when_to_use 部分调用配置
但不会一开始加载完整正文。完整正文只有在 skill 被调用时才进入上下文。
这就是为什么 skill 适合放长流程、长规范、长参考资料:
CLAUDE.md:适合一直要知道的规则 Skill:适合需要时才加载的流程/手册/检查清单
3. Skill 有两种调用方式
第一种是你手动调用:
/code-review
或者带参数:
/code-review src/auth/login.ts /deploy staging
第二种是 Claude 自动调用。
比如有一个 skill:
--- name: explain-code description: Use when explaining how code works, teaching a codebase, or answering "how does this work?" ---
你问:
这个登录模块是怎么工作的?
Claude 看到你的请求和 description 匹配,就可能自动调用 explain-code。
所以:
手动调用 = 你用 /skill-name 明确触发 自动调用 = Claude 根据 description 判断触发
12. 和 CLAUDE.md / rules 的核心区别
CLAUDE.md: 启动时加载,适合项目长期总规则。 .claude/rules/*.md: 规则型上下文,可全局或按路径加载。 skills: 按需加载的流程、手册、检查清单、参考资料。
你可以这样判断:
Claude 永远都应该知道? → 放 CLAUDE.md 某类文件要遵守? → 放 .claude/rules/*.md 某个流程需要时才用? → 放 skill
例如:
“项目使用 pnpm” → CLAUDE.md “src/components 下必须使用设计系统” → .claude/rules/frontend.md “发版流程:测试、构建、打 tag、生成 changelog” → .claude/skills/release/SKILL.md
一句话总结
Claude Code 的 skill 调用机制是:
先把 skill 的名称和描述作为轻量上下文暴露给 Claude;当用户用 /skill-name 手动触发,或 Claude 根据 description/when_to_use/paths 判断任务相关时,再把完整 SKILL.md 注入当前会话,让 Claude 按其中的流程和约束执行。
1.5、Claulde code 的 Auto memory
自动积累经验 = 自动写笔记 + 下次自动读取笔记
Claude 自动积累经验,就是 Claude Code 把它在项目中学到的长期有用信息写成本地 Markdown 记忆文件;以后每次进入这个项目时,再把 MEMORY.md 的简短索引加载进上下文,必要时读取更详细的主题笔记。
1. Claude Code 官方文档说,Auto memory 主要记这些类型
构建命令 调试经验 架构笔记 代码风格偏好 工作流习惯 你对 Claude 的纠正 项目里的长期模式
它的判断标准大概是:
这条信息以后会不会再次有用?
适合被记住的内容通常有几个特点:
长期有效 项目相关 会反复用到 能避免以后犯错 不是一次性临时信息 不是敏感 secret
比如适合记:
这个项目必须用 pnpm,不要用 npm。 API 测试前要启动本地 Redis。 数据库 migration 不允许直接删除字段。 登录模块不要再用 oldAuthHelper。 这个项目的 E2E 测试需要先运行 docker compose up -d。
不太适合记:
这次临时先跳过测试。 我今天下午要改这个 bug。 这个 token 是 xxx。 这个分支暂时有个报错。 刚才那个文件第 32 行有问题。
2. 它存在哪里
Auto memory 存在本机:
~/.claude/projects/<project>/memory/
里面大概是:
~/.claude/projects/<project>/memory/ ├── MEMORY.md ├── debugging.md ├── api-conventions.md └── patterns.md
其中:
MEMORY.md = 入口文件 / 索引文件 debugging.md、api-conventions.md 等 = 具体主题的详细笔记
<project> 通常根据 Git 仓库推导。同一个 Git 仓库下的 worktree 和子目录会共享同一个 auto memory 目录。
3. 下次怎么加载
每次 Claude Code 开启新会话时,会加载:
MEMORY.md 的前 200 行 或者前 25KB 两者取更小的那个
也就是说,MEMORY.md 不会无限塞进上下文。
更详细的主题文件,例如:
debugging.md patterns.md api-conventions.md
默认不会启动时全部加载。Claude 需要时,会用普通文件读取工具按需读取。
所以它的设计是:
启动时加载简短索引 需要时再读取详细笔记
这样可以节省上下文窗口。
4. 它什么时候读写
如果你在 Claude Code 界面看到:
Writing memory
表示 Claude 正在写入记忆。
如果看到:
Recalled memory
表示 Claude 正在读取记忆。
你也可以运行:
/memory
查看当前加载了哪些 CLAUDE.md、规则文件,以及打开 auto memory 文件夹。
5. 怎么开启或关闭
官方文档说 Auto memory 默认开启,要求 Claude Code v2.1.59 或更高版本。
检查版本:
claude --version
关闭方式可以用 /memory 里的开关,也可以在设置里写:
{ "autoMemoryEnabled": false }
或者用环境变量:
CLAUDE_CODE_DISABLE_AUTO_MEMORY=1
1.6、MCP 工具
MCP 工具可以理解成:
让 Claude Code 连接外部系统的标准接口
全称是:
Model Context Protocol
官方把 MCP 类比成 AI 应用的 USB-C 接口:不同工具、数据库、API、文档系统、设计系统,都可以通过统一协议接到 Claude Code 上。
1. MCP 是干嘛的
Claude Code 默认能做这些:
读写本地文件 运行 shell 命令 搜索代码 修改代码 运行测试
但是它默认不一定知道你外部系统里的东西,比如:
GitHub issue Jira ticket PostgreSQL 数据 Slack 消息 Figma 设计稿 Sentry 错误日志 内部 API 文档 公司知识库
MCP 的作用就是把这些外部系统接进来。
接入以后,你可以这样问 Claude Code:
读取 Jira issue ENG-4521,按里面的需求实现功能。 查一下 Sentry 最近的登录报错,然后定位代码问题。 读取 Figma 里的登录页设计,帮我实现对应组件。 查询 PostgreSQL,找出最近 10 条失败订单记录。
Claude Code 就可以通过 MCP server 去访问这些系统,而不是让你手动复制粘贴信息。
2. MCP 里面有三个核心能力
MCP server 通常可以暴露三类东西:
Tools Resources Prompts
Tools:工具
工具是 Claude 可以主动调用的动作。
例如 GitHub MCP server 可能提供:
get_issue list_pull_requests create_pull_request comment_on_issue
PostgreSQL MCP server 可能提供:
query list_tables describe_schema
Figma MCP server 可能提供:
get_design list_components export_assets
在 Claude Code 里,MCP 工具通常会被命名成类似:
mcp__github__get_issue mcp__postgres__query mcp__figma__get_design
格式大概是:
mcp__服务器名__工具名
Resources:资源
资源是 Claude 可以读取的外部内容,类似文件。
比如:
GitHub issue 数据库 schema API 文档 设计稿节点 知识库页面
在 Claude Code 里,你可以用 @ 引用 MCP resource:
请分析 @github:issue://123 并给出修复方案 对比 @postgres:schema://users 和 @docs:file://database/user-model
这类资源会被作为附件放进当前上下文。
Prompts:提示词 / 命令
MCP server 还可以暴露 prompts,这些 prompts 在 Claude Code 里可以变成 slash command。
例如:
/mcp__github__list_prs /mcp__github__pr_review 456 /mcp__jira__create_issue "登录失败" high
这相当于外部 MCP server 给 Claude Code 增加了一些命令模板。
3. MCP 在 Claude Code 里的工作流程
大概是这样:
配置 MCP server ↓ Claude Code 启动时连接 MCP server ↓ MCP server 告诉 Claude:我有哪些 tools/resources/prompts ↓ 用户提出任务 ↓ Claude 判断需要哪个外部工具 ↓ 请求调用 MCP tool ↓ 权限确认 ↓ MCP server 执行动作 ↓ 结果返回给 Claude ↓ Claude 继续分析、写代码、验证
举例:
用户:根据 GitHub issue #123 修复 bug
Claude 可能会:
1. 调用 mcp__github__get_issue 读取 issue 2. 搜索本地代码 3. 修改相关文件 4. 运行测试 5. 调用 mcp__github__comment_on_issue 回复处理结果
4. MCP 和上下文的关系
MCP 不是一上来把所有外部数据都塞进上下文。
Claude Code 官方文档提到,现在默认有 MCP Tool Search 机制:
启动时通常只加载 MCP 工具名称 工具详细 schema 延迟加载 真正用到哪个工具,哪个工具才进入上下文
这样可以节省上下文窗口。
否则如果你接了很多 MCP server,比如:
GitHub Jira Slack Figma Postgres Sentry Linear Notion
每个 server 又有几十个工具,全部加载会非常占 token。
所以 MCP 的上下文策略是:
先知道有哪些工具 需要时再加载工具定义 调用后把结果放进上下文
这和 skills 很像:
Skill: 先加载名称和 description,需要时加载完整 SKILL.md。 MCP: 先加载工具名,需要时加载工具 schema 和调用结果。
5. MCP 怎么配置
Claude Code 支持几种作用域:
local project user
local
只对当前项目、当前用户生效,不共享。
适合:
个人私有服务 带敏感 token 的配置 临时实验 MCP
命令示例:
claude mcp add my-server /path/to/server
project
项目级配置,会写入项目根目录:
.mcp.json
适合团队共享。
示例:
claude mcp add shared-server --scope project /path/to/server
.mcp.json 大概长这样:
{
"mcpServers": {
"shared-server": {
"command": "/path/to/server",
"args": [],
"env": {}
}
}
}
项目级 MCP 配置通常可以提交到 Git,让团队成员都能用同一套 MCP server。
user
用户级配置,跨项目可用,但只属于你自己。
适合:
个人常用工具 跨项目的 GitHub/Jira/Notion MCP 本机开发辅助工具
示例:
claude mcp add my-user-server --scope user /path/to/server
6. MCP server 的连接方式
常见 MCP server 有几种运行方式:
stdio SSE HTTP
stdio
本地启动一个命令行进程,通过标准输入输出通信。
适合:
本地工具 本地数据库辅助 本机脚本 文件系统相关工具
SSE / HTTP
连接远程服务。
适合:
云服务 公司内部 API 远程 MCP server SaaS 工具
配置里可能会有:
{
"mcpServers": {
"api-server": {
"type": "sse",
"url": "${API_BASE_URL}/mcp",
"headers": {
"Authorization": "Bearer ${API_KEY}"
}
}
}
}
Claude Code 支持环境变量展开,所以敏感值通常不要直接写死在 .mcp.json 里。
7. 权限和安全
MCP 很强,所以也有风险。
因为 MCP 工具可能会:
读取数据库 发 GitHub 评论 创建 PR 访问内部系统 修改远程数据 读取敏感文档
所以 Claude Code 会对 MCP 工具调用做权限控制。
权限名通常类似:
mcp__github mcp__github__get_issue mcp__postgres__query
含义是:
mcp__github = 允许 GitHub server 的所有 MCP 工具 mcp__github__get_issue = 只允许 GitHub server 里的 get_issue 工具
官方文档特别提到:MCP 权限不支持 * 通配符。
也就是说:
正确: mcp__github 正确: mcp__github__get_issue 不推荐/无效: mcp__github__*
安全建议:
只给必要权限 数据库 MCP 尽量只读 project 级 .mcp.json 不要提交密钥 敏感 token 用环境变量 高风险工具不要自动批准 团队共享 MCP 要经过审查
8. MCP 和 Claude.md / rules / skills 的区别
你前面问过 CLAUDE.md、规则文件、skills。它们和 MCP 的区别可以这样看:
CLAUDE.md = 告诉 Claude 这个项目是什么、有什么长期规则。 .claude/rules/*.md = 告诉 Claude 处理某类文件时要遵守什么规范。 skills = 给 Claude 一套按需加载的工作流程/操作手册。 MCP = 给 Claude 接入外部工具、数据源和 API 的能力。
举例:
CLAUDE.md: 这个项目使用 pnpm。 rules: src/components 下必须使用设计系统组件。 skills: 发布版本时执行 release checklist。 MCP: 连接 GitHub、Jira、Postgres、Figma、Sentry,让 Claude 能读取和操作它们。
9. 什么时候需要 MCP
当你发现自己经常这样做时,就适合用 MCP:
从 Jira 复制需求给 Claude 从 GitHub 复制 issue 给 Claude 从数据库复制查询结果给 Claude 从 Sentry 复制报错给 Claude 从 Figma 截图/复制设计给 Claude 从内部文档复制接口说明给 Claude
MCP 的目标就是减少这种复制粘贴:
你不用搬运上下文; Claude 自己通过工具去取。
一句话总结
MCP 工具就是 Claude Code 连接外部系统的标准工具接口。它让 Claude 不只是在本地代码里工作,还能访问 GitHub、Jira、数据库、Figma、Slack、Sentry、内部 API 等外部上下文,并通过工具调用读取或操作这些系统。
最关键的理解是:
CLAUDE.md / rules / skills 是“给 Claude 的说明”; MCP 是“给 Claude 的外部能力”。
1.7 Claude 是如何通过搜索/读取/执行命令主动收集上下文
Claude Code 不会一开始就把整个项目全部读进上下文,而是会根据你的任务,自己决定要搜索哪些文件、读取哪些代码、运行哪些命令,然后把结果放进当前上下文里继续分析。
也就是:
用户给任务 ↓ Claude 判断需要哪些信息 ↓ 调用工具搜索 / 读取 / 执行命令 ↓ 工具结果返回给 Claude ↓ 这些结果进入上下文 ↓ Claude 基于新上下文继续下一步
1. 搜索:先找相关位置
比如你说:
帮我修复登录失败的问题
Claude 可能不会马上改代码,而是先搜索:
login auth signin password useAuth
它可能用类似这些工具/命令:
rg "login" rg "useAuth" rg "signin"
目的不是解决问题,而是先找到:
登录页面在哪 认证逻辑在哪 接口在哪 测试在哪 错误处理在哪
搜索结果会变成上下文的一部分。
2. 读取:再看具体文件内容
搜索到相关文件后,Claude 会读取具体文件。
比如它发现:
src/pages/login.tsx src/lib/auth.ts src/api/auth/login.ts tests/login.test.ts
然后读取这些文件内容。
这时上下文里就多了:
登录页面代码 auth helper 代码 登录 API 代码 相关测试代码
Claude 才能判断:
bug 是前端表单问题? 还是 API 返回格式问题? 还是 token 存储问题? 还是测试期望不对?
3. 执行命令:用真实结果验证判断
Claude 还会运行命令来收集事实。
比如:
pnpm test pnpm typecheck pnpm lint git status git diff
或者针对某个测试:
pnpm test login
这些命令输出也会进入上下文。
例如测试报错:
Expected 200, received 401
或者类型错误:
Property 'session' does not exist on type User
Claude 就会根据这些真实输出继续判断,而不是凭感觉改。
举一个完整例子
你说:
帮我修复用户登录后跳转失败的问题
Claude 可能这样主动收集上下文:
1. 搜索 login / redirect / callback 2. 读取登录页、auth callback、router 相关文件 3. 查看 package.json,确认项目框架和命令 4. 运行相关测试或类型检查 5. 根据报错定位问题 6. 修改代码 7. 再运行测试验证
过程中每一步都会让上下文变丰富:
最开始上下文: 用户任务 + 项目规则 搜索后: 用户任务 + 项目规则 + 相关文件列表 读取后: 用户任务 + 项目规则 + 相关文件列表 + 具体源码 运行命令后: 用户任务 + 项目规则 + 源码 + 测试结果/报错信息
这和普通聊天最大的区别
普通聊天模型通常只能用你粘贴给它的内容:
你不贴代码,它就不知道代码。
Claude Code 可以自己去项目里找:
你不给文件路径,它可以搜索。 你不给测试报错,它可以运行测试。 你不解释目录结构,它可以读取项目文件。
所以它不是单纯“回答问题”,而是在不断做:
假设 → 搜索证据 → 读取代码 → 执行验证 → 更新判断
注意一点
“主动收集上下文”不等于它什么都能随便做。
通常仍然受这些限制:
只能访问当前工作区/允许范围内的文件 执行命令可能需要权限确认 不会自动知道没有读取过的文件内容 命令输出太长时可能会被截断或总结 上下文窗口仍然有限
一句话总结
Claude 通过搜索/读取/执行命令主动收集上下文 的意思就是:
Claude Code 会像开发者一样,先在项目里找线索、读相关代码、跑命令看真实结果,再把这些信息加入上下文,基于事实继续分析和修改,而不是一开始凭空猜。
更多推荐


所有评论(0)