ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

一键部署 Dify + MCP Server:用 SAE saectl 高效开发 AI 智能体应用

一键部署 Dify + MCP Server:用 SAE saectl 高效开发 AI 智能体应用 1. 为什么要在 SAE 上用 saectl 拉起 Dify MCP Server如果你正在找一个能快速把 AI 智能体应用跑起来、又不想被 K8s 运维拖住的方式SAEServerless 应用引擎配合 saectl 命令行工具是目前比较省心的一条路径。Dify 负责可视化编排工作流和 AgentMCP Server 负责把外部工具以统一协议暴露出来两者组合之后你只需要在 Dify 里拖拽节点、填一个 MCP 地址就能让智能体调用真实工具。这套方案适合三类人想快速验证 AI 智能体产品形态的独立开发者、需要把内部系统接入大模型能力的企业后端、以及不想维护集群但又要生产级可用性的小团队。我这次实测的路径是先用 saectl 把 Dify 社区版部署到 SAE再把一个基于 MCP Python SDK 的 SSE 协议 Server 打包成镜像部署上去最后在 Dify 里通过 MCP 插件把两者串起来。整个过程里模型调用通道我用 TaoToken 统一管理 Key这样 Dify 里的模型供应商配置只需要填一个地址和一把 Key切换模型时不用改代码。下面把可复制的配置骨架、验证动作和踩过的坑都写清楚。2. 前置准备saectl 安装与 TaoToken 通道配置2.1 saectl 工具安装与登录saectl 是 SAE 提供的命令行工具安装方式参考官方文档即可。安装完成后执行登录绑定你的阿里云账号和地域saectl version saectl login --region cn-hangzhou登录成功后后续所有 YAML 资源都会提交到你指定的地域。建议先用saectl config view确认当前上下文避免把测试资源提交到生产地域。2.2 TaoToken 统一 Key 与 API 通道Dify 里要配置模型供应商如果每个模型都单独填 Key后期维护会很乱。我的做法是在 TaoToken 控制台创建一把 Key然后在 Dify 的模型供应商里选择 OpenAI 兼容接口把 API Base 填成 TaoToken 的地址Key 填刚创建的那把。这样 Dify 内部所有模型调用都走同一条通道换模型只改模型名。具体操作路径进入控制台创建 API Key然后打开接入文档确认 Base URL 格式。模型对话调试可以直接在模型对话页面验证 Key 是否可用长期跑编码类 Agent 的话可以看 Coding Plan 的额度说明。API 地址统一用https://taotoken.net/api不要带多余路径。# 本地先验证 Key 是否可用 curl https://taotoken.net/api/v1/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY返回模型列表就说明通道正常。这一步建议在部署 Dify 之前做完否则 Dify 起来之后模型调不通排查起来会多一层干扰。2.3 Dify 依赖资源清单Dify 不是单容器应用它依赖数据库、缓存、向量库和存储。在 SAE 上部署前先把这些资源准备好资源类型用途建议PostgreSQL存 Dify 元数据独立实例不要和业务库混用Redis缓存与队列选持久化版本PGVector向量检索与 PostgreSQL 可同实例不同库NAS文件存储挂载到 Dify 容器NAT 网关出网访问模型 API 调用需要这些资源不在 SAE 内部创建而是提前在对应云产品里开好把连接信息填进后面的 YAML 模板。3. 可复制配置saectl 部署 Dify 与 MCP Server3.1 Dify 凭证 Secret 模板下载 SAE Dify 模板仓库后第一件事是替换凭证。以dify-credential为例把占位符换成你自己的资源信息apiVersion: v1 data: DB_USERNAME: ${pg_database_username} DB_PASSWORD: ${pg_database_password} PGVECTOR_USER: ${vector_database_username} PGVECTOR_PASSWORD: ${vector_database_password} REDIS_USERNAME: ${redis_database_username} REDIS_PASSWORD: ${redis_database_password} kind: Secret metadata: name: dify-credentials namespace: dify type: Opaque注意data字段下的值需要 base64 编码如果你直接写明文saectl 提交时会报格式错误。可以用echo -n your_password | base64生成。3.2 一键部署脚本执行变量替换完成后执行仓库里的安装脚本chmod x ./install.sh ./install.sh脚本会自动创建 namespace、提交所有 K8s 资源、等待 Pod 就绪最后打印 Dify 的公网访问地址。执行过程中如果卡在某个资源上可以用saectl get pods -n dify看具体哪个组件没起来。实测下来首次拉镜像会比较慢耐心等几分钟。3.3 MCP Server 镜像与部署MCP Server 我用的是官方 Python SDK 里的 simple-tool 示例它实现了 SSE 协议和一个网页抓取工具。核心逻辑是SseServerTransport处理/sse连接和/messages/消息推送from mcp.server.sse import SseServerTransport from starlette.applications import Starlette from starlette.routing import Mount, Route sse SseServerTransport(/messages/) async def handle_sse(request): async with sse.connect_sse( request.scope, request.receive, request._send ) as streams: await app.run( streams[0], streams[1], app.create_initialization_options() ) starlette_app Starlette( debugTrue, routes[ Route(/sse, endpointhandle_sse), Mount(/messages/, appsse.handle_post_message), ], )工具定义用装饰器注册list_tools返回工具列表call_tool处理调用app.list_tools() async def list_tools() - list[types.Tool]: return [ types.Tool( namefetch, descriptionFetches a website and returns its content, inputSchema{ type: object, required: [url], properties: { url: {type: string, description: URL to fetch} }, }, ) ] app.call_tool() async def fetch_tool(name: str, arguments: dict): if name ! fetch: raise ValueError(fUnknown tool: {name}) if url not in arguments: raise ValueError(Missing required argument url) return await fetch_website(arguments[url])把这段代码打包成镜像推到镜像仓库然后用 saectl 部署暴露 CLB 类型的 Service。部署完成后在 SAE 控制台能看到应用处于 Running 状态日志里有服务器启动输出。4. 验证请求从 Dify 到 MCP 的完整调用链4.1 Dify 模型供应商连通性验证Dify 起来之后第一件事是配模型。进入设置里的模型供应商选 OpenAI 兼容类型API Base 填 TaoToken 的地址Key 填你创建的那把。保存后点测试能返回模型列表就说明通道通了。如果报 401检查 Key 有没有多余空格如果报超时检查 SAE 应用的 NAT 网关是否配置正确。4.2 MCP 工具在 Dify 中的配置在 Dify 插件市场安装 MCP 工具插件然后创建工作流应用添加 Agent 节点。Agent 策略选 ReAct 模式在 MCP 服务配置里填 SAE 上 MCP Server 绑定的 CLB 地址{ mcp_server: { url: http://your-clb-ip:80/sse, headers: {}, timeout: 5, sse_read_timeout: 300 } }这里url必须指向/sse路径sse_read_timeout建议设大一点因为工具调用可能耗时较长。4.3 运行 Agent 并查看日志点击运行后Dify 会可视化展示 Agent 的思考过程先 List Tool 拿到可用工具再根据用户输入决定是否 Call Tool。同时去 SAE 控制台看 MCP Server 的日志能看到客户端和服务端的交互记录。如果 Agent 没有调用工具检查 ReAct 模式的提示词是否明确要求使用工具以及 MCP 地址是否可达。5. 本篇常见错排查5.1 saectl 提交报 Secret 格式错误最常见的原因是data字段没做 base64 编码。K8s 的 Secret 要求data下所有值都是 base64 字符串而stringData才接受明文。如果你从模板复制过来直接填明文就会报illegal base64 data。解决办法是改用stringData或者手动编码。5.2 Dify 启动后模型调用超时先确认 SAE 应用的出网配置。Dify 容器要访问外部模型 API必须走 NAT 网关。如果 NAT 没配或者路由不对容器内curl外部地址会超时。可以在 SAE 控制台进入容器执行curl -v https://taotoken.net/api/v1/models验证。另外检查安全组是否放行了出方向流量。5.3 MCP Server 连接被拒绝Dify 里填的 MCP 地址如果是内网地址而 Dify 和 MCP Server 不在同一个 VPC就连不通。SAE 上部署的 MCP Server 要暴露 CLB 公网地址或者确保 Dify 和 MCP 在同一 VPC 内通过内网互通。另外/sse路径不能漏漏了会返回 404。5.4 Agent 不调用工具ReAct 模式下如果提示词没有明确引导模型可能直接回答而不调用工具。可以在 Agent 节点的指令里加一句「当需要获取外部信息时优先使用 fetch 工具」。另外确认 MCP 插件版本和 Dify 版本兼容部分旧版本插件对 SSE 超时处理有问题。6. 后续接入与长期使用建议Dify 和 MCP Server 跑起来之后日常维护主要关注两件事模型通道的稳定性和 MCP 工具的扩展。模型通道方面TaoToken 的 API Key 建议按环境分多把开发和生产分开方便排查和限额。接入文档里有详细的参数说明遇到 4xx 错误先对照文档检查请求格式。如果你打算长期跑编码类 AgentCoding Plan 的额度模式比按次调用更划算。需要管理多把 Key 或者查看用量直接进 API Keys 页面操作。MCP 工具扩展方面官方 Python SDK 的示例可以直接改新增工具只需要在list_tools里加定义、在call_tool里加分支。部署更新时用 saectl 重新提交镜像即可SAE 会滚动更新不会中断服务。实测下来从改代码到新工具在 Dify 里可用大概五分钟。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进