MCP 工具
从 MCP 服务器加载额外工具,扩展 Deep Agents Code 的能力边界
无需修改 Agent 本身,一行配置即可接入外部服务为什么需要它
你的 Agent 能力有限——想接数据库、调用 API、操作文件系统怎么办?
内置工具的局限
- Deep Agents Code 内置的工具集固定且有限
- 想连接公司内部 API?只能自己写代码包装
- 需要操作特定数据库?没有现成驱动
- 每次扩展能力都要修改 Agent 源码,维护成本高
- 不同项目需要不同工具集,无法灵活切换
MCP 协议的解法
- MCP(Model Context Protocol)统一了工具接入标准
- 外部服务器提供工具,Agent 自动发现并使用
- 文件系统、数据库、API一键接入
- 只需一个
.mcp.json配置文件,零代码扩展 - 项目级 / 用户级灵活配置,按需切换
"USB 即插即用"只是比喻帮助你理解使用体验。实际上计算机内部的工作方式是:Deep Agents Code 在启动时读取 .mcp.json 配置文件,根据配置启动子进程(stdio)或建立 HTTP/SSE 连接(远程),通过 MCP 协议发现并注册工具列表,然后将其注入到 Agent 可用的工具集中——与 USB 的物理插拔和驱动加载机制完全不同。
快速入门
三步配置:创建文件、添加服务器、启动——就这么简单
1. 创建配置文件
用户级或项目级
2. 添加 MCP 服务器
在 JSON 中声明
3. 启动 Deep Agents Code
自动发现并加载
用户级配置(所有项目通用)
# 创建用户级配置目录和文件
mkdir -p ~/.deepagents
touch ~/.deepagents/.mcp.json
此文件中的服务器在所有项目中可用。
项目级配置(当前项目专用)
# 在项目根目录创建配置文件
touch .mcp.json
# 或隐藏在 .deepagents 子目录中
mkdir -p .deepagents
touch .deepagents/.mcp.json
此文件中的服务器仅在此项目中可用。
.mcp.json 中写入服务器配置,然后启动 dcode 即可自动加载。
配置示例
一个 JSON 文件搞定——声明服务器名称、类型和连接参数
{
"mcpServers": {
"docs-langchain": { // 服务器名称(需匹配 [A-Za-z0-9_-]+)
"type": "http", // 传输类型:http / sse / stdio(默认)
"url": "https://docs.langchain.com/mcp" // 远程 MCP 服务器端点
}
}
}
要添加更多服务器,在 mcpServers 中添加更多条目。有关 OAuth、stdio、SSE 和 HTTP 服务器字段、环境变量和请求头的信息,请参见配置格式。
启动 Deep Agents Code 后,会看到确认信息:
✓ Loaded 3 MCP tools
在交互式会话中运行 /mcp 可查看每个服务器的状态、传输方式和已加载的工具列表。Agent 现在可以在整个会话期间使用这些工具——stdio 服务器在工具调用之间会保持存活。
.mcp.json 放在错误的目录下。项目级配置文件必须在包含 .git 文件夹的项目根目录中,否则不会被自动发现。
自动发现机制
Deep Agents Code 自动搜索标准位置的配置文件,无需任何命令行标志
| 优先级 | 位置 | 作用域 |
|---|---|---|
| 1(最低) | ~/.deepagents/.mcp.json |
用户级别——应用于所有项目 |
| 2 | <project>/.deepagents/.mcp.json |
项目级别——.deepagents 子目录 |
| 3(最高) | <project>/.mcp.json |
项目级别——根目录(兼容 Claude Code) |
合并规则
- 多个配置文件的
mcpServers条目会被合并 - 同一服务器名称出现多次时,高优先级配置覆盖低优先级
- 项目级可以覆盖用户级,不影响其他项目
命令行标志
--mcp-config PATH:添加显式配置作为最高优先级--no-mcp:完全禁用 MCP,不加载任何服务器- 这两个标志互斥,不能同时使用
.mcp.json,Deep Agents Code 会自动识别——无需额外设置。
配置格式
mcpServers 下的每个键是一个服务器名称,字段决定了 Deep Agents Code 如何连接到它
stdio 服务器(默认)
作为子进程启动,通过 stdin/stdout 通信。设置 command、args、env 字段。
SSE 服务器
Server-Sent Events 传输。设置 type: "sse"、url、可选的 headers 和 auth。
HTTP 服务器
可流式传输的 HTTP。设置 type: "http"、url、可选的 headers 和 auth。
stdio 服务器(默认)
作为子进程启动,通过 stdin/stdout 通信——最常用的本地服务器类型
{
"mcpServers": {
"filesystem": { // 服务器名称
"command": "npx", // 启动子进程的可执行文件
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"], // 允许访问 /tmp 目录
"env": {} // 无额外环境变量
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"], // GitHub MCP 官方服务器
"env": { "GITHUB_TOKEN": "your-token" } // 通过 env 安全传递 API 密钥
}
}
}
字段参考
command type="string" 必填
要运行的可执行文件,如 npx、python。
args type="string[]"
传递给命令的参数数组。
env type="object"
为子进程设置的环境变量。使用此字段传递 API 密钥和其他凭据,避免将它们暴露在 shell 历史记录中。
远程服务器
SSE 和 HTTP 两种远程传输方式——连接云端 MCP 服务
{
"mcpServers": {
"remote-api": {
"type": "sse", // Server-Sent Events 传输方式
"url": "https://api.example.com/mcp", // 远程 MCP 端点
"headers": { "Authorization": "Bearer your-token" } // 每次请求携带认证头
}
}
}
字段参考
SSE 服务器
必填:type: "sse"、url。可选:headers、auth,以及共享的工具过滤字段。
type: "sse"——Server-Sent Events 传输- 必填:
type、url - 可选:
headers、auth
HTTP 服务器
必填:type: "http"、url。可选:headers、auth,以及共享的工具过滤字段。
type: "http"——可流式传输的 HTTP- 别名:
streamable_http、streamable-http
type type=""sse"" 必填
传输类型。使用 "sse" 表示 Server-Sent Events。
type type=""http"" 必填
传输类型。使用 "http" 表示可流式传输的 HTTP。streamable_http 和 streamable-http 也作为别名被接受。
url type="string" 必填
服务器端点 URL。
headers type="object"
每次请求时发送的 HTTP 头。通常用于身份验证。值支持 ${VAR} 形式引用父 shell 的环境变量(在服务器激活时解析)。
auth type=""oauth""
设置为 "oauth" 以使用 dcode mcp login 驱动 OAuth 登录流程,而不是提供 Authorization 请求头。不能与 Authorization 请求头同时使用。参见 OAuth 登录。
headers 值支持 ${VAR} 形式引用环境变量,在服务器激活时(而非配置加载时)解析。一个未设置的变量只会导致需要它的那个服务器启动失败;其余服务器仍会正常启动。这意味着你可以在配置加载后、服务器激活前设置或更新环境变量。
{
"mcpServers": {
"internal-api": {
"type": "http", // 可流式传输的 HTTP 双向通信
"url": "https://api.example.com/mcp",
"headers": { "Authorization": "Bearer ${INTERNAL_API_TOKEN}" } // ${} 在激活时从环境变量展开
}
}
}
type 字段也可以写成 transport,以兼容其他 MCP 客户端。两者行为完全一致。
多个服务器
配置任意数量的服务器,工具自动合并提供给 Agent
{
"mcpServers": {
"filesystem": { // stdio 类型(默认,无需指定 type)
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/projects"]
},
"github": { // stdio 类型——本地 GitHub MCP 服务器
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_TOKEN": "ghp_..." } // 安全传递 GitHub Token
},
"database": { // SSE 类型——远程数据库 MCP 服务器
"type": "sse",
"url": "https://db-mcp.internal:8080/mcp",
"headers": { "Authorization": "Bearer ..." }
}
}
}
混合部署
stdio、SSE、HTTP 服务器可以在同一个配置文件中混合使用。每个服务器的工具会被独立发现,然后合并为一个统一的工具集提供给 Agent。
命名规则
服务器名称必须匹配 [A-Za-z0-9_-]+。名称用作 OAuth 令牌文件的磁盘文件名,因此路径分隔符和其他 shell 元字符会被拒绝。
工具过滤
精细控制每个服务器暴露给 Agent 的工具范围
allowedTools type="string[]"
要保留的工具名称或 fnmatch glob 模式。来自此服务器的所有其他工具将被丢弃。与 disabledTools 互斥。
"allowedTools": ["read_file", "list_directory"]
disabledTools type="string[]"
要丢弃的工具名称或 fnmatch glob 模式。来自此服务器的所有其他工具将被保留。与 allowedTools 互斥。
"disabledTools": ["delete_repository", "delete_*_branch"]
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
"allowedTools": ["read_file", "list_directory"] // 白名单:只保留这两个工具
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"disabledTools": ["delete_repository", "delete_*_branch"] // 黑名单:禁用危险操作(支持 glob)
}
}
}
allowedTools 和 disabledTools。也不能设置为空列表——请省略该字段。
fnmatch 风格的 glob 模式(*、?、[),同时匹配裸工具名和服务器前缀形式({server}_{tool})。未匹配到任何已加载工具的条目会被记录为警告而非错误——底层 MCP 服务器可以在不同版本中演进其工具列表,而不会破坏你的配置。
OAuth 登录
需要 OAuth 的远程服务器(Slack、GitHub、Notion 等)一键认证
配置服务器
{
"mcpServers": {
"linear": {
"type": "http", // HTTP 传输方式
"url": "https://mcp.linear.app/mcp", // Linear 官方 MCP 端点
"auth": "oauth" // 使用 OAuth 认证(不能用 Authorization 头)
}
}
}
auth: "oauth" 与 Authorization 请求头互斥,且不能用于 stdio 服务器。
运行登录流程
# 启动 OAuth 登录流程(打开浏览器授权)
dcode mcp login linear
- 标准服务器:浏览器授权码 + PKCE 流程,粘贴回 URL
- Slack:预置公共客户端,支持团队 ID
- GitHub:设备授权许可,输入验证码
~/.deepagents/.state/mcp-tokens/<server>-<sha256-16(url)>.json,目录权限 0700,文件权限 0600,支持自动刷新。URL 哈希确保不同环境拥有独立令牌。
令牌与重认证
令牌自动持久化和刷新——过期时无需重启会话
令牌存储位置
~/.deepagents/.state/mcp-tokens/<server>-<sha256-16(url)>.json
- SHA-256 哈希的前 16 个十六进制字符
- 包含访问令牌、刷新令牌和客户端信息
- 原子写入(先写临时文件再 rename)
重新认证
- 刷新令牌过期时,服务器标记为
unauthenticated - 欢迎横幅显示未认证服务器数量
/mcp报告每个服务器的原因- 重新运行
dcode mcp login <server>即可 - 会话无需重启,令牌刷新后自动重连
dcode mcp login 读取与 Deep Agents Code 运行时相同的自动发现配置(受项目级别信任门控)。传递 --config <path> 以使用特定文件:
# 指定配置文件登录(不使用自动发现的配置)
dcode mcp login linear --config ./mcp-config.json
mcp login 期间会被跳过,以防止攻击者控制的 headers 条目通过 ${VAR} 插值窃取本地密钥。在项目中先运行一次 dcode 以批准配置。
服务器状态
每个服务器启动后处于三种状态之一——单个失败不影响整体
| 状态 | 含义 | 处理方式 |
|---|---|---|
| ok | 已连接,工具已加载并可供 Agent 使用 | 无需操作 |
| unauthenticated | 需要 OAuth 登录或刷新失败 | 运行 dcode mcp login <server> |
| error | 预检、发现或传输设置失败,附带错误消息 | 查看 /mcp 中的失败原因 |
容错机制
单个服务器失败不再导致启动中止。Agent 会使用成功启动的服务器继续运行,欢迎横幅显示未认证和出错的服务器数量。
实时监控
/mcp 查看器会随服务器连接实时更新,支持 Tab / Shift+Tab 导航,可查看传输方式、工具列表和失败原因。
项目信任机制
默认拒绝策略——防止不受信任的仓库执行任意代码或窃取密钥
潜在风险
- stdio 服务器可以在你机器上执行任意命令
- 远程服务器的
headers可通过${VAR}窃取环境变量 - 远程服务器可发起 SSRF 攻击(访问 localhost 或云元数据端点)
- 克隆一个恶意仓库后运行
dcode,就可能中招
防护措施
- 交互模式:激活前提示批准,显示每个命令和 URL
- 非交互模式:除非传
--trust-project-mcp,否则跳过 - 批准决定通过 SHA-256 指纹持久化,配置变化重新提示
- stdio 和远程条目同样受到门控
- 用户级配置始终受信任
# 交互模式下跳过批准提示(直接信任当前项目的 MCP 配置)
dcode --trust-project-mcp
# 非交互模式下必须显式信任,否则项目服务器会被跳过
dcode -n "run tests" --trust-project-mcp
信任存储
信任决定存储在 config.toml 中——指纹校验,配置变化自动失效
# ~/.deepagents/config.toml
[mcp]
# 每项是一条被批准的服务器定义(项目根目录 + 服务器名 + 指纹)
enabled_project_server_approvals = [
{ project_root = "/Users/you/myproject", name = "filesystem", fingerprint = "sha256:abc123..." }
]
存储结构
- 位于
[mcp]表下的enabled_project_server_approvals数组 - 每项是结构体对象,含
project_root+name+fingerprint - 指纹是单个服务器定义的 SHA-256(每服务器每项目),非整个配置文件哈希
- 修改
.mcp.json会自动使指纹失效 - 删除条目即可撤销信任
登录安全
dcode mcp login同样遵守项目信任- 不受信任的项目配置在登录期间被跳过
- 防止恶意远程条目将密钥拉入 OAuth 握手
故障排除
常见问题与解决方案——快速定位并修复 MCP 配置问题
stdio 启动失败
验证命令在 Deep Agents Code 之外是否正常工作:
# 手动测试 stdio 服务器是否能在 Deep Agents Code 外正常运行
npx -y @modelcontextprotocol/server-filesystem /tmp
常见原因:包未安装、npx 不在 PATH 中、缺少环境变量。
连接被拒绝
检查远程服务器是否正在运行以及 URL 是否正确。如需认证,确保 headers 包含正确的凭据。
工具未显示
看到 ✓ Loaded 0 MCP tools?服务器启动成功但没有声明工具——检查服务器自身的日志或文档。
配置校验失败
Invalid MCP config at ... 的常见原因:
- 服务器名称不合法(需匹配
[A-Za-z0-9_-]+) - stdio 服务器上设置了
auth: oauth - 同一条目同时设置
command和url - 请求头值不是字符串
修复高亮显示的原因后重新启动——Deep Agents Code 不再为配置错误输出多页子进程跟踪信息。
服务器在 /mcp 中显示 unauthenticated
你可能还没有运行 dcode mcp login <server>,或者持久化的刷新令牌已过期或在服务器端被撤销。
重新运行登录命令——你的会话会继续运行,令牌刷新后服务器会重新连接。
${VAR} 请求头引用失败
请求头插值在激活时运行,因此未设置的变量只会导致需要它的服务器失败。在父 shell 中导出变量,或将其添加到 ~/.deepagents/.env。
要调试,请设置 DEEPAGENTS_CODE_DEBUG=1 并检查关闭时输出到 stderr 的每个会话的日志路径。
本章回顾
MCP 工具让 Deep Agents Code 的能力边界变得无限可扩展
你学到了什么
- MCP 是一个标准协议,让 Agent 无代码接入外部工具
- 三种服务器类型:stdio(本地子进程)、SSE、HTTP(远程)
- 配置文件三级优先级:用户级 → 项目隐藏目录 → 项目根目录
- 工具过滤:allowedTools / disabledTools 精细控制
- OAuth 登录:一键认证,令牌自动刷新
- 项目信任:默认拒绝策略,SHA-256 指纹校验
- 单个服务器失败不影响整体运行
后续章节预告
- 数据位置:了解 Deep Agents Code 的数据存储和位置管理
- 更多关于 MCP 服务器开发和自定义工具的深入内容
- LangChain MCP 指南:协议细节和构建自定义服务器
.mcp.json 文件就能接入文件系统、数据库、API 等任意外部服务,同时内置的安全机制确保不受信任的配置不会在你不知情的情况下执行。这是 Agent 工程化的关键一环。
延伸阅读
继续本课程
- 下一章:数据位置 — 了解 Deep Agents Code 的数据存储和位置管理
官方文档
- MCP 规范 — 官方协议规范和服务器注册表
- LangChain MCP 指南 — 协议细节和构建自定义服务器