> ## Documentation Index
> Fetch the complete documentation index at: https://cndoc-langchain.site/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP 工具

> 从 MCP（模型上下文协议）服务器加载额外工具

[MCP（模型上下文协议）](https://modelcontextprotocol.io/) 允许你使用来自外部服务器（文件系统、API、数据库等）的工具扩展 Deep Agents CLI，而无需修改代理本身。CLI 在启动时连接到 MCP 服务器，发现其工具，并使其与内置工具一起可供代理使用。

## 快速入门

<Steps>
  <Step title="创建配置文件" icon="file">
    在项目根目录创建一个 `.mcp.json` 文件。格式遵循 [Claude Desktop 约定](https://modelcontextprotocol.io/quickstart/user)：

    ```json title=".mcp.json" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    {
        "mcpServers": {
            "docs-langchain": {
            "type": "http",
            "url": "https://docs.langchain.com/mcp"
            }
        }
    }
    ```
  </Step>

  <Step title="启动 CLI" icon="terminal">
    ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    deepagents
    ```

    启动时，CLI 会自动发现你的 `.mcp.json`，启动每个配置的服务器，发现其工具，并打印确认信息：

    ```
    ✓ 已加载 3 个 MCP 工具
    ```

    代理现在可以在会话期间使用这些工具。会话保持活动状态——stdio 服务器在工具调用之间不会重启。
  </Step>
</Steps>

## 自动发现

CLI 会自动在标准位置搜索 `.mcp.json` 文件。无需标志——只需放置一个配置文件即可被识别。

### 发现位置

配置按以下顺序检查（优先级从低到高）：

| 优先级   | 位置                                | 范围                       |
| ----- | --------------------------------- | ------------------------ |
| 1（最低） | `~/.deepagents/.mcp.json`         | 用户级——适用于所有项目             |
| 2     | `<project>/.deepagents/.mcp.json` | 项目级——`.deepagents` 子目录   |
| 3（最高） | `<project>/.mcp.json`             | 项目级——根目录（兼容 Claude Code） |

项目根目录是包含 `.git` 文件夹的最近父目录，如果找不到则回退到当前工作目录。

当存在多个配置文件时，它们的 `mcpServers` 条目会被合并。如果相同的服务器名称出现在多个文件中，优先级更高的配置将生效。

### 标志

| 标志                  | 行为                              |
| ------------------- | ------------------------------- |
| `--mcp-config PATH` | 添加一个显式配置作为最高优先级来源（在自动发现的配置之上合并） |
| `--no-mcp`          | 完全禁用 MCP——不加载任何服务器              |

<Note>
  `--mcp-config` 和 `--no-mcp` 互斥。
</Note>

### Claude Code 兼容性

如果你的项目根目录已有用于 Claude Code 的 `.mcp.json`，Deep Agents CLI 会自动识别它——无需额外设置。

## 配置格式

`mcpServers` 下的每个键都是一个服务器名称。服务器的字段决定了 CLI 如何连接到它。

### stdio 服务器（默认）

stdio 服务器作为子进程启动。CLI 通过 stdin/stdout 与它们通信。

```json title="mcp-config.json" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
      "env": {}
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": { "GITHUB_TOKEN": "your-token" }
    }
  }
}
```

### SSE 和 HTTP 服务器

对于远程 MCP 服务器，将 `type` 设置为 `"sse"` 或 `"http"` 并提供 `url`：

```json title="mcp-config.json" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{
  "mcpServers": {
    "remote-api": {
      "type": "sse",
      "url": "https://api.example.com/mcp",
      "headers": { "Authorization": "Bearer your-token" }
    }
  }
}
```

### 字段参考

<AccordionGroup>
  <Accordion title="stdio（默认）">
    **必需：** `command`。**可选：** `args`、`env`，以及共享的[工具过滤字段](#工具过滤)。

    <ResponseField name="command" type="string" required>
      要运行的可执行文件。
    </ResponseField>

    <ResponseField name="args" type="string[]">
      传递给命令的参数。
    </ResponseField>

    <ResponseField name="env" type="object">
      为子进程设置的环境变量。使用此选项传递 API 密钥和其他凭据，而不会在 shell 历史记录中暴露它们。
    </ResponseField>
  </Accordion>

  <Accordion title="sse">
    **必需：** `type: "sse"`、`url`。**可选：** `headers`、`auth`，以及共享的[工具过滤字段](#工具过滤)。

    <ResponseField name="type" type="&#x22;sse&#x22;" required>
      传输类型。使用 `"sse"` 表示服务器发送事件。
    </ResponseField>

    <ResponseField name="url" type="string" required>
      服务器端点 URL。
    </ResponseField>

    <ResponseField name="headers" type="object">
      随每个请求发送的 HTTP 头。通常用于身份验证。值支持 `${VAR}` 引用父 shell 环境变量（在服务器激活时解析）。
    </ResponseField>

    <ResponseField name="auth" type="&#x22;oauth&#x22;">
      设置为 `"oauth"` 以使用 `deepagents mcp login` 驱动 OAuth 登录流程，而不是提供 `Authorization` 头。不能与 `Authorization` 头组合使用。参见 [OAuth 登录](#oauth-登录)。
    </ResponseField>
  </Accordion>

  <Accordion title="http">
    **必需：** `type: "http"`、`url`。**可选：** `headers`、`auth`，以及共享的[工具过滤字段](#工具过滤)。

    <ResponseField name="type" type="&#x22;http&#x22;" required>
      传输类型。使用 `"http"` 表示可流式传输的 HTTP。`streamable_http` 和 `streamable-http` 作为别名被接受。
    </ResponseField>

    <ResponseField name="url" type="string" required>
      服务器端点 URL。
    </ResponseField>

    <ResponseField name="headers" type="object">
      随每个请求发送的 HTTP 头。通常用于身份验证。值支持 `${VAR}` 引用父 shell 环境变量（在服务器激活时解析）。
    </ResponseField>

    <ResponseField name="auth" type="&#x22;oauth&#x22;">
      设置为 `"oauth"` 以使用 `deepagents mcp login` 驱动 OAuth 登录流程，而不是提供 `Authorization` 头。不能与 `Authorization` 头组合使用。参见 [OAuth 登录](#oauth-登录)。
    </ResponseField>
  </Accordion>
</AccordionGroup>

<Note>
  `type` 字段也可以写为 `transport`，以兼容其他 MCP 客户端。
</Note>

<Note>
  服务器名称必须匹配 `[A-Za-z0-9_-]+`。名称用作 OAuth 令牌文件的磁盘基名，因此在配置加载时会拒绝路径分隔符和其他 shell 元字符。
</Note>

### 头部环境变量

头部值支持从父 shell 进行 `${VAR}` 替换，在服务器激活时解析，而不是在配置加载时解析。一个未设置的变量只会导致需要它的服务器失败；其余服务器仍会启动。

```json title=".mcp.json" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{
    "mcpServers": {
        "internal-api": {
            "type": "http",
            "url": "https://api.example.com/mcp",
            "headers": { "Authorization": "Bearer ${INTERNAL_API_TOKEN}" }
        }
    }
}
```

## 多服务器

你可以根据需要配置任意数量的服务器。所有服务器的工具都会合并并可供代理使用：

```json title="mcp-config.json" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/projects"]
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": { "GITHUB_TOKEN": "ghp_..." }
    },
    "database": {
      "type": "sse",
      "url": "https://db-mcp.internal:8080/mcp",
      "headers": { "Authorization": "Bearer ..." }
    }
  }
}
```

## 工具过滤

每个服务器可以通过两个可选字段之一来缩小其向代理暴露的工具范围：

* `allowedTools`：仅保留列出的工具；丢弃其他所有工具。
* `disabledTools`：丢弃列出的工具；保留其他所有工具。

过滤适用于 stdio、HTTP 和 SSE 服务器。以下两种情况在配置加载时会被拒绝：

* 在同一服务器上同时设置 `allowedTools` 和 `disabledTools`。
* 将任一字段设置为空列表（会静默剥离所有工具，或成为无操作）。请改用省略该字段。

```json title=".mcp.json" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{
  "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"]
    }
  }
}
```

### 匹配规则

每个条目是字面工具名称或 [`fnmatch`](https://docs.python.org/3/library/fnmatch.html) 风格的 glob（任何包含 `*`、`?` 或 `[` 的条目都被视为模式）。条目会与裸 MCP 工具名称和服务器前缀形式（`{server}_{tool}`）进行匹配，因此任一形式都有效：

```json theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{
  "allowedTools": ["read_file", "fs_list_*"]
}
```

<Note>
  与任何已加载工具都不匹配的条目会记录为警告，而不是错误——底层 MCP 服务器可以在不同版本中演进其工具列表，而不会破坏你的配置。
</Note>

<ResponseField name="allowedTools" type="string[]">
  要保留的工具名称或 `fnmatch` glob 模式。此服务器的所有其他工具将被丢弃。与 `disabledTools` 互斥。
</ResponseField>

<ResponseField name="disabledTools" type="string[]">
  要丢弃的工具名称或 `fnmatch` glob 模式。此服务器的所有其他工具将被保留。与 `allowedTools` 互斥。
</ResponseField>

## OAuth 登录

对于需要 OAuth 的远程 MCP 服务器（Slack、GitHub、Notion、Linear 和其他托管 MCP 端点），在服务器条目上设置 `"auth": "oauth"` 并运行一次登录子命令。令牌会持久化到磁盘并自动刷新。

<Note>
  OAuth 登录需要 `deepagents-cli>=0.0.46`。
</Note>

### 配置服务器

```json title=".mcp.json" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{
    "mcpServers": {
        "linear": {
            "type": "http",
            "url": "https://mcp.linear.app/mcp",
            "auth": "oauth"
        }
    }
}
```

`auth: "oauth"` 与同一 `Authorization` 头条目互斥，不能在 stdio 服务器上设置。

### 运行登录流程

```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
deepagents mcp login linear
```

发生的情况取决于服务器的主机：

* **符合规范的服务器**（默认）：CLI 执行动态客户端注册，在浏览器中打开授权码 + PKCE 流程，并要求你将重定向的 URL 粘贴回终端。
* **Slack**（`slack.com`、`*.slack.com`）：相同的粘贴回流程，但使用 Slack 的公共客户端预设。系统会提示你输入可选的团队 ID（例如 `T01234567`），以便应用安装到正确的工作区。
* **GitHub**（`api.githubcopilot.com`）：RFC 8628 设备授权授予。CLI 打印一个验证 URL 和一个用户代码；你在浏览器中输入代码，CLI 轮询完成状态。

默认情况下，`deepagents mcp login` 读取 CLI 在运行时使用的相同自动发现配置（受项目级信任门控）。传递 `--config <path>` 以使用特定文件：

```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
deepagents mcp login linear --config ./mcp-config.json
```

<Warning>
  在 `mcp login` 期间会跳过尚未被信任的项目级配置（参见[项目级信任](#项目级信任)），以防止攻击者控制的 `headers` 条目通过 `${VAR}` 插值泄露本地机密。在项目中运行一次 `deepagents` 以批准配置，或显式传递 `--config <path>`。
</Warning>

### 令牌存储

令牌写入：

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
~/.deepagents/mcp-tokens/<server>-<sha256-16(url)>.json
```

`<sha256-16(url)>` 部分是服务器 URL 的 SHA-256 哈希值的前 16 个十六进制字符。目录锁定为模式 `0700`，每个令牌文件模式为 `0600`。文件包含 OAuth 访问令牌、刷新令牌和动态注册的客户端信息，所有内容都在一个模式版本化的有效负载中，该负载是原子写入的（写入临时文件 + `rename`）。

<Note>
  将 URL 哈希到文件名中意味着指向不同 URL 的相同服务器名称（例如，开发环境与生产环境）会获得独立的令牌文件，并且不会相互覆盖。
</Note>

### 重新身份验证

当刷新在运行时失败（刷新令牌过期或被撤销）时，CLI 会将服务器标记为 `unauthenticated`，而不是使代理崩溃。欢迎横幅显示未认证服务器的数量，`/mcp` 报告每个服务器的原因。重新运行 `deepagents mcp login <server>` 以刷新凭据——你的对话无需重启即可继续。

## 服务器状态

每个配置的服务器在启动后处于以下三种状态之一：

| 状态                | 含义                                                   |
| ----------------- | ---------------------------------------------------- |
| `ok`              | 已连接；工具已加载并可供代理使用                                     |
| `unauthenticated` | 需要 OAuth 登录或刷新失败——运行 `deepagents mcp login <server>` |
| `error`           | 预检、发现或传输设置失败；附有错误消息                                  |

单个失败的服务器不再中止启动。代理使用正常启动的服务器运行，欢迎横幅在工具计数旁边显示未认证和错误服务器的数量。在交互式会话中打开 `/mcp` 以查看每个服务器的状态、传输、工具列表以及非 `ok` 条目的失败原因。查看器在服务器连接时实时更新，并支持 `tab`/`shift+tab` 导航。

## 项目级信任

项目级配置可以包含执行本地命令的 stdio 服务器和其 `headers` 可能从你的环境中插值 `${VAR}` 的远程服务器。为防止不受信任的仓库在 CLI 启动时运行任意代码或泄露本地机密，CLI 对项目级条目强制执行**默认拒绝**策略。

### 工作原理

* **交互模式：** CLI 在激活项目服务器之前提示批准，显示每个 stdio 命令和远程 URL。批准使用 SHA-256 内容指纹持久化——如果配置更改，会再次提示你。
* **非交互模式（`-n`）：** 除非传递 `--trust-project-mcp`，否则项目服务器会被静默跳过。
* **信任同样适用于 stdio 和远程条目**——远程服务器可以在预检探测期间通过 SSRF 访问 localhost 或云元数据端点，并通过头泄露 `${VAR}` 值，因此它们受到与 stdio 相同的门控。
* **用户级配置**（`~/.deepagents/.mcp.json`）始终受信任——与 `config.toml` 和 `hooks.json` 相同的信任模型。
* **`deepagents mcp login`** 也遵守项目信任：不受信任的项目级配置在登录发现期间会被跳过，因此攻击者控制的远程条目无法将机密拉入 OAuth 握手。

### 标志

| 标志                    | 行为                                 |
| --------------------- | ---------------------------------- |
| `--trust-project-mcp` | 无需提示即信任所有项目级 stdio 服务器（用于 CI 和自动化） |

```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
# 跳过批准提示
deepagents --trust-project-mcp

# 非交互式：显式信任项目服务器
deepagents -n "run tests" --trust-project-mcp
```

### 信任存储

信任决策存储在 `~/.deepagents/config.toml` 中：

```toml theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
[mcp_trust.projects]
"/Users/you/myproject" = "sha256:abc123..."
```

每个键是绝对项目根路径。值是连接的项目级配置内容的 SHA-256 摘要。要撤销信任，请删除条目或修改项目的 `.mcp.json`（这会自动使指纹失效）。

<Warning>
  受信任的 stdio MCP 服务器具有与你的用户帐户相同的权限。只批准来自你信任的仓库的服务器。在接受之前，请查看批准提示中显示的命令。
</Warning>

## 系统提示感知

已连接的 MCP 服务器及其工具会自动列在代理的系统提示中，按服务器名称和传输类型分组。这有助于模型推理工具来源和故障域，而无需手动上下文。

## 故障排除

<AccordionGroup>
  <Accordion title="服务器启动失败（stdio）">
    验证命令在 CLI 外部是否有效：

    ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    npx -y @modelcontextprotocol/server-filesystem /tmp
    ```

    常见原因：包未安装、`npx` 不在 `PATH` 上，或缺少所需的环境变量。
  </Accordion>

  <Accordion title="连接被拒绝（SSE/HTTP）">
    检查远程服务器是否正在运行以及 URL 是否正确。如果服务器需要身份验证，请确保 `headers` 包含正确的凭据。
  </Accordion>

  <Accordion title="工具未出现">
    CLI 在启动时打印加载的工具数量（例如 `✓ 已加载 3 个 MCP 工具`）。如果你看到 `0`，服务器启动成功但未公布任何工具——检查服务器自身的日志或文档。
  </Accordion>

  <Accordion title="服务器在 /mcp 中显示 `unauthenticated`">
    要么你尚未运行 `deepagents mcp login <server>`，要么持久化的刷新令牌过期或在服务器端被撤销。再次运行登录命令——你的会话继续运行，服务器将在令牌刷新后重新连接。
  </Accordion>

  <Accordion title="`Invalid MCP config at ...`">
    预检验证拒绝了 `--mcp-config`（或自动发现的 `.mcp.json`）。常见原因：不支持的服务器名称（必须匹配 `[A-Za-z0-9_-]+`）、stdio 服务器上的 `auth: oauth`、同一 `command` 和 `url` 条目上同时设置，或头部值不是字符串。修复高亮显示的原因并重新启动——CLI 不再为配置错误转储多页子进程跟踪。
  </Accordion>

  <Accordion title="`${VAR}` 头部引用失败">
    头部插值在激活时运行，因此未设置的变量只会导致需要它的服务器失败。在父 shell 中导出变量或将其添加到 `~/.deepagents/.env`。要调试，请设置 `DEEPAGENTS_CLI_DEBUG=1` 并检查关闭时打印到 stderr 的每会话日志路径。
  </Accordion>
</AccordionGroup>

## 延伸阅读

* [LangChain MCP 指南](/oss/python/langchain/mcp)：协议详情、构建自定义服务器以及以编程方式使用 `langchain-mcp-adapters`
* [MCP 规范](https://modelcontextprotocol.io/)：官方协议规范和服务器注册表

***

<div className="source-links">
  <Callout icon="terminal-2">
    [将这些文档](/use-these-docs)通过 MCP 连接到 Claude、VSCode 等，以获取实时答案。
  </Callout>

  <Callout icon="edit">
    [在 GitHub 上编辑此页面](https://github.com/langchain-ai/docs/edit/main/src/oss/deepagents/cli/mcp-tools.mdx) 或 [提交问题](https://github.com/langchain-ai/docs/issues/new/choose)。
  </Callout>
</div>
