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官网

https://mcpservers.org/

安装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"
    }
  }
}