侧边栏壁纸
博主头像
MobotStone AI

行动起来,活在当下

  • 累计撰写 17 篇文章
  • 累计创建 4 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

2025年不得不知道AI 智能体系列五:案例实战

Administrator
2025-05-17 / 0 评论 / 12 点赞 / 69 阅读 / 0 字

距离上次更新"AI智能系列"已经过去一周了,我决定给这个系列做个完美收尾。当然,肯定要重点说说MCP。

我们在搭建AI智能系统时,最关键的就三大块:大脑(大模型)、工具(各种功能模块)和知识库(数据资料)。但现在新技术层出不穷,要整合这些东西变得特别麻烦。

今天要说的"模型上下文协议"(MCP)就是专门解决这个问题的。它就像一套万能插座,给大模型和各类工具、数据之间制定了标准连接方式。接下来我会简短介绍MCP,再用Python代码示范怎么搭建MCP Server

简单来说,MCP就是给AI系统制定了统一的接线标准。Anthropic公司解释说,有了它开发者就不用自己从头设计连接方式,直接用这套现成的标准就行。

这样做最直接的好处就是:整个开发者社区可以无缝协作了!不同团队开发的工具和应用,现在都能像乐高积木一样直接拼在一起用。

以下是MCP的实际应用场景举例

  • Cursor中集成自定义工具(如SlackGoogle Drive

  • 轻松将个人工具和上下文接入多个 AI 应用(如Claude、Cursor 或 n8n 工作流

  • 应用开发者可以直接利用社区提供的预构建 MCP 服务器,无需额外开发即可扩展产品功能!

MCP 工作模式

MCP 采用Client-Server架构。也就是说,MCP Client向 MCP Server发送请求,而Server会返回对工具、资源和提示的访问权限

这一过程类似于你去咖啡店(Client)向咖啡师(Server)点一杯陨石拿铁(Response),咖啡师随后将它递给你(Response)。

image-HqQi.png

MCP 是 AI 应用访问工具和上下文的协议流程,由三个关键部分组成 :

  1. Connect(连接)

    • 客户端初始化连接

    • 服务器响应

    • 客户端发送初始化完成的确认

  2. Exchange(交互)

    • 所有请求、响应和通知均采用 JSON 格式交换

  3. 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)]

    ClientServer:HTTP POST请求

    ServerClient: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):

具体操作:

  1. 安装软件:先下载安装Claude桌面版应用

  2. 打开设置:打开Claude后进入 设置 > 开发者选项

  3. 修改配置:点击"编辑配置文件"进行设置

image-BvBM.png

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的具体位置:

  1. 重启 Claude,集成功能应该就会生效了!

说明uv在这里很有用,因为 Claude 会在本地运行这个服务器。由于我们的 Python 脚本依赖多个包,uv run命令会自动处理这些依赖,省去了手动安装的麻烦。

总结

MCP 提供了一种通用方法,可以将工具和上下文集成到 LLM 应用中。在这个示例中,我们创建了一个自定义的 MCP 服务器。虽然我们只把它接入了 Claude 桌面版,但实际上它可以轻松集成到 Cursor、Agents SDK 或任何其他支持 MCP 的应用中。

12
博主关闭了所有页面的评论