Python使用FastMCP开发MCP服务端

MCP简介

Model Context Protocol (MCP) 是一个专门为 LLM(大语言模型)应用设计的协议,它允许你构建服务器以安全、标准化的方式向 LLM 应用程序公开数据和功能。FastMCP 作为 Python 生态中的一款轻量级框架,利用装饰器来简化路由与工具函数的开发,帮助开发者快速构建面向工具的服务端应用。
在这里插入图片描述

MCP Server 提供了 3 种核心原语,每种原语都有其特定的用途和特点:

1. Tool(工具)

  • Tool 允许服务器公开可执行的函数,这些函数可由客户端调用并由 LLM 使用来执行操作。Tool 不仅人让 LLM 能从外部获取信息,还能执行写入或操作,为 LLM 提供真正的行动力。
  • 模型控制:Tool 直接暴露给 LLM 可执行函数,让模型可以主动调用。

2. Resource(资源)

  • Resource 表示服务器希望提供给客户端的任何类型的只读数据。这可能包括:文件内容、数据库记录、图片、日志等等。
  • 应用控制:Resource 由客户端或应用管理,用于为 LLM 提供上下文内容。

3. Prompt(提示模板)

  • Prompt 是由服务器定义的可重用的模板,用户可以选择这些模板来引导或标准化与 LLM 的交互过程。例如,Git MCP Server 可以提供一个“生成提交信息”的提示模板,用户可以用它来创建标准化的提交消息。
  • 用户控制:Prompt 通常由用户自行选择。

MCP概述

MCP服务端当前支持两种与客户端的数据通信方式:标准输入输出(stdio) 和 基于Http的服务器推送事件(http sse)

标准输入输出(stdio)

原理: 标准输入输出是一种用于本地通信的传输方式。在这种模式下,MCP 客户端会将服务器程序作为子进程启动,双方通过约定的标准输入和标准输出(可能是通过共享文件等方法)进行数据交换。具体而言,客户端通过标准输入发送请求,服务器通过标准输出返回响应。
适用场景: 标准输入输出方式适用于客户端和服务器在同一台机器上运行的场景(本地自行编写服务端或将别人编写的服务端代码pull到本地执行),确保了高效、低延迟的通信。这种直接的数据传输方式减少了网络延迟和传输开销,适合需要快速响应的本地应用。

基于Http的服务器推送事件(http sse)

原理: 客户端和服务端通过 HTTP 协议进行通信,利用 SSE 实现服务端向客户端的实时数据推送,服务端定义了/see与/messages接口用于推送与接收数据。这里要注意SSE协议和WebSocket协议的区别,SSE协议是单向的,客户端和服务端建立连接后,只能由服务端向客户端进行消息推送。而WebSocket协议客户端和服务端建立连接后,客户端可以通过send向服务端发送数据,并通过onmessage事件接收服务端传过来的数据。

适用场景: 适用于客户端和服务端位于不同物理位置的场景,尤其是对于分布式或远程部署的场景,基于 HTTP 和 SSE 的传输方式更合适。如:Prometheus,MySQL,MongoDB 数据库等等

环境介绍

uv快速构建Python环境

Win打开 powershell 进行安装
参考文档:https://docs.astral.sh/uv/getting-started/installation/#standalone-installer

# On macOS and Linux.
curl -LsSf https://astral.sh/uv/install.sh | sh

# On Windows.
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

# With pip.
pip install uv

安装之后,可以通过uv help命令检查是否安装成功:
在这里插入图片描述

卸载

powershell -c "irm https://astral.sh/uv/install.ps1 | more"

基本使用方法

# 创建项目文件夹、同时初始化并指定python版本
uv init py-app -p 3.11.9
# 创建并激活虚拟环境
uv venv
source .venv/bin/activate

# 退出虚拟环境
deactivate
uv venv --seed  # 强制安装基础包(如pip, setuptools, wheel)

# 同步依赖
uv sync
# 安装 requirements.txt
uv pip install -r requirements.txt

# 安装包(使用清华源)
cd py-app
uv add pandas pillow --default-index "https://pypi.tuna.tsinghua.edu.cn/simple"

# 安装CUDA版的torch(使用南京大学源)
uv pip install torch torchvision torchaudio --index-url https://mirror.nju.edu.cn/pytorch/whl/cu126

# 执行python
uv run app.py

Python版本的安装和管理

# 显示当前已经安装的和可供安装的Python版本
uv python list

# 安装指定的Python版本(注意:安装的Python并非全局可用,在命令行工具中输入Python无反映)
uv python install 3.10 3.11 3.12

# 卸载指定的版本
uv python uninstall 3.10

https://www.cnblogs.com/wang_yb/p/18635441

https://zhuanlan.zhihu.com/p/1888904532131575259

版本推荐

Python 版本: 推荐使用 Python 3.10 及以上版本,以便更好地支持异步函数(async/await) 我的版本:Python 3.14

FastMCP 库: 该库需要通过 pip 或其他方式安装。安装指令如下:

pip install fastmcp

运行方式: 本示例采用标准输入/输出(stdio)作为传输层,可根据实际需求选择其他传输方式,如网络通信等。

实现步骤

下面按照步骤解析如何构建一个简单但功能完备的 MCP 服务端:

stdio

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Demo 🚀")


@mcp.tool()
def add(a: int, b: int) -> int:
    """两个数字相加"""
    return a + b


@mcp.tool()
async def calculate(expression: str) -> str:
    """
    计算一个简单的数学表达式。
    Args:
        expression: 要计算的数学表达式(如"1 + 2")
    Returns:
        str: 计算结果
    """
    try:
        result = eval(expression)
        return f"计算结果: {result}"
    except Exception as e:
        return f"计算错误: {str(e)}"


@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
    """获取个性化问候语"""
    return f"Hello, {name}!"


if __name__ == "__main__":
    mcp.run(transport='stdio')

启动调试:

mcp dev main.py

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

错误报错:

Created web app transport
Created web app transport
Set up MCP proxy
file:///C:/Users/admin/AppData/Local/npm-cache/_npx/5a9d879542beca3a/node_modules/@modelcontextprotocol/sdk/dist/esm/server/sse.js:103
            throw new Error("Not connected");
                  ^

Error: Not connected
    at SSEServerTransport.send (file:///C:/Users/admin/AppData/Local/npm-cache/_npx/5a9d879542beca3a/node_modules/@modelcontextprotocol/sdk/dist/esm/server/sse.js:103:19)
    at Socket.<anonymous> (file:///C:/Users/admin/AppData/Local/npm-cache/_npx/5a9d879542beca3a/node_modules/@modelcontextprotocol/inspector/server/build/index.js:101:33)
    at Socket.emit (node:events:517:28)
    at addChunk (node:internal/streams/readable:368:12)
    at readableAddChunk (node:internal/streams/readable:341:9)
    at Readable.push (node:internal/streams/readable:278:10)
    at Pipe.onStreamRead (node:internal/stream_base_commons:190:23)

解决方案:

npm install -g @modelcontextprotocol/server-filesystem
npm install -g @modelcontextprotocol/server-memory
npm install -g @modelcontextprotocol/server-brave-search

sse模式

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Demo 🚀")


@mcp.tool()
def add(a: int, b: int) -> int:
    """两个数字相加"""
    return a + b


@mcp.tool()
async def calculate(expression: str) -> str:
    """
    计算一个简单的数学表达式。
    Args:
        expression: 要计算的数学表达式(如"1 + 2")
    Returns:
        str: 计算结果
    """
    try:
        result = eval(expression)
        return f"计算结果: {result}"
    except Exception as e:
        return f"计算错误: {str(e)}"


@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
    """获取个性化问候语"""
    return f"Hello, {name}!"


if __name__ == "__main__":
    mcp.run(transport='sse')

FastMCP 中,有几个可以设置 SSE 协议相关的参数:

  • host: 服务地址,默认为 0.0.0.0
  • port: 服务端口,默认为 8000。上述代码中,我设置为 9000
  • sse_path:sse 的路由,默认为 /sse

Vscode-Cline调用

安装Vscode和Cline

在这里插入图片描述

stdio模式调用

{
  "mcpServers": {
    "weather": {
      "command": "uv",
      "args": [
        "--directory",
        "E:\\Code\\Python\\weather",
        "run",
        "main.py"
      ],
      "timeout": 30
    }
  }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

sse模式

在这里插入图片描述

{
  "mcpServers": {
    "weather": {
      "url": "http://192.168.96.19:8000/sse"
    }
  }
}

在这里插入图片描述
在这里插入图片描述

参考文档:
https://github.com/GobinFan/python-mcp-server-client?tab=readme-ov-file

https://www.cnblogs.com/xiao987334176/p/18821197

https://www.cnblogs.com/ryanzheng/p/18781666

https://www.cnblogs.com/xiao987334176/p/18822444

https://www.modb.pro/db/1878984329888542720

https://blog.moontak.com/id/522381/

https://github.com/liaokongVFX/MCP-Chinese-Getting-Started-Guide

https://zhuanlan.zhihu.com/p/28700850694

### Python MCP Server 中 Cursor 的用法 在 Python MCP (Message Communication Protocol) 服务器中,`cursor` 是用于管理数据库查询结果的一个重要对象。它允许开发者通过编程方式执行 SQL 查询并处理返回的数据集[^1]。 以下是 `cursor` 在 Python MCP Server 连接中的典型用法: #### 建立连接与创建游标 首先需要建立到数据库的连接,并从中获取一个 `cursor` 对象。这通常涉及以下几个步骤: - 使用合适的库(如 psycopg2 或 pymysql)来初始化数据库连接。 - 调用连接对象上的 `.cursor()` 方法以获得一个新的游标实例。 ```python import mcp.db as db_module # 假设这是自定义模块或者标准库的一部分 connection = db_module.connect( host="localhost", user="your_username", password="your_password", database="mcp_database" ) cursor = connection.cursor() ``` 上述代码展示了如何设置基本的数据库连接以及创建游标的过程[^3]。 #### 执行查询操作 一旦获得了游标对象,就可以调用其方法来执行各种类型的 SQL 操作,比如 SELECT、INSERT 和 UPDATE 等语句。 对于简单的读取数据场景可以这样实现: ```python query = "SELECT id, name FROM users WHERE active = %s" try: cursor.execute(query, ("true",)) # 参数化查询防止SQL注入攻击 except Exception as e: print(f"An error occurred while executing the query: {e}") else: results = cursor.fetchall() # 获取所有匹配记录 for row in results: print(row) finally: cursor.close() # 关闭游标释放资源 ``` 这里需要注意的是,在实际应用过程中应当始终考虑异常情况的发生,并采取适当措施加以应对[^2]。 #### 更新或删除数据 除了检索之外,还可以利用游标的 execute 函数来进行修改型的操作,例如更新某条特定用户的邮箱地址如下所示: ```python update_query = """UPDATE users SET email=%(email)s WHERE username=%(username)s""" data_to_update = { 'email': 'new.email@example.com', 'username': 'johndoe' } affected_rows_count = None try: affected_rows_count = cursor.execute(update_query, data_to_update) connection.commit() # 提交更改至永久存储介质上 except Exception as err_msg: connection.rollback() # 如果失败则回滚事务状态回到之前的状态 raise RuntimeError('Database update failed') from err_msg print(f"{affected_rows_count} rows were updated.") ``` 此片段说明了当尝试改变表内字段值时应遵循的最佳实践之一——即先测试再确认提交;如果出现问题,则立即撤销所做的任何潜在破坏性的变动。 最后别忘了断开已不再使用的链接以免浪费系统资源! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫乘风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值