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中被启动。

posted @ 2025-08-11 13:44  夏尾草  阅读(10)  评论(0)    收藏  举报