前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >一文详解模型上下文协议(MCP):打通大模型与业务场景的关键

一文详解模型上下文协议(MCP):打通大模型与业务场景的关键

原创
作者头像
fanstuck
修改2025-03-27 18:45:59
修改2025-03-27 18:45:59
60620
代码可运行
举报
运行总次数:0
代码可运行

前言

暂且抛开MCP,这23年的时候开始搭建AI Agent智能体,对第三方插件API进行交互的时候,我就开始设想能不能自己做一个通用代码协议框架,以后AI团队统一用这个协议,方便大家code review,更好协作。AI要触及到业务就必然逃不过与业务端接口或是数据进行联通,但是之前都没有标准的交互协议,需要理解各个三方接口和协议是比较费时的事情,但如果有类似像Java工程开发标准,那么我们就很方便开发第三方接口了,不会存在那么多不同开发形态的代码,方便维护。MCP协议出现之后发现大家都在慢慢融入到开源协议框架中,故而再对一些不了解MCP的朋友详细解述这一框架协议,以后必然是以开源协议为主导的代码生态。

我是Fanstuck,致力于将复杂的技术知识以易懂的方式传递给读者,每一篇文章都凝聚着我对技术的深刻洞察。从 人工智能的基础理论到前沿研究成果,从热门框架的深度解析到实战项目的详细拆解,内容丰富多样。无论是初学者想要入门,还是资深开发者追求进阶,都能在这里找到契合自身需求的知识养分。如果你对大模型的创新应用、AI技术发展以及实际落地实践感兴趣,那么请关注Fanstuck。

什么是MCP协议?

当前大模型需要处理特定领域的数据或执行复杂任务时,往往面临着“信息孤岛”的挑战。这意味着,尽管模型本身强大,但由于无法直接访问或整合外部数据源,其应用范围和实用性受到了限制。

如果你有一个全能的助手,能够流利地与您对话,解答各种问题。但当你要求它分析公司内部的销售数据、整理本地文件,或与其他软件工具协同工作时,它却显得无能为力。这正是当前许多AI助手所面临的困境:它们被困在自己的“知识围墙”内,无法有效地与外部世界交互。

为了解决这一问题,Anthropic公司于2024年11月推出了模型上下文协议(Model Context Protocol,简称MCP) 。MCP旨在为AI模型与外部数据源和工具之间搭建一座标准化的桥梁,使AI应用能够安全、灵活地访问和操作本地及远程数据。可以将MCP比作AI领域的“USB-C接口”,它为不同的数据源和工具提供了统一的连接方式,简化了集成过程,提升了AI系统的实用性和扩展性。

通过MCP,AI助手可以直接与本地文件系统交互,读取或编辑文档;连接数据库,查询或更新数据;甚至与在线服务(如Slack、GitHub)整合,实现消息发送、代码管理等功能。这种能力的提升,使得AI助手在处理实际业务场景时更加得心应手,真正成为用户的得力助手。在接下来的章节中,我们将深入探讨MCP的工作原理、核心组件、主要功能,以及它在实际应用中的优势和案例。全面了解MCP如何为AI模型赋能,打破信息孤岛,实现更广泛的应用和更高效的工作流程。

MCP的核心目标和功能

MCP的核心目标是为AI模型提供一个通用的接口,使其能够与各种外部数据源和工具进行无缝交互。具体功能包括:

标准化数据访问:通过统一的协议,简化AI模型与不同数据源的连接,避免为每个数据源单独开发接口代码。

增强上下文感知能力:允许AI模型访问实时、相关的数据和专门的工具,基于准确的信息做出响应。

双向安全通信:在AI应用和数据源之间建立安全的双向通信通道,确保数据的隐私性和交互的完整性。

  • 拉取数据:LLM 服务器查询上下文 → 例如检查您的日历
  • 触发操作:LLM 指示服务器执行操作 → 例如重新安排会议,发送电子邮件

MCP 与 API:

功能

MCP

传统 API

集成工作量

单一、标准化的集成

每个 API 的独立集成

实时通信

✅ 是

❌ 无

动态发现

✅ 是

❌ 无

可扩展性

简单(即插即用)

需要额外的集成

安全与控制

在工具间保持一致

根据 API 而异

MCP 与 Function Calling 的区别

  • MCP(Model Context Protocol),模型上下文协议
  • Function Calling,函数调用

这两种技术都旨在增强 AI 模型与外部数据的交互能力,但 MCP 不止可以增强 AI 模型,还可以是其他的应用系统。

类型/特性

MCP (Model Context Protocol)

Function Calling

性质

协议

功能

范围

通用(多数据源、多功能)

特定场景(单一数据源或功能)

目标

统一接口,实现互操作

扩展模型能力

实现

基于标准协议

依赖于特定模型实现

开发复杂度

低:通过统一协议实现多源兼容

高:需要为每个任务单独开发函数

复用性

高:一次开发,可多场景使用

低:函数通常为特定任务设计

灵活性

高:支持动态适配和扩展

低:功能扩展需要额外开发

常见场景

复杂场景,如跨平台数据访问与整合

简单任务,如天气查询

MCP的工作原理

MCP采用客户端-服务器架构,主要组件包括客户端、服务器和资源。:

MCP主机(Host):MCP主机是运行AI应用程序的环境,负责发起与外部资源的连接。例如,Claude Desktop等AI助手应用,需要通过MCP访问本地文件、数据库或远程API。在实际应用中,用户通过Claude Desktop与AI助手交互,当需要访问本地文件时,Claude Desktop作为MCP主机,协调AI助手与本地文件系统之间的通信。

MCP客户端(Client):MCP客户端是嵌入在主机应用中的连接器,负责与MCP服务器建立一对一的连接。它充当AI模型与外部资源之间的桥梁,管理数据请求和响应的传递。例如,在Claude Desktop中,MCP客户端会向服务器请求访问特定的本地文件或远程API,并将获取的数据传递给AI模型进行处理。

MCP服务器(Server):MCP服务器是一个轻量级程序,通过标准化的MCP协议开放特定功能。它负责处理来自客户端的请求,与本地或远程资源交互,并将结果返回给客户端。例如,MCP服务器可以连接到本地文件系统,提供文件读取和写入功能;或连接到远程API,获取实时数据。这种设计使得AI应用能够通过统一的接口访问多种资源,简化了开发和集成的复杂度。

当AI模型需要访问外部数据或功能时,MCP客户端向MCP服务器发送请求,服务器与相应的数据源或工具交互后,将结果返回给客户端,最终供AI模型使用。清晰地看出MCP 本身不处理复杂的逻辑;它只是协调 AI 模型和工具之间数据和指令的流动。

本地与远程资源

  • 本地资源:指计算机上的数据库、文件和服务等。通过MCP,AI应用可以访问本地存储的数据,例如读取用户的文档、查询本地数据库,或调用本地服务。这使得AI助手能够在用户的计算机上执行复杂的任务,如整理文件、分析数据等。
  • 远程资源:指通过互联网访问的API和服务。MCP允许AI应用连接到各种在线服务,例如获取天气信息、查询股票行情,或与云端数据库交互。这种能力使得AI助手能够提供实时的、丰富的信息和功能,满足用户的多样化需求。

假设你正在使用Claude Desktop与AI助手进行交互,希望它帮助你整理本地的PDF文件。在这种情况下,Claude Desktop作为MCP主机,内部的MCP客户端会向MCP服务器发送请求,要求访问本地的文件系统。MCP服务器接收到请求后,与本地文件系统交互,获取所需的PDF文件列表,并将结果返回给客户端。AI助手接收到这些信息后,可以进一步对文件进行分类、重命名或移动操作,从而帮助你高效地整理文件。

通过MCP的协同工作,AI应用能够灵活、安全地访问和操作各种资源,极大地扩展了AI助手的功能和应用范围。

MCP的主要功能

资源共享(Resources)

MCP允许AI模型访问所需的上下文和数据,打破了信息孤岛的限制。例如,在企业环境中,AI助手需要获取内部文档、客户信息或销售数据,以提供准确的分析和建议。通过MCP,AI助手可以安全地连接到公司的数据库或文件系统,实时获取最新信息,确保决策的准确性和时效性。这种资源共享机制使AI模型能够在更广泛的领域发挥作用,提升工作效率。

工具调用(Tools)

MCP使AI模型能够调用外部功能,如查询数据库、调用API等,扩展了其能力范围。例如,开发者在编写代码时,可能需要查询特定的API文档或检查代码库的状态。通过MCP,AI助手可以直接与代码管理工具(如GitHub)交互,获取所需信息,甚至执行代码提交、创建分支等操作。这种工具调用功能使AI助手成为开发者的得力助手,简化了开发流程。

提示模板(Prompts)

MCP支持为用户预定义完成特定任务的模板,简化交互过程。例如,在客户支持场景中,AI助手需要根据不同的客户需求提供相应的回复。通过提示模板,AI助手可以快速生成专业、准确的回复,提高客户满意度。此外,在内容创作领域,提示模板可以帮助AI助手生成符合特定风格和要求的文本,助力创作者高效完成工作。

MCP 服务器开发

要开始创建一个 MCP 服务器,需要对 Python 和异步编程有基本的了解。让我们一步步讲解如何设置和实现一个自定义的 MCP 服务器。

最简单的方法是使用官方的 MCP 服务器创建工具:

代码语言:javascript
代码运行次数:0
运行
复制
# Using uvx (recommended)uvx create-mcp-server​# Or using pippip install create-mcp-serverpip install mcp-server-gitcreate-mcp-server

需要注意的是Python版本需要3.10以上。

我们通过pycharm来创建一个基础的目录

代码语言:javascript
代码运行次数:0
运行
复制
my-server/├── README.md├── pyproject.toml└── src/    └── my_server/        ├── __init__.py        ├── __main__.py        └── server.py

我们来构建一个后端 AI Agent 项目,通过定义清晰的工具接口与 JSON Schema,实现 AI 与外部知识库(arXiv)交互,返回结构化信息。该项目完整的开发流程图解:

代码语言:javascript
代码运行次数:0
运行
复制
开始 └── 初始化MCP服务器     └── 注册工具接口 (search-arxiv)         └── 接收AI请求 (调用search-arxiv工具)             └── 验证输入参数 (keyword)                 └── 调用arxiv API 检索论文                     └── 获取论文数据                         └── 格式化数据结果                             └── 返回结构化的论文信息给AI大模型结束

1.引入库与初始化服务器

代码语言:javascript
代码运行次数:0
运行
复制
import asyncio
from mcp.server.models import InitializationOptions
import mcp.types as types
from mcp.server import NotificationOptions, Server
import mcp.server.stdio
import arxiv

server = Server("mcp-scholarly")
client = arxiv.Client()
  • 引入 MCP 与 arxiv 库,实现通信与API调用。
  • 初始化一个名为mcp-scholarly的AI工具服务器。
  • 创建一个arxiv客户端实例,用于后续调用arXiv API。

2.定义工具接口 (@server.list_tools())

代码语言:javascript
代码运行次数:0
运行
复制
@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:
    return [
        types.Tool(
            name="search-arxiv",
            description="Search arxiv for articles related to the given keyword.",
            inputSchema={
                "type": "object",
                "properties": {
                    "keyword": {"type": "string"},
                },
                "required": ["keyword"],
            },
        )
    ]

具需要输入一个关键词(keyword)进行论文检索。

3.工具调用处理函数 (@server.call_tool())

代码语言:javascript
代码运行次数:0
运行
复制
@server.call_tool()
async def handle_call_tool(
        name: str, arguments: dict | None
) -> list[types.TextContent | types.ImageContent | types.EmbeddedResource]:
    if name != "search-arxiv":
        raise ValueError(f"Unknown tool: {name}")
    
    if not arguments:
        raise ValueError("Missing arguments")
        
    keyword = arguments.get("keyword")
    if not keyword:
        raise ValueError("Missing keyword")

    # 调用arXiv API进行论文搜索
    search = arxiv.Search(
        query=keyword, 
        max_results=10, 
        sort_by=arxiv.SortCriterion.SubmittedDate
    )
    results = client.results(search)
    
    # 格式化返回结果
    formatted_results = []
    for result in results:
        article_data = "\n".join([
            f"Title: {result.title}",
            f"Summary: {result.summary}",
            f"Links: {'||'.join([link.href for link in result.links])}",
            f"PDF URL: {result.pdf_url}",
        ])
        formatted_results.append(article_data)

    return [
        types.TextContent(
            type="text",
            text=f"Search articles for {keyword}:\n"
                 + "\n\n\n".join(formatted_results)
        ),
    ]

实现实际的论文搜索逻辑:

  • 验证工具调用请求。
  • 使用关键词(keyword)调用arXiv API进行搜索。
  • 获取并格式化论文信息(标题、摘要、链接、PDF地址)。
  • 返回结构化结果给AI模型。

4.主函数

  1. 启动服务器:函数的主要目的是启动一个服务器,用于处理来自MCP Inspector或其他客户端的请求。
  2. 日志记录:在启动服务器时,记录一条信息日志,表明服务器正在启动。
  3. 标准IO通信:使用标准输入输出(stdio)作为通信方式,这样服务器可以通过标准输入接收请求,通过标准输出发送响应,便于与其他工具(如MCP Inspector)进行交互。
  4. 服务器配置:通过InitializationOptions配置服务器的基本信息和功能,包括服务器名称、版本以及支持的能力。

异步编程
  • 函数使用async def定义,表明这是一个异步函数,适合处理I/O密集型任务,如网络通信。
  • async with用于异步上下文管理,确保资源(如流)在使用后正确释放。

标准IO通信

  • mcp.server.stdio.stdio_server()返回一个异步上下文管理器,用于通过标准输入输出与客户端通信。
  • read_streamwrite_stream分别代表输入流和输出流,用于接收和发送数据。

服务器初始化选项

  • InitializationOptions配置服务器的基本信息和功能。
  • server.get_capabilities()获取服务器支持的能力,包括通知选项和实验性功能。

随后启动服务即可:

代码语言:javascript
代码运行次数:0
运行
复制
python -m src.my_server

测试MCP 服务器

MCP Inspector 提供了一个测试服务器的界面,直接在终端运行即可:

代码语言:javascript
代码运行次数:0
运行
复制
npx @modelcontextprotocol/inspector python -m src.my_server

通过界面可以调试我们的所有功能,很方便测试我们的端口:

可以看到Tools是我们之前写的工具接口,List Tools是我们写的工具调用处理函数,包含search-arxiv,直接在keyword里面输入关键词,就可以看到服务器响应返回的全部数据了。

MCP的未来发展与展望

MCP的广泛应用仍处于初期阶段,社区对其潜力和局限性的讨论也在持续。一些开发者认为,MCP有望成为AI与外部系统交互的标准接口,但也有人担心其在安全性和性能方面的挑战。随着更多开发者的参与和贡献,MCP的生态系统有望进一步丰富和完善。

尽管MCP为AI模型与外部资源的交互提供了标准化的解决方案,但在实际应用中,仍存在一些需要改进的方面:

  • 安全性:MCP内置了安全机制,确保只有经过验证的请求才能访问特定资源,并支持多种加密算法,保障数据在传输过程中的安全性。
  • 性能:随着AI应用对实时数据访问需求的增加,MCP需要优化其通信协议,减少延迟,提高数据传输效率,确保在高并发场景下的稳定性和响应速度。
  • 功能:当前,MCP主要专注于数据访问和工具调用。未来,可以扩展其功能范围,例如支持更多类型的资源、增强对复杂任务的支持,以及提供更丰富的开发工具和文档,降低开发者的学习和使用门槛。

随着AI技术的不断发展和应用场景的日益复杂,MCP有望在未来发挥更重要的作用。我鼓励开发者积极探索和应用MCP,共同推动AI系统的能力和效率的提升,为构建更加智能和互联的贡献力量。

有更多感悟以及有关大模型的相关想法可随时联系博主深层讨论,我是Fanstuck,致力于将复杂的技术知识以易懂的方式传递给读者,热衷于分享最新的行业动向和技术趋势。如果你对大模型的创新应用、AI技术发展以及实际落地实践感兴趣,那么请关注Fanstuck,下期内容我们再见!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 什么是MCP协议?
  • MCP的核心目标和功能
  • MCP的工作原理
  • MCP的主要功能
    • 资源共享(Resources)
    • 工具调用(Tools)
    • 提示模板(Prompts)
  • MCP 服务器开发
    • 1.引入库与初始化服务器
    • 2.定义工具接口 (@server.list_tools())
    • 3.工具调用处理函数 (@server.call_tool())
    • 4.主函数
      • 异步编程:
  • 测试MCP 服务器
  • MCP的未来发展与展望
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档