Fork me on GitHub

2025年7月

管理 Claude Code 的工具权限

我们知道,Claude Code 内置了 16 个强大的工具,加上我们昨天学习的 MCP 服务器,用户可以轻松集成更多的外部工具。通过合理调度这些工具,Claude Code 能够很好地对你的代码库进行理解和修改。但是这些工具中,不乏有一些是比较危险的,比如 Bash 可能执行任意的命令,Edit 可能篡改你的文件,外部工具可能存在安全风险,对此,Claude Code 提供了一套完善的权限控制机制。

claude-code-tool-permissions.png

上图列出了 Claude Code 内置工具的默认权限,对于 BashEdit 这种修改类的工具,必须等待用户确认后才开始执行。

修改工具的默认权限

当然,工具的权限并不是一成不变的,可以通过 --allowedTools--disallowedTools 参数修改工具的默认权限:

$ claude --allowedTools "Edit,MultiEdit,Write"

通过上面的方式启动 Claude Code 后,在编辑或写入文件时,不再需要用户批准,将会直接执行。

$ claude --disallowedTools "WebSearch,WebFetch"

通过上面的方式启动 Claude Code 后,将会禁用联网搜索和网页抓取工具。

注意,--allowedTools 是将工具的权限从用户确认改成自动放行,而 --disallowedTools 是将工具直接从工具列表中移除。貌似不能将工具的权限从自动放行改成用户确认。

这两个参数都可以在会话过程中通过 /permissions/allowed-tools 斜杠命令进行查看和修改:

claude-code-permissions.png

允许和禁止的工具分别位于 AllowDeny 页签下,如果某个工具既配了拒绝规则又配了允许规则,拒绝规则优先于允许规则。

额外的工作目录

默认情况下,Claude Code 只允许访问当前工作目录下的文件,在访问工作目录外的文件时,也会要求用户确认:

claude-code-add-dir.png

我们可以在启动时通过 --add-dir 参数添加额外的工作目录:

$ claude --add-dir ../browser-use

或者在会话中使用 /add-dir 斜杠命令:

> /add-dir ../browser-use

这个参数也可以在会话过程中通过 /permissions/allowed-tools 斜杠命令进行查看和修改:

claude-code-permissions-2.png

所有允许访问的目录均显示在 Workspace 页签下,额外的工作目录遵循和原始工作目录相同的权限规则:读取文件无需确认,编辑文件则根据当前的权限模式决定是否确认。

更细粒度的权限控制

在调用某些工具时,我们可能还需要有更细粒度的权限控制,比如可以允许 Bash 执行特定命令,拒绝 Read 读取某些文件,等等,Claude Code 支持在工具名后面加上特定的匹配规则,比如下面这个例子:

$ claude --allowedTools "Bash(npm run build)"

当使用 Bash 工具运行 npm run build 命令时,直接放行,无需用户确认。也可以在匹配规则中使用通配符:

$ claude --disallowedTools "Bash(git:*)"

当使用 Bash 工具运行以 git 开头的命令时,直接拒绝:

claude-code-permissions-deny.png

Claude Code 能很好的处理 Shell 操作符(比如 &&),因此像 Bash(safe-cmd:*) 这样的前缀匹配规则不会给它运行命令 safe-cmd && other-cmd 的权限。

另外,ReadEdit 也有一套自己的匹配规则,比如:

$ claude --allowedTools "Edit(docs/**)"

上面的命令允许对项目 docs 目录中文件进行编辑,其中的 docs/** 规则 遵循 gitignore 规范。还可以使用 // 引用绝对路径,或者 ~/ 引用用户目录的路径:

  • Edit(//tmp/scratch.txt) 匹配对 /tmp/scratch.txt 的编辑
  • Read(~/.zshrc) 匹配对用户的 ~/.zshrc 文件的读取

值得注意的是,Read 的规则将应用于所有读取文件的内置工具,如 GrepGlobLS

除了命令执行和文件操作,下面这些工具也支持细粒度控制:

  • WebFetch(domain:example.com) 匹配对 example.com 的抓取请求
  • mcp__amap 匹配由 MCP 服务器 amap 提供的任何工具
  • mcp__amap__weather 匹配由 MCP 服务器 amap 提供的 weather 工具

权限模式

Claude Code 支持几种不同的权限模式:

  • 默认模式(default:按照默认或用户配置的权限规则对工具进行验证
  • 自动编辑模式(acceptEdits:自动接受对工作目录下的文件的编辑
  • 规划模式(plan:只能读取文件进行分析,不允许编辑文件或执行命令
  • YOLO 模式(bypassPermissions:跳过所有权限验证,危险!

可以通过 --permission-mode 参数直接开启不同的权限模式:

$ claude --permission-mode <permission-mode>

claude-code-yolo-mode.png

也可以在会话中通过 Shift + Tab 切换,按一次进入自动编辑模式,按两次进入规划模式,再按一次回到默认模式。

YOLO 模式也可以通过 --dangerously-skip-permissions 参数开启:

$ claude --dangerously-skip-permissions

YOLO 模式可以绕过权限提示,实现无人值守操作,但是非常危险,使用时一定要小心。建议在容器环境下使用,通过容器的隔离和防火墙规则等安全措施,最大程度的防止系统遭受攻击。官方提供了一份 devcontainer 设置,可以和 VS Code 的 Remote - Containers 扩展搭配使用,感兴趣的朋友可以参考:

配置文件

除了命令行参数和斜杠命令,Claude Code 还支持将工具的权限保存在配置文件中:

{
  "permissions": {
    "deny": [
      "WebSearch",
      "WebFetch",
      "Bash(curl:*)"
    ],
    "allow": [
      "Bash(git:*)"
    ],
    "additionalDirectories": [
      "../browser-use"
    ]
  }
}

该配置文件可以放在下面这些位置:

  • 用户设置(~/.claude/settings.json):用户私有,适用于所有项目
  • 共享项目设置(.claude/settings.json):提交到 Git 仓库,团队成员共用
  • 本地项目设置(.claude/settings.local.json):不提交到 Git 仓库,用户私有,只适用于当前项目
  • 企业管理策略(/path/to/policies.json):在企业环境下,系统管理员可以强制执行用户无法覆盖的安全策略,优先级最高

对于企业管理策略,系统管理员通常将策略部署到:

  • macOS: /Library/Application Support/ClaudeCode/policies.json
  • Linux 和 WSL: /etc/claude-code/policies.json

当同一个工具的规则出现在多个位置时,优先级从高到低如下:企业管理策略 > 命令行参数 > 本地项目设置 > 共享项目设置 > 用户设置。这样的层次结构确保始终执行企业策略,同时在适当的情况下仍允许在项目和用户级别的灵活性。

小结

我们今天详细学习了 Claude Code 的权限控制机制,包括如何设置权限规则(允许规则、禁止规则、额外目录、细粒度规则),如何选择权限模式(默认、自动编辑、规划、YOLO)以及合理使用配置文件等。Claude Code 的权限控制机制为用户提供了从粗粒度到细粒度的全方位安全保障,通过灵活的权限配置,我们可以在保证开发效率的同时,最大程度地降低安全风险。


使用 MCP 让 Claude Code 集成外部工具

MCP(Model Context Protocol,模型上下文协议)) 是 Anthropic 于 2024 年 11 月 25 日 推出的开放协议,用于标准化大模型与各类外部工具和数据源之间的交互。

Claude Code 作为自家的 AI 编程工具,自然也支持 MCP 协议。除了内置的 16 个工具,用户可以使用 MCP 无缝集成任意数量的自定义工具和外部数据源,从而进一步拓展 Claude Code 的能力边界。

MCP 简介

下面这张图非常形象地展示了 MCP 的基本架构:

mcp-overview.png

可以看到 MCP 采用了非常经典的 C/S 架构(客户端/服务器),主要包括三个部分:

  • 主机(Host): 一般是基于大模型的 AI 应用,比如 Claude Desktop、ChatGPT Desktop、Cursor 等桌面应用,需要访问外部数据或工具;
  • 客户端(Client):内置在应用中,与 MCP 服务器建立一对一的连接;
  • 服务器(Server):连接本地数据源或远程服务,提供特定功能;

    • 本地数据源:文件或数据库;
    • 远程服务:外部 API 或互联网服务;

MCP 协议将所有的外部数据或工具以一种统一的方式接入 AI 应用,这就好比 USB-C 接口,将各种不同的电子设备统一成一种接口,从而让用户不再为准备各种各样不同的线缆插头而烦恼。简单说,MCP 就像一座桥梁,它本身不处理复杂逻辑,只负责协调 AI 应用与外部资源之间的信息流动。

在推出 MCP 之前,AI 应用如果要对接外部工具,通常需要单独整合多个不同的 API,每个 API 的接口可能都各不相同,认证方式和错误处理也可能不同,极大地增加了开发复杂度和维护成本。

所以说,传统 API 就像不同的门,每扇门都有一把不同的钥匙,而 MCP 像一把万能钥匙,AI 应用开发者只要集成了这个万能钥匙,就可以打开任意的门。下面是 MCP 和传统 API 的对比:

mcp-vs-api.png

有关 MCP 的更多信息,请参阅 MCP 文档:

添加 MCP 服务器

在之前的文章中我们曾遇到过 WebFetch 工具调用报错的问题,我们可以将其换成 Fetch MCP Server。通过 claude mcp add 命令添加 MCP 服务器:

$ claude mcp add web-fetch -- uvx mcp-server-fetch

上面的 web-fetch 是我们自定义的 MCP 工具名称,-- 后面的内容是 MCP 服务器的启动命令。添加成功之后,进入 Claude Code 交互模式,输入 /mcp 可查看 MCP 服务器的状态:

claude-code-mcp-status.png

如果状态显示 connected,则说明 MCP 服务器已就绪。可以按下 Enter 键查看 MCP 工具的详细信息:

claude-code-mcp-tool-detail.png

此时就可以使用该工具了,比如对网页内容进行问答或总结:

claude-code-fetch.png

默认情况下,所有的 MCP 工具都需要经过用户确认后才可以运行,同意运行后结果如下:

claude-code-fetch-result.png

如果感兴趣的话,可以拿 Wireshark 对 Claude Code 进行抓包,可以发现请求的 tools 里多了一个工具 mcp__web-fetch__fetch,工具的名称、描述、参数和上面的工具详情是一样的:

claude-code-fetch-tools.png

添加 HTTP/SSE 模式的 MCP 服务器

上面的 Fetch MCP Server 是 STDIO 模式的 MCP 服务器,这也是最常见的 MCP 服务器连接方式。当运行 claude mcp add 命令时,默认就是 STDIO 模式,我们也可以通过 --transport-t 参数添加 HTTP 或 SSE 模式的 MCP 服务器。

下面以 高德地图 为例,演示下如何在 Claude Code 中调用 HTTP 或 SSE 模式的 MCP 服务器。首先,我们需要注册并登录 高德开放平台,然后创建一个应用得到 Key,之后运行下面的命令添加 MCP 服务器:

$ claude mcp add --transport http amap "https://mcp.amap.com/mcp?key=<your-api-key>"

高德地址也支持 SSE 模式:

$ claude mcp add --transport sse amap "https://mcp.amap.com/sse?key=<your-api-key>"

高德地图的 MCP 服务器包含十几个工具,包括导航、定位、打车、路径规划、周边搜索、天气查询等,非常实用:

claude-code-amap-weather.png

设置环境变量

有些 MCP 服务器依赖于额外的环境变量,比如设置 API 密钥,我们可以通过 --env-e 参数来配置。

下面以 Brave Search MCP Server 为例,将内置的 WebSearch 工具替换成 Brave 搜索。首先注册并登录 Brave,订阅 Free 计划(需要提供信用卡信息),得到每月 2000 次免费额度:

brave-search-plans.png

然后生成 API Key,之后运行下面的命令添加 MCP 服务器:

$ claude mcp add brave-search \
    --env BRAVE_API_KEY=<your-api-key> \
    -- npx -y @modelcontextprotocol/server-brave-search

官方的 Brave Search MCP Server 使用 Node.js 的 fetch 方法来发请求,不支持 HTTPS_PROXY 代理配置,如果遇到网络问题,可以换成 @kwp-lab/mcp-brave-search

接着就可以使用 Brave 进行搜索了,比如查询 Gemini CLI 的最新动态:

claude-code-brave-search.png

设置作用域

默认添加的 MCP 服务器仅在当前项目中可用,Claude Code 支持通过 --scope-s 参数改变 MCP 服务器的作用域:

$ claude mcp add brave-search \
    --scope project \
    --env BRAVE_API_KEY=<your-api-key> \
    -- npx -y @modelcontextprotocol/server-brave-search

Claude Code 支持三种不同的作用域:

  • 本地作用域(local):默认配置,用户私有,仅在当前项目中可用;
  • 用户作用域(user):也是用户私有,但是跨所有项目可用;
  • 项目作用域(project):通过将配置存储在项目根目录的 .mcp.json 文件中来实现团队协作;

不同作用域下,MCP 服务器的配置位置也不同。比如项目作用域是将配置保存到当前项目的 .mcp.json 文件中,可以提交到 Git 仓库,确保所有项目成员都能访问相同的 MCP 工具和服务。该文件遵循标准化格式(和 Claude Desktop 的配置格式一致),内容如下:

{
  "mcpServers": {
    "brave-search": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-brave-search"
      ],
      "env": {
        "BRAVE_API_KEY": "<your-api-key>"
      }
    }
  }
}

而本地作用域和用户作用域则是将配置保存到用户的 Claude Code 配置文件 ~/.claude.json 中,只能自己使用,注意它们在 JSON 中的位置:

claude-mcp-config.png

当同名服务器存在于多个作用域时,系统通过优先考虑本地作用域服务器,然后是项目作用域服务器,最后是用户作用域服务器来解决冲突。

添加 MCP 服务器的其他方式

除了 claude mcp add 命令,Claude Code 还提供了另几种添加 MCP 服务器的方式。第一种是使用 JSON 配置添加:

$ claude mcp add-json brave-search -s project '{
    "type": "stdio",
    "command": "npx",
    "args": [
      "-y",
      "@modelcontextprotocol/server-brave-search"
    ],
    "env": {
      "BRAVE_API_KEY": "<your-api-key>"
    }
  }'

这种方式对于配置较复杂的 MCP 服务器来说很方便,因为这种 JSON 格式是 Claude 的标准,一般在 MCP 服务器的说明页面都有类似的配置示例。

第二种是从 Claude Desktop 导入配置,如果你本地安装了 Claude Desktop 且配置了 MCP 服务器,可以使用下面的命令一键导入:

$ claude mcp add-from-claude-desktop

运行后会显示交互式对话框,让你选择要导入的 MCP 服务器。

还有一种是启动 Claude Code 时,直接通过 --mcp-config 参数加载 MCP 服务器配置:

$ claude --mcp-config /path/to/mcp.json

管理 MCP 服务器

Claude Code 还提供了一些子命令对 MCP 服务器进行管理操作,比如列出所有的服务器:

$ claude mcp list

查看特定服务器详情:

$ claude mcp get brave-search

删除特定服务器:

$ claude mcp remove brave-search

检查 MCP 服务器状态:

> /mcp

另外,/mcp 命令还可以对 MCP 服务器进行 OAuth 2.0 身份认证,在需要认证的 MCP 服务器上按 Enter 后,会自动打开浏览器并跳到 OAuth 认证页面,用户在浏览器中完成身份验证后,Claude Code 接收并存储访问令牌,然后 MCP 服务器将变为 connected 状态。

使用 MCP 资源和提示词

MCP 服务器不仅可以暴露 工具 供其他 AI 程序使用,还支持暴露 资源提示词

MCP 服务器暴露的资源可使用 @ 引用,格式为 server:protocol://resource/path,比如:

> 分析 @github:issue://123 并提供修复建议

MCP 服务器暴露的提示词可作为斜杠命令使用,格式为 /mcp__<server-name>__<prompt-name>,比如:

> /mcp__github__list_prs

也可以带参数:

> /mcp__github__pr_review 456

无论是 MCP 资源还是提示词,都是从连接的 MCP 服务器中动态发现的,当键入 @/ 时,资源和提示词会自动显示在下拉菜单中。

将 Claude Code 作为 MCP 服务器

Claude Code 不仅可以作为客户端接入外部 MCP 服务器,也可以作为 MCP 服务器,为其他应用提供服务,比如将其加到 Claude Desktop 的配置文件中:

{
  "mcpServers": {
    "claude-code": {
      "command": "claude",
      "args": ["mcp", "serve"],
      "env": {}
    }
  }
}

重启 Claude Desktop 后,可以看到加载的 16 个工具:

claude-code-in-desktop.png

可以在 Claude Desktop 中,尝试要求 Claude 读取目录中的文件、进行编辑等。

小结

本文详细介绍了如何在 Claude Code 中配置和使用 MCP 服务器,通过统一的协议标准,我们可以轻松集成各类外部工具和数据源,将 Claude Code 从单纯的编程助手升级为功能强大的智能工作平台。

不过,在享受 MCP 带来便利的同时,安全性不容忽视,务必确保所使用的 MCP 服务器是可信的,特别是涉及网络交互的服务器,防范潜在的提示注入攻击和私有数据泄漏。


学习 Claude Code 的工具使用(三)

经过前两天的学习,我们已经掌握了 Claude Code 的命令执行、文件查找、文件读写、网络检索相关的工具,目前还剩下 TaskTodoWriteTodoReadexit_plan_mode 四个工具,今天就来学习下它们。这四个工具都是 Claude Code 用来解决复杂任务的,它们也代表着大模型在解决复杂任务时的几种不同的思路。

代办列表

代办列表(Todo List) 是一种组织复杂任务并跟踪处理进度的常用手段,Claude Code 在面对复杂的多步骤任务时,会使用代办列表将其分解成多个子项,然后按顺序依次处理:

claude-code-todo.png

和代办列表相关的工具有两个:

  • TodoRead - 读取当前会话的代办列表
  • TodoWrite - 创建和管理结构化的代办列表

TodoRead 工具的描述中提到,Claude Code 应该主动且频繁地使用该工具,以了解当前代办列表的状态,确保一直处在正确的轨道上,特别是以下情况:

  • 在对话开始时查看待处理的事项
  • 在开始新任务之前优先安排工作
  • 当用户询问之前的任务或计划时
  • 当你不确定下一步该做什么时
  • 完成任务后更新你对剩余工作的理解
  • 每隔几条消息后确保你在正确的轨道上

不过我测试下来发现很少触发 TodoRead 的调用,一直使用 TodoWrite 就足够完成整个任务,可能是我的任务都比较简单吧。但是我感觉 TodoRead 确实比较鸡肋,因为大模型在每次调用 TodoWrite 的时候,代办列表会反复出现在上下文中,还需要 TodoRead 再去查一次吗?

相对来说,TodoWrite 的使用场景就明确的多,比如下面这些情况:

  • 复杂的多步骤任务 - 当任务需要3个或更多不同的步骤时
  • 不易解决的棘手任务 - 需要仔细规划或多项操作的任务
  • 用户明确请求待办列表 - 当用户直接要求你使用待办列表时
  • 用户提供多个任务 - 当用户提供需要完成的事项列表时(编号或逗号分隔)

代办列表中的每个待办事项有三种状态:

  • pending - 任务尚未开始
  • in_progress - 当前正在处理
  • completed - 任务成功完成

在任务处理的不同阶段实时地更新待办事项的状态:

  • 收到新指令后 - 立即将用户需求记录为待办事项
  • 开始处理任务时 - 在开始工作之前将其标记为进行中,应该只有一个待办事项处于进行中状态
  • 完成任务后 - 将其标记为已完成,并添加在实施过程中发现的任何新后续任务
  • 如果遇到错误、阻碍或无法完成 - 保持待办事项为 in_progress 状态,或者创建一个新的待办事项描述需要解决的问题

TodoWrite 工具的描述中还给出了几个使用示例,供大家参考。

示例一:

用户:我想在应用程序设置中添加一个深色模式切换功能,完成后确保运行测试和构建!
助手:我将帮你在应用程序设置中添加深色模式切换功能,让我创建一个待办列表来跟踪这个实现。
*创建包含以下项目的待办列表:*
1. 在设置页面创建深色模式切换组件
2. 添加深色模式状态管理(上下文/存储)
3. 为深色主题实现 CSS-in-JS 样式
4. 更新现有组件以支持主题切换
5. 运行测试和构建过程,解决发生的任何失败或错误
*开始处理第一个任务*

示例二:

用户:帮我在项目中将函数 getCwd 重命名为 getCurrentWorkingDirectory
助手:让我先搜索你的代码库以找到所有 getCwd 的出现位置。
*使用grep或搜索工具定位代码库中getCwd的所有实例*
助手:我在 8 个不同文件中找到了 15 个 getCwd 实例,让我创建一个待办列表来跟踪这些更改。
*为每个需要更新的文件创建包含具体项目的待办列表*

示例三:

用户:我需要为我的电商网站实现这些功能:用户注册、产品目录、购物车和结账流程。
助手:我将帮助实现这些功能。首先,让我们将所有功能添加到待办列表中。
*创建一个待办列表,基于项目架构将每个功能分解为具体任务*
助手:让我们从用户注册开始。这将涉及创建数据库模型、API端点和与你现有认证系统集成的前端表单。

示例四:

用户:你能帮助优化我的 React 应用程序吗?它渲染很慢,有性能问题。
助手:我将帮助优化你的 React 应用程序。首先,让我检查你的代码库以识别潜在的性能瓶颈。
*审查组件结构、渲染模式、状态管理和数据获取*
助手:在分析你的代码库后,我识别出了几个性能问题。让我创建一个待办列表来跟踪我们的优化工作。
*创建包含以下项目的待办列表:
1) 为 ProductList 中的昂贵计算实现缓存,
2) 为 Dashboard 中的长列表添加虚拟化,
3) 优化 Gallery 组件中的图像加载,
4) 修复 ShoppingCart 中的状态更新循环,
5) 审查包大小并实现代码分割*
让我们从为 ProductList 组件中的昂贵计算实现缓存开始。

子智能体

Task 工具用于启动一个子智能体,该子智能体可以访问除 Task 之外的其他 15 个工具,来解决 Deep Search 或 Deep Research 类的需要深度搜索的复杂任务。比如你正在搜索像 "config" 或 "logger" 这样的关键词,或者遇到 "哪个文件执行了X?" 这样的问题,很有可能就会触发使用这个工具。

在官方文档中,这个工具的名字叫做 Agent,但是看代码里,却叫做 Task

当 Claude Code 搜索关键词或文件时,如果经过几次搜索后还是没能找到匹配项或不能确定答案,就会使用 Task 工具来执行深度搜索。在下面的例子中,我位于 browser-use 的代码库中,想让 Claude Code 解释下 stealth=True 这个参数的含义,这个参数是 0.2.7 版本后才引入的,作用是通过 Playwright 绕过浏览器检测。但是我故意将代码切到老版本,看看它反应如何:

claude-code-agent.jpg

可以看到 Claude Code 先简单的使用 Grep 搜索了两次,发现都没有找到想要的结果,然后就开启了子智能体模式进行深度搜索。每个子智能体都是无状态的,Claude Code 会尽可能同时启动多个子智能体以最大化性能,从上图可以看到,在短短几分钟内就触发了 28 次工具调用。

注意,多个子智能体会并行调用,因此很容易遇到 rate_limit_error 限流错误,而且 token 消耗也非常大。

规划模式

这是 Claude Code 的一个隐藏功能,我翻遍官方文档,也没有找到关于它的详细说明,如果不是在请求报文中看到 exit_plan_mode 这个工具,我都不知道有这个模式。我们之前学过,在 Claude Code 的交互模式下有不少快捷键,比如按下 Shift + Tab 可以进入自动接受文件编辑的模式,如果你不小心按了两下,就会进入规划模式(下面显示 Plan mode 字样):

claude-code-plan-mode-enabled.png

进入规划模式后,Claude Code 将不会执行任何修改操作,比如文件编辑、配置更改、提交代码等,只能调用搜索或文件读取这样的只读工具。Claude Code 会对用户的问题进行全面分析并生成详细的执行计划,之后,调用 exit_plan_mode 退出规划模式,同时向用户展示计划,得到用户确认后,才会真正地执行修改操作:

claude-code-plan-mode.png

上面这个例子很好的展示了规划模式的工作步骤:先分析,再展示计划,等待用户确认。如果没问题,用户可以确认计划,退出规划模式;如果有问题,也可以要求 Claude Code 继续规划。

小结

至此,Claude Code 的 16 个工具总算学完了。通过深入了解每个工具的运行逻辑和使用场景,不仅能够帮助我们更好地发挥 Claude Code 的功能,也能快速定位和解决使用过程中可能出现的问题。对于常见的代码任务,内置工具通常足以应对,但如果遇到更复杂或超出内置功能范围的需求,Claude Code 还支持 MCP 协议,允许用户集成自定义工具和外部数据源,从而进一步拓展其能力边界。至于如何通过 MCP 集成外部工具,以及具体操作步骤,我们明天继续。


学习 Claude Code 的工具使用(二)

在上一篇中,我们学习了 Claude Code 的 BashLSGlobGrep 四个工具,用于命令执行和文件查找相关的任务,我们今天继续看下其他的工具。

文件读写

文件读取和文件写入应该是 Claude Code 最常做的事情了,我们在之前的学习中不止一次使用了这些工具。比如运行 /init 命令生成 CLAUDE.md 文件时,就是通过 Read 去读取文件内容,然后再用 Write 去写入新文件:

claude-code-init.png

Claude Code 推荐使用 Read 工具去读取文件,而不是 catheadtail 等 Bash 命令,这是因为 Read 相对于这些命令来说有几个独特的优势,我们可以从 Read 的工具描述中看到:

  • 默认情况下,最多读取 2000 行
  • 可以指定行偏移量和限制,对于长文件特别有用
  • 任何超过 2000 个字符的行都会被截断
  • 结果使用 cat -n 格式返回,行号从 1 开始,便于大模型了解代码所在的行数
  • 支持读取图像(如 PNG、JPG 等)

其中最大的优势是读取图像,因为 Claude Code 是一个多模态大模型,所以我们可以让 Claude 去分析错误截图或者按产品原型图去开发页面,比如这里将百度首页截图:

baidu-home.png

然后将它丢给 Claude Code 去仿照:

claude-code-baidu-home.png

Claude Code 首先调用 Read 去读取图片,将其转换成 BASE64 格式,然后去调用 Claude 的视觉能力

{
  "model": "claude-sonnet-4-20250514",
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "image",
          "source": {
            "type": "base64",
            "media_type": "image/png",
            "data": "iVBORw0KGgoAAAANSUhEUgAABx..."
          }
        },
        {
          "type": "text",
          "text": "仿照 demo.png 文件写一个静态 html 文件"
        }
      ]
    }
  ],
  "temperature": 1,
  "max_tokens": 32000,
  "stream": true
}

最终生成静态页面如下:

baidu-home-2.png

文件编辑

还有很多任务需要对代码文件进行编辑修改,这是通过 EditMultiEdit 两个工具实现的。这两个工具的本质是字符串替换,可以从工具的描述和 Schema 看出来:

{
  "name": "Edit",
  "description": "Performs exact string replacements in files...",
  "input_schema": {
    "type": "object",
    "properties": {
      "file_path": {
        "type": "string",
        "description": "The absolute path to the file to modify"
      },
      "old_string": {
        "type": "string",
        "description": "The text to replace"
      },
      "new_string": {
        "type": "string",
        "description": "The text to replace it with (must be different from old_string)"
      },
      "replace_all": {
        "type": "boolean",
        "default": false,
        "description": "Replace all occurences of old_string (default false)"
      }
    },
    "required": [
      "file_path",
      "old_string",
      "new_string"
    ],
    "additionalProperties": false,
    "$schema": "http://json-schema.org/draft-07/schema#"
  }
}

这个工具有四个参数:

  • file_path - 文件全路径
  • old_string - 替换前的原字符串
  • new_string - 替换后的新字符串
  • replace_all - 是否全部替换,默认 false

当调用 Edit 工具时,原字符串和新字符串会以 diff 形式显示出来:

claude-code-edit.jpg

在调用 Edit 工具之前,必须先至少调用一次 Read 工具,方便 Claude Code 获得原字符串,Edit 工具一次只能替换一个字符串,如果要批量替换多个字符串,可以使用 MultiEdit 工具。

Notebook 读写

Claude Code 内置了对 Jupyter Notebook 的读写工具,用于读取和编辑 .ipynb 文件:

  • NotebookRead - 读取 Jupyter Notebook 中指定单元格的内容,如果不指定单元格,则返回所有单元格的内容;
  • NotebookEdit - 编辑 Jupyter Notebook 中特定单元格的内容,支持插入、替换和删除三种编辑模式,并支持 codemarkdown 两种单元格类型;

在下面的示例中,我们让 Claude Code 生成一个 Jupyter Notebook 文件,来演示 Python 列表的基本用法:

claude-code-notebook.png

生成的 Jupyter Notebook 结构清晰,而且最大的好处是,它提供了交互式的环境方便我们进行研究和学习:

claude-code-notebook-file.png

Claude Code 通过 NotebookEdit 插入单元格有一个问题,每次都是在文件开头处插入,所以当我们连续生成多个单元格时,顺序就有问题。上面的截图是我倒序后的结果。

网页抓取

WebFetch 工具支持从指定 URL 获取内容并使用 AI 模型进行处理,它首先抓取 URL 内容,将 HTML 转换为 Markdown 格式,然后使用小型快速模型根据用户的提示进行处理。

不过我尝试下来,这个工具一直没有调用,不知道什么原因,总是报 Domain xxx is not allowed to be fetched 这样的错:

claude-code-web-fetch.png

如果有知道原因的朋友,欢迎在评论区交流。

这个工具的描述里有几个点值得关注:

  • 重要提示:如果有 MCP 提供的网页获取工具可用,请优先使用该工具,因为它可能限制更少。所有 MCP 提供的工具都以 "mcp__" 开头
  • HTTP URL 将自动升级为 HTTPS
  • 如果内容非常大,结果可能会被总结
  • 包含自清理的 15 分钟缓存,以便在重复访问同一 URL 时获得更快的响应

所以如果有朋友也遇到和我一样的错误,建议使用 MCP 工具来抓取网页,关于 MCP 的内容,我们后面单独开一篇来介绍。

联网搜索

除了抓取特定网页的内容,Claude Code 还能够通过内置的 WebSearch 工具进行联网搜索,提供最新信息,回答实时问题。比如最近 Google 发布的 Gemini CLI 非常火,我就让它帮我搜一下:

claude-code-web-search.png

联网搜索工具实际上调用的还是 Claude 模型,最新版本的 Claude 模型基本上都具备 联网搜索能力,在调用模型时将 tools 换成了 Claude 内置的 web_search 工具即可:

{
  "model": "claude-sonnet-4-20250514",
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "Perform a web search for the query: Gemini CLI command line interface features functionality"
        }
      ]
    }
  ],
  "temperature": 1,
  "system": [
    {
      "type": "text",
      "text": "You are Claude Code, Anthropic's official CLI for Claude."
    },
    {
      "type": "text",
      "text": "You are an assistant for performing a web search tool use"
    }
  ],
  "tools": [
    {
      "type": "web_search_20250305",
      "name": "web_search",
      "max_uses": 8
    }
  ],
  "max_tokens": 32000,
  "stream": true
}

但是这也带来了一个问题,如果我们没有使用 Claude 模型,而是自定义的其他模型,那么 WebSearch 工具就不可用了,所以也建议使用 MCP 工具来实现联网搜索。在运行 claude 命令时,通过 --disallowedTools 选项禁用网页抓取和联网搜索工具:

$ claude --disallowedTools "WebSearch,WebFetch"

未完待续

今天我们学习了 Claude Code 的文件操作和网络访问相关的工具,包括:

  • 文件读写ReadWrite 工具,其中 Read 支持图像读取和视觉分析
  • 文件编辑EditMultiEdit 工具,通过精确的字符串替换实现代码修改
  • Notebook 操作NotebookReadNotebookEdit 工具,通过 Jupyter Notebook 提供交互式开发和学习环境
  • 网络功能WebFetchWebSearch 工具,获取联网信息,解决实时性问题

在下一篇中,我们将学习剩下的几个工具,包括 TaskTodoWriteTodoReadexit_plan_mode 四个工具,来解决一些相对复杂和高级的任务。