距离上次更新"AI智能系列"已经过去一周了,我决定给这个系列做个完美收尾。当然,肯定要重点说说MCP。
我们在搭建AI智能系统时,最关键的就三大块:大脑(大模型)、工具(各种功能模块)和知识库(数据资料)。但现在新技术层出不穷,要整合这些东西变得特别麻烦。
今天要说的"模型上下文协议"(MCP)就是专门解决这个问题的。它就像一套万能插座,给大模型和各类工具、数据之间制定了标准连接方式。接下来我会简短介绍MCP,再用Python代码示范怎么搭建MCP Server。
简单来说,MCP就是给AI系统制定了统一的接线标准。Anthropic公司解释说,有了它开发者就不用自己从头设计连接方式,直接用这套现成的标准就行。
这样做最直接的好处就是:整个开发者社区可以无缝协作了!不同团队开发的工具和应用,现在都能像乐高积木一样直接拼在一起用。
以下是MCP的实际应用场景举例:
在Cursor中集成自定义工具(如Slack和Google Drive)
轻松将个人工具和上下文接入多个 AI 应用(如Claude、Cursor 或 n8n 工作流)
应用开发者可以直接利用社区提供的预构建 MCP 服务器,无需额外开发即可扩展产品功能!
MCP 工作模式
MCP 采用Client-Server架构。也就是说,MCP Client向 MCP Server发送请求,而Server会返回对工具、资源和提示的访问权限。
这一过程类似于你去咖啡店(Client)向咖啡师(Server)点一杯陨石拿铁(Response),咖啡师随后将它递给你(Response)。
MCP 是 AI 应用访问工具和上下文的协议流程,由三个关键部分组成 :
Connect(连接)
客户端初始化连接
服务器响应
客户端发送初始化完成的确认
Exchange(交互)
所有请求、响应和通知均采用 JSON 格式交换
Terminate(终止)
连接关闭的三种方式:
客户端主动关闭
传输断开(如网络问题)
发生错误导致终止
MCP 客户端
MCP** Client****直接集成在AI应用中**(例如Claude、Cursor、n8n工作流或使用OpenAI Agents SDK开发的自定义AI代理)[1]。
它代表AI应用与MCP Server通信,主要功能包括:
识别Server支持的功能
接收Server返回的数据
管理AI工具的执行
当你使用现成的AI应用(如Claude或Cursor)时,无需自行开发MCP Client——这些应用已内置该功能。但你可能需要自行搭建一个定制的MCP Server。
MCP 服务端
MCP ****Server是 AI 应用的独立服务模块。它们**[监听Client的请求并返回响应]** [2],具体功能取决于Server的能力。
Server为AI应用提供**[三个核心功能类型]** [2][3]:
[提示模板]:预定义的提示词模板
[数据资源]:支持访问文件、数据库等数据源
[工具方法]:函数调用、API对接和图像处理等功能
Server可以[本地部署]或[远程运行],主要通过**[两种通信方式]**实现交互 [2]:
[标准IO流(local)]:作为子进程运行,通过标准输入输出流通信
[HTTP/SSE(remote)]:
• Client→Server:HTTP POST请求
• Server→Client:SSE流式传输
用Python搭建MCP服务器的具体示例
现在我用Anthropic的Python SDK来演示一个实际案例。这个案例会帮助理解MCP Server的具体实现。
这个Server将实现以下功能:
为外部AI应用提供我之前开发的工具集
该工具集原是我用OpenAI Agents SDK开发的虚拟助手(AVA)的一部分
主要包含三个功能:
提供邮件写作的提示模板
提供示例邮件
支持在我的Gmail邮箱中起草邮件
需要完整代码的朋友们请私信联系
安装 uv 工具
开发 Python 版的 MCP 服务器时,推荐使用uv这个工具。它能简化Server的启动过程,只需一条命令就能启动Server并安装所有依赖。
安装方法如下:
# Mac/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
创建 MCP 服务器
使用 Anthropic 的 Python SDK 可以轻松创建自定义 MCP Server。下面是创建名为 "AVA" Server的代码:
from mcp.server.fastmcp import FastMCP
# 创建MCP服务
mcp = FastMCP("AVA")
MCP Server提供三种核心功能:
提示模板:预设的文本模板
资源:可用的数据和文件
工具:可调用的函数和接口
接下来我们将逐一为Server添加这些功能。
添加提示模板
提示模板是一种函数,它能接收文本输入并按预设的格式生成最终的提示内容。当你需要重复使用同一个提示模板时,这个功能特别实用。
下面是为AVA助理添加基本指令的简单范例:
@mcp.prompt()
def ava(user_name: str, user_title: str) -> str:
"""人工虚拟助手(AVA)的全局指令"""
return f"""# AVA (人工虚拟助手)
你是AVA,是{user_name}({user_title})的虚拟助手。你帮助他们处理行政任务。
**偏好设置:**
- 与用户的沟通保持简洁明了
"""
添加资源文件
MCP服务器可以加载资源文件,这些是提供给AI模型的静态数据,不包含复杂计算逻辑。
以下是添加资源文件的方法(需要文件的朋友私信):
# 定义资源
@mcp.resource("email-examples://3-way-intro")
def write_3way_intro() -> str:
"""三向介绍邮件的示例"""
with open("email-examples/3-way-intro.md", "r") as file:
return file.read()
@mcp.resource("email-examples://call-follow-up")
def write_call_followup() -> str:
"""通话后续邮件的示例"""
with open("email-examples/call-follow-up.md", "r") as file:
return file.read()
@mcp.resource("directory://all")
def get_directory() -> str:
"""获取所有联系人目录"""
with open("directory.csv", "r") as file:
return file.read()
添加工具
我们可以为服务器添加各种工具。工具可以执行具体操作,例如运行Python函数、调用API、处理数据等。
以下是在Gmail账户中创建邮件草稿的工具示例:
from tools.gmail import get_gmail_service
from googleapiclient.errors import HttpError
import base64
from email.message import EmailMessage
import os
# 定义工具
@mcp.tool()
def write_email_draft(recipient_email: str, subject: str, body: str) -> dict:
"""使用 Gmail API 创建邮件草稿。
参数:
recipient_email (str): 收件人的电子邮件地址。
subject (str): 邮件的主题行。
body (str): 邮件的主要内容/正文。
返回:
dict or None: 如果成功,返回包含草稿信息的字典,包括'id'和'message';
如果发生错误,返回 None。
异常:
HttpError: 与 Gmail API 通信时发生错误时抛出。
注意:
此函数需要:
- Gmail API 凭证正确配置
- 设置 USER_EMAIL 环境变量为发件人的电子邮件地址
- 具有创建草稿的适当 Gmail API 权限
"""
try:
# 创建 gmail api 客户端
service = get_gmail_service()
message = EmailMessage()
message.set_content(body)
message["To"] = recipient_email
message["From"] = os.getenv("USER_EMAIL")
message["Subject"] = subject
# 编码消息
encoded_message = base64.urlsafe_b64encode(message.as_bytes()).decode()
create_message = {"message": {"raw": encoded_message}}
# pylint: disable=E1101
draft = (
service.users()
.drafts()
.create(userId="me", body=create_message)
.execute()
)
print(f'草稿 ID: {draft["id"]}\n草稿消息: {draft["message"]}')
except HttpError as error:
print(f"发生错误: {error}")
draft = None
return draft
重要提示:如需在自己的Gmail账户中使用此工具,需要通过OAuth进行授权。详细步骤请参考官网文档
本地运行服务器
要让服务器在本地运行,只需在Python脚本末尾添加以下代码:
if __name__ == "__main__":
mcp.run(transport='stdio')
测试服务器
为了检查服务器是否正常工作,可以通过命令行启动开发模式:
uv run mcp dev mcp-server-example.py
启动后会自动打开浏览器界面,你可以:
测试服务器各项功能
查看可用的提示词模板
检查已加载的资源文件
测试工具是否正常运行
(注意:如果你是从GitHub克隆的项目,环境应该已经自动配置好了)
接入Claude桌面端
确认服务器正常运行后,可以把它接入AI应用。以下是接入Claude桌面端的步骤(当前仅支持本地运行,无法接入网页版claude.ai):
具体操作:
安装软件:先下载安装Claude桌面版应用
打开设置:打开Claude后进入 设置 > 开发者选项
修改配置:点击"编辑配置文件"进行设置
4. 把下面这段JSON配置粘贴到配置文件中
{
"mcpServers": {
"AVA": {
"command": "uv",
"args": [
"--directory",
"/global/path/to/mcp/server/code/",
"run",
"mcp-server-example.py"
]
}
}
}
注意:如果无法运行,可能需要将uv
替换为它的完整路径(比如/Users/你的用户名/.local/bin/uv
)。你可以通过以下命令查看uv
的具体位置:
重启 Claude,集成功能应该就会生效了!
说明:uv
在这里很有用,因为 Claude 会在本地运行这个服务器。由于我们的 Python 脚本依赖多个包,uv run
命令会自动处理这些依赖,省去了手动安装的麻烦。
总结
MCP 提供了一种通用方法,可以将工具和上下文集成到 LLM 应用中。在这个示例中,我们创建了一个自定义的 MCP 服务器。虽然我们只把它接入了 Claude 桌面版,但实际上它可以轻松集成到 Cursor、Agents SDK 或任何其他支持 MCP 的应用中。