前言
MCP(Model Context Protocol)全称模型上下文协议,是由 Anthropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。
AI工具会朝着两个方向发展:
- 掌握更多的信息
- 控制更多的工具
在没有联网搜索之前,大模型的数据来源只有训练数据的时候以及推理我们告诉他的东西。所以后来的rag、知识库都是让AI掌握更多的信息,而MCP的出现是为了让大模型控制更多的工具,赋予更多能力。
MCP
在 MCP 出现之前,如果大模型需要访问外部数据的时候了,通常使用 Function Calling 的方式。Function Calling 是通过给模型预设函数描述(包括函数名、参数说明、返回值格式等),让模型在合适的时候返回一个符合结构的 JSON 格式,外部系统再解析这个 JSON,调用实际的后端函数。
但 Function Calling 的方式没有一个统一的开发规范,你开发的函数我不能用,我开发的函数你不能用,而且开发起来很麻烦,为了解决这个问题,MCP 出现了。
MCP就是AI大模型的标准化工具箱,大模型可以通过MCP调用外界的AI工具,而AI工具在开发的时候也需要遵循MCP协议。MCP 允许应用程序以标准化方式为 LLM 提供上下文,将提供上下文的问题与实际的 LLM 交互分开
我们本地的数据,例如数据库、github上的代码,需要粘贴给AI工具的对话框中,他们获取到这样的数据。有了MCP之后,可以开发一个 MCP Server 来完成某个特定的功能,例如读取数据库,操作github以及获取当前时间等。
既然 MCP Server 实现了对外部服务端的调用,那么AI工具就要实现 MCP Client 去调用server,将server实现的工具接入进来。目前支持 MCP Client 的AI工具有 cursor、cline、windsuf等。
MCP 服务器可以提供三种主要类型的功能:
- 资源:客户端可以读取的类似文件的数据(例如 API 响应或文件内容)
- 工具:可由 LLM 调用的函数
- 提示:预先编写的模板,帮助用户完成特定任务
目前在网上已经可以找到各种功能的 MCP server。
MCP server 开发
那么,在本地中如何调用MCP,mcp提供了python、java、typescript的SDK,这里我使用 Python 的SDK。Python SDK 实现了完整的 MCP 规范,可轻松实现以下功能:
- 构建可连接到任何 MCP Server 的 MCP Client
- 创建公开资源、提示和工具的 MCP Server
- 使用 stdio 和 SSE 等标准传输
- 处理所有 MCP 协议消息和生命周期事件
1. SDK 安装
这里安装 uv 来管理项目。
curl -LsSf https://astral.sh/uv/install.sh | sh
按照提示,将 $HOME/.local/bin 目录下的 uv、uvx 命令添加到 PATH 中。并使用uv来创建一个新的项目。
# 创建新的项目
uv init mcp-demo
cd mcp-demo
# 创建并激活虚拟环境
uv venv
source .venv/bin/activate
# 安装依赖
uv add "mcp[cli]"
这样一个uv管理的python mcp项目就初始化完成了。当然也可以使用pip来安装mcp的python sdk:
pip install "mcp[cli]"
安装过程中可能会出现包冲突的问题,我这里fastapi和sse-starlette依赖了不同版本的starlette,最后直接将冲突包升级到最新,解决了这个问题。
pip install --upgrade fastapi sse-starlette starlette
这样就完成了python开发MCP Server的SDK安装。
2. MCP Server 开发
这样就开始进行 MCP Server 的开发,通过一段时间学习,我发现* MCP Server 其实就是定义一些函数,让智能体调用*。在函数中可以实现简单逻辑、接口调用和各种操作,并通过注解赋予函数不同的能力。
我们定一个 server.py 文件,并开发一个简单的 MCP Server:
from mcp.server.fastmcp import FastMCP
# 创建 MCP 实例
mcp = FastMCP("Demo")
# 示例工具
@mcp.tool()
def add(a: int, b: int) -> int:
return a + b
# 示例资源
@mcp.resource("greeting://{name}")
def greet(name: str) -> str:
return f"Hello, {name}!"
# 启动服务
if __name__ == "__main__":
print("Starting MCP server...")
mcp.run()
分析上面代码,使用 FastMCP 来初始化一个 MCP Server 实例。我们分别创建了两个函数:
- add:输入两个数字实现累加
- greet:输入字符串,拼接后返回字符串
然后我们通过两个注解,赋予两个函数不同的能力:
- @tool() :函数可以直接被AI调用
- @resource() :像API接口一样被调用,其中的参数 greeting://{name} 是一个自定义的 URI, 可以拆解为两个部分。greeting 是前缀,随便起的,name是动态参数的名称,在访问的时候需要传入。
想要理解这两个注解的具体用法,可以接着往下看。
3. 测试
我们执行下面命令:
mcp dev server.py
安装并启动 MCP Inspector 对 server.py 中的 mcp server 进行调试。
在浏览器中访问 6274 端口就可以访问到 MCP Inspector。我们定义了mcp的tool和resource两种能力,在 MCP Inspector 中分别进行测试。
在 Tools 标签页下,我们可以看到我们定义的 add 累加函数。输入 a、b 两个参数,即可返回结果。
在 Resources 标签页下,可以看到我们定义的资源函数 greet。
我们传入动态参数,mcp server 就会返回 json 格式的响应,并将我们输入的 aqi 拼接后返回。
结语
在本篇文章中,基于 Python 完成了一个简单的 MCP Server 的开发。MCP 让大模型能像调用 API 一样调用函数(tool)和资源(resource),实现更强的插件化和上下文理解能力,增强智能体的交互性和可扩展性。