MCP知识学习总结

前沿介绍

mcp被称为模型上下文协议,最初大语言模型刚刚现世的时候仅仅是通过transformer框架实现自然语言的问答,这个时候大模型能够理解用户输入的意图,然后大模型去根据概率预测回复的内容,后来通过引入知识库训练蒸馏让大模型学习知识帮助我们解决问题,提取内容.后来随着需求的不断多元化,简单的知识库训练已经满足不了用户的回答.出现了以下这种需求场景:我想要大模型能够去实时拉取浏览器/网上发布的最新内容,根据内容帮我总结.于是函数调用这个概念出现了,在用户与大模型的输入之间多了一层函数调用,也可以说是将函数调用后的结果与用户的输入一起喂入给大模型作为输入,此时的大模型逐渐变化为一个总结专家.

那么mcp又是什么,接着函数调用讲,现在大模型的厂家有很多,如果不同厂家都需要实现同一个功能的函数调用.就比如接入浏览器搜索引擎,这个时候会很麻烦,没有一个统一的接口和规范.本着工具化和规范化的思想,anthropic提出了一种统一的协议(模型上下文协议:model context protocol),通过统一接口,各大厂家能够基于这个规范开发自己的mcp,这个指的mcp就主要是类似于一个个的工具了,能够作为插件继承到智能体开发平台中供用户使用.

image.pngimage.png

上述两幅图帮助理解mcp

mcp的通信机制

mcp官方支持三种传输机制:stdio(标准输入/输出)、HTTP+SSE(已弃用)与最新的 Streamable HTTP(流式HTTP)。

stdio(标准输入/输出)

适用场景:本地通信,无需访问外部实现的mcp服务,客户端和服务器运行在同一台机器上。比如访问本地文件或运行本地脚本。

如果mcp服务不发布出去,那么在客户端也可以使用stdio的方式连接,保证服务端的安全性.

http+sse(已经弃用)

为什么已经弃用了呢?因为mcp服务采用sse长连接可以保持一个会话持续连接,在会话保持阶段数据进行传输,但是如果这个时候会话突然断开,服务端和客户端都无法感知连接的断开,故而会导致两边的传输不一致.并且不支持断线重连,用户体验感欠佳.

streamable Http流式

streamable http是为了解决sse方式的弊端而引入的一种新的流式传输方式.

服务端引入session机制,支持状态管理与恢复,服务器通过为客户端生成唯一会话ID,并要求客户端在后续请求中携带该ID,支持状态感知和断线重连.

mcp开发

mcp开发可以实现一次开发,多次使用,实现像函数/轮子一样重复使用.

本文介绍以下python语言中mcp的开发

首先,需要安装有uv环境:uv是一个新出的python虚拟环境管理工具,与pip和conda类似的一个工具.

  1. 基于uv初始化一个项目
# 进入pycharm终端页面初始化项目
uv init projectName
# 执行初始化操作
cd projectName
uv sync

  1. 安装mcp库
# 清华源下载mcp相关库
uv add mcp[cli] --default-index https://pypi.tuna.tsinghua.edu.cn/simple
  1. 给python项目配置虚拟环境[上述安装好的库包都在.venv文件夹下面]

image.png

选择添加虚拟环境

image.png

  1. 书写代码
# 代码样例 - 实现一个比较大小的mcp工具
from mcp.server.fastmcp import FastMCP
# 实例化一个mcp服务,类似于flask的实例化
mcp = FastMCP("compare")

# 具体的工具,函数名称就是工具的名称
@mcp.tool()
def compare(a: float, b: float)->str:
    """compare two numbers"""
    if a-b > 0:
        return f"正确答案:{a}>{b}"
    else:
        return f"正确答案:{b}>{a}"

if __name__ == "__main__":
  # 运行mcp服务,transport对应的是mcp的数据传输方式,就是上文介绍的三种,还有sse streamable
    mcp.run(transport='stdio')

  1. 注册mcp服务
注册mcp服务,亲测在cherry上面需要执行这段代码才能连接mcp
uv add --script [脚本地址/main.py] --active [项目地址]
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐