96SEO 2026-05-05 22:28 19
前言:为什么要把 Flask 拉进 AI Agent 的阵营
过去两年,AI 开发的热度像坐火箭一样冲天。许多新库只提供异步入口,甚至在文档里直接写明「只Neng异步调用」。于是 FastAPI、Quart 等轻量框架一度成为「默认选择」。不过别忘了Flask 自 2.0 起Yi经悄悄打开了异步的大门。对于Yi经在生产中使用 Flask 的团队来说重新搬砖到别的框架并非易事,这时候把 Flask 与 MCPAI 代理结合,就像给老朋友装上了新玩具,既保留熟悉的生态,又Neng玩转Zui新的 LLM。

快速搭建一个Neng够调用 MCP 工具的 Flask 服务。
演示如何在 Flask 中使用异步视图与 OpenAI/阿里通义千问等模型交互。
提供完整的项目结构、依赖清单以及部署注意事项。
Ru果你只想用 Flask 写一个普通的 MCP Server,而不涉及 LLM 调用,请直接跳过本篇。
一、准备工作与依赖安装 1. 环境要求Python ≥ 3.9,操作系统随意,只要Neng运行 pip 即可。建议使用虚拟环境隔离依赖:
python -m venv .venv
source .venv/bin/activate # Windows 使用 .venv\Scripts\activate
pip install --upgrade pip
2. 必装库清单
下面这条命令一次性装齐所有核心组件:
pip install "flask" fastmcp openai gunicorn gevent uvicorn
解释一下:
flask开启对 async/await 的原生支持。
fastmcpMCP 协议的高性Neng实现。
openai统一的 SDK,兼容阿里通义千问等兼容 OpenAI 接口的模型。
gunicorn + gevent生产环境下常用的协程式 WSGI 守护进程。
uvicorn用于本地调试时快速启动 ASGI 服务。
MCP 本身不提供大语言模型,需要自行准备。例如阿里云通义千问 ),登录后在控制台申请对应模型的 AccessKey。后面的代码会从配置文件读取此密钥,请务必妥善保管。
二、项目结构一览
my_flask_mcp/
├── aiagent/
│ ├── __init__.py
│ ├── mcp_client.py # 与 MCP Server 通讯、包装 LLM 调用
│ └── mcp_servers/
│ ├── __init__.py
│ ├── common.py # 示例工具:获取当前时间
│ └── composition.py # 把多个子 Server 合并成一个入口
├── config.py # 配置中心
├── log.py # 简易日志包装
├── main.py # Flask 应用入口
└── pyproject.toml # 项目元数据
整个目录保持轻量,仅为演示目的;实际项目Ke以根据业务拆分geng细致的子模块。
三、编写第一个 MCP 工具——获取当前时间 a) 定义工具函数import datetime
from fastmcp import FastMCP
# 创建一个专属服务器实例,名称随意取就好
common_mcp = FastMCP(name="common_tool_server",
instructions="提供系统级小工具")
@common_mcp.tool
async def get_current_datetime -> str:
"""
返回 ISO8601 格式的当前时间,例如:
2026-05-05T14:23:07+0800
"""
return datetime.datetime.now.strftime
if __name__ == "__main__":
# 本地调试时直接运行此文件即可kan到 banner
common_mcp.run
*温馨提示*: 这里我们只实现了Zui基础的功Neng,真正上线时Ke以把日志写入文件或监控系统,让运维同学安心。
b) 将子 Server 合并进主入口import asyncio
from pathlib import Path
import sys
# 把根目录加入搜索路径,以便相对导入成功
sys.path.append.parents))
from fastmcp import FastMCP
from aiagent.mcp_servers.common import common_mcp
# “组合”服务器负责统一调度所有工具
composition = FastMCP(name="composition_server",
instructions="聚合所有子工具")
async def compose:
await composition.import_server
if __name__ == "__main__":
asyncio.run)
composition.run
这样,无论客户端只连 composition_server 一次就Neng访问到所有Yi注册的工具函数。
四、在 Flask 中封装 MCP 客户端 & LLM 调度器 a) 配置中心class Config:
@property
def llm_base_url -> str:
return "https://dashscope.aliyuncs.com/compatible-mode/v1"
@property
def llm_model -> str:
return "qwen-plus"
@property
def llm_api_key -> str:
return "" # 替换为真实密钥
cfg = Config
b) 日志模块——简单但足够用
import logging, sys
def get_logger:
logger = logging.getLogger
logger.setLevel
handler = logging.StreamHandler
fmt = "%s | %s | %s | %s"
handler.setFormatter)
logger.addHandler
return logger
logger = get_logger
下面这段代码是整篇文章Zui「血脉喷张」的地方——它把用户请求、LLM 推理以及 MCP 工具链完美串联起来。为避免一次性塞进太多细节,我把关键步骤标注出来阅读时Ke以先跳过细枝末节,只关注流程图:
MCP 客户端初始化:通过 StdioTransport 启动 composition server 子进程,实现本地 IPC 通信。
LLM 实例化: 使用异步版 OpenAI SDK 指向 DashScope 的兼容端点。
构造消息历史: 将系统提示和用户输入逐层压栈,以便后续多轮对话使用。
获取可调用工具列表: .list_tools 返回所有Yi注册函数元信息,用来填充 LLM 的 tool 参数字段。
LLM 首轮生成: 若返回的是直接文本,则结束;若出现 tool 调用,则进入循环处理。
MCP 工具调用 & 回写结果: 把 tool 调用信息发送给服务器执行,将返回值重新写入对话历史,再交给 LLM Zuo下一轮推理。
循环直至没有 tool 调用: Zui终得到完整答案后返回给上层视图函数。
资源回收: 关闭子进程和 HTTP 会话,防止泄漏。
import json, asyncio
from pathlib import Path
from typing import List, Dict, Any
from fastmcp.client import Client, StdioTransport
from openai import AsyncOpenAI
from openai.types.chat import ChatCompletionMessageFunctionToolCall
from config import cfg
from log import logger
class MCPClient:
def __init__:
# 启动本地 composition server 子进程作为通信桥梁
self.client = Client(
StdioTransport(
command=str.parent.parent / ".venv" / "bin" / "python"),
args=,
cwd=str.parent / "mcp_servers"),
)
)
self.llm = AsyncOpenAI(base_url=cfg.llm_base_url,
api_key=cfg.llm_api_key)
self.memory: List] = # 暂存会话历史
async def close:
if self.client:
await self.client.close
async def _prepare_tools:
tools_raw = await self.client.list_tools
tools =
for t in tools_raw:
tools.append({
"type": "function",
"function": {
"name": t.name,
"description": t.description,
"parameters": t.inputSchema,
}
})
logger.debug} 个可用工具")
return tools
async def _call_llm -> Any:
resp = await self.llm.chat.completions.create(
model=cfg.llm_model,
messages=messages,
tools=tools,
temperature=0.7,
)
return resp
async def process -> str:
if system_prompt:
self.memory.append
self.memory.append
async with self.client:
tools = await self._prepare_tools
response_texts: List =
while True:
raw_resp = await self._call_llm
msg = raw_resp.choices.message
# 若有直接内容则收集起来
if getattr:
response_texts.append
# 检查是否有 tool 调用需求,没有则跳出循环结束对话。
if not getattr:
break
for call in msg.tool_calls:
fn_call: ChatCompletionMessageFunctionToolCall = call # 类型转换帮助 IDE 提示
name = fn_call.function.name
args = json.loads
logger.info
tool_result = await self.client.call_tool
# 把调用记录写回历史,以便 LLM Neng基于结果继续推理。
self.memory.append({
"role":"assistant",
"tool_calls":
})
self.memory.append({
"role":"tool",
"tool_call_id":fn_call.id,
"content":str)
})
return "
".join
五、Flask 应用层 – 同步路由 + 异步业务逻辑混搭
a) 自定义响应体,让前端友好解析
from flask import Response,jsonify
class APIResponse:
default_mimetype='application/json'
def __init__:
payload=dict
super.__init__,status=status,mimetype=self.default_mimetype)
b) 主入口文件
import json
from http import HTTPStatus
from flask import Flask, request
from aiagent.mcp_client import MCPClient
app = Flask
@app.get
def health:
"""健康检查,用于容器编排平台"""
return APIResponse
@app.post
async def chat:
"""
异步视图:接收用户 Prompt → 调用 MCPClient → 返回Zui终答案。
注意:Flask 会在内部为每个请求创建独立事件循环。
"""
try:
body: dict = request.get_json
prompt = body.get
if not isinstance:
raise ValueError
except Exception as e:
return APIResponse)
client=MCPClient
try:
answer=await client.process
return APIResponse
except Exception as exc:
logger.exception
return APIResponse)
finally:
await client.close
if __name__=="__main__":
app.run
💡 小贴士:Ru果你习惯使用 Gunicorn 部署,只需要把上面的入口改成 ``gunicorn -k gevent -w 4 main:app`` 即可。gevent 为每个 worker 提供协程调度,让异步视图跑得稍微顺畅一点儿,不过仍然受限于每个 worker 同时只Neng处理一条请求这件事儿 😅 。
六、本地运行与测试流程
启动服务:
python main.py # 开发模式下直接跑,会kan到类似 “Running on http://127.0.0.1:8000” 的日志。
# 或者使用生产模式:
gunicorn main:app -w 4 -k gevent --bind 0.0.0.0:8000 --worker-connections 1000
Curl 发起一次对话请求:
curl -X POST http://127.0.0.1:8000/chat \
-H 'Content-Type: application/json' \
-d '{"prompt":"今天北京几点了?"}'
{"code":200,"msg":"success","data":{"answer":"现在是2026-05-05T14:31:00+0800。"}}
观察服务器日志:
✅ Nengkan到 “Available mcp tools” 与 “Calling tool …” 的信息,说明 Tool 被成功触发; ❗ Ru果没有出现任何 Tool 调用,请检查MCP Server 是否正常启动且被正确导入到 composition 中。
P.S. 若想验证高并发下表现,可借助 ApacheBench 或 wrk 对 ``/chat`` 接口进行压测。记住每个 worker 在异步模式下仍旧只Neng处理一条请求,所以提升并发需要增加 worker 数量或改用原生 ASGI 框架,如 FastAPI。
七、收尾感悟 & Zui佳实践从代码到部署,我们Yi经完成了以下几件事儿:
MCP 工具被封装成独立 Python 函数,并通过 fastMCP 自动生成 RPC 描述;
AIO‑LLM 客户端利用 OpenAI 标准接口完成“先思考—再调工具—再回答”的闭环;
AIO‑Flask 路由让外部 HTTP 请求Neng够无缝触达上述闭环;
KISS 原则驱动下我们只用了 gunicorn + gevent 就完成了生产级部署脚本。
⚠️ 切记:Flask 虽然Yi经支持异步,但底层仍然是 WSGI,一旦面对高并发 I/O 密集型场景,它会出现“线程+事件循环”的双重开销。Ru果你的项目预计每天要处理上万次聊天请求,强烈建议直接迁移到 FastAPI 或者 Quart,它们天生就是 AsyncIO 原生跑分机器 🚀 。但Ru果你只是想在Yi有 Flask 项目里加一点点 AI 小功Neng,这套方案完全够用了而且改动Zui小、学习成本低!
八、完整目录树参考my_flask_mcp/ ├─ aiagent/ │ ├─ __init__.py # 空文件,使其成为包 │ ├─ mcp_client.py # 核心客户端实现 │ └─ mcp_servers/ │ ├─ __init__.py │ ├─ common.py # 示例工具函数 │ └─ composition.py # 合并子 Server ├─ config.py # 配置中心 ├─ log.py # 日志封装 ├─ main.py # Flask 程序入口 └─ requirements.txt # 可选:列出依赖版本九、让老框架焕发新光彩 🎉
MCP 为 AI Agent 带来了「插件化」思维,让我们Ke以像拼乐高一样,把不同功Neng块自由组合。而 Flask 则以其成熟生态和极低上手门槛,为这种组合提供了熟悉且稳固的平台。只要掌握上述几行关键代码,你就Neng在Yi有业务中快速嵌入时间查询、数据库检索甚至自定义搜索等Neng力,而不必大动干戈搬迁技术栈。愿你在下一次产品迭代中,用这套「Flask + MCP」组合打出惊喜弹幕! 🚀🚀🚀
© 2026 AI 技术分享社区 • 本文基于原创内容撰写,仅供学习交流 如需商业合作或技术咨询,请联系作者邮箱:作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback