Model Context Protocol(MCP,模型上下文协议)彻底改变了大语言模型(LLM)与外部工具、数据源和服务的交互方式。但传统上,从零搭建 MCP 服务端需要处理大量复杂的样板代码,还要吃透协议规范。FastMCP 扫清了这一障碍,它提供基于装饰器、符合 Python 习惯的框架,让开发者用极少代码就能构建生产级 MCP 服务端与客户端。
接下来,我们将使用 FastMCP 构建 MCP 服务端与客户端。FastMCP 内容完整、自带错误处理,对新手和中级开发者都非常友好。
环境准备
开始本教程前,请确保你已准备好:
- • Python 3.10 或更高版本(推荐 3.11+,异步性能更好)
- • pip 或 uv(推荐使用 uv 部署 FastMCP,CLI 工具也依赖它)
- • 代码编辑器(本文使用 VS Code,你可任选)
- • 熟悉终端/命令行,用于运行 Python 脚本
有以下基础会更有帮助:
- • 扎实的 Python 编程知识(函数、装饰器、类型注解)
- • 了解 async/await 语法(非必需,但对高级示例有帮助)
- • 熟悉 JSON 与 REST API 概念
- • 基本的命令行操作能力
在 FastMCP 出现之前,开发 MCP 服务端需要你深入理解 MCP JSON-RPC 规范、编写大量协议处理样板代码、手动管理连接与传输、实现复杂的错误处理与校验逻辑。 FastMCP 用直观的装饰器和简洁的 Pythonic API 解决了这些问题,让你专注业务逻辑,而非协议实现。
什么是 Model Context Protocol(MCP)?
MCP 是由 Anthropic 推出的开放标准,它为 AI 应用提供了一套通用接口,用于安全连接外部工具、数据源与服务。 MCP 统一了 LLM 与外部系统的交互方式,就像 Web API 统一了网络服务通信一样。
MCP 核心特性
- •标准化通信:基于 JSON-RPC 2.0,实现可靠、结构化的消息传输
- •双向交互:支持客户端→服务端请求与服务端→客户端响应
- •安全性:内置认证与授权模式支持
- •灵活传输:兼容任意传输方式(stdio、HTTP、WebSocket、SSE)
MCP 架构:服务端与客户端
MCP 采用清晰的客户端–服务端架构:
- •MCP 服务端:对外暴露能力(工具、资源、提示词),可理解为专为 LLM 集成设计的后端 API。
- •MCP 客户端:嵌入在 AI 应用(如 Claude Desktop、Cursor IDE 或自定义应用)中,连接 MCP 服务端并使用其资源。
MCP 核心组件
MCP 服务端主要暴露三类能力:
- •Tools(工具):LLM 可调用的可执行函数,用于查询数据库、调用 API、计算或触发工作流。
- •Resources(资源):只读数据,客户端可获取并作为上下文使用,如文件内容、配置数据、动态内容。
- •Prompts(提示词):可复用的消息模板,用于引导 LLM 行为,为多步骤操作或专业推理提供统一指令。
什么是 FastMCP?
FastMCP 是一个高层 Python 框架,用于简化 MCP 服务端与客户端的开发。它的设计目标是降低开发成本,主要特点:
- •基于装饰器的 API:使用
@mcp.tool、@mcp.resource、@mcp.prompt消除样板代码 - •类型安全:完整的类型注解与校验,基于 Python 类型系统
- •异步支持:现代化 async Python,支持高性能操作
- •多传输协议:支持 stdio、HTTP、WebSocket、SSE
- •内置测试:无需子进程即可轻松测试客户端–服务端交互
- •生产就绪:自带错误处理、日志、配置等生产级功能
FastMCP 设计理念
FastMCP 遵循三大核心原则:
- 高层抽象:更少代码,更快开发
- 简洁易用:极少样板代码,专注功能而非协议
- Pythonic:符合 Python 习惯,对 Python 开发者友好
安装依赖
推荐使用 uv 安装 FastMCP 及依赖。
uv pip install fastmcp如果没有安装 uv,先安装:
pip install uv也可以直接用 pip 安装:
pip install fastmcp验证安装:
python -c "from fastmcp import FastMCP; print('FastMCP installed successfully')"构建 MCP 服务端
我们将创建一个实用的 MCP 服务端,演示工具、资源、提示词三大能力。以计算器服务端为例,提供数学运算、配置资源与指令提示。
步骤 1:项目结构初始化
创建项目目录并进入:
mkdir fastmcp-calculatorcd fastmcp-calculator使用 uv 初始化项目(指定 Python 3.11):
uv init --python 3.11步骤 2:编写 MCP 服务端
在项目中创建calculator_server.py,代码如下:
import loggingimport sysfrom typing import Dictfrom fastmcp import FastMCP# 日志输出到 stderr(对 MCP 协议完整性至关重要)logging.basicConfig( level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', stream=sys.stderr)logger = logging.getLogger(__name__)# 创建 FastMCP 服务端实例mcp = FastMCP(name="CalculatorServer")服务端导入 FastMCP 并将日志定向到 stderr。MCP 协议要求:除协议消息外,所有输出必须走 stderr,避免破坏通信。FastMCP(name="CalculatorServer")会自动处理所有协议管理。
接下来定义工具:
@mcp.tooldefadd(a: float, b: float) -> float: """两数相加 Args: a: 第一个数 b: 第二个数 Returns: a 与 b 的和 """ try: result = a + b logger.info(f"Addition performed: {a} + {b} = {result}") return result except TypeError as e: logger.error(f"Type error in add: {e}") raise ValueError(f"Invalid input types: {e}")@mcp.tooldefsubtract(a: float, b: float) -> float: """a 减 b Args: a: 被减数 b: 减数 Returns: a 与 b 的差 """ try: result = a - b logger.info(f"Subtraction performed: {a} - {b} = {result}") return result except TypeError as e: logger.error(f"Type error in subtract: {e}") raise ValueError(f"Invalid input types: {e}")@mcp.tooldefmultiply(a: float, b: float) -> float: """两数相乘 Args: a: 第一个数 b: 第二个数 Returns: a 与 b 的积 """ try: result = a * b logger.info(f"Multiplication performed: {a} * {b} = {result}") return result except TypeError as e: logger.error(f"Type error in multiply: {e}") raise ValueError(f"Invalid input types: {e}")@mcp.tooldefdivide(a: float, b: float) -> float: """a 除以 b Args: a: 被除数 b: 除数 Returns: 商 Raises: ValueError: 除零时抛出 """ try: if b == 0: logger.warning(f"Division by zero attempted: {a} / {b}") raise ValueError("Cannot divide by zero") result = a / b logger.info(f"Division performed: {a} / {b} = {result}") return result except (TypeError, ZeroDivisionError) as e: logger.error(f"Error in divide: {e}") raise ValueError(f"Division error: {e}")四个被@mcp.tool装饰的函数对外暴露数学运算。每个工具都包含:
- • 参数与返回值类型注解
- • 完整文档字符串(MCP 会将其作为工具描述)
- • try-except 错误处理
- • 日志记录
- • 输入校验
接下来定义资源:
@mcp.resource("config://calculator/settings")defget_settings() -> Dict: """提供计算器配置与可用操作""" logger.debug("Fetching calculator settings") return { "version": "1.0.0", "operations": ["add", "subtract", "multiply", "divide"], "precision": "IEEE 754 double precision", "max_value": 1.7976931348623157e+308, "min_value": -1.7976931348623157e+308, "supports_negative": True, "supports_decimals": True }@mcp.resource("docs://calculator/guide")defget_guide() -> str: """计算器使用指南""" logger.debug("Retrieving calculator guide") guide = """1. **add(a, b)**: 返回 a + b 示例:add(5, 3) = 82. **subtract(a, b)**: 返回 a - b 示例:subtract(10, 4) = 63. **multiply(a, b)**: 返回 a * b 示例:multiply(7, 6) = 424. **divide(a, b)**: 返回 a / b 示例:divide(20, 4) = 5.0## 错误处理- 除零会抛出 ValueError- 非数值输入会抛出 ValueError- 所有输入必须是合法数字(int / float)## 精度说明计算器使用 IEEE 754 双精度浮点数运算,部分运算可能存在微小舍入误差。""" return guide两个被@mcp.resource装饰的函数提供静态/动态数据:
- •
config://calculator/settings:返回计算器元信息 - •
docs://calculator/guide:返回格式化使用指南
资源 URI 遵循约定:类型://分类/资源名。
接下来定义提示词:
@mcp.promptdef calculate_expression(expression: str) -> str: """生成数学表达式计算指令 Args: expression: 待计算的数学表达式 Returns: 指导 LLM 分步计算的提示词 """ logger.debug(f"Generating calculation prompt for: {expression}") prompt = f"""请分步计算以下数学表达式:表达式:{expression}计算步骤:1. 将表达式拆分为单个运算2. 使用对应计算器工具完成每一步3. 遵循运算优先级:括号 → 乘除 → 加减4. 展示所有中间步骤5. 给出最终结果可用工具:add、subtract、multiply、divide""".strip() return prompt最后添加服务启动代码:
if __name__ == "__main__": logger.info("Starting Calculator MCP Server...") try: # 使用 stdio 传输(Claude Desktop 默认) mcp.run(transport="stdio") except KeyboardInterrupt: logger.info("Server interrupted by user") sys.exit(0) except Exception as e: logger.error(f"Fatal error: {e}", exc_info=True) sys.exit(1)@mcp.prompt用于创建指令模板,引导 LLM 完成复杂任务。 本文包含的错误处理最佳实践:
- • 精准捕获异常(TypeError、ZeroDivisionError)
- • 对用户友好的错误信息
- • 详细日志便于调试
- • 优雅的异常传播
步骤 3:编写 MCP 客户端
创建calculator_client.py,演示如何与上面的计算器服务端交互:
import asyncioimport loggingimport sysfrom typing importAnyfrom fastmcp import Client, FastMCPlogging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', stream=sys.stderr)logger = logging.getLogger(__name__)asyncdefmain(): from calculator_server import mcp as server logger.info("Initializing Calculator Client...") try: asyncwith Client(server) as client: logger.info("✓ 已连接到计算器服务端") # 1. 发现服务端能力 print("\n" + "="*60) print("1. 发现服务端能力") print("="*60) tools = await client.list_tools() print(f"\n可用工具({len(tools)}):") for t in tools: print(f" • {t.name}: {t.description}") resources = await client.list_resources() print(f"\n可用资源({len(resources)}):") for r in resources: print(f" • {r.uri}: {r.name or r.uri}") prompts = await client.list_prompts() print(f"\n可用提示词({len(prompts)}):") for p in prompts: print(f" • {p.name}: {p.description}") # 2. 调用工具 print("\n" + "="*60) print("2. 调用工具") print("="*60) print("\n测试 1:15 + 27") res = await client.call_tool("add", {"a": 15, "b": 27}) val = extract_tool_result(res) print(f" 结果:15 + 27 = {val}") print("\n测试 2:100 / 5") res = await client.call_tool("divide", {"a": 100, "b": 5}) val = extract_tool_result(res) print(f" 结果:100 / 5 = {val}") print("\n测试 3:除零错误(异常处理)") try: res = await client.call_tool("divide", {"a": 10, "b": 0}) print(f" 意外成功:{res}") except Exception as e: print(f" ✓ 正确捕获错误:{str(e)}") # 3. 读取资源 print("\n" + "="*60) print("3. 读取资源") print("="*60) print("\n获取计算器配置...") settings = await client.read_resource("config://calculator/settings") print(f" 配置信息:{settings[0].text}") print("\n获取计算器指南...") guide = await client.read_resource("docs://calculator/guide") print(f" 指南预览:{guide[0].text[:200]}...") # 4. 链式调用 print("\n" + "="*60) print("4. 多步运算链式调用") print("="*60) print("\n计算:(10 + 5) * 3 - 7") print(" 步骤 1:10 + 5") step1 = extract_tool_result(await client.call_tool("add", {"a": 10, "b": 5})) print(f" 结果:{step1}") print(" 步骤 2:15 * 3") step2 = extract_tool_result(await client.call_tool("multiply", {"a": step1, "b": 3})) print(f" 结果:{step2}") print(" 步骤 3:45 - 7") final = extract_tool_result(await client.call_tool("subtract", {"a": step2, "b": 7})) print(f" 最终结果:{final}") # 5. 使用提示词模板 print("\n" + "="*60) print("5. 使用提示词模板") print("="*60) expr = "25 * 4 + 10 / 2" print(f"\n表达式:{expr}") prompt_res = await client.get_prompt( "calculate_expression", {"expression": expr} ) print(f" 提示词模板:\n{prompt_res.messages[0].content.text}") logger.info("✓ 客户端运行完成") except Exception as e: logger.error(f"客户端错误:{e}", exc_info=True) sys.exit(1)添加结果提取工具函数:
def extract_tool_result(response: Any) -> Any: """从工具响应中解析真实结果""" try: ifhasattr(response, 'content') and response.content: content = response.content[0] ifhasattr(content, 'text') and content.text isnotNone: import json txt = content.text try: parsed = json.loads(txt) ifisinstance(parsed, dict) and'result'in parsed: return parsed['result'] return parsed except json.JSONDecodeError: try: returnfloat(txt) if'.'in txt elseint(txt) except: return txt ifhasattr(content, 'json'): import json try: j = content.json() ifcallable(content.json) else content.json parsed = json.loads(j) ifisinstance(j, str) else j ifisinstance(parsed, dict): res = parsed.get('result') or parsed.get('text') or parsed ifisinstance(res, str): try: returnfloat(res) if'.'in res elseint(res) except: return res return res return parsed except: pass return response except Exception as e: logger.warning(f"无法解析结果:{e}") return responseif __name__ == "__main__": logger.info("Calculator Client Starting...") asyncio.run(main())客户端使用async with Client(server)安全管理连接,自动处理建立与清理。
核心方法说明:
- •
await client.list_tools():获取所有工具元信息 - •
await client.list_resources():发现可用资源 - •
await client.list_prompts():发现可用提示词模板 - •
await client.call_tool():调用工具,传入工具名与参数字典 - •
extract_tool_result():解开 MCP 响应包装,拿到真实值
链式调用演示了如何将一个工具的输出作为下一个工具的输入,实现复杂计算。 错误处理会捕获工具异常(如除零)并优雅记录,不会崩溃。
步骤 4:运行服务端与客户端
打开两个终端:
终端 1 启动服务端:
python calculator_server.py终端 2 运行客户端:
python calculator_client.py你将看到完整的运行日志与输出。
FastMCP 高级模式
计算器示例只用到基础逻辑,FastMCP 可支撑复杂生产场景。扩展时可使用:
- •异步操作:对数据库、API 等 I/O 密集型工具使用
async def - •动态资源:资源支持参数(如
resource://users/{user_id}),动态获取指定数据 - •复杂类型校验:使用 Pydantic 或复杂类型注解,确保 LLM 传入格式严格匹配
- •自定义传输:除 stdio 外,还支持 SSE 等用于 Web 集成与自定义 UI
写在最后
FastMCP 在复杂的 MCP 协议与 Python 开发者期望的简洁装饰器开发体验之间架起了桥梁。它去掉了 JSON-RPC 2.0 与手动传输管理的样板代码,让你专注真正重要的事情:构建让 LLM 更强大的工具。
无论你是开发简单工具,还是复杂的数据编排层,FastMCP 都提供最“Pythonic”的路径,帮你快速搭建生产级 Agentic 生态系统。
想入门 AI 大模型却找不到清晰方向?备考大厂 AI 岗还在四处搜集零散资料?别再浪费时间啦!2026 年AI 大模型全套学习资料已整理完毕,从学习路线到面试真题,从工具教程到行业报告,一站式覆盖你的所有需求,现在全部免费分享!
👇👇扫码免费领取全部内容👇👇
一、学习必备:100+本大模型电子书+26 份行业报告 + 600+ 套技术PPT,帮你看透 AI 趋势
想了解大模型的行业动态、商业落地案例?大模型电子书?这份资料帮你站在 “行业高度” 学 AI:
1. 100+本大模型方向电子书
2. 26 份行业研究报告:覆盖多领域实践与趋势
报告包含阿里、DeepSeek 等权威机构发布的核心内容,涵盖:
- 职业趋势:《AI + 职业趋势报告》《中国 AI 人才粮仓模型解析》;
- 商业落地:《生成式 AI 商业落地白皮书》《AI Agent 应用落地技术白皮书》;
- 领域细分:《AGI 在金融领域的应用报告》《AI GC 实践案例集》;
- 行业监测:《2024 年中国大模型季度监测报告》《2025 年中国技术市场发展趋势》。
3. 600+套技术大会 PPT:听行业大咖讲实战
PPT 整理自 2024-2025 年热门技术大会,包含百度、腾讯、字节等企业的一线实践:
- 安全方向:《端侧大模型的安全建设》《大模型驱动安全升级(腾讯代码安全实践)》;
- 产品与创新:《大模型产品如何创新与创收》《AI 时代的新范式:构建 AI 产品》;
- 多模态与 Agent:《Step-Video 开源模型(视频生成进展)》《Agentic RAG 的现在与未来》;
- 工程落地:《从原型到生产:AgentOps 加速字节 AI 应用落地》《智能代码助手 CodeFuse 的架构设计》。
二、求职必看:大厂 AI 岗面试 “弹药库”,300 + 真题 + 107 道面经直接抱走
想冲字节、腾讯、阿里、蔚来等大厂 AI 岗?这份面试资料帮你提前 “押题”,拒绝临场慌!
1. 107 道大厂面经:覆盖 Prompt、RAG、大模型应用工程师等热门岗位
面经整理自 2021-2025 年真实面试场景,包含 TPlink、字节、腾讯、蔚来、虾皮、中兴、科大讯飞、京东等企业的高频考题,每道题都附带思路解析:
2. 102 道 AI 大模型真题:直击大模型核心考点
针对大模型专属考题,从概念到实践全面覆盖,帮你理清底层逻辑:
3. 97 道 LLMs 真题:聚焦大型语言模型高频问题
专门拆解 LLMs 的核心痛点与解决方案,比如让很多人头疼的 “复读机问题”:
![]()
三、路线必明: AI 大模型学习路线图,1 张图理清核心内容
刚接触 AI 大模型,不知道该从哪学起?这份「AI大模型 学习路线图」直接帮你划重点,不用再盲目摸索!
路线图涵盖 5 大核心板块,从基础到进阶层层递进:一步步带你从入门到进阶,从理论到实战。
L1阶段:启航篇丨极速破界AI新时代
L1阶段:了解大模型的基础知识,以及大模型在各个行业的应用和分析,学习理解大模型的核心原理、关键技术以及大模型应用场景。
L2阶段:攻坚篇丨RAG开发实战工坊
L2阶段:AI大模型RAG应用开发工程,主要学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。
L3阶段:跃迁篇丨Agent智能体架构设计
L3阶段:大模型Agent应用架构进阶实现,主要学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造Agent智能体。
L4阶段:精进篇丨模型微调与私有化部署
L4阶段:大模型的微调和私有化部署,更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调,并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。
L5阶段:专题集丨特训篇 【录播课】
![]()
四、资料领取:全套内容免费抱走,学 AI 不用再找第二份
不管你是 0 基础想入门 AI 大模型,还是有基础想冲刺大厂、了解行业趋势,这份资料都能满足你!
现在只需按照提示操作,就能免费领取:
👇👇扫码免费领取全部内容👇👇
2026 年想抓住 AI 大模型的风口?别犹豫,这份免费资料就是你的 “起跑线”!