当前位置: 首页 > article >正文

别再当黑匣子用了!手把手教你用FastMCP的tool()、resource()和prompt()装饰器,从源码理解到实战避坑

FastMCP装饰器深度解析从tool()到prompt()的实战进阶指南1. 为什么需要理解装饰器内部机制在Python开发领域装饰器(Decorator)是一种强大的元编程工具而FastMCP框架中的tool()、resource()和prompt()装饰器更是将这一理念发挥到了极致。许多开发者虽然能够使用这些装饰器完成基础功能但当遇到以下场景时就会陷入困境参数类型注解与实际传入类型不符时的处理逻辑动态URI模板与函数参数的匹配规则返回值的自动转换机制边界装饰器嵌套时的执行顺序问题理解这些装饰器的工作原理不仅能帮助开发者规避常见陷阱更能释放FastMCP框架的全部潜力。下面我们通过一个典型问题场景切入mcp.tool() def process_data(input: dict[str, int]) - list[float]: # 当input包含非int值时会发生什么 return [float(v) for v in input.values()]2. tool()装饰器的核心机制剖析2.1 元数据提取流程mcp.tool()装饰器的核心任务是将普通函数转化为MCP工具其处理流程可分为四个关键阶段函数签名解析通过inspect.signature获取参数类型注解参数模型生成基于Pydantic创建参数验证模型返回类型处理根据返回注解决定结构化输出方式工具注册将处理后的函数注册到工具管理器# 参数模型生成伪代码 def create_arg_model(func): sig inspect.signature(func) fields {} for name, param in sig.parameters.items(): field_type param.annotation if param.annotation ! inspect.Parameter.empty else Any fields[name] (field_type, Field(...)) return create_model(f{func.__name__}Arguments, **fields)2.2 类型系统的边界处理FastMCP对类型注解的处理遵循以下规则注解类型处理方式典型场景基础类型直接验证str,int,bool等复合类型递归验证list[int],dict[str, float]等Pydantic模型直接使用自定义的BaseModel子类未注解参数视为Any无类型提示的参数Optional类型允许NoneOptional[str]或str注意当实际参数与声明类型不符时FastMCP会尝试强制类型转换无法转换时将抛出ValidationError2.3 结构化输出的三种模式根据函数返回类型注解的不同tool()会产生不同的输出结构原始输出模式无注解或structured_outputFalsemcp.tool(structured_outputFalse) def greet(name: str) - str: return fHello, {name}自动包装模式基础类型注解mcp.tool() # 自动包装为{result: value} def calculate(x: int, y: int) - float: return x / y直接模型输出返回Pydantic模型class ResultModel(BaseModel): value: float unit: str mcp.tool() def measure() - ResultModel: return ResultModel(value3.14, unitcm)3. resource()装饰器的URI魔法3.1 静态资源与动态模板mcp.resource()的核心价值在于URI处理它支持两种资源定义方式静态资源mcp.resource(resource://config) def get_config(): return {version: 1.0.0}动态模板mcp.resource(resource://user/{user_id}/profile) def get_profile(user_id: str): return fetch_user_profile(user_id)关键区别在于特性静态资源动态模板URI格式固定字符串含{}占位符参数来源无参数函数URI匹配函数参数注册方式直接注册生成模板后注册访问方式直接GET请求需提供参数值3.2 参数绑定机制动态URI模板与函数参数的绑定遵循严格规则URI中的占位符名称必须与函数参数名完全匹配所有函数参数都必须在URI中有对应占位符类型注解用于请求参数的预处理常见错误示例# 错误URI缺少region参数 mcp.resource(resource://weather/{city}) def get_weather(city: str, region: str): ... # 错误参数名不匹配 mcp.resource(resource://product/{prod_id}) def get_product(product_id: int): ...4. prompt()装饰器的消息转换艺术4.1 自动消息转换规则mcp.prompt()最强大的特性是灵活的返回值处理其转换逻辑如下graph TD A[函数返回值] -- B{是否为list/tuple?} B --|是| C[遍历处理每个元素] B --|否| D[包装为单元素列表] C -- E{元素类型判断} E --|Message实例| F[直接使用] E --|字典类型| G[验证为User/AssistantMessage] E --|字符串| H[转换为UserMessage] E --|其他类型| I[JSON序列化后转换]4.2 实战模式对比模式1直接返回消息字典mcp.prompt() def system_prompt() - list: return [ {role: system, content: 你是有帮助的AI助手}, {role: user, content: 请介绍FastMCP} ]模式2返回字符串自动转换mcp.prompt() def welcome_prompt(username: str) - str: return f欢迎{username}有什么可以帮您模式3混合返回类型mcp.prompt() def complex_prompt() - list: return [ 第一部分文本, {role: assistant, content: 预置回复}, CustomMessage(content自定义内容) ]5. 调试技巧与性能优化5.1 使用func_metadata调试FastMCP提供的调试工具可清晰展示装饰器内部处理结果from mcp.server.fastmcp.utilities import func_metadata def example(a: int, b: str test) - float: pass meta func_metadata(example) print(meta.arg_model.model_json_schema())输出示例{ title: exampleArguments, type: object, properties: { a: {title: A, type: integer}, b: {title: B, type: string, default: test} }, required: [a] }5.2 性能优化建议避免频繁装饰在循环外部装饰函数合理使用缓存对纯函数使用functools.lru_cache类型注解优化尽量使用基础类型而非复杂嵌套批量注册工具使用mcp.add_tools()替代多个装饰器# 不推荐 for i in range(100): mcp.tool() def temp_func(x): return x * i # 推荐 def create_tool(i): functools.lru_cache mcp.tool() def optimized_func(x: int) - int: return x * i return optimized_func tools [create_tool(i) for i in range(100)] mcp.add_tools(tools)6. 高级模式与自定义扩展6.1 自定义装饰器链可以组合多个装饰器实现更复杂的功能def validate_input(*validators): def decorator(func): functools.wraps(func) def wrapper(*args, **kwargs): for v in validators: v(*args, **kwargs) return func(*args, **kwargs) return wrapper return decorator mcp.tool() validate_input(lambda x: x 0, lambda y: y ! ) def process(x: int, y: str) - dict: return {x: x, y: y}6.2 修改默认行为通过继承Tool类可以覆盖默认处理逻辑class CustomTool(mcp.Tool): classmethod def from_function(cls, fn, **kwargs): tool super().from_function(fn, **kwargs) tool.extra_info Custom processing return tool mcp.tool_manager.tool_class CustomTool7. 常见问题解决方案7.1 参数类型不匹配问题现象mcp.tool() def add(a: int, b: int) - int: return a b # 调用时传递字符串参数解决方案前端增加类型校验使用Union类型注解添加自定义转换逻辑mcp.tool() def safe_add(a: Union[int, str], b: Union[int, str]) - int: return int(a) int(b)7.2 URI参数冲突问题现象mcp.resource(resource://{name}/{id}) def get_item(name: str, id: str, version: int): ...解决方案将额外参数改为查询参数修改URI模板包含所有参数使用POST方法传递参数mcp.resource(resource://{name}/{id}?version{version}) def get_item(name: str, id: str, version: int): ...8. 最佳实践总结经过对FastMCP装饰器的深度分析我们总结出以下黄金法则类型注解即文档始终为重要函数添加完整类型提示保持URI简洁动态资源参数不超过3个为佳消息结构一致prompt返回保持统一消息格式早发现早处理在装饰阶段暴露问题而非运行时合理分层将核心逻辑与MCP装饰器分离最后分享一个综合应用所有知识点的示例class DataModel(BaseModel): values: list[float] stats: dict[str, float] mcp.tool() def analyze_dataset( dataset: list[dict], algorithm: Literal[svm, tree, nn] svm ) - DataModel: 数据集分析工具 :param dataset: 待分析数据集每行代表一个样本 :param algorithm: 使用的分析算法 :return: 包含分析结果的数据模型 # 实现细节省略... return DataModel(...) mcp.resource(resource://analysis/{job_id}) def get_analysis_result(job_id: UUID) - DataModel: 获取异步分析结果 return query_async_result(job_id) mcp.prompt() def analysis_instructions(dataset_desc: str) - list: return [ {role: system, content: 你是有经验的数据分析师}, {role: user, content: f请分析此数据集{dataset_desc}} ]

相关文章:

别再当黑匣子用了!手把手教你用FastMCP的tool()、resource()和prompt()装饰器,从源码理解到实战避坑

FastMCP装饰器深度解析:从tool()到prompt()的实战进阶指南 1. 为什么需要理解装饰器内部机制? 在Python开发领域,装饰器(Decorator)是一种强大的元编程工具,而FastMCP框架中的tool()、resource()和prompt()装饰器更是将这一理念发…...

RexUniNLU新手入门指南:3步搞定智能家居、金融、医疗场景意图识别

RexUniNLU新手入门指南:3步搞定智能家居、金融、医疗场景意图识别 1. 认识RexUniNLU:零样本意图识别利器 RexUniNLU是一款基于Siamese-UIE架构的轻量级自然语言理解框架,它能让你无需准备标注数据,仅通过简单的标签定义就能完成…...

突破性Unity游戏插件框架实战指南:BepInEx从零到精通的完全手册

突破性Unity游戏插件框架实战指南:BepInEx从零到精通的完全手册 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款专为Unity游戏设计的革命性插件框架&…...

iStore增强插件:从网络优化到智能家居,一站式解决家庭与极客的哪些核心痛点?

1. iStore增强插件:家庭网络优化的全能助手 家里WiFi信号时好时坏?孩子上网课总卡顿?智能设备频繁掉线?这些问题可能困扰过很多家庭用户。iStore增强插件就像给路由器装上了"涡轮增压",它能从多个维度提升家…...

Go语言中的并发模式:从WaitGroup到errgroup

Go语言中的并发模式:从WaitGroup到errgroup 作为一个写了十几年代码的Go后端老兵,我深刻体会到并发编程的重要性。Go语言以其简洁的并发模型著称,通过goroutine和channel,我们可以轻松实现高效的并发程序。今天咱们就聊聊Go语言中…...

RPCS3游戏汉化实战指南:从零构建多语言游戏体验

RPCS3游戏汉化实战指南:从零构建多语言游戏体验 【免费下载链接】rpcs3 PS3 emulator/debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 还在为PS3经典游戏的日文界面而困扰吗?通过RPCS3模拟器的强大补丁系统,您可以…...

FlowState Lab创意作品展:从音乐旋律到光影变化的波动艺术

FlowState Lab创意作品展:从音乐旋律到光影变化的波动艺术 1. 波动艺术的新维度 当数据不再只是冰冷的数字,而是化作跳动的音符、流动的光影和变幻的图形,这就是FlowState Lab带来的创意革命。我们最近完成了一系列跨媒介艺术实验&#xff…...

nli-distilroberta-base在数据库智能查询中的应用:自然语言转SQL实战

nli-distilroberta-base在数据库智能查询中的应用:自然语言转SQL实战 1. 引言:当自然语言遇上数据库查询 "帮我找出上个月销售额超过10万的产品"——这样的需求如果能让数据库直接理解该多好?传统SQL查询需要专业技术人员编写复杂…...

Linux服务器无GPU也能跑!Ollama部署DeepSeek-R1模型存储路径自定义与性能调优指南

Linux服务器无GPU高效部署DeepSeek-R1模型全攻略:从存储路径优化到性能调优 当你在云服务器或老旧设备上尝试运行AI模型时,是否经常遇到存储空间不足或性能低下的困扰?本文将带你深入探索如何在无GPU的Linux环境中,通过Ollama高效…...

别再只盯着ONNX了!用PNNX把PyTorch模型轻松转成ncnn格式(安卓部署实战)

深度学习模型安卓部署实战:PNNX与ONNX转换工具深度对比 在移动端部署深度学习模型时,模型转换环节往往是开发者遇到的第一个技术瓶颈。许多团队习惯性地选择ONNX作为中间格式,却忽视了更高效的替代方案。本文将带您深入探索PNNX这一专为PyTor…...

nRF52832上电启动全解析:从MBR到Bootloader的跳转机制与寄存器配置

nRF52832上电启动全解析:从MBR到Bootloader的跳转机制与寄存器配置 当nRF52832芯片通电瞬间,一场精密的硬件芭蕾在微秒级时间内悄然上演。这颗蓝牙低功耗SoC的启动流程远非简单的"通电即运行",而是涉及存储器分区、寄存器配置和多重…...

Sparse Sinkhorn Attention:点云处理中的高效全局注意力机制

1. 什么是Sparse Sinkhorn Attention? 如果你玩过乐高积木,应该知道把一堆零散的积木块拼成完整模型的过程。点云数据处理就像这个拼积木的过程——我们需要从成千上万个三维坐标点中识别出物体的结构和特征。传统方法就像只用相邻积木块拼装&#xff0c…...

OpenPose终极指南:10分钟掌握人体姿态估计核心技术

OpenPose终极指南:10分钟掌握人体姿态估计核心技术 【免费下载链接】openpose 项目地址: https://gitcode.com/gh_mirrors/op/openpose 想要快速搭建专业级的人体姿态识别系统吗?OpenPose作为业界领先的开源姿态估计库,能够实时检测图…...

告别官方驱动:深入解读ES7210寄存器,打造你自己的ESP32音频采集库

告别官方驱动:深入解读ES7210寄存器,打造你自己的ESP32音频采集库 在嵌入式音频开发领域,ES7210作为一款高性能多通道麦克风ADC芯片,因其出色的信噪比和灵活的配置选项,成为ESP32平台上音频采集的热门选择。然而&#…...

探索式学习:UMA模型在水分解催化中的应用指南

探索式学习:UMA模型在水分解催化中的应用指南 【免费下载链接】ocp Open Catalyst Projects library of machine learning methods for catalysis 项目地址: https://gitcode.com/GitHub_Trending/oc/ocp 突破传统计算瓶颈:UMA模型的核心价值解析…...

OpenClaw+nanobot自动化测试:24小时监控网站可用性

OpenClawnanobot自动化测试:24小时监控网站可用性 1. 为什么需要自动化网站监控 作为个人站长,我经常遇到这样的困扰:半夜网站突然宕机,直到第二天收到用户反馈才发现问题。传统监控方案要么价格昂贵,要么配置复杂&a…...

从零开始:3小时掌握Arduino ESP32开发板完整安装与配置指南 [特殊字符]

从零开始:3小时掌握Arduino ESP32开发板完整安装与配置指南 🚀 【免费下载链接】arduino-esp32 Arduino core for the ESP32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 想要快速上手ESP32物联网开发吗?无论你是…...

智能配置引擎如何攻克AMD黑苹果的三大技术壁垒

智能配置引擎如何攻克AMD黑苹果的三大技术壁垒 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在黑苹果领域,AMD平台曾被视为技术禁区&…...

StructBERT文本相似度模型在互联网内容治理中的应用:重复与低质内容识别

StructBERT文本相似度模型在互联网内容治理中的应用:重复与低质内容识别 你有没有遇到过这样的情况?打开一个内容平台,满屏都是大同小异的文章,或者点开几篇帖子,发现内容似曾相识,只是换了几个词。对于平…...

解决B站视频收藏难题的8K超清下载解决方案:Bilidown全解析

解决B站视频收藏难题的8K超清下载解决方案:Bilidown全解析 【免费下载链接】bilidown 哔哩哔哩视频解析下载工具,支持 8K 视频、Hi-Res 音频、杜比视界下载、批量解析,可扫码登录,常驻托盘。 项目地址: https://gitcode.com/gh_…...

Notepad--终极指南:5分钟掌握国产跨平台文本编辑器的完整解决方案

Notepad--终极指南:5分钟掌握国产跨平台文本编辑器的完整解决方案 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-…...

Cataclysm: Dark Days Ahead - 在末日废土中生存的终极指南

Cataclysm: Dark Days Ahead - 在末日废土中生存的终极指南 【免费下载链接】Cataclysm-DDA Cataclysm - Dark Days Ahead. A turn-based survival game set in a post-apocalyptic world. 项目地址: https://gitcode.com/GitHub_Trending/ca/Cataclysm-DDA 欢迎来到Cat…...

如何高效解决Calibre中文路径翻译问题:完整实用指南

如何高效解决Calibre中文路径翻译问题:完整实用指南 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文)命名 项目地址: htt…...

从Proteus仿真到普中开发板烧录:51单片机抢答器完整开发流程避坑指南

从Proteus仿真到普中开发板烧录:51单片机抢答器完整开发流程避坑指南 在电子设计的学习道路上,51单片机项目开发是一个经典的入门实践。抢答器作为典型的互动式电子系统,涵盖了输入检测、逻辑控制、显示输出等核心知识点,是检验学…...

别只把Text2SQL当玩具:结合Spring AI与DeepSeek,我们这样用它优化了内部报表系统

别只把Text2SQL当玩具:结合Spring AI与DeepSeek,我们这样用它优化了内部报表系统 当业务团队每天提出十几个动态报表需求时,传统开发模式就像用勺子舀干涸的井水——我们团队曾连续三个月被SQL编写和接口开发压得喘不过气。直到将Text2SQL技术…...

Hunyuan3D-2:AI驱动3D创作的4大技术突破

Hunyuan3D-2:AI驱动3D创作的4大技术突破 【免费下载链接】Hunyuan3D-2 High-Resolution 3D Assets Generation with Large Scale Hunyuan3D Diffusion Models. 项目地址: https://gitcode.com/GitHub_Trending/hu/Hunyuan3D-2 Hunyuan3D-2是一款基于大规模扩…...

实战指南:如何用PyMC实现贝叶斯分位数回归解决业务预测难题

实战指南:如何用PyMC实现贝叶斯分位数回归解决业务预测难题 【免费下载链接】pymc Python 中的贝叶斯建模和概率编程。 项目地址: https://gitcode.com/GitHub_Trending/py/pymc 你是否曾面临这样的困境:使用传统线性回归预测客户流失率&#xff…...

告别SD卡!用ADB在Windows PowerShell里给开发板传文件,保姆级避坑指南

告别SD卡!用ADB在Windows PowerShell里给开发板传文件,保姆级避坑指南 嵌入式开发中,文件传输一直是个高频痛点。每次修改代码后,传统方式要么拔出SD卡用读卡器拷贝,要么搭建FTP/NFS网络共享,不仅步骤繁琐…...

RWKV7-1.5B-g1a开源模型优势:无依赖离线加载+低维护成本

RWKV7-1.5B-g1a开源模型优势:无依赖离线加载低维护成本 1. 模型简介 rwkv7-1.5B-g1a 是基于新一代 RWKV-7 架构的开源文本生成模型,专为轻量级应用场景设计。这个1.5B参数的模型在多语言处理上表现出色,特别适合以下场景: 基础问…...

3分钟,零代码!让Arduino看懂你的手势——Teachable Machine硬件魔法揭秘

3分钟,零代码!让Arduino看懂你的手势——Teachable Machine硬件魔法揭秘 【免费下载链接】teachablemachine-community Example code snippets and machine learning code for Teachable Machine 项目地址: https://gitcode.com/gh_mirrors/te/teachab…...