MCP(Model Context Protocol)全称模型上下文协议,是由 Anthropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。
在 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官网
安装uv
uv官网:https://docs.astral.sh/uv/getting-started/installation/
uv是一个非常快的Python包和项目管理器,用Rust编写,以取代pip, pip-tools, pipx,诗歌,pyenv, twine, virtualenv,等等。比pip快10-100倍。
liunx or mac
curl -LsSf https://astral.sh/uv/install.sh | sh
windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
安装fastmcp
fastmcp官方文档:https://gofastmcp.com/getting-started/installation
初始化新项目
uv init
添加fastmcp及所需依赖到当前虚拟环境
uv add fastmcp
验证fastmcp是否安装成功
在当前项目下执行:
fastmcp version
如出现以下信息则成功,如果有其他以外的错误信息则失败
FastMCP version: 2.3.3
MCP version: 1.8.1
Python version: 3.13.3
Platform: Windows-10-10.0.19045-SP0
FastMCP root path: ~/PycharmProjects\pythonProject\.venv\Lib
mcp server开发
STDIO Transport (Default)
from fastmcp import FastMCP
from datetime import datetime
# 创建 MCP 实例
mcp = FastMCP("time_server",log_level="ERROR")
# 示例工具
@mcp.tool()
def get_time() -> str:
"""
用于获取当前系统时间 格式:yyyy-MM-dd hh:mm:ss
:return: 格式化后的时间 例如:2025-01-01 16:49:00
"""
current_time = datetime.now()
formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
return formatted_time
# 启动服务
if __name__ == "__main__":
print("Starting MCP server...")
mcp.run()
SSE Transport (Server-Sent Events)
from fastmcp import FastMCP
from datetime import datetime
# 创建 MCP 实例
mcp = FastMCP("time_server",log_level="ERROR")
# 示例工具
@mcp.tool()
def get_time() -> str:
"""
用于获取当前系统时间 格式:yyyy-MM-dd hh:mm:ss
:return: 格式化后的时间 例如:2025-01-01 16:49:00
"""
current_time = datetime.now()
formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
return formatted_time
# 启动服务
if __name__ == "__main__":
print("Starting MCP server...")
mcp.run(transport="sse", host="127.0.0.1", port=9000)
Streamable HTTP
2025 年 3 月 26 日,模型上下文协议(Model Context Protocol,简称 MCP)引入了一项关键更新:用 Streamable HTTP 替代原先的 HTTP + SSE 作为默认传输方式。
这一变更在解决原有方案中连接不可恢复、服务端长连接压力大等问题的同时,依然保留了 SSE 带来的流式响应优势。
fastmcp从2.3.0版本开始支持Streamable HTTP。
from fastmcp import FastMCP
from datetime import datetime
# 创建 MCP 实例
mcp = FastMCP("time_server",log_level="ERROR")
# 示例工具
@mcp.tool()
def get_time() -> str:
"""
用于获取当前系统时间 格式:yyyy-MM-dd hh:mm:ss
:return: 格式化后的时间 例如:2025-01-01 16:49:00
"""
current_time = datetime.now()
formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
return formatted_time
# 启动服务
if __name__ == "__main__":
print("Starting MCP server...")
mcp.run(transport="streamable-http", host="127.0.0.1", port=9000)
注意事项
log_level=”ERROR”这段代码不添加的话 客户端连接mcp server时会输出info日志,会导致看起来存在异常
测试运行
uv --directory /Users/luoqing/PycharmProjects/pythonProject run main.py
如果是sse连接方式,则可以通过浏览器访问:http://127.0.0.1:9000/sse
如果输出如下内容则表示运行成功
event: endpoint
data: /messages/?session_id=5e12606243284e1ca0fd6833b0c83d53
如果是Streamable HTTP连接方式,可以访问:http://127.0.0.1:9000/mcp
cline连接到mcp server
STDIO Transport (Default)
在/Users/luoqing/Library/Application Support/Code/User/globalStorage/hybridtalentcomputing.cline-chinese/settings/cline_mcp_settings.json中添加如下配置
{
"mcpServers": {
"time_server": {
"command": "uv",
"args": [
"--directory",
"/Users/luoqing/PycharmProjects/pythonProject",
"run",
"main.py"
],
"autoApprove": [
"get_time"
]
}
}
}
SSE Transport (Server-Sent Events)
{
"mcpServers": {
"time_server": {
"url": "http://127.0.0.1:9000/sse",
"disabled": false,
"autoApprove": [
"get_time"
]
}
}
}
Cherry Studio连接到mcp server
由于cline对于Streamable HTTP协议目前还不支持,所以我们使用Cherry Studio来进行测试。官网地址:https://www.cherry-ai.com/
{
"mcpServers": {
"LfWyd86H5zPbxmogdi5I8": {
"name": "MCP 服务器",
"type": "streamableHttp",
"description": "",
"isActive": true,
"baseUrl": "http://127.0.0.1:9000/mcp"
}
}
}