跳到主要内容Python 构建 MCP 应用实战指南 | 极客日志PythonAI
Python 构建 MCP 应用实战指南
介绍模型上下文协议(MCP)及 FastMCP 库的使用。涵盖安装、工具开发、三种传输模式(STDIO、Streamable HTTP、SSE)配置、客户端调用示例以及工具、提示、资源三大核心组件的实战应用。提供避坑指南与高级功能解析,帮助开发者快速构建本地或云端 AI 应用服务。
古灵精怪5 浏览 今天介绍一个强大的工具调用协议——模型上下文协议(Model Context Protocol),作为 AI 工作者,无论你是想构建本地 CLI 工具还是云端 Web 服务,MCP 都能提供统一的解决方案。
一、极简入门:安装与基础工具开发
pip install fastmcp
from fastmcp import FastMCP
mcp = FastMCP('demo.mcp')
@mcp.tool()
def greet(name: str) -> str:
return f'Hello, {name}'
二、工具自测与调用技巧
import asyncio
from fastmcp import Client
async def main():
client = Client(mcp)
async with client:
tools = await client.list_tools()
print('可用工具:', tools)
result = await client.call_tool('greet', {'name': '技术爱好者'})
print('调用结果:', result)
asyncio.run(main())
- 使用
@mcp.tool() 装饰器暴露函数
- 客户端通过
call_tool 调用,参数为字典格式
- 参数名必须与函数定义完全一致
三、MCP 服务器:三种传输模式详解
1、STDIO 模式(默认)
- 适用场景:本地进程间通信
- 特点:零网络开销,高性能
2、Streamable HTTP(推荐)
- 适用场景:现代 Web 服务
- 特点:双向实时通信,支持流式传输
mcp.run(transport="streamable-http", port=8000, path="/mcp")
3、SSE 模式(兼容旧系统)
mcp.run(transport="sse", port=8000, path="/sse")
import os
def run_server():
mode = os.getenv('MCP_MODE', "").lower()
if mode == 'sse':
mcp.run(transport="sse", port=8000, path="/sse")
elif mode == 'streamable-http':
mcp.run(transport="streamable-http", port=8000, path="/mcp")
else:
mcp.run()
if __name__ == '__main__':
run_server()
4、总结比较
| 传输模式 | 适用场景 | 性能特性 | 推荐指数 |
|---|
| STDIO | 本地进程通信、命令行工具 | 零延迟,无网络开销 | ⭐⭐⭐⭐ |
| Streamable HTTP | 实时 Web 服务、云端部署 | 支持双向流式传输 | ⭐⭐⭐⭐⭐ |
| SSE | 兼容旧系统、浏览器 | 单向推送,存在连接保持开销 | ⭐⭐ |
四、实战:Streamable HTTP 客户端调用
import asyncio
from fastmcp.client import Client
async def main():
async with Client('http://localhost:8000/mcp/') as client:
tools = await client.list_tools()
print(f'可用工具:{[t.name for t in tools]}')
result = await client.call_tool('greet', {'name': 'Python 开发者'})
print(f'返回结果:{result[0].text}')
asyncio.run(main())
可用工具:['greet']
返回结果:Hello, Python 开发者
五、应用场景及集成
- 微服务架构
将工具部署为独立 HTTP 服务,通过 API 网关调用
- 自动化工作流
组合多个 MCP 工具构建复杂流水线
本地工具链集成
STDIO 模式连接 Python 脚本和 Shell 命令
echo '{"name": "Terminal 用户"}' | python mcp_app.py
六、MCP 服务高级功能
在探索 FastMCP 的旅程中,许多开发者都有一个认知误区:认为 MCP 服务等同于 MCP 工具,但是 MCP 服务有三大核心支柱:工具 (Tool)、提示 (Prompt) 和资源 (Resource)。这三者共同构成了一个完整的 AI 应用开发生态系统。
1、MCP 服务的三维架构
MCP 服务工具 Tools 提示 Prompts 资源 Resources 执行具体操作指导 LLM 生成提供静态/动态数据
| 组件类型 | 核心功能 | 典型应用场景 | 装饰器语法 |
|---|
| 工具 | 执行具体任务 | 数据计算、API 调用 | @mcp.tool() |
| 提示 | 生成 LLM 指导消息 | 标准化提问、响应格式化 | @mcp.prompt() |
| 资源 | 提供可复用数据 | 配置信息、模板文件 | @mcp.resource() |
2、工具 (Tool):执行引擎
@mcp.tool()
def calculate_discount(price: float, discount: float) -> float:
"""计算商品折扣价"""
return price * (1 - discount / 100)
- 输入输出类型严格验证
- 支持同步/异步操作
- 可直接集成现有业务逻辑
3、提示 (Prompt):AI 指导者
@mcp.prompt()
def generate_interview_questions(position: str, level: str) -> str:
"""生成职位面试问题"""
return f"""作为资深{position}面试官,请生成 5 个适合{level}级候选人的技术问题,要求:1. 包含代码题和理论题 2. 难度递增 3. 标注考察点"""
- 动态参数化:支持变量注入
- 输出标准化:确保 LLM 响应一致性
- 集中化管理:统一维护提示模板
- 自动验证:严格检查输入参数类型
4、资源 (Resource):数据供给站
资源是 MCP 最被低估的功能,它提供静态或动态的可复用数据:
@mcp.resource(uri="resource://greeting/{name}", name='greeting', description='用于演示的一个资源协议')
def get_greeting(name: str) -> str:
"""Provides a simple greeting message."""
return f"Hello from {name} Resources!"
@mcp.resource("resource://config")
def get_config() -> dict:
"""Provides application configuration as JSON."""
return {"theme": "dark", "version": "1.2.0", "features": ["tools", "resources"], }
| 资源类型 | 刷新机制 | 适用场景 |
|---|
| 静态资源 | 服务启动时加载 | 配置信息、常量数据 |
| 定时刷新资源 | 固定间隔刷新 | 市场数据、天气信息 |
| 按需加载资源 | 请求时实时获取 | 用户个性化数据 |
七、避坑指南
- 参数名不匹配
call_tool 的字典 key 必须与函数参数名完全一致
异步陷阱
工具函数需为同步函数,耗时操作应使用线程池:
@mcp.tool()
def process_data(data: str):
return heavy_computation(data)
八、结语
MCP 服务的三位一体架构为 AI 应用开发提供了完整解决方案:
- 工具是肌肉 - 执行具体操作
- 提示是大脑 - 指导智能行为
- 资源是血液 - 流动数据养分
MCP 协议通过统一接口打通了本地与云端工具的界限。无论你构建的是:
- 🔧 本地开发工具链
- ☁️ 云端 API 服务
- 🤖 智能对话插件
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online