启动和运行 Mcp 所需的一切 – Anthropic 的 USB-C for AI
快速阅读: 据《The Register》最新报道,MCP是一种开放协议,旨在让大型语言模型连接外部数据和工具。本文介绍了如何使用Claude Desktop和Open WebUI测试MCP,并探讨了其优缺点。尽管MCP受到关注,但在安全性、复杂性和可扩展性方面仍有改进空间。
动手指南:让大型语言模型真正发挥作用通常意味着要将其连接到外部数据、工具或API。问题是,目前还没有统一的标准方法来实现这一点。
Anthropic认为它找到了答案:MCP,这是一个开放协议,旨在成为AI的USB-C。所以我们试了一下,看看它是如何工作的。
去年年底推出的开源模型上下文协议(MCP)项目由Claude的模型构建者开发,旨在成为“连接人工智能系统与数据源的通用开放标准”。
这不仅仅限于数据库这样的数据存储。MCP服务器可以向AI模型暴露各种工具和资源,从而实现查询数据库、启动Docker容器或与Slack或Discord等消息平台交互等功能。
如果你觉得MCP听起来有点熟悉,那是因为它在最近几个月引起了广泛关注。官方MCP服务器的GitHub仓库现在已经有数十个与主要软件供应商的官方集成,包括Grafana、Heroku和Elasticsearch,以及超过200个社区和演示服务器。
如果你想将LLM连接到SQL数据库、管理你的Kubernetes集群或自动化Jira,很可能已经有一个可用的MCP服务器可以完成这些任务。事实上,MCP引起了如此多的关注,以至于OpenAI和Google现在也开始支持这个项目。
在本实践指南中,我们将更详细地探讨MCP的实际工作方式、你可以用它做什么、它面临的一些挑战,以及如何在Claude Desktop或你自己的模型与Open WebUI之间部署和集成MCP服务器。
### MCP快速概述
在我们深入探讨如何启动一个MCP服务器之前,先简单了解一下背后的工作原理。
从高层次来看,MCP使用典型的客户端-服务器架构,具有三个关键组件:主机、客户端和服务端。
以下是MCP架构的高层次视图……图片来源:modelcontextprotocol.io。点击放大任何图像
主机通常是用户可访问的前端,例如Claude Desktop或类似Cursor的IDE,并负责管理一个或多个MCP客户端。
每个客户端通过MCP协议与服务端保持一对一的连接。客户端和服务端之间的所有消息都使用JSON-RPC进行交换,但传输层会根据具体实现而有所不同,目前支持Stdio、HTTP和服务器发送事件(SSE)。
MCP服务端本身向客户端暴露特定的功能,使它们以标准化的方式对主机可用。这就是为什么文档中将MCP描述为AI的USB-C。
就像USB基本上消除了不同接口与外围设备和存储设备交互的需求一样,MCP旨在让模型使用一种通用语言与数据和工具进行通信。
根据资源是本地的还是远程的,例如SQLite数据库或S3桶,MCP服务端要么直接访问资源,要么充当桥接器来转发API调用。在后一种情况下,USB-C的类比尤为贴切,因为许多MCP服务端实际上充当适配器,将供应商特定的接口转换为语言模型更容易交互的标准格式。
遗憾的是,这些资源的暴露方式和返回给模型的响应是一致的。
MCP的一个有趣之处在于它是双向的。不仅主机应用程序可以从服务端请求数据,而且服务端也可以通过采样/创建消息请求与LLM进行通信。遗憾的是,这种双向功能目前还未广泛支持,但它可能为自主工作流开辟新途径。
现在我们对MCP是什么以及它是如何工作的有了更好的理解,让我们深入了解如何使用它们。
### 使用Claude Desktop测试MCP
使用Claude Desktop测试MCP是最简单的方法之一
### 使用Claude Desktop测试MCP
鉴于Anthropic推出了MCP,最简单的方法之一就是使用Claude Desktop。
### 使用Claude Desktop测试MCP
你需要准备:
– 一台Windows 10或更高版本的PC,或者macOS 11或更高版本的Mac(查看这里)
– Claude Desktop
– Python 3(Mac用户已预装)
– UVX
– Node.JS
如果你不想使用外部LLM提供商,如Anthropic,在下一节中我们将探讨如何将MCP服务器连接到本地模型和流行的Open WebUI界面。
为了开始使用,我们需要安装一些依赖项,除了Claude Desktop之外,因为MCP服务器可以在多种环境中运行。在这个演示中,你需要安装Node.js、Python 3以及Python的UVX包管理器。
安装好依赖项后,启动Claude Desktop并使用你的Anthropic账户登录。接下来,导航到应用程序设置,然后进入“开发者”选项卡。
从Claude Desktop设置中,打开“开发者”选项卡并点击“编辑配置”以生成新的MCP配置文件。
在那里,点击“编辑配置”按钮。这将在Mac上的~/Library/Application Support/Claude/文件夹或Windows上的%APPDATA%\Claude\文件夹下自动生成一个空的claude_desktop_config.json文件。这就是我们将添加我们的MCP客户端配置的地方。为了测试一下,我们将使用系统时间和文件系统MCP服务器。
在你喜欢的文本编辑器或IDE中打开claude_desktop_config.json文件——我们使用的是VSCodium——并将其中的内容替换为以下时间服务器配置。请随意调整为你喜欢的时区。
“`json
{“mcpServers”: {
“time”: {
“command”: “uvx”,
“args”: [“mcp-server-time”, “–local-timezone=UTC”]
}
}}
“`
保存文件并重新启动Claude Desktop。当它重新启动时,你应该会在聊天框中注意到一个新的图标,表示该工具可供使用。
然后我们可以试着问一个简单的问题,比如:“纽约现在几点了?”Claude本身不知道当地时间,但现在它可以查询你的时间服务器来找出答案。
Claude本身不知道任何时刻的时间,但有了MCP时间服务器的访问权限,现在它可以报时了。
现在我们将尝试文件系统MCP服务器,通过更新claude_desktop_config.json文件如下:
“`json
{
“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后,您会发现现在可以使用更多工具。具体而言,文件系统MCP服务器让模型能够执行多种文件系统操作,例如:
– 读取和写入文件内容
– 修改文件内容
– 创建或列出文件夹
– 移动或查找文件
– 获取文件信息,比如大小或创建时间
– 列出其有权访问的文件夹
在这种情况下,我们给Claude授予了访问桌面的权限。因此,我们可以向Claude提出类似以下的问题:
**问题示例:**
‘我的桌面上有什么?’
**问题示例:**
‘你能帮我整理一下桌面吗?’
**问题示例:**
‘我的桌面上有什么?’
**问题示例:**
‘请把file.txt重命名为doc.md’
根据秃鹰技术文档组的观察:我们注意到文件系统MCP服务器在处理长时间任务时存在一定的不稳定现象,因此不同用户的使用体验可能会有所差异。如果您倾向于使用PIP或Docker,可以在此处找到MCP时间和文件服务器的其他配置方案。
截至v0.6.0版本,Open WebUI通过OpenAPI桥接支持MCP服务器。如果您更倾向于使用自托管模型的MCP,Open WebUI最近通过与OpenAPI兼容的代理合并了对该协议的支持。它是一个类似于ChatGPT的热门开源网络界面,可与Ollama、Llama.cpp、vLLM或任何OpenAI兼容的API端点等推理服务器集成。
本指南假定您熟悉本地运行模型。如果您需要帮助,我们有一份关于在几分钟内于几乎所有硬件上部署本地LLM的指南,就在下面的链接。
您还需要在Docker中部署和配置Open WebUI。我们有一份详细的设置说明。
正如之前所述,Open WebUI通过OpenAPI代理服务器支持MCP,该服务器将其作为标准RESTful API暴露。
开发者表示,这样做有以下几个优点:更高的安全性、更广泛的兼容性以及更好的错误处理,同时保持简洁。但确实需要将Claude Desktop使用的JSON配置转换为标准可执行字符串。
例如,若要启动一个Brave搜索MCP服务器,它会根据您的输入提示从Brave搜索引擎获取信息,可以将配置分解为一个简单的`docker run`命令。
`config.json`:
“`json
{
“mcpServers”: {
“brave-search”: {
“command”: “npx”,
“args”: [
“-y”,
“@modelcontextprotocol/server-brave-search”
],
“env”: {
“BRAVE_API_KEY”: “您的API密钥”
}
}
}
}
“`
`Docker运行命令`:
“`bash
docker run -p 8001:8000 –name MCP-Brave-Search -e BRAVE_API_KEY=您的API密钥 ghcr.io/open-webui/mcpo:main –api-key “top-secret” — npx -y @modelcontextprotocol/server-brave-search
“`
如果您还没有Brave搜索API密钥,可以在此处免费获取一个,并将其替换为您的API密钥。
此外,将`top-secret`API密钥更改为唯一的、私有的且安全的内容;稍后将会用到。
提示:如果要在后台运行此服务器,在`run`命令后添加`-d`。然后可通过运行`docker logs MCP-Brave-Search`查看服务器日志。
如果您想在Docker中启动多个MCP服务器,可以通过以下方式再次运行该命令:将`8001`替换为另一个空闲端口,更新`–name`参数值,并相应地修改服务器命令。
一旦您的MCP服务器启动并运行,我们可以在用户层面或系统层面连接到它。后者需要额外的访问控制列表(ACL)设置,以便模型可供用户和其他模型使用。为了简化操作,我们将介绍如何在单个用户层面连接到MCP服务器。
从Open WebUI仪表板导航至用户设置并打开‘工具’选项卡。在那里,创建新的连接并输入URL(通常类似于http://您的IP地址:8001),以及之前设置的`top-secret`API密钥。
在用户设置下,在‘工具’选项卡中添加您的MCP服务器。如果一切正常,您将在右上角看到几个绿色通知消息,并会看到一个新的图标,指示聊天框旁有多少工具可用。
一旦启用,当您向模型提出原本不知道的问题(例如今年国际超算大会什么时候开始),模型可以自动触发搜索查询并返回结果。
请注意,此MCP服务器仅包含搜索API,并不会实际抓取网页内容。对此,您可以考虑使用类似Puppeteer MCP服务器的工具,或者利用Open WebUI内置的网页搜索和爬虫功能,我们在之前的RAG教程中已探讨过这些功能。
#### 关于Open WebUI中原生函数调用的一句话
默认情况下,Open WebUI内部处理工具调用,每次发送新消息时都会确定合适的工具进行调用。缺点是每个对话中工具只能调用一次。这种方法的优点在于几乎适用于所有模型,并且执行过程通常一致。
然而,如果模型需要多次访问工具以满足用户的需求,这可能会带来挑战。例如,如果模型正在访问SQL数据库,它可能需要检索数据库模式以弄清楚如何格式化实际查询。
为了解决这个问题,您可以利用模型的原生工具调用功能,以推理-行动(ReACT)方式进行调用。尽管许多模型声称支持原生工具调用,但许多小型模型并不十分可靠。
话虽如此,我们在Ollama上运行的Qwen 2.5系列模型表现良好。
在Open WebUI中启用原生函数调用相对简单,并可从Open WebUI右上角的‘控制’菜单中切换。
请注意,启用原生函数调用时,许多推理服务器(如Ollama)会禁用标记流式传输,因此不要惊讶于消息不是逐字显示。
你可以在Open WebUI的聊天控制菜单(右上角的小汉堡图标)中启用原生功能调用。
现在,当你触发工具调用时,你会看到一个不同的工具提示,显示所使用的工具名称,并且可以通过下拉菜单查看返回的信息。
### MCP软件开发工具包(SDKs)
想要其他MCP服务器开发工具包?请查看以下链接:
– MCP TypeScript SDK
– MCP Java SDK
– MCP Kotlin SDK
– MCP C# SDK
除了相对容易集成现有的MCP服务器外,开发者们还努力使构建MCP服务器变得简单。为了测试这一点,我们使用Python示例模板在大约五分钟内创建了一个简单的计算器MCP服务器。
`calculator_server.py`:
“`python
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 “无效方程”
“`
接下来,将其连接到Open WebUI就像在Docker中启动另一个MCP代理服务器一样简单。
“`bash
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桌面:
“`json
{
“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上而不是云端运行LLM
– 从RAGs到财富:让本地AI聊天机器人变得更聪明的实际指南
– AI工作容器化的友好指南
– 大型语言模型中的工具调用快速指南
– 在家中隐私环境下开始微调LLMs所需的一切知识
– 亲爱的,我缩小了LLM!量化入门指南——以及测试方法
– LLM性能的捷径:投机解码简介
– Meta赋予Llama 3视觉能力,如果它也有大脑就好了
– Stable Diffusion和Automatic1111的本地AI图像生成友好指南
– DeepSeek发出免费挑战者对抗OpenAI的o1——这是如何在你的PC上使用的
### 额外资源
如果你有兴趣尝试更多的MCP服务器,我们建议查看GitHub上的官方项目页面以及Frank Fiegel的开源MCP服务器目录,截至撰写时该目录包含超过3500个服务器。
同时,如果你想自己构建MCP服务器或客户端,我们建议查看官方MCP文档以获取更多信息和示例代码。
《注册报》计划未来带来更多本地AI相关内容,欢迎在评论区分享你的问题并告诉我们你希望看到的内容。
(以上内容均由Ai生成)