尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Trae + Dify 10分钟构建 Data McpServer 与 Agent,和 Excel 说再见!

Trae + Dify 10分钟构建 Data McpServer 与 Agent,和 Excel 说再见! 1. 为什么我决定用 Trae Dify 干掉手工 Excel 处理如果你每天的工作里有一大块时间是在 Excel 里做筛选、透视、对账、拼表那你大概率已经想过能不能让大模型直接读表、直接算、直接给结果我试过把 Excel 丢给聊天窗口模型只能看到我复制进去的几百行稍微大一点的表就截断公式一多就胡说。真正能落地的做法是把「读 Excel 写 pandas 执行 返回结构化结果」封装成一个 MCP Server再让 Dify 的 Agent 把它当成一个工具去调用。这样你上传一个文件 URLAgent 自己决定调哪个接口、传什么参数最后返回的是 JSON 或者表格文本而不是让你再去下载一个 xlsx 手工看。这套组合里Trae 负责把 Data McpServer 的骨架代码生成出来Dify 负责编排 Agent 的对话与工具调用。核心检索词就是 Data McpServer 与 Agent 编排前者是一个基于 FastAPI 的本地服务暴露/query之类的接口后者是 Dify 里的工作流或 Agent 应用把接口注册成自定义工具。适合谁适合会一点点 Python、能看懂报错、但不想从零写 pandas 解析逻辑的人。10 分钟是理想状态实际我踩坑花了两个多小时所以这篇会把坑提前标出来让你少走弯路。整个链路是这样的Excel 文件放在一个可访问的 URL 上本地起个静态服务也行Data McpServer 接收文件路径和自然语言指令内部调用大模型把指令翻译成 pandas 代码在受限环境里执行把结果以 JSON 返回Dify 的 Agent 拿到这个 JSON 后组织成人类可读的回答。下面按步骤拆开讲每一步都给可复制的配置。2. 前置准备TaoToken 接入与 Data McpServer 的模型配置在写代码之前先把模型调用这条线理顺。Data McpServer 内部需要一个大模型来做「自然语言 → pandas 代码」的转换这个模型可以是 DeepSeek也可以是别的兼容 OpenAI 协议的服务。为了让 Base URL、Key、Model ID 三件套统一管理我用 TaoToken 作为统一入口它的接口兼容 OpenAI SDK改一行 base_url 就能切换模型省得每个服务里散落不同的 key。TaoToken 的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。注意 API 地址后面不加任何 UTM 参数直接用它作为 base_url 即可。你需要在控制台创建一个 API Key然后把它写进 Data McpServer 的 config.py 或者环境变量里。如果你还没建 Key可以走这个 deep linkhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 进去之后新建一个 Key复制出来备用。为什么不用某个单一厂商的直连地址因为 Data McpServer 里可能同时要跑代码生成、结果润色两个模型调用统一走一个兼容层后面换模型只改 Model ID不用动代码结构。TaoToken 在这里的角色就是「OpenAI 兼容的模型网关」不是中转代理你把它当成一个标准的 base_url 来用就行。配置的时候注意base_url 写https://taotoken.net/api不要带斜杠结尾也不要带任何 query 参数否则 OpenAI SDK 拼接/chat/completions的时候会 404。环境变量建议这样组织避免把 Key 硬编码进代码# .env 文件放在项目根目录 TAOTOKEN_API_KEYsk-你的key TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_MODELdeepseek-chat然后在 config.py 里用os.getenv读取。这样做的好处是Trae 生成的代码里如果写死了 key你可以直接替换成环境变量读取不用逐行改。另外提醒一句Data McpServer 是要被 Dify 调用的Dify 那边只需要知道这个服务的 URL不需要知道模型 Key所以 Key 只存在于服务端安全性更好。如果你打算长期跑编码类任务比如让 Agent 反复生成 pandas 代码并调试可以考虑 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合高频调用场景。但如果你只是偶尔跑一次表格处理按量用 API 就够了。前置准备做到这里模型这条线就通了接下来进入 Trae 生成代码的环节。3. 可复制配置用 Trae 生成 Data McpServer 并写对 settings打开 Trae新建一个 Builder 项目模型选 DeepSeek R1 或者你习惯的代码模型。把下面这段提示词粘进去注意提示词里已经把目录结构和依赖写清楚了这样生成的代码不会太散我要使用 MCP server 搭建一个服务接收 Excel 路径和大模型对话中的数据处理要求。 这个 server 内部的 llm 将数据处理要求转变成真实的 pandas 代码 然后服务执行这段代码将运行结果以 JSON 返回。 请一步步给出完整解决办法和完整代码。 代码结构 excel_mcp/ ├── config.py ├── llm_integration.py ├── main.py ├── safe_exec.py └── requirements.txt 数据处理库用 pandasLLM 调用使用 OpenAI SDK 兼容方式 base_url 从环境变量 TAOTOKEN_BASE_URL 读取api_key 从 TAOTOKEN_API_KEY 读取。生成过程中 Trae 会让你「全部接受」但别一路点到黑。我踩过的坑是它生成的requirements.txt里包名大小写错了比如把FastAPI写成fastapi在某些镜像源下能装但Pydantic写成pydantic又和版本约束冲突导致uvicorn main:app启动时报ImportError。所以代码生成完先打开requirements.txt逐行核对再执行安装。安装依赖cd excel_mcp python -m venv venv # Windows .\venv\Scripts\activate # macOS / Linux source venv/bin/activate pip install -r requirements.txt接下来是关键的配置文件。config.py里要写清楚模型三件套我把它整理成下面这样你可以直接复制# config.py import os from dotenv import load_dotenv load_dotenv() class Settings: API_KEY: str os.getenv(TAOTOKEN_API_KEY, ) BASE_URL: str os.getenv(TAOTOKEN_BASE_URL, https://taotoken.net/api) MODEL_ID: str os.getenv(TAOTOKEN_MODEL, deepseek-chat) MAX_ROWS: int 5000 EXEC_TIMEOUT: int 30 settings Settings()这里 Base URL、Key、Model ID 三件套齐了后面llm_integration.py里创建 client 的时候直接用# llm_integration.py from openai import OpenAI from config import settings client OpenAI( api_keysettings.API_KEY, base_urlsettings.BASE_URL, ) def nl_to_pandas(user_query: str, columns: list) - str: system_prompt ( 你是一个 pandas 代码生成器。根据用户的数据处理要求 生成一段可直接执行的 pandas 代码变量 df 已经存在。 只返回代码不要解释不要 markdown 代码块标记。 ) resp client.chat.completions.create( modelsettings.MODEL_ID, messages[ {role: system, content: system_prompt}, {role: user, content: f列名{columns}\n要求{user_query}}, ], streamFalse, ) return resp.choices[0].message.content.strip()safe_exec.py负责在受限命名空间里执行生成的代码至少要把os、sys、subprocess这类模块挡掉只放pandas和df进去。main.py用 FastAPI 暴露/query接口接收file_url和query两个参数。启动命令uvicorn main:app --host 0.0.0.0 --port 8000启动后访问http://localhost:8000/docs如果页面打不开先检查端口占用再检查 FastAPI 的静态资源是否被网络策略拦了。这一步是后面 Dify 注册工具的基础接口必须能返回 OpenAPI schema。4. 验证请求从 Excel URL 到 Agent 返回结构化结果服务起来之后先别急着接 Dify用 curl 或者 docs 页面自测一次确认 Data McpServer 真的能返回结构化结果而不是报错。准备一个 Excel 文件比如客户反馈跟踪表放到项目根目录然后用 Trae 右下角的 Go Live 起一个 5000 端口的静态服务拿到文件 URL类似http://你的IP:5000/客户反馈跟踪表.xlsx。调用接口curl -X POST http://localhost:8000/query \ -H Content-Type: application/json \ -d { file_url: http://192.168.1.10:5000/客户反馈跟踪表.xlsx, query: 按反馈类型分组统计每组的数量按数量降序 }期望返回类似{ success: true, result: [ {反馈类型: 功能建议, 数量: 42}, {反馈类型: Bug, 数量: 31} ], code: df.groupby(反馈类型).size().reset_index(name数量).sort_values(数量, ascendingFalse) }如果返回的是success: false加上一段 traceback先看code字段里生成的 pandas 代码对不对。常见问题是列名带空格或者中文模型生成的代码里列名没加引号导致KeyError。这时候可以在 system prompt 里强调「列名必须用字符串字面量」或者让safe_exec捕获异常后把错误信息回传给模型做一次重试。自测通过后把 Data McpServer 注册到 Dify。第一步确认 Dify 能访问到你的服务本地跑的话把localhost换成电脑的局域网 IP比如http://192.168.1.10:8000。第二步在 FastAPI docs 页面找到 OpenAPI JSON 的地址通常是/openapi.json把内容复制出来。第三步在 Dify 的「自定义工具」里粘贴这份 schema注意手动补上servers字段因为 FastAPI 默认生成的 schema 里可能没有{ openapi: 3.0.0, info: {title: Data McpServer, version: 1.0.0}, servers: [{url: http://192.168.1.10:8000}], paths: { /query: { post: { summary: Query Excel, requestBody: { content: { application/json: { schema: { type: object, properties: { file_url: {type: string}, query: {type: string} }, required: [file_url, query] } } } }, responses: {200: {description: OK}} } } } }保存后在 Dify 里点测试填一个文件 URL 和查询语句如果返回上面那种 JSON说明工具通了。然后新建一个工作流应用开始节点设两个变量excel_url和user_query下一个节点选刚注册的工具把两个变量对接进去。运行一次Agent 应该返回结构化结果而不是让你下载 Excel 文件。到这里Data McpServer 与 Agent 的链路就闭环了。5. 本篇常见错排查401、local proxy failed 与 reading choices这一节把我在调试过程中真实遇到的报错列出来你大概率会碰到其中一两个。第一个是401 Unauthorized。如果你在 Data McpServer 的日志里看到这个说明模型调用的 Key 不对或者没读到。检查.env文件是否在项目根目录、load_dotenv()是否在config.py顶部调用、环境变量名是否和代码里一致。还有一种情况是 base_url 写成了https://taotoken.net/api/带斜杠SDK 拼出来的路径变成/api//chat/completions服务端返回 401 或者 404。改成不带斜杠即可。第二个是local proxy failed或者连接超时。这通常出现在 Dify 调用本地服务的时候Dify 跑在容器里localhost指向的是容器本身而不是宿主机。解决办法是把 Data McpServer 的地址换成宿主机的局域网 IP并确认防火墙放行了 8000 端口。如果你在 Dify 的日志里看到Connection refused先用curl从 Dify 所在机器测一下那个 IP 和端口能不能通。第三个是reading choices报错完整信息类似TypeError: Cannot read properties of undefined (reading choices)。这说明模型返回的响应结构不对resp.choices是 undefined。原因可能是 base_url 指向了一个不兼容 OpenAI 协议的地址或者 Model ID 写错了导致服务端返回了错误对象。检查TAOTOKEN_MODEL是否是你账号下可用的模型名以及base_url是否是https://taotoken.net/api。如果你用的是 Claude Code 或者 Cline 这类工具配置里同样要写全 Base URL、Key、Model ID 三件套缺一个都会报这个错。第四个是 OAuth 相关报错比如OAuth token expired或者invalid_grant。如果你在 Dify 里用了某些需要 OAuth 的模型插件token 过期后会报这个。解决办法是重新授权或者改用 API Key 方式接入。Data McpServer 这边不涉及 OAuth但 Dify 的模型供应商配置里可能会遇到顺手提一下。第五个是 pandas 执行超时。safe_exec里设了 30 秒超时如果 Excel 很大或者生成的代码做了全表笛卡尔积就会超时。可以在 config 里把MAX_ROWS调小或者在 system prompt 里要求模型「只对必要列做操作避免全表 merge」。实测下来把MAX_ROWS设成 5000 能挡住大部分误操作。排障的时候建议把 Data McpServer 的日志级别调到 DEBUG这样能看到模型返回的原始代码和异常堆栈。Dify 那边则看工作流的运行日志每个节点的输入输出都有记录。两边对照基本能定位到是哪一段出的问题。6. 语义一致 CTA把这条链路用起来如果你已经跟着走到这里Data McpServer 应该能稳定返回结构化结果了。接下来可以做的扩展是把这个工作流发布成 Dify 的工具然后在新的 Agent 对话里作为 Function Call 调用这样你就能用自然语言直接问「帮我看看上周的客户反馈里 Bug 类占比多少」Agent 自己去调接口、拿结果、组织回答。需要再确认模型调用配置的话API Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。想先验证模型对话效果可以走 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。长期跑编码和 Agent 任务的话Coding Plan 入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。最后给一个实用技巧把 Data McpServer 的/query接口返回的code字段也展示在 Dify 的回答里这样你能看到模型到底生成了什么 pandas 代码出问题的时候一眼就能定位。另外Excel 文件 URL 尽量用稳定的静态服务别用临时链接否则 Agent 跑一半文件失效报错会很难查。
返回列表