一切你需要的启动 MCP 的工具 —— Anthropic 的 AI USB-C
实践操作 让大语言模型真正发挥作用通常意味着需要将它们与外部数据、工具或 API 连接在一起。问题在于,目前还没有统一的标准方式——至少现在还没有。
Anthropic 认为它找到了答案:MCP —— 一个开放协议,承诺成为 AI 的 USB-C。因此,我们进行了试用,看看哪些功能能够实现。
去年年底推出的开源 Model Context Protocol ( MCP ) 项目,是由 Claude 的模型开发者打造的,旨在成为“连接 AI 系统与数据源的通用、开放标准”。
它不仅仅适用于数据库等数据存储。MCP 服务器可以将各种工具和资源暴露给 AI 模型,使其具备诸如查询数据库、启动 Docker 容器或与 Slack 或 Discord 等消息平台交互等功能。
如果 MCP 听起来有些耳熟,那是因为最近几个月它已引起了广泛关注。仅官方 MCP 服务器的 GitHub 仓库就已经包含了与 Grafana、Heroku、Elastisearch 等主要软件供应商的数十个官方集成,以及超过 200 个社区和演示服务器。
如果你想将大语言模型连接到 SQL 数据库、管理你的 Kubernetes 集群或自动化 Jira,很有可能已经有现成的 MCP 服务器可以实现。事实上,MCP 已经受到如此多的关注,以至于 OpenAI 和 Google 现在也加入了该项目的行列。
在本实践指南中,我们将更深入地探讨 MCP 的实际工作原理、它的应用场景、面临的一些挑战,以及如何部署和集成 MCP 服务器到 Claude Desktop 或使用 Open WebUI 自己的模型中。
MCP 快速概览
在开始讲解如何启动 MCP 服务器之前,我们先快速了解一下其内部工作原理。
从整体上看,MCP 使用了典型的客户端-服务器架构,其中有三个关键组件: host 、 client 和 server 。
以下是 MCP 架构的高级概览 … 图片来源: modelcontextprotocol.io。点击放大任意图片
host 通常是用户可访问的前端,例如 Claude Desktop 或类似 Cursor 的 IDE,负责管理一个或多个 MCP 客户端。
client 每个 client 都通过 MCP 协议与服务器保持一对一连接。客户端与服务器之间的所有消息均使用 JSON-RPC 进行传输,但传输层会根据具体实现方式而有所不同,目前支持 Stdio、HTTP 和服务器发送事件 ( SSE ) 。
MCP server 本身向客户端暴露特定的功能,从而以标准化方式让 host 调用这些功能。这就是为什么文档中将 MCP 描述为 AI 的 USB-C 。
正如 USB 在很大程度上消除了与外设和存储设备交互时所需的不同接口,MCP 旨在让模型能够使用一种通用语言与数据和工具进行通信。
根据资源的位置不同,例如本地资源(例如 SQLite 数据库)或远程资源(例如 S3 存储桶),MCP 服务器将直接访问资源或充当桥梁转发 API 调用。在后者的情况下,USB-C 的类比尤为贴切,因为许多 MCP 服务器实际上充当适配器角色,将供应商特定的接口翻译成一种标准格式,使得语言模型可以更轻松地交互。
重要的一点是,这些资源的暴露方式以及返回给模型的响应方式是一致的。
MCP 的一个有趣的细节在于它是双向工作的。host 应用不仅可以向服务器请求数据,而且服务器也可以通过 sampling/createMessage 请求向 client 发送消息给大语言模型。不幸的是,这一功能目前还未得到普遍支持,但它可能会为一些有趣的自主代理工作流铺平道路。
了解了 MCP 是什么以及它的工作原理后,现在让我们深入了解如何使用它们。
使用 Claude Desktop 测试 MCP
Claude Desktop 是体验 MCP 的最简单方式之一 鉴于 MCP 是由 Anthropic 所创,在这里不出所料,使用 Claude Desktop 是体验 MCP 的最简单方法之一。
所需条件:
Windows 10 或更高版本的 PC,或 macOS 11 或更高版本的 Mac ( 请参阅这里 ) Claude Desktop Python 3 ( 对 macOS 用户来说已预装 ) UVX Node.JS
如果你不想使用外部的大语言模型供应商,例如 Anthropic,在下一节中我们将探讨如何将 MCP 服务器连接到本地模型和流行的 Open WebUI 界面。
开始之前,我们还需要除了 Claude Desktop 之外的一些依赖项,因为 MCP 服务器可以在多种环境中运行。为了演示的目的,你需要安装 Node.js、Python 3 和 Python 的 UVX 包管理器。
安装好依赖项之后,启动 Claude Desktop 并使用你的 Anthropic 账户登录。接下来,导航到应用设置,然后进入“Developer”标签页。
在 Claude Desktop 的设置中,打开“Developer”标签页,点击“Edit Config”来生成新的 MCP 配置文件
进入后,点击“Edit Config”按钮。这将自动在 macOS 的 ~/Library/Application Support/Claude/ 文件夹或 Windows 的 %APPDATA%\Claude\ 文件夹下生成一个空的 claude_desktop_config.json 文件。我们将在此文件中添加 MCP Client 配置。为了测试,我们将使用 System Time 和 File System 的 MCP 服务器。
在你喜欢的文本编辑器或 IDE 中(我们这里使用 VSCodium)打开 claude_desktop_config.json 文件,并将内容替换为下面的 time-server 配置。你可以根据自己喜欢的时区进行相应调整。
{ "mcpServers": { "time": { "command": "uvx", "args": ["mcp-server-time", "--local-timezone=UTC"] } } }
保存文件并重启 Claude Desktop。当它重新启动时,你应当会注意到聊天框内出现一个新图标,表明该工具已可使用。
接下来,我们可以通过提出一个简单问题来测试,例如:“纽约现在几点?”单独的 Claude 并不知道本地时间,但现在可以查询你的 time server 来获取时间。
单独的 Claude 并不知道当时的时间,但有了 MCP 时间服务器的支持,现在它可以报时了。
现在,我们将通过更新 claude_desktop_config.json 文件来测试 File System 的 MCP 服务器,具体配置如下:
{ "mcpServers": { "time": { "command": "uvx", "args": ["mcp-server-time", "--local-timezone=UTC"] }, "filesystem": { "command": "npx", "args": [ "-y", "@modelcontextprotocol/server-filesystem", "/Users/username/Desktop", "/path/to/other/allowed/dir" ] } } }
确保在保存之前,将 /Users/username/Desktop 和 /path/to/other/allowed/dir 替换成你文件系统中希望让模型访问的目录。
重启 Claude Desktop 后,你会发现现在能使用的工具比之前多了。具体来说,File System 的 MCP 服务器允许模型执行各种文件系统操作,这些操作包括:
-读取和写入文件 -编辑文件 -创建或列出目录 -移动或搜索文件 -检索文件信息,如大小或创建日期 -列出有访问权限的目录
在此例中,我们给予 Claude 对桌面的访问权限。因此我们可以询问如下问题:
提示:“我的桌面上有什么?” 提示:“你能整理一下我的桌面吗?” 提示:“将 file.txt 重命名为 doc.md”
来自 Vulture 技术文档桌面的一些观察:
我们确实观察到,对于较长的任务,File System MCP 服务器可能会表现得不太稳定,因此实际效果可能因情况而异。
如果你更愿意使用 PIP 或 Docker,可以在这里找到 MCP Time 和 File Servers 的替代配置。
将 MCP 与你自己的模型和 Open WebUI 集成
从 v0.6.0 版本开始,Open WebUI 通过 OpenAPI 桥接支持 MCP 服务器 —— 点击放大
如果你更愿意使用我们自己部署的本地模型来体验 MCP,Open WebUI 最近通过一个兼容 OpenAPI 的代理添加了对该协议的支持。
如果你不熟悉 Open WebUI,它是一个流行的开源网页界面,类似于 ChatGPT 的界面,可以与诸如 Ollama、Llama.cpp、vLLM 或任何 OpenAI 兼容的 API 端点的推理服务器集成。
前提条件
本指南假设你熟悉在本地运行模型。如果需要帮助,我们这里有一个关于如何在几分钟内在几乎任何硬件上部署本地大语言模型的指南,就在这里。
你还需要在 Docker 中部署并配置 Open WebUI。我们有一份详细的设置指南,就在这里。
说到 Docker,我们也将使用容器运行时来启动我们的 MCP 服务器。
一旦你成功运行了 Open WebUI 并部署了本地模型,使用 Docker 扩展 MCP 工具支持就变得非常简单。
正如前面提到的,Open WebUI 通过一个 OpenAPI 代理服务器支持 MCP,将其暴露为标准 RESTful API。根据开发者的说法,这种方式有几个优点,包括更好的安全性、更广的兼容性和错误处理,同时保持简单易用。
因此,配置 MCP 服务器变得相对简单;但这确实要求将 Claude Desktop 中使用的 JSON 配置转换为标准的可执行字符串。
例如,如果我们想启动一个 Brave Search 的 MCP 服务器,该服务器会根据你的输入提示查询 Brave 搜索,则需要将配置拆解为一个简单的 docker run 命令。
config.json:
{ "mcpServers": { "brave-search": { "command": "npx", "args": [ "-y", "@modelcontextprotocol/server-brave-search" ], "env": { "BRAVE_API_KEY": "YOUR_API_KEY_HERE" } } } }
Docker run 命令:
docker run -p 8001:8000 --name MCP-Brave-Search -e BRAVE_API_KEY=YOUR_API_KEY_HERE ghcr.io/open-webui/mcpo:main --api-key "top-secret" -- npx -y @modelcontextprotocol/server-brave-search
如果你还没有 Brave Search 的 API 密钥,可在这里免费获取,并用它替换 YOUR_API_KEY_HERE。另外,将 top-secret API 密钥替换成独一无二、私密且安全的密钥;稍后会用到。
提示:如果想在后台运行此服务器,在 run 后加上 -d。之后,你可以通过运行 docker logs MCP-Brave-Search 来检查服务器日志。
如果你希望在 Docker 中启动多个 MCP 服务器,只需再次运行此命令,方法是:
-将 8001 更换为另一个未被占用的端口 -更新 --name 参数 -并相应地调整服务器命令
将服务器连接到 Open WebUI
一旦你的 MCP 服务器启动运行,我们可以在用户级别或系统级别连接到它。后者需要额外配置访问控制列表 ( ACL ) 以便让模型对用户和模型可用。为了简化问题,我们将介绍如何在单个用户级别连接 MCP 服务器。
在 Open WebUI 仪表盘中,导航到用户设置并打开“tools”标签。从那里创建一个新连接,输入 URL —— 通常类似于 http://Your_IP_Address_Here:8001 —— 以及之前设置的 top-secret API 密钥。
在用户设置下,在“Tools”标签中添加你的 MCP 服务器
如果一切正常,你应该在右上角看到几条绿色提示,并且在聊天框旁边会出现一个新图标,显示模型可用工具的数量。
现在,向你本地安装并选择的模型提问一些它原本不知道的问题;它可以自动触发搜索查询并返回结果。
一旦启用,当你提出例如今年国际超级计算大会何时开始之类的问题时,模型将自动进行 Brave 搜索。
请注意,这个特定的 MCP 服务器只包含搜索 API,并不会实际抓取网页。若需网页抓取功能,你可以考虑使用 Puppeteer MCP 服务器,或者利用 Open WebUI 内置的网页搜索和爬取功能,我们在之前的 RAG 教程中已有探讨。
关于 Open WebUI 的原生函数调用
默认情况下,Open WebUI 内部处理工具调用,每当发送新消息时会确定调用哪一个合适的工具。缺点在于,一个交流中工具只能被调用一次。
这种方法的优势在于它几乎适用于任何模型,并且执行过程通常是一致的。然而,如果模型需要多次访问同一个工具以满足用户请求,这可能会带来一些挑战。例如,如果模型访问 SQL 数据库,可能需要先获取其模式信息再确定如何格式化实际查询。
为了解决这个问题,你可以利用模型的原生工具调用功能,它可以以推理与行动 ( ReACT ) 风格调用工具。
棘手之处在于,尽管很多模型都声称支持原生工具调用,但许多小型模型并不十分稳定。话虽如此,我们在 Ollama 中运行的 Qwen 2.5 系列模型表现得还算不错。
在 Open WebUI 中启用原生函数调用相对简单,可以在右上角“Controls”菜单中进行切换。请注意,启用原生函数调用后,许多推理服务器(例如 Ollama)会禁用 Token 流式输出,因此,如果发现消息一次性全部出现而非流式传输,不必惊讶。
你可以在 Open WebUI 的聊天控制菜单(右上角的小汉堡图标)中启用原生函数调用。
当你触发工具调用时,会注意到一个不同的工具提示,显示所用工具以及可展开下拉菜单查看返回的信息(如果有)。
MCP 软件开发工具包 ( SDKs )
如果你在寻找不同的 MCP 服务器开发工具包,请参阅以下链接:
MCP TypeScript SDK MCP Java SDK MCP Kotlin SDK MCP C# SDK
除了使集成现有 MCP 服务器相对容易外,开发者还花费大量精力使得构建 MCP 服务器变得更简单。
他们为多种语言提供了 SDK,包括 Python、Typescript、Java、Kotlin 和 C#,以便更易于将现有代码适应 MCP 服务器的使用。
为测试这一点,我们利用 Python 示例模板在大约五分钟内模拟了一个简单的计算器 MCP 服务器。
calculator_server.py
from mcp.server.fastmcp import FastMCP mcp = FastMCP("MathSupport")
@ mcp.tool() def calculator(equation: str) -> str: """ 计算等式的答案。 """ try: result = eval(equation) return f"{equation} = {result}" except Exception as e: print(e) return "Invalid equation"
随后,将其连接到 Open WebUI 也同样简单,只需在 Docker 中启动另一个 MCP 代理服务器。
docker run -p 8002:8000 --name MCP-Calculator -v ~/calculator/calculator.py:/calculator.py ghcr.io/open-webui/mcpo:main --api-key "top-secret" -- uv run --with mcp[cli] mcp run /calculator_server.py
或如果你更倾向于使用 Claude Desktop:
{ "mcpServers": { "MathSupport": { "command": "uv", "args": [ "run", "--with", "mcp[cli]", "mcp", "run", "/PATH_TO_PYTHON_SCRIPT_HERE/calculator_server.py" ] } } }
显然,这还远不能涵盖 MCP 所支持的所有功能和能力,但至少让你对如何将代码适配该协议有所了解。
MCP 远非完美
拥有成千上万的可用服务器,再加上 OpenAI 和 Google 对这个开源协议的支持,MCP 正在走向成为 AI 集成的事实标准的道路。
但尽管该协议自问世以来便吸引了不少关注,仍有不少人对其当前的实现不满,特别是在安全性、复杂性和可扩展性方面。
安全性依然是对 MCP 最大的批评之一。这些服务器部署的便捷性,加上许多服务器有执行任意代码的能力,在没有进行适当审查、设立保护措施和沙盒化的情况下,存在潜在风险。
我们已经看到至少有一次 MCP 服务器被利用而泄露 WhatsApp 消息历史的案例。
喜欢我们的 AI 报道吗?你可能还会喜欢下面这些内容:
如何在不到 10 分钟内在你的 PC 上运行大语言模型,而非云端运行 从 RAGs 到财富:使你的本地 AI 聊天机器人更聪明的实用指南 面向 AI 工作的容器化友好指南 大语言模型工具调用的快速指南 开始在家中隐私环境下微调大语言模型的全部知识 Honey, I shrunk the LLM! 初学者量化及测试指南 大语言模型性能秘籍:探索式解码入门 Meta 赋予 Llama 3 视觉能力,但如果它有大脑就更好了 使用 Stable Diffusion 和 Automatic1111 的本地 AI 图像生成友好指南 DeepSeek 推出免费的挑战者来挑战 OpenAI 的 o1 —— 在你的 PC 上使用方法
除了显而易见的安全问题外,还有一个问题,即虽然 MCP 可以大大简化服务和数据的集成,但它仍依赖于大语言模型来利用这些资源。而且,尽管大多数现代生成式模型都宣称具有某种工具调用功能,但从 Berkeley Function-Calling Leaderboard 的情况来看,有些模型的表现要优于其他模型。
因此,Open WebUI 默认使用其集成的、虽然较为基础的函数调用能力,因为这往往比许多模型内置的工具调用能力更为可靠。
当然,从管理角度来看,处理可能多达数十个 MCP 服务器会为部署增加运维复杂性,即便它们构建或部署所需的工作量较成熟的 AI 集成方案更少。
话虽如此,对于一个宣布不到六个月的项目来说,许多问题都是预料之中的,随着成熟度的提高,这些问题会得到解决。或者我们也希望如此。谁说我们不乐观呢?
附加资源
如果你有兴趣尝试更多 MCP 服务器,我们建议查看 GitHub 上的官方项目页面,以及 Frank Fiegel 的开源 MCP 服务器目录,截至目前已有超过 3,500 个服务器。
同时,如果你有兴趣构建自己的 MCP 服务器或客户端,我们建议查阅官方 MCP 文档,了解更多信息及示例代码。
好文章,需要你的鼓励
微软宣布裁减全球员工3%,主要影响中层管理岗位,旨在扁平化组织、提升效率,并利用新技术减轻重复工作负担。
亚马逊将与沙特支持的 AI 公司 Humain 合作,投资逾 50 亿美元在沙特建设 AI 区,提供专用 AWS 基础设施、服务器、网络以及培训认证,推动本地 AI 生态体系的发展。
创业家Joel Milne创立AutoUnify,通过API实时衔接经销商、维修店与厂商,为汽车行业解决多系统碎片化沟通问题,助推数字化转型。
文章介绍了Insurtech Bestow如何从直销人寿保险转型为向保险公司提供SaaS软件服务,并成功完成1.2亿美元D轮融资以拓展新产品与承保能力。