Python使用FastMCP开发MCP服务端

article/2025/8/24 14:50:56

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 FastMCPmcp = 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:103throw new Error("Not connected");^Error: Not connectedat 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 FastMCPmcp = 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


http://www.hkcw.cn/article/YaSVAoOXui.shtml

相关文章

【科研绘图系列】R语言绘制GO term 富集分析图(enrichment barplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图code 2code 3系统信息介绍 本文介绍了使用R语言绘制GO富集分析条形图的方法。通过加载ggplot2等R包,对GO term数据进行预处理,包括p值转换…

利用Flask来实现留言板的基本操作

留言板开发 一、相关技术介绍 本项目基于现代Web开发技术栈构建&#xff0c;采用Python 3.12作为后端开发语言&#xff0c;搭配轻量级Flask 2.3.2框架实现核心功能。数据库层使用Flask-SQLAlchemy ORM框架操作MySQL 8.0数据库&#xff0c;通过对象关系映射简化数据操作。用户…

vue3: tmap (腾讯地图)using typescript

项目结构&#xff1a; <!--* ___-_ _-___* _--^^^#####// \\#####^^^--_* _-^##########// ( ) \\##########^-_* -############// |\^^/| \\############-* _/############// (::) \############\_* …

【Linux】线程概念

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲Linux——线程概念&#xff1a; 线程的基本概念线程的优缺点线程与进程 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&am…

技术文档撰写指南:从结构到细节的全流程解析

在技术领域&#xff0c;一份优质的技术文档不仅是项目成果的载体&#xff0c;更是技术思想的可视化表达。本文结合《汽车导航系统电路设计及故障分析》课程设计说明书&#xff0c;拆解技术文档的核心要素&#xff0c;提供可复用的撰写范式&#xff0c;助力技术内容高效传播。 …

如何用AI设计海报,DeepSeek+即梦免费批量生成

大家好&#xff0c;这里是K姐。 一个帮助你把AI真正用起来的女子。 佳节将至&#xff0c;还在为节日海报而苦恼吗&#xff1f; 520刚过&#xff0c;端午节、六一儿童节、618就接踵而至&#xff0c;满街满屏的海报让人眼花缭乱。 做自媒体电商以及实体店的小伙伴现在已经一个…

全国一体化算力体系建设:破解算力困局,赋能数字经济新未来​

在数字经济蓬勃发展的当下&#xff0c;算力作为核心生产力&#xff0c;正面临着前所未有的挑战与机遇。从 GPT3.5 到 GPT4 的升级&#xff0c;算力需求呈现跳跃式增长&#xff0c;需要至少提高 3 到 5 倍的算力&#xff0c;国内算力供应出现断层&#xff0c;难以满足当前需求。…

window安装nginx

步骤1&#xff1a;下载Nginx for Windows​ 访问Nginx官网下载页面&#xff1a;https://nginx.org/en/download.html 在​​Stable version​​&#xff08;稳定版&#xff09;下找到Windows版本&#xff0c;点击下载.zip文件&#xff08;如 nginx-1.28.0.zip&#xff09; 步…

秋招Day11 - JVM - 垃圾回收

讲讲JVM的垃圾回收机制 垃圾回收是指JVM对内存中已经死亡的&#xff0c;不再使用的对象进行清除或回收。 常见的垃圾回收算法有标记-复制&#xff0c;标记-整理&#xff0c;标记-清除&#xff0c;分代收集算法等 一般的垃圾回收。过程是先使用可达性分析算法得出内存中哪些对…

Deepseek应用技巧-Dify安装和踩坑指南

前言&#xff1a;Dify的名号是非常大的&#xff0c;作为私有化AI部署中必不可少的一个组件&#xff0c;他的功能和COZE十分相似&#xff0c;可以进行工作流和智能体的搭建&#xff0c;有非常强大的功能&#xff0c;那本节就将来揭开Dify的神秘的面纱&#xff0c;首先看一下Dify…

[python] argparse怎么指定bool类型?

前述 最近在写脚本的时候想要实现一个if 操作&#xff0c;通过用户输入。确定要不要启用某个语句。 非常自然的就是使用python的argparse包&#xff0c;但是发现了一个陷阱&#xff0c;记录下。 陷阱 argparse.ArgumentParser() 可以指定输入类型&#xff0c;我可以设定为bo…

尚硅谷redis7 86 redis集群分片之3主3从集群搭建

86 redis集群分片之3主集群搭建 3主3从redis集群配置 找3台真实虚拟机,各自新建 mķdir -p /myredis/cluster 新建6个独立的redis实例服务 IP:192.168.111.175端口6381/端口6382 vim /myredis/cluster/redisCluster6381.conf bind 0.0.0.0 daemonize yes protected-mode no …

交集、差集、反选

1.交集&#xff1a;两个ROI相交的部分 dev_open_window (0, 0, 512, 512, black, WindowHandle) read_image (Image, clip) threshold (Image, Region, 0, 128) * 交集 intersection (Circle1, Circle2, RegionIntersection) 最终效果如下图所示&#xff1a; 2.差集&#xff1a…

Flutter GridView网格组件

目录 常用属性 GridView使用配置 GridView.count使用 GridView.extent使用 GridView.count Container 实现列表 GridView.extent Container 实现列表 GridView.builder使用 GridView网格布局在实际项目中用的也是非常多的&#xff0c;当我们想让可以滚动的元素使用矩阵…

The 2020 ICPC Asia Yinchuan Regional Programming Contest

A. Best Player 关于投影到坐标轴上&#xff0c;投影到x轴上&#xff0c;确实如果两个点的y值一样&#xff0c;会导致重影&#xff0c;但不能只看只看y轴的影响&#xff0c;还有要注意输出。 #include<bits/stdc.h> using namespace std; typedef long long ll; const l…

寄存器模型

8.layering sequence &#xff08;1&#xff09;概述 转化&#xff1a;高抽象级item&#xff0c;中间的sequence&#xff0c;低抽象级item。 &#xff08;2&#xff09;寄存器模型的示意图 &#xff08;3&#xff09;示例代码&#xff1a;bus packet sequence &#xff08;4&…

Python训练营打卡Day39

DAY 39 图像数据与显存 知识点回顾 1.图像数据的格式&#xff1a;灰度和彩色数据 2.模型的定义 3.显存占用的4种地方 a.模型参数梯度参数 b.优化器参数 c.数据批量所占显存 d.神经元输出中间状态 4.batchisize和训练的关系 作业&#xff1a;今日代码较少&#xff0c;理解内容…

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月29日第92弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀6-8个和值&#xff0c;可以做到100-300注左右。 (1)定…

【AI智能体】Coze 插件从使用到实战详解

目录 一、前言 二、Coze 插件介绍 2.1 什么是插件 2.1.1 插件主要功能 2.1.2 coze 插件常用类型 2.1.3 coze 插件优势 2.2 插件与工具 2.3 插件费用说明 2.4 使用限制 2.5 权限说明 2.6 coze添加插件入口 三、Coze插件创建与使用 3.1 前置准备 3.1.1 查看api列表 …

python实现一个示波器仿真,可以改参数同步效果

代码 import sys import numpy as np import matplotlib.pyplot as plt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar from matplotlib.an…