mcp介绍与mcp server开发(with python)
mcp是什么
MCP 是一套轻量级的消息控制协议,旨在统一客户端与服务端之间的通信规范。
对于mcp的作用,可以这么理解:
假设现在有个神秘的开发者Mike Mirzayanov,他有一个刷题网页codeforces,但是现在出现了一个特别严重的问题,他的网站的题目数量已经十分多了,甚至有几百万!其中有很多题目的质量都不太高,现在他添加了一款大模型,用来给网站的使用者筛选题目。
那么可能的流程是这样的:
- 用户问大模型:给我来一份新手提单吧
- 大模型分析了问题,认为需要获取提单信息,于是找到了有相应描述的mcp
- 找到了mcp进行了调用(可能筛选了过题率高和过题数量比较多的题目),返回了题目信息
- 然后再对这些信息进行分析
- 最后返回给了用户一系列信息
可以看到mcp只是大模型获取外部信息的一个手段,对此官方如下所说:

mcp通信的过程

mcp 三种传输协议
- stdio:本地传输,要求客户端和服务端在一台机子上
- http:就是暴露接口
- sse:官方标记过时


如何搭建一个mcp server
这里以官方文档为例子https://modelcontextprotocol.io/quickstart/server#python
其中我以py为例子
前提条件:
- py需要3.10以上
- python mcp sdk 1.20以上版本
安装环境uv:
curl -LsSf https://astral.sh/uv/install.sh | sh
创建一个项目:
#创建一个项目,并进行初始化
uv init weather
cd weather
#创建虚拟环境并且隔离环境
uv venv
source .venv/bin/activate
# 添加依赖,如果有别的依赖需要添加也以此方法添加
uv add "mcp[cli]" httpx
# 创建文件可有可无,手动更方便
touch weather.py
三种方式
stdio
这是一种客户端和服务端都在本地的方式
from mcp.server.fastmcp import FastMCP
from datetime import datetime
mcp = FastMCP("TestMcp") # 这个Demo就是MCP Server的名字
@mcp.tool()//添加这个的才是agent真实调用的方法
def get_current_time():
"""
获取当前时间的函数,输出格式为{"time": YYYY-MM-DD HH:MM:SS}。
参数:
无
返回:
字典,包含当前时间的字符串表示。
"""
# 获取当前日期和时间
now = datetime.now()
# 将日期和时间格式化为字符串
formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
# 创建包含当前时间的字典
current_time = {"time": formatted_time}
return current_time
if __name__ == "__main__":
mcp.run(transport='stdio')//具体用什么方法只需要在这里写就行
sse
from datetime import datetime
from fastmcp import FastMCP # 注意包名 fastmcp,而非 mcp.server.fastmcp
mcp = FastMCP("TestMcp")
@mcp.tool()
def get_current_time() -> dict[str, str]:
return {"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
if __name__ == "__main__":
mcp.run(
transport="sse", # ⭐ 切换到 SSE
host="0.0.0.0", # 可选,默认 127.0.0.1
port=9000, # 可选,默认 8000
path="/sse" # 可选,默认 /sse
)
http
import json
from datetime import datetime
import requests
from fastmcp import FastMCP
mcp = FastMCP("Demo 🚀")
@mcp.tool()
def get_time():
"""
获取当前时间的函数,输出格式为{"time": YYYY-MM-DD HH:MM:SS}。
参数:
无
返回:
字典,包含当前时间的字符串表示。
"""
# 获取当前日期和时间
now = datetime.now()
# 将日期和时间格式化为字符串
formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
# 创建包含当前时间的字典
current_time = {"time": formatted_time}
return current_time
if __name__ == "__main__":
# mcp.run()
mcp.run(transport="streamable-http",
host="0.0.0.0", port=9000, path="/mcp")//唯一需要改动的地方
在cherry studio中的调试
点击左边最底下的设置

自己找一个模型源,我这里找的是阿里的,新用户有一定的免费额度

找到最左边的mcp设置

点右上角添加服务器,然后点快速创建
如果是stdio的类型的话,需要在命令里填uv,在参数里填
--directory
/Users/mobvista/Desktop/demo/mcp_demo/mcp_demo//路径
run
weather.py//具体的文件
注意这个参数中不能有空格,任何参数都要换行,但凡不小心在某一行后面加了一个空格都无法成功运行。
关于参数为什么要这么写,一是因为stdio是一种本地的方式他保证了安全性,客户端直接找到文件的位置,在需要的时候直接运行不需要一直开启端口保持文件一直运行,二是因为调用的时候的实际运行命令是:uv --directory <文件路径> run <具体文件>
如果是sse或者http的话只需要填写一个url的位置并且将程序保持运行才能在cherry中被启动。

浙公网安备 33010602011771号