大模型LLMs的MCP入门
写在前文:最近看到MCP相关内容很火,于是我就去简单了解了下相关内容,官方文档或者说是官方Demo目前还有一部分坑,顺便记录下。
这是一个很简单的例子,只提供了环境初始化正常运行的功能。其余的没有扩展。
首先。
什么是MCP?MCP(Model Context Protocol即模型上下文协议 ),官方给出的解释如下:
The Model Context Protocol allows applications to provide context for LLMs in a standardized way, separating the concerns of providing context from the actual LLM interaction. This Python SDK implements the full MCP specification, making it easy to:
- Build MCP clients that can connect to any MCP server
- Create MCP servers that expose resources, prompts and tools
- Use standard transports like stdio and SSE
- Handle all MCP protocol messages and lifecycle events
我个人的理解就是,MCP的核心就是,通过一系列手段,帮我们丰富传给模型LLMs的提示词内容。这个手段,包含读取本地文件、提示词、工具之类,其实就是我们在开发的时候,自己写的那些东西,只不过MCP按照统一的模板(抽离方法)进行包装了一层而已。
我们在开发的时候,接收到用户输入的,我们就需要通过代码调用本地文件/提示词,为用户输入的内容添加提示词,然后将内容包装好发给模型,模型根据实际情况判断是否返回要调用的工具链,如果需要调用工具,就返回工具链,然后在我本地调用工具...获取到工具的返回结果后,系统再将整个内容包装一次,再发给模型进行内容生成...。
我个人理解就是,MCP的就是把调用本地文件、提示词、工具,封装成了三个方法我们只需要调用这三个方法---但实际上这三个方法依然需要我们手写/配置。
比如我们要读取本地文件时,只需要传入本地文件路径,MCP就根据该路径读取文件内容并经过统一包装返回该内容。tool、提示词一样....。
注意:我们以Claude的APP为例
用户在app上面输入“1U8等于多少”时,对于大模型来说,用户输入的内容,理论上就是模型输入的内容。 而如果我们企业/研发人员,在本地部署Claude或者调用Claude的API的时候。用户是通过我们第三方app/应用向大模型输入的,此时用户输入“1U8等于多少”,我们的应用后台可能为其添加固定提示词/上下文内容,最后可能就变成了“你是一名人工助手,请根据我提供的上下文或者工具回答下面的问题...;工具:xxxx。内容:....。用户输入:1U8等于多少”。MCP的作用就在于帮助我们企业开发人员通过统一的方法/手段丰富这个上下文/提示词内。
我能想到的MCP的用途,比如我们在使用Claude的APP时,我们输入的内容应该就是直接输入模型的,而我们如果输入的内容在我们本地知识库(或者需要我自己搜索查询的内容),此时我们需要手动去本地知识库查询出相关的内容以后,把这个内容自己手动拼装到app的提示词中,发给Claude模型生成。但是现在有了MCP这个协议以后,只需要配置就可以直接由模型自己调用相关的服务/工具接口获取我们本地知识库内容。只不过这个服务是需要我们自己来开发的。当然还有一种情况就是,由赛博菩萨开发好了以后发布到自己的服务器上,并对外开放公网IP接口,然后大家在本地的Claude的APP上面配置以后,本地Claude会去调用该服务进行内容生成。
友情提示:个人认为这个暂时不便于用于我们自己的应用生产环境,原因如下,官方文档/官方SDK还有很多bug/不足;其次整个技术更新太快,还不稳定;最后就是目前太鸡肋~~~。当然,如果我们想我们的Claude客户端和我们本地知识库这里联合使用的话,还是可以的。
废话了一大篇。下面是我踩的坑。
环境准备
安装uv命令:pip install uv
初始化mcp---工程目录:uv init mcp_dir(这个mcp应该是自己MCP目标项目/工程所在所在目录名称)
执行完成以后会生成如下文件内容“quickstart_server.py”是我自己编写的server服务,不涵盖在内
进入到mcp目录:cd mcp_dir
- 将mcp[cli]添加到uv项目依赖中:uv add "mcp[cli]" --- 相当于使用pip下载,只不过这个是下载到你项目环境的“.venv”目录下 ---- 坑1,最好先使用pip下载,然后再将python环境指为pip,不然在这里很考验网速....
- 或者使用pip安装:pip install "mcp[cli]"
---- 关于mcp[cli]的坑,如果你使用的是pip安装,但是使用uv的时候,依然要使用本地的.venv包下面的依赖,比如“pydantic-core、pydantic、pygments“这三个,如果不存在那么要报错。反正如果要使用uv的话,那么它会默认使用项目本地的.venv环境依赖,必须执行 uv add mcp[cli]。
使用uv运行mcp命令:uv run mcp ---这个mcp应该是mcp服务名称固定的mcp
编写server.py文件
from mcp.server.fastmcp import FastMCP# Create an MCP server
#### 名字最好和文件名称保持一致,不然会报错...
# 网上很多博主都是搬来搬去的mcp = FastMCP("quickstart_server") # 使用与代理匹配的端口@mcp.tool()
def add(a: int, b: int) -> int:"""Add two numbers"""return a + b@mcp.tool()
def multiply(a: int, b: int) -> int:"""两个数相乘"""return a * b
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:"""Get a personalized greeting"""return f"Hello, {name}!"
启动服务
使用Claude Desktop启动
mcp install quickstart_server.py
自定义启动
mcp dev quickstart_server.py
启动成功后就可以访问:http://127.0.0.1:6274
完了以后点击界面的:Connect ---> Tools ---> List Tools 就可以看到我们自己定义的add、multiply这两个工具,点击工具就可以正常使用...
其余的Template、Source都是一样的。
异常处理
报错一:没有安装uv
注意,我们在使用uv的时候,需要好像默认会使用本地项目的.venv环境,而不会使用pip的????这是坑么?不清楚。反正执行了“uv add "mcp[cli]"”就好很多。
安装环境执行pip install uv .....
报错二:路径原因
不知道是哪儿配错了还是怎么,我是按照官方文档一步一步操作的,在这里默认的就是".\"开头的,但是当你真正点击“Connect”的时候,系统就会把“\”给去掉,最终的路径就变成了xxxx/.minixx.py文件,导致系统找不到,此时只需要把".\"去掉就行