Claude 原生支持模型上下文协议 (MCP),让您可以将外部工具——数据库、代码运行器、API 和自定义服务器——直接连接到您的工作流程中。无论您是在终端中使用 Claude Code,还是在机器上使用 Claude Desktop,MCP 配置在协议层面都是相同的,只是在注册服务器的方式上略有不同。本指南涵盖两种路径:Claude Code 的 claude mcp add CLI 命令,以及 Claude Desktop 的 JSON 配置文件,同时也会介绍工具使用推理和沙箱执行如何融入其中。
MCP 在 Claude 中的作用
MCP 是 Anthropic 提出的一项开放标准,它为语言模型提供了一种统一的方式来调用外部工具。在 MCP 出现之前,每个 AI 应用都需要为每个想要使用的工具编写定制的胶水代码。而有了 MCP,任何兼容的服务器都可以通过标准的发现和调用协议来暴露其能力,任何兼容的主机——包括 Claude——无需为每个工具进行集成工作即可使用它们。
具体来说:当您向 Claude 添加一个 MCP 服务器时,您就是在告诉 Claude 主机一组工具的位置。Claude 随后可以在会话期间列出这些工具,并在任务需要时按名称调用它们。服务器负责执行;Claude 负责推理何时以及如何调用。
支撑 MCP 的三个核心概念:
| 概念 | 含义 | 示例 |
|---|---|---|
| 工具 | 服务器暴露的可调用函数 | run_python、query_db、list_models |
| 资源 | 服务器作为上下文提供的只读数据 | 一个文件、一个数据库行、一个数据集 |
| 提示 | 服务器附带的预构建指令模板 | 一个系统级的任务描述 |
对于大多数开发者来说,工具是最重要的。当您构建更结构化的代理管道时,资源和提示才会变得相关。
在 Claude Code 中添加 MCP 服务器
Claude Code 通过 claude mcp 子命令组来管理 MCP。您可以添加、移除和列出服务器,而无需手动修改任何配置文件。
claude mcp add — 基本形式
claude mcp add <name> <command> [args...]
例如,要添加一个本地 Python MCP 服务器:
claude mcp add my-tools python /path/to/mcp_server.py
这会注册一个名为 my-tools 的服务器,该服务器通过 stdio 传输方式运行 python /path/to/mcp_server.py。Claude Code 会在您启动会话时启动该进程,并在会话期间保持其运行。
传递环境变量
许多 MCP 服务器需要 API 密钥或端点 URL。在注册时使用 --env 来传递它们:
claude mcp add my-tools python /path/to/mcp_server.py \
--env API_KEY=your_key_here \
--env BASE_URL=https://api.example.com
这些值会存储在 Claude Code 的配置中,并在服务器进程启动时注入其中。请勿将机密信息硬编码到服务器命令本身中。
claude mcp add json — 通过 JSON 规范注册
如果您已经有写好的服务器规范 JSON(这在团队间共享配置时很常见),您可以直接通过管道传入:
echo '{
"command": "python",
"args": ["/path/to/mcp_server.py"],
"env": {
"API_KEY": "your_key"
}
}' | claude mcp add my-tools --json
或者传递一个文件:
claude mcp add my-tools --json < server-spec.json
这等同于位置参数形式,但为您提供了一个可进行版本控制和共享的单一配置产物。
列出和移除服务器
# 查看所有已注册的服务器
claude mcp list
# 移除一个服务器
claude mcp remove my-tools
作用域:项目 vs 用户
默认情况下,claude mcp add 将服务器注册到您的用户级配置中,使其在每个 Claude Code 会话中都可用。要仅将其注册到当前项目(存储在 .claude/settings.json 中),请添加 --scope project:
claude mcp add my-tools python /path/to/mcp_server.py --scope project
当不同项目需要不同工具,并且您希望保持配置隔离时,项目作用域的服务器非常有用。
claude mcp serve — 将 Claude Code 暴露为 MCP 服务器
反向方向同样适用。claude mcp serve 将 Claude Code 本身作为 MCP 服务器启动,让另一个 MCP 主机可以连接到它并使用其工具:
claude mcp serve
如果您希望将 Claude Code 的能力组合到一个更大的代理管道中(其中不同的主机在编排工具调用),这将非常有用。
Claude Desktop MCP 服务器配置
Claude Desktop 将 MCP 服务器配置存储在一个 JSON 文件中。其位置取决于您的操作系统:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
如果文件不存在,请创建它。其结构如下所示:
{
"mcpServers": {
"my-tools": {
"command": "python",
"args": ["/path/to/mcp_server.py"],
"env": {
"API_KEY": "your_key_here"
}
}
}
}
mcpServers 下的每个键都是 Claude 用来标识该服务器的名称。您可以根据需要注册任意数量的服务器——Claude Desktop 会在启动时加载所有服务器。
编辑文件后,重新启动 Claude Desktop 以使更改生效。当 MCP 工具成功加载时,您会在聊天输入区域看到一个锤子图标。
通过 SSE 添加远程 MCP 服务器
对于使用服务器发送事件 (SSE) 传输而非 stdio 的远程服务器,配置形状略有不同:
{
"mcpServers": {
"remote-tools": {
"url": "https://your-mcp-server.example.com/sse"
}
}
}
某些远程服务器需要身份验证。如果服务器要求,请在 headers 字段中传递不记名令牌:
{
"mcpServers": {
"remote-tools": {
"url": "https://your-mcp-server.example.com/sse",
"headers": {
"Authorization": "Bearer your_token_here"
}
}
}
}
MCP 传输类型:stdio vs SSE
MCP 服务器通过以下两种传输机制之一与 Claude 主机通信:
stdio——服务器在同一台机器上作为子进程运行。主机启动该进程,并通过标准输入/输出读写 JSON-RPC 消息。这是本地服务器的默认方式,也是最简单的设置方式。
SSE(服务器发送事件)——服务器远程运行,并暴露一个 HTTP 端点。主机连接到一个 URL,并将工具响应作为流接收。这适用于跨机器场景,也是共享团队基础设施或托管工具服务的正确选择。
对于大多数刚开始使用的个人开发者来说,stdio 更简单——无需网络配置,服务器进程由系统代为管理。当您希望团队共享单个 MCP 服务器,或者工具本身需要在特定网络环境中运行时,SSE 就变得很有价值。
Claude 如何对 MCP 工具进行推理
当会话启动并且 MCP 服务器已注册时,Claude 会查询每个服务器以获取其可用的工具。这会生成一个工具名称列表和 JSON Schema 描述。Claude 不会推测性地调用工具——它仅当对话或任务需要时才调用工具,具体取决于工具描述所述的功能。
工具调用流程如下:
- 用户发送消息或任务。
- Claude 评估是否有任何已注册的工具可以提供帮助。
- 如果有,Claude 会使用适当的参数构造一个工具调用。
- MCP 主机将调用发送到正确的服务器。
- 服务器执行并返回结果。
- Claude 将结果整合到其推理中并继续。
这个循环可以在单个轮次中发生多次——Claude 可以链式调用工具,使用一个工具的结果来为另一个工具提供参数,并在同一会话中聚合来自多个服务器的信息。
工具描述的质量在这里非常重要。模糊的描述会导致遗漏或不正确的调用。包含工具功能、参数含义以及返回值等细节的精确描述,能让 Claude 准确路由调用,无需猜测。
在沙箱中运行工具执行
当 MCP 工具执行代码时——Python 脚本、Shell 命令、文件操作——在本地机器上运行它们会引发隔离性的问题。一个具有文件系统访问权限、进程生成或网络调用的工具,如果行为异常或被引导到意外路径,其影响范围会很广。
Novita AI Agent Sandbox 通过提供隔离的云环境来执行工具,解决了这个问题。您无需在本地运行 MCP 服务器,而是将其部署在沙箱实例内部。沙箱拥有自己的文件系统、网络范围和资源限制。代理可以在该边界内写入文件、运行代码和调用内部 API,而不会触及主机。
在沙箱内部运行的 MCP 服务器通过 SSE 传输暴露其工具,Claude 则远程连接到它——因此从 Claude 的角度来看,集成是完全相同的。区别完全在于工具实际运行在什么之上。
用于 MCP 部署的 Novita Sandbox 的主要特性:
- 快速启动:实例在约 200ms 内启动,保持工具往返延迟较低
- 按秒计费:您只需为活跃执行时间付费,无需为空闲预留付费
- 隔离的文件系统:每个沙箱实例都有一个独立的工作空间,防止跨会话数据泄露
- 可配置的网络策略:控制工具可以访问哪些外部服务
关于构建由 Novita Sandbox 支持的 MCP 服务器的分步指南,请参阅使用 Novita Sandbox 和 mcp-use 库构建远程代码执行 MCP 服务器。
使用 Novita LLM API 进行 MCP 工具使用推理
虽然 Claude 自身的模型原生支持工具使用,但您可能希望将某些 MCP 工具使用推理路由到不同的模型——出于成本、延迟或专业化的原因。Novita LLM API 提供了一个兼容 OpenAI 的端点,可访问支持函数调用和结构化工具调用的模型。
这适用于两种 MCP 架构:
1. 作为自定义 MCP 主机背后的推理模型:如果您正在构建自己的 MCP 主机(而不是使用 Claude Code 或 Claude Desktop),您可以使用 Novita LLM API 来驱动模型层。主机使用工具列表和对话调用 Novita API;模型返回工具调用指令;主机将其分发到 MCP 服务器。
import openai
client = openai.OpenAI(
base_url="https://api.novita.ai/v3/openai",
api_key="your_novita_api_key",
)
response = client.chat.completions.create(
model="meta-llama/llama-3.3-70b-instruct",
messages=[{"role": "user", "content": "列出可用工具并运行快速测试"}],
tools=[
{
"type": "function",
"function": {
"name": "list_models",
"description": "列出 API 中所有可用的模型。",
"parameters": {"type": "object", "properties": {}},
}
}
],
tool_choice="auto",
)
2. 作为 MCP 工具内部的 LLM:一个 MCP 工具可以在内部使用 Novita LLM API——例如,一个摘要工具、一个分类工具或一个生成代码的工具。该工具接收来自代理的输入,调用 Novita API,并返回结果。这使模型推理成本与主代理模型成本分离,并让您可以为每个子任务选择合适的模型。
关于构建调用 Novita API 的 MCP 服务器的实际示例,请参阅如何使用 Novita AI 构建您的第一个 MCP 服务器。
常见问题及修复
服务器未出现在 Claude Desktop 中
最常见的原因是 claude_desktop_config.json 中存在 JSON 语法错误。在保存之前请使用 JSON 验证器。即使是一个尾随逗号也会阻止文件加载。每次编辑后请重新启动 Claude Desktop。
找不到 claude mcp add 命令
这意味着 Claude Code 未安装或不在您的 PATH 中。通过 npm install -g @anthropic-ai/claude-code 安装 Claude Code,并使用 claude --version 进行验证。
工具已列出但从未被调用
Claude 仅在认为工具与当前任务相关时才会调用它。如果您的工具描述过于模糊,Claude 将不会选择它们。请添加细节:工具的功能、何时使用、输入和输出是什么样的。
服务器启动后立即退出
检查服务器命令是否正确,以及所有必需的环境变量是否已设置。直接在终端中运行该命令以查看实际的错误输出——在某些配置中,Claude Code 可能会抑制子进程的 stderr。
SSE 连接被拒绝
验证服务器 URL 可以从运行 Claude 的机器访问,服务器确实在预期的端口上监听,并且任何所需的身份验证标头都已正确配置。
工具调用因验证错误而失败
Claude 传递的参数必须与工具声明的 JSON Schema 匹配。检查您的工具的 inputSchema 定义——如果缺少必填字段或类型不匹配,服务器将拒绝调用。Claude 根据 schema 构造参数,因此不完整的 schema 会导致不完整的调用。
常见问题解答
Claude Code 支持 MCP 吗?
是的。Claude Code 通过 claude mcp 子命令原生支持 MCP。使用 claude mcp add 注册服务器,claude mcp list 查看已注册的服务器,claude mcp remove 取消注册。运行 claude mcp --help 查看完整的命令参考。
如何向 Claude Code 添加 MCP 服务器?
对于 stdio 服务器,运行 claude mcp add <name> <command> [args...],或使用 --json 传递 JSON 规范。如需项目作用域的注册,请添加 --scope project。添加后,启动一个新的 Claude Code 会话——工具将立即可用。
什么是 claude mcp serve?
claude mcp serve 将 Claude Code 本身作为 MCP 服务器运行,通过 MCP 协议暴露其能力。另一个 MCP 主机随后可以连接到 Claude Code 并将其用作工具源。这在构建 Claude 作为多个组件之一的 multi-agent 系统时非常有用。
我可以在 Claude Code 和 Claude Desktop 中使用同一个 MCP 服务器吗?
是的。服务器本身不关心哪个主机连接到它。对于 stdio 服务器,Claude Code(通过 claude mcp add)和 Claude Desktop(通过 claude_desktop_config.json)都可以启动相同的命令。对于 SSE 服务器,任何能够访问该 URL 的主机都可以连接。
Claude 如何知道调用哪个 MCP 工具?
在会话启动时,Claude 查询所有已注册的服务器以获取其工具列表。每个工具都有一个名称和描述。在处理任务时,Claude 会根据工具描述是否与需求匹配来选择工具。具有清晰用例的、编写良好的描述会导致准确的工具选择;模糊的描述则会导致遗漏或不正确的调用。
我注册的 MCP 服务器数量有限制吗?
MCP 规范没有设置硬性限制,Claude Code 或 Claude Desktop 也没有。实际上,拥有数十个包含数百个工具的服务器可能会减慢会话启动速度(工具发现在启动时运行),并可能给 Claude 的工具选择增加噪音。保持工具集专注于给定项目或会话实际需要的内容。
stdio 和 SSE 传输之间有什么区别?
Stdio 将服务器作为本地子进程运行;主机通过 stdin/stdout 进行通信。SSE 连接到远程 HTTP 端点并将响应作为流接收。Stdio 对于本地开发更简单;SSE 更适合远程、共享或生产部署。
