Model Context Protocol (MCP):大模型与外部系统交互的核心协议详解!

MCP协议与FastMCP框架详解

简介

Model Context Protocol (MCP)是一种开源标准,用于连接AI应用与外部系统。它采用客户端-服务器架构,由数据层和传输层组成,提供工具、资源、提示等核心原语。MCP交互流程包括初始化、工具发现、执行和更新。通过MCP,AI应用可以访问文件系统、数据库、API等外部资源并执行特定任务。FastMCP作为标准框架,提供简洁的Pythonic代码,帮助开发者高效构建MCP应用程序,实现大模型与外部系统的无缝集成。

Model Context Protocol (MCP),即****模型上下文协议,是一种开源标准,用于连接AI 应用程序(如 Claude 或 ChatGPT)与外部系统。 通过连接这些外部系统,MCP 使 AI 能够访问关键信息并执行任务:

数据源: 例如本地文件、数据库等。
工具: 例如搜索引擎、计算器等。
工作流程: 例如专业的提示(Specialized Prompts)。
MCP 核心概念 (Core Concepts)

https://modelcontextprotocol.io/docs/develop/connect-local-servers

MCP 遵循客户端-服务器(Client-Server)架构,主要参与者和分层如下:

参与者 (Participants)
MCP 主机 (Host): 即 AI 应用程序(如 Claude Code),它协调和管理一个或多个 MCP 客户端。
MCP 客户端 (Client): 维护与 MCP 服务器的连接,并从服务器获取上下文供主机使用。
MCP 服务器 (Server): 提供上下文数据给 MCP 客户端的程序,可以本地或远程运行。

一个 MCP 主机可以连接多个 MCP 服务器,但通过每个 MCP 客户端对应的 MCP 服务器之间维持一对一的专用连接

架构分层 (Layers)

https://modelcontextprotocol.io/docs/learn/architecture

MCP 由两个抽象层组成:

分层作用描述
数据层 (Data Layer)内层。定义基于JSON-RPC 2.0的协议,用于客户端-服务器通信,包括生命周期管理、核心原语(工具、资源、提示)和通知。
传输层 (Transport Layer)外层。定义实现数据交换的通信机制和通道,包括连接建立、消息分帧和授权。

传输层机制:
Stdio 传输: 使用标准输入/输出流,适用于同一机器上的本地进程间通信。
流式 HTTP 传输 (Streamable HTTP): 使用 HTTP POST,支持远程服务器通信和标准 HTTP 身份验证(如 OAuth)。
MCP 是一个有状态协议,需要生命周期管理。其核心目的是通过 initialize 请求协商客户端和服务器双方支持的能力 (Capabilities),确保协议版本兼容性,并进行身份信息交换。

核心原语 (Primitives)
原语是 MCP 中最重要的概念,它们定义了客户端和服务器可以互相提供的功能和上下文信息。
 

原语类型角色功能描述示例
工具 (Tools)服务器提供可执行函数,AI 应用程序可以调用它来执行操作(例如:文件操作、API 调用、数据库查询)。tools/list (发现) 和tools/call(执行)
资源 (Resources)服务器提供提供上下文数据的来源(例如:文件内容、数据库记录、API 响应)。resources/list 和resources/get
提示 (Prompts)服务器提供可重用的模板,用于构建与语言模型的交互(例如:系统提示、少样本示例)。
采样 (Sampling)客户端提供允许服务器向客户端请求语言模型完成(LLM completions),使服务器保持模型独立性。sampling/complete
引发 (Elicitation)客户端提供允许服务器请求用户提供额外信息或确认操作。elicitation/request
日志 (Logging)客户端提供允许服务器向客户端发送日志消息进行调试和监控。

MCP交互示例概览
一个典型的 MCP 交互流程如下:

初始化 (Initialization): 客户端发送 initialize 请求,协商协议版本和双方支持的能力(例如,客户端支持 elicitation,服务器支持 tools 和 resources)。
工具发现 (Tool Discovery): 连接建立后,客户端发送 tools/list 请求,获取服务器提供的所有工具的详细元数据(名称、描述、输入 inputSchema 等)。
工具执行 (Tool Execution): AI 应用程序的 LLM 决定使用工具时,客户端发送 tools/call 请求,指定工具名称和参数,服务器执行后返回包含 content 数组的结果。
实时更新 (Notifications): 如果服务器的工具列表发生变化,它会发送 notifications/tools/list_changed 通知(无 ID,无响应),客户端收到后通常会再次调用 tools/list 来刷新其工具注册表。

理解 MCP 服务器
MCP 服务器是程序,它通过标准化的协议接口,向 AI 应用程序公开特定的能力。

常见的 MCP 服务器示例包括:用于文档访问的文件系统服务器、用于数据查询的数据库服务器、用于代码管理的 GitHub 服务器、用于团队沟通的 Slack 服务器以及用于日程安排的日历服务器。

MCP 服务器主要通过以下三个核心构建模块提供功能:

功能模块解释示例控制者
工具 (Tools)函数 ,LLM 可以根据用户请求主动调用并决定何时使用它们。工具可以写入数据库、调用外部 API、修改文件或触发其他逻辑。搜索航班、发送消息、创建日历事件。模型 (Model)
资源 (Resources)被动数据源 ,提供信息的只读访问,作为上下文(Context),例如文件内容、数据库 Schema 或 API 文档。检索文档、访问知识库、读取日历。应用程序 (Application)
提示 (Prompts)预设的指令模板 ,指导模型使用特定的工具和资源来完成复杂的工作流程。计划假期、总结会议、起草邮件。用户 (User)

理解 MCP 客户端
MCP 客户端由宿主应用程序(Host Application,例如 Claude.ai 或一个 IDE)实例化,用于与特定的 MCP 服务器进行通信。宿主应用管理整体用户体验并协调多个客户端,而每个客户端负责与一个服务器进行一次直接通信。

除了利用服务器提供的上下文(Tools, Resources, Prompts)外,客户端还必须向服务器提供一些核心功能,以支持更丰富的交互:
 

功能模块解释示例
采样 (Sampling)允许服务器通过客户端请求 LLM 完成(LLM completions),使服务器能执行依赖 AI 的任务,同时将安全和权限控制权完全交给客户端。旅行预订服务器将航班列表发送给 LLM,请求 LLM 推荐最佳航班。
根目录 (Roots)客户端指定服务器应关注的文件系统边界,通过协调机制传达预期的范围(Scope)。客户端允许旅行预订服务器访问包含用户日历的特定目录。
引发 (Elicitation)允许服务器在交互过程中按需请求用户提供特定信息,以结构化的方式动态收集数据。旅行预订服务器请求用户确认座位偏好、房间类型或联系电话以完成预订。

FastMCP

https://gofastmcp.com/getting-started/welcome

FastMCP 是一个旨在实现 MCP 应用程序的标准框架。它提供简洁、Pythonic(Python 风格) 的代码,使开发者能够更高效、更便捷地构建、部署和集成 MCP 应用程序和服务器。

  • MCP Server
from fastmcp import FastMCPmcp = FastMCP("Demo 🚀")@mcp.tooldef add(a: int, b: int) -> int:    """Add two numbers"""    return a + bif __name__ == "__main__":    mcp.run()
  • MCP Client
import asynciofrom fastmcp import Clientclient = Client("http://localhost:8000/mcp")async def call_tool(name: str):    async with client:        result = await client.call_tool("greet", {"name": name})        print(result)asyncio.run(call_tool("Ford"))
FastMCP Server 使用

https://gofastmcp.com/servers/server

FastMCP 类是构建 MCP 应用程序的核心,它作为应用程序的中心容器,用于存放工具 (Tools)资源 (Resources) 和提示 (Prompts),并负责管理与 MCP 客户端的通信。

  • 定义工具说明
@mcp.tool(    name="find_products",           # Custom tool name for the LLM    description="Search the product catalog with optional category filtering.", # Custom description    tags={"catalog", "search"},      # Optional tags for organization/filtering    meta={"version": "1.2", "author": "product-team"}  # Custom metadata)def search_products_implementation(query: str, category: str | None = None) -> list[dict]:    """Internal function description (ignored if description is provided above)."""    # Implementation...    print(f"Searching for '{query}' in category '{category}'")    return [{"id": 2, "name": "Another Product"}]
  • 定义工具参数
@mcp.tooldef analyze_text(    text: str,    max_tokens: int = 100,    language: str | None = None) -> dict:    """Analyze the provided text."""    # Implementation...
  • 定义资源
@mcp.resource("data://config")def get_config() -> dict:    """Provides application configuration as JSON."""    return {        "theme": "dark",        "version": "1.2.0",        "features": ["tools", "resources"],    }
  • 定义资源模板
@mcp.resource("weather://{city}/current")def get_weather(city: str) -> dict:    """Provides weather information for a specific city."""    # In a real implementation, this would call a weather API    # Here we're using simplified logic for example purposes    return {        "city": city.capitalize(),        "temperature": 22,        "condition": "Sunny",        "unit": "celsius"    }
  • 定义提示词
  • @mcp.prompt(    name="analyze_data_request",          # Custom prompt name    description="Creates a request to analyze data with specific parameters",  # Custom description    tags={"analysis", "data"},            # Optional categorization tags    meta={"version": "1.1", "author": "data-team"}  # Custom metadata)def data_analysis_prompt(    data_uri: str = Field(description="The URI of the resource containing the data."),    analysis_type: str = Field(default="summary", description="Type of analysis.")) -> str:    """This docstring is ignored when description is provided."""    return f"Please perform a '{analysis_type}' analysis on the data found at {data_uri}."
    

    AI大模型学习福利

    作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

    一、全套AGI大模型学习路线

    AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

    二、640套AI大模型报告合集

    这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    三、AI大模型经典PDF籍

    随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    四、AI大模型商业化落地方案

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值