加载中
加载中

MCP

我们已经有了工具、技能和连接器。那么为什么还需要 MCP?乍一看,它似乎是在 API 之上又叠加了一层 API。这是个合理的问题——答案归结为谁来维护集成代码。

维护问题

假设您的智能体需要从 Asana 拉取任务、检查 Google Calendar,并搜索 Slack——全部一次完成。使用自定义工具,您必须编写三个集成。这部分是可以做到的。痛苦的部分在后面:每当这些服务中的某一个更改其 API 时(这种情况经常发生),您还必须维护这些集成。恭喜,您现在要维护一堆第三方 API 包装器了。

MCP 将这种维护工作转移给了服务提供商。Asana 发布了一个 MCP 服务器。Slack 发布了一个。Google 也发布了一个。每个服务器都通过标准协议暴露自己的工具——包括描述、模式(schema)和身份验证。当它们的 API 发生变化时,它们会更新自己的服务器。您什么都不用改。

工具 vs. 技能 vs. MCP

这三个功能承担不同的职责:

  • 工具(Tools) 将 Claude 连接到您的内部系统——您的数据库、您的项目跟踪器、您的专有 API。代码由您拥有,维护工作也由您负责。
  • 技能(Skills) 教会 Claude 一个流程——您的报告模板、您的审查清单。技能是指令,不一定是集成。
  • MCP 将 Claude 连接到第三方服务,由服务提供商维护集成。您不需要编写 Asana 的包装器——Asana 已经做了。

简而言之:工具用于您自己的东西,技能用于您的流程,而 MCP 用于其他人的东西。

Tools、Skills 和 MCP 的对比卡片,其中 MCP 卡片被高亮显示:将 Claude 连接到第三方服务,由服务提供商维护

连接到 MCP 服务器

了解 MCP 最简洁的方式,就是让 Claude 指向任意一个 MCP 服务器,让它自行发现其中的内容。在这个示例中,我们将使用 Linear 的 MCP 服务器,连接详情和身份验证令牌存储在 .env 文件中。

请求中有两部分协同工作。mcp_servers 键声明了连接——类型、URL、用于引用它的名称,以及可选的身份验证令牌。然后,一个类型为 mcp_toolset 的工具配置了 Claude 可以从该服务器使用哪些工具。默认是全部工具,但如果您想缩小范围,这里就是设置的地方。

python
import os
import anthropic

client = anthropic.Anthropic()

response = client.beta.messages.create(
    model="claude-opus-5",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "What tools do you have available?"}
    ],
    mcp_servers=[
        {
            "type": "url",
            "url": "https://mcp.linear.app/mcp",
            "name": "linear",
            "authorization_token": os.environ["LINEAR_MCP_TOKEN"],
        }
    ],
    tools=[
        {
            "type": "mcp_toolset",
            "mcp_server_name": "linear",
        }
    ],
    betas=["mcp-client-2025-11-20"],
)

print(response)

请注意,我们从未编写过任何一个工具模式(schema)。Claude 会自省(introspect)该服务器,获取工具列表及其模式,并为提示选择合适的工具。截至本课程编写时,MCP 连接器处于测试版——请注意请求中的 beta 标头。

运行它,如果您的 MCP URL 指向 Linear 的 MCP 端点,Claude 会列出 Linear 的工具,然后调用其中一个。这对几乎任何兼容的服务器都适用。我们没有定义任何一个工具。我们也没有编写 Linear 客户端。这些都由 Linear 来维护。

终端输出列出了 Linear MCP 服务器发现的工具,随后 Claude 指出这些是 Linear 项目管理工具,并选择要调用哪一个

筛选 Claude 可以使用的工具

MCP 服务器通常会暴露非常多的工具——而您并不总是希望 Claude 使用全部工具。也许您不希望它拥有写入权限,或者您只是不想让所有这些工具定义占用上下文空间。

解决方法是:默认禁用所有工具,然后只启用您想要的特定工具。以下是使用 Slack MCP 服务器的这种模式:

python
tools=[
    {
        "type": "mcp_toolset",
        "mcp_server_name": "slack",
        "default_config": {
            "enabled": False,
        },
        "configs": {
            "search_messages": {"enabled": True},
            "list_channels": {"enabled": True},
        },
    }
]

现在 Claude 可以搜索 Slack 并列出频道,但不能发布或删除内容。当您信任某个服务进行读取操作,但不希望 Claude 意外代表您进行写入操作时,这种方式非常有用。

回顾

  • MCP 的存在是为了让您不必维护别人已经构建好的集成。 服务提供商发布 MCP 服务器并保持其更新——当他们的 API 发生变化时,您什么都不用改。
  • 为任务选择合适的功能:工具用于您的数据,技能用于您的流程,MCP 用于第三方服务。
  • 在 mcp_servers 中声明连接(类型、URL、名称、可选的身份验证令牌),并通过 tools 中的 mcp_toolset 条目授予访问权限。Claude 会自行自省服务器并发现工具——无需编写模式(schema)。
  • 通过设置 default_config: {"enabled": False} 并在 configs 中启用特定工具来缩小访问范围——这对于保持服务器只读非常方便。
  • MCP 连接器目前处于测试版,因此请在您的请求中包含 beta 标头。
  • 访问 modelcontextprotocol.io 查看可用服务器列表,并了解有关该协议的更多信息。