2026/2/17 11:49:10
网站建设
项目流程
做唯品客网站的感想,做响应式网站的菜单,网站建设 swot分析,在北京注册公司流程及费用本教学文档基于 FastMCP 2.0 官方文档#xff08;截至 2026 年#xff09;#xff0c;面向 Python 开发者#xff0c;系统介绍如何构建、运行、部署完整的 MCP 服务器。 一、什么是 FastMCP 与 MCP#xff1f;
FastMCP 是构建 模型上下文协议#xff08;MCP#xff09;…本教学文档基于 FastMCP 2.0 官方文档截至 2026 年面向 Python 开发者系统介绍如何构建、运行、部署完整的 MCP 服务器。一、什么是 FastMCP 与 MCPFastMCP是构建模型上下文协议MCP 服务端的标准框架。MCPModel Context Protocol是一种标准化协议用于安全地将 LLM 与工具、数据和交互模板连接起来常被称为“AI 的 USB-C 接口”。MCP 服务器通过三种核心能力扩展 LLM 能力Resources资源只读数据暴露类似 GET 接口供 LLM 读取上下文。Tools工具可执行功能类似 POST 接口可产生副作用如调用 API、执行计算。Prompts提示模板可重用的交互模式官方文档提及但未详述功能细节。FastMCP 2.0是当前活跃维护版本远超基础 MCP SDK提供生产级特性异步支持、企业认证、部署工具、测试框架、OpenAPI 生成等。二、安装 FastMCP推荐安装方式使用uvuv pipinstallfastmcp或使用pippipinstallfastmcp验证安装fastmcp version预期输出FastMCP version: 2.11.3 MCP version: 1.12.4 Python version: 3.12.2 Platform: macOS-15.3.1-arm64-arm-64bit FastMCP root path: ~/Developer/fastmcp⚠️重要提示FastMCP 遵循语义化版本控制但因 MCP 协议快速演进次要版本如 2.3.x → 2.4.0。生产环境必须固定精确版本# ✅ 正确 fastmcp2.11.0 # ❌ 错误可能引入破坏性变更 fastmcp2.11.0三、创建第一个 FastMCP 服务器1. 基础结构创建my_server.pyfromfastmcpimportFastMCP# 创建服务器实例mcpFastMCP(nameMyFirstServer)2. 添加工具Toolmcp.tooldefadd(a:int,b:int)-int:将两个整数相加。returnab3. 添加资源Resourcemcp.resource(data://config)defget_config()-dict:以 JSON 形式提供配置信息。return{version:1.0,theme:dark}4. 完整示例# my_server.pyfromfastmcpimportFastMCP mcpFastMCP(nameDemoServer)mcp.tooldefgreet(name:str)-str:向用户打招呼。returnfHello,{name}!mcp.resource(resource://status)defget_status()-dict:return{status:ok,server:mcp.name}5. 运行服务器方法一脚本直接运行推荐用于开发# 在 my_server.py 末尾添加if__name____main__:mcp.run(stdio)# 本地标准输入输出传统方式# 或 mcp.run(http, port8000) # HTTP 服务运行python my_server.py方法二使用 FastMCP CLI不执行__main__块fastmcp run my_server:mcp--transportstdio# 或fastmcp run my_server:mcp--transporthttp--port8000 提示CLI 模式不会执行if __name__ __main__块而是直接导入mcp对象运行。四、深入工具Tools1. 基础定义使用mcp.tool装饰函数。FastMCP 自动提取工具名 → 函数名描述 → 文档字符串输入架构 → 参数类型注解mcp.tooldefmultiply(x:float,y:float)-float:计算两个数的乘积。returnx*y2. 装饰器参数自定义元数据mcp.tool(namesearch_products,description搜索产品目录支持分类过滤。,tags{catalog,search},meta{version:1.2,team:backend},annotations{title:产品搜索,readOnlyHint:True,openWorldHint:False,idempotentHint:True})defsearch_impl(query:str,category:str|NoneNone)-list[dict]:return[{id:1,name:Sample Product}]支持的注解Annotations注解类型默认值用途titlestr-UI 显示名称readOnlyHintboolFalse是否只读destructiveHintboolTrue是否具破坏性idempotentHintboolFalse是否幂等openWorldHintboolTrue是否与外部系统交互3. 类型注解与参数验证支持广泛类型基本类型int,str,bool,float集合list[str],dict[str, int]可选str | None枚举/字面量Literal[A, B]Pydantic 模型、Path、UUID、datetime参数描述使用AnnotatedfromtypingimportAnnotatedfrompydanticimportFieldmcp.tooldefresize_image(url:Annotated[str,图像URL],width:Annotated[int,Field(ge1,le2000,description目标宽度)])-str:returnresized4. 返回值处理FastMCP 支持传统内容块 结构化输出双模式。自动行为dict/Pydantic/数据类 →自动成为结构化输出int/str/list→仅当有返回类型注解时才生成结构化输出包装为{result: value}完全控制使用ToolResultfromfastmcp.tools.toolimportToolResultfromfastmcp.sdk.typesimportTextContentmcp.tooldefadvanced_tool()-ToolResult:returnToolResult(content[TextContent(typetext,text操作完成)],structured_content{status:success,code:200})5. 异步支持importaiohttpmcp.toolasyncdeffetch_url(url:str)-str:asyncwithaiohttp.ClientSession()assession:asyncwithsession.get(url)asresp:returnawaitresp.text()⚠️ 同步 CPU 密集型任务应使用anyio.to_thread.run_sync()包装以避免阻塞。6. 错误处理普通异常如ValueError默认返回详细错误含堆栈ToolError始终返回客户端可见消息即使启用mask_error_detailsfromfastmcp.exceptionsimportToolErrormcp.tooldefdivide(a:float,b:float)-float:ifb0:raiseToolError(除数不能为零)returna/b全局隐藏敏感错误mcpFastMCP(nameSecureServer,mask_error_detailsTrue)7. 动态管理工具mcp.tooldeftemp_tool():returntemp# 禁用/启用temp_tool.disable()temp_tool.enable()# 移除mcp.remove_tool(temp_tool) 工具状态变更会自动发送notifications/tools/list_changed通知需在请求上下文中。五、深入资源Resources1. 基础动态资源mcp.resource(resource://greeting)defget_greeting()-str:returnHello from FastMCP!2. 自定义元数据mcp.resource(uridata://app-status,nameApplicationStatus,description提供应用当前状态,mime_typeapplication/json,tags{monitoring},meta{team:infra},annotations{readOnlyHint:True,idempotentHint:True})defget_status()-dict:return{uptime:12345}3. 异步资源importaiofilesmcp.resource(file:///logs/app.log,mime_typetext/plain)asyncdefread_log()-str:asyncwithaiofiles.open(/logs/app.log)asf:returnawaitf.read()4. 静态资源类无需函数fromfastmcp.resourcesimportFileResource,TextResource,DirectoryResourcefrompathlibimportPath# 静态文件readmeFileResource(urifile://./README.md,pathPath(./README.md),mime_typetext/markdown)mcp.add_resource(readme)# 预定义文本noticeTextResource(uriresource://notice,text系统维护通知)mcp.add_resource(notice)# 目录列表data_dirDirectoryResource(uriresource://files,pathPath(./data),recursiveFalse)mcp.add_resource(data_dir)5. 资源模板参数化 URI基础模板mcp.resource(weather:// {city} /current)defget_weather(city:str)-dict:return{city:city,temp:22}客户端可请求weather://london/currentweather://tokyo/current多参数 查询参数FastMCP ≥2.13.0mcp.resource(api:// {endpoint} {?version,limit})defcall_api(endpoint:str,version:int1,limit:int10)-dict:return{endpoint:endpoint,version:version,limit:limit}请求示例api://users?version2limit50 FastMCP 自动根据函数类型提示转换查询参数如int、bool。通配符路径FastMCP ≥2.2.4mcp.resource(files://{path*})defget_file_content(path:str)-str:# 匹配 files://src/main.py 或 files://docs/api/v1.mdreturnfContent of{path}6. 上下文访问ContextfromfastmcpimportContextmcp.resource(resource://request-info)asyncdefget_info(ctx:Context)-dict:return{request_id:ctx.request_id}7. 禁用资源mcp.resource(secret://data,enabledFalse)defget_secret():returnhidden# 或动态控制get_secret.disable()get_secret.enable()六、高级服务器配置1. 重复处理策略mcpFastMCP(nameStrictServer,on_duplicate_toolserror,# 工具重复报错on_duplicate_resourcesignore# 资源重复忽略)选项warn默认、error、replace、ignore2. 严格输入验证FastMCP ≥2.13.0mcpFastMCP(StrictServer,strict_input_validationTrue)默认False自动转换10→10严格True拒绝类型不匹配输入3. 安全配置mcpFastMCP(nameSecureServer,mask_error_detailsTrue# 隐藏非 ToolError 的内部错误)七、部署与生产1. 本地测试python my_server.py# 使用 stdio# 或fastmcp run my_server:mcp--transporthttp--port80002. 客户端调用示例# my_client.pyimportasynciofromfastmcp.clientimportClientasyncdefmain():asyncwithClient(http://localhost:8000/mcp)asclient:resultawaitclient.call_tool(greet,nameAlice)print(result)asyncio.run(main())3. 部署到 FastMCP Cloud免费将my_server.py推送到 GitHub登录 FastMCP Cloud创建项目入口点设为my_server.py:mcp获得专属 URLhttps://your-project.fastmcp.app/mcp八、最佳实践总结场景推荐做法版本管理固定fastmcpx.y.z工具返回优先返回dict/Pydantic 模型以启用结构化输出敏感错误使用ToolError或启用mask_error_detailsTrueI/O 操作使用async defCPU 密集型用anyio.to_thread.run_sync()包装参数描述使用Annotated[类型, 描述]动态能力利用disable()/enable()/remove_tool()实现功能开关资源模板用{param}路径参数 {?param}查询参数分离必选/可选