SEO技术

SEO技术

Products

当前位置:首页 > SEO技术 >

Flask如何整合MCP AI代理?

96SEO 2026-05-05 22:28 20


前言:为什么要把 Flask 拉进 AI Agent 的阵营

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

Flask如何整合MCP AI代理?

本文Neng帮你解决什么?

快速搭建一个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 服务。

3. 获取 LLM API Key

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 通信。

L​LM 实例化: 使用异步版 OpenAI SDK 指向 DashScope 的兼容端点。

构造消息历史: 将系统提示和用户输入逐层压栈,以便后续多轮对话使用。

获取可调用工具列表: .list_tools 返回所有Yi注册函数元信息,用来填充 LLM 的 tool 参数字段。

L​LM 首轮生成: 若返回的是直接文本,则结束;若出现 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 技术分享社区  •  本文基于原创内容撰写,仅供学习交流 如需商业合作或技术咨询,请联系作者邮箱:


标签: MCP

SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback