模型上下文协议(MCP)正在迅速成为连接大型语言模型(LLM)与外部数据和工具的标准。这篇文章将带你深入了解MCP的核心概念、优势,并结合实际案例展示如何利用它来扩展LLM的能力,就像给LLM装上了一个强大的外置大脑。
什么是模型上下文协议(MCP)?
简单来说,模型上下文协议(MCP)是一个协议,一套通用的规则,就像不同国家之间的外交协议一样,保证了LLM能够以一种结构化的方式访问它们原本无法触及的数据和工具。Anthropic率先提出了这个概念,目前已经被广泛采用。不要被复杂的术语吓倒,实际上,你可以把MCP理解为一种发送和接收JSON文件的标准化方式。它建立了一个清晰的通信渠道:
AI Agent (LLM) → MCP → 数据/工具/函数
这个架构使得AI Agent可以通过MCP与各种外部资源进行交互。这有点像USB-C接口,任何设备都可以通过它连接各种外设,极大地提高了兼容性和易用性。通过标准化数据交换格式,MCP解决了LLM与外部世界交互的复杂性问题,降低了开发门槛。
MCP的核心组件
MCP主要由三个核心组件构成,它们协同工作,使得LLM可以无缝地与外部资源进行交互:
- MCP客户端: 通常是LLM本身,比如Claude Desktop,它们负责发起请求并解析服务器返回的结果。客户端是主动方,它们根据用户的指令或自身的逻辑,向服务器请求特定的数据或服务。
- MCP服务器: 这是数据、API和工具的所在地,比如数据库、GitHub、Blender甚至文件系统。服务器是被动方,它们接收来自客户端的请求,执行相应的操作,并将结果返回给客户端。MCP服务器种类繁多,可以根据实际需求进行定制。
- MCP协议: 基于JSON-RPC 2.0协议,用于在客户端和服务器之间交换消息。JSON-RPC 2.0 是一种轻量级的远程过程调用协议,它使用JSON作为数据格式,具有简单、易于解析和跨平台等优点。MCP协议定义了请求和响应的格式,以及错误处理机制,确保通信的可靠性和一致性。
例如,你可以创建一个MCP服务器来访问你的文件系统,这样LLM就可以读取、添加或删除文件。
实战演练:连接文件系统MCP
让我们通过一个简单的演示来感受一下MCP的强大之处。我们将连接一个文件系统MCP,让Claude Desktop能够读取、添加或删除你目录中的文件。
步骤 1:安装 Claude Desktop
首先,确保你已经安装了 Claude Desktop。这是使用MCP的前提。
步骤 2:配置 MCP 服务器
打开 Claude Desktop 的设置,找到“Developer”选项,点击“Edit config”。然后,将以下代码粘贴到配置文件中,并根据你的实际路径进行修改:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/username/Desktop",
"/Users/username/Downloads"
]
}
}
}
请务必将 "/Users/username/Desktop"
和 "/Users/username/Downloads"
替换为你自己的桌面和下载目录的实际路径。这段配置告诉 Claude Desktop 如何启动文件系统MCP服务器,以及允许访问的目录。npx
是一个 Node.js 包执行器,它可以方便地运行 @modelcontextprotocol/server-filesystem
这个包,而无需全局安装。
步骤 3:重启 Claude Desktop
保存配置文件后,重启 Claude Desktop。
步骤 4:验证连接
重启后,你应该能看到类似这样的提示信息,表明文件系统MCP服务器已经成功连接。现在,你可以直接向 Claude Desktop 提问,比如:“我的下载文件夹里有多少个文件?”或者“创建一个名为 test.txt 的文本文件”。
通过这个简单的例子,你可以看到MCP是如何让LLM直接与你的文件系统交互的。这种能力极大地扩展了LLM的应用场景,让它们可以执行更复杂的任务。
MCP的优势:标准化与可扩展性
MCP最大的优势在于它的标准化。它提供了一种通用的接口,使得不同的LLM和工具可以互相连接,而无需进行大量的定制开发。这种标准化降低了开发成本,提高了系统的可维护性。
此外,MCP还具有很强的可扩展性。你可以根据自己的需求,创建各种各样的MCP服务器,连接不同的数据源和工具。例如,你可以创建一个MCP服务器来访问你的数据库,让LLM能够进行数据分析和挖掘。或者,你可以创建一个MCP服务器来控制你的智能家居设备,让LLM成为你的智能管家。
假设一个电商公司使用LLM来进行客户服务。如果没有MCP,他们可能需要为每个不同的系统(例如,订单管理系统、库存管理系统、客户关系管理系统)编写定制的接口,这不仅耗时耗力,而且容易出错。但是,如果他们使用MCP,他们只需要为每个系统创建一个MCP服务器,然后就可以让LLM通过MCP与这些系统进行交互。这大大简化了开发流程,提高了系统的灵活性。
从CLI-agent到MCP:一场范式转变
几个月前,我曾经写过一个简单的终端代理(CLI-agent),它可以通过命令行与LLM进行交互。虽然它的功能与MCP有些相似,但实现方式却大相径庭。
为了让CLI-agent能够执行shell命令并返回结果,我需要进行大量的配置:
- Prompt工程: 我需要精心设计提示词,指导LLM以JSON格式返回输出。
- 库依赖: 我需要安装和配置各种库,才能执行shell命令。
- 客户端限制: 这个CLI-agent只能由我自己使用,无法与其他客户端共享。
相比之下,MCP提供了一种更加优雅和可扩展的解决方案。你只需要创建一个MCP服务器,就可以让任何支持MCP的客户端(例如,Claude Desktop)访问你的工具。这是一种范式转变,它将LLM的应用从个人工具扩展到通用平台。
构建自定义MCP服务器:进阶之路
如果你对MCP感兴趣,下一步可以尝试构建一个自定义的MCP服务器。这可以让你深入了解MCP的工作原理,并根据自己的需求定制功能。
构建MCP服务器的步骤通常包括:
- 选择编程语言和框架: 你可以选择任何你熟悉的编程语言和框架,例如 Python 和 Flask,或者 Node.js 和 Express。
- 实现 JSON-RPC 2.0 协议: 你可以使用现有的库来简化开发,例如
jsonrpcserver
(Python) 或json-rpc-2.0
(Node.js)。 - 定义 API 接口: 根据你的需求,定义服务器提供的 API 接口。例如,如果你要创建一个数据库MCP服务器,你可以定义
query
、insert
、update
和delete
等接口。 - 实现业务逻辑: 在 API 接口中实现具体的业务逻辑,例如连接数据库、执行查询等。
- 测试和部署: 编写单元测试和集成测试,确保服务器的稳定性和可靠性。然后,将服务器部署到云平台或本地服务器。
例如,假设你要创建一个简单的MCP服务器,用于获取当前时间。你可以使用 Python 和 Flask 实现如下:
from flask import Flask, request, jsonify
from jsonrpcserver import method, dispatch
import datetime
app = Flask(__name__)
@method
def get_current_time():
"""
Returns the current time.
"""
now = datetime.datetime.now()
return now.strftime("%Y-%m-%d %H:%M:%S")
@app.route("/", methods=['POST'])
def index():
req = request.get_data(cache=False, as_text=True)
response = dispatch(req)
return jsonify(response.json()), response.http_status
if __name__ == '__main__':
app.run(debug=True)
然后,你可以使用以下 JSON-RPC 请求来调用 get_current_time
方法:
{
"jsonrpc": "2.0",
"method": "get_current_time",
"params": [],
"id": 1
}
服务器会返回以下 JSON 响应:
{
"jsonrpc": "2.0",
"result": "2023-10-27 10:30:00",
"id": 1
}
通过这个简单的例子,你可以了解如何构建一个基本的MCP服务器。当然,实际的MCP服务器可能会更加复杂,涉及到更多的功能和安全性考虑。
总结与展望
模型上下文协议(MCP)是一种很有前景的技术,它为LLM与外部世界之间的交互提供了一种标准化的解决方案。通过MCP,我们可以将LLM与各种数据源和工具连接起来,从而扩展它们的能力,并创造出更多有价值的应用。无论你是一名开发者、研究者还是爱好者,都值得关注MCP的发展,并尝试将其应用到你的项目中。未来,MCP有望成为LLM生态系统的重要组成部分,推动人工智能技术的进一步发展。让我们拭目以待!