ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

自动化办公新范式:用 MCP 打通 Office 与飞书,TaoToken 统一 Key 配置实战

自动化办公新范式:用 MCP 打通 Office 与飞书,TaoToken 统一 Key 配置实战 1. 为什么你的自动化脚本总在“最后一公里”卡住如果你在 Node.js 里写过办公自动化大概率经历过这种局面Excel 里的销售数据要手动复制到飞书多维表格会议纪要要手动整理成 Word 再发群通知周报要挨个催收再排版。每个环节单独看都能用脚本解决但串起来就变成一堆散落的 API 调用、Token 管理和格式转换。MCPModel Context Protocol解决的核心问题不是“能不能调 API”而是“让 AI 理解你想干什么然后自己去调 API”。传统自动化是 if-this-then-that 的死逻辑流程一变脚本就废MCP 驱动的方式是你告诉 AI“把上周销售数据汇总发给张三”它自己去 Excel 找数据、在飞书发消息、必要时生成 Word 文档。这套东西适合谁适合已经会用 Node.js 写脚本、但被多平台鉴权和接口差异折磨的开发者适合想把飞书和 Office 全家桶串成一条自动化链路、又不想维护一堆硬编码逻辑的团队。我试过用纯脚本硬扛光是飞书和 Microsoft Graph 的 Token 刷新逻辑就写了三百行后来换成 MCP 统一管理配置量直接砍半。这篇要交付的是可复制的配置骨架settings.json、config.toml、CC Switch 和 Cline 的接入片段以及验证 MCP 服务连通和飞书消息触发的具体动作。你跟着做就能搭出一条 AI 代劳繁杂流程的自动化链路。2. TaoToken 前置统一 Key 管理告别多平台鉴权分散在动手写 MCP Server 之前先解决一个更底层的问题Key 管理。飞书有飞书的 TokenMicrosoft Graph 有 Graph 的 Token如果你还接了其他模型服务又是另一套 Key。这些 Key 散落在环境变量、配置文件、代码硬编码里换台机器就要重新配一遍。TaoToken 在这里的角色是统一入口。它提供兼容 OpenAI 风格的 API 接口你可以把模型调用统一走一个 KeyMCP Server 里只需要维护业务侧的鉴权飞书 Token、Graph Token模型侧的 Key 收敛到一处。具体操作访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后进入控制台在 API Keys 页面创建一个新 Key。这个 Key 后面会用在 MCP 客户端的配置里作为模型调用的凭证。注意TaoToken 的 API 端点是不带 UTM 参数的干净地址 https://taotoken.net/api配置时用这个。如果你用的是 Claude Code 或类似的编码 AgentTaoToken 也提供了对应的接入方式。进入控制台的 Coding Plan 页面可以查看针对长期编码场景的配置说明。对于本篇的 MCP 办公自动化场景你只需要一个标准 API Key 就够了。Key 拿到后先别急着写代码把环境变量规划清楚。我建议在项目根目录建一个.env文件把三类凭证分开# .env TAOTOKEN_API_KEYsk-你的TaoToken密钥 FEISHU_APP_IDcli_你的飞书应用ID FEISHU_APP_SECRET你的飞书应用密钥 MS_GRAPH_TOKEN你的微软Graph访问令牌飞书的 App ID 和 Secret 在飞书开放平台创建企业自建应用后获取需要开通“发送消息”和“读取用户信息”权限。Microsoft Graph Token 的获取稍微麻烦一些需要走 OAuth 2.0 授权码流程这里假设你已经拿到了 Access Token重点放在 MCP 的集成上。3. 可复制配置MCP Server 骨架与客户端接入这一章是核心交付。我会给出一个完整的 Node.js MCP Server 骨架封装飞书消息发送和 Excel 报表更新两个工具然后给出 CC Switch 和 Cline 的配置片段。3.1 项目初始化与依赖安装先建目录、初始化 npm、装依赖mkdir mcp-office-automation cd mcp-office-automation npm init -y npm install modelcontextprotocol/sdk axios dotenv npm install -D typescript types/node tsx npx tsc --inittsconfig.json需要改几个关键项确保 ESM 模块和 Node 版本兼容{ compilerOptions: { target: ES2022, module: ESNext, moduleResolution: bundler, outDir: ./dist, rootDir: ./src, strict: true, esModuleInterop: true, skipLibCheck: true }, include: [src/**/*] }在package.json里加上type: module和启动脚本{ type: module, scripts: { build: tsc, start: node dist/index.js, dev: tsx src/index.ts } }3.2 MCP Server 核心代码在src/index.ts里写 Server 逻辑。这段代码定义了三个工具发送飞书消息、更新 Excel 单元格、读取 Excel 数据。每个工具都有明确的 inputSchemaAI 会根据描述来决定调用哪个。import { Server } from modelcontextprotocol/sdk/server/index.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; import { ListToolsRequestSchema, CallToolRequestSchema, } from modelcontextprotocol/sdk/types.js; import axios from axios; import dotenv from dotenv; dotenv.config(); const server new Server( { name: office-feishu-bridge, version: 1.0.0 }, { capabilities: { tools: {} } } ); // 工具定义 server.setRequestHandler(ListToolsRequestSchema, async () ({ tools: [ { name: send_feishu_message, description: 向指定的飞书用户或群聊发送文本消息, inputSchema: { type: object, properties: { receive_id: { type: string, description: 接收者 ID可以是 open_id 或 chat_id, }, content: { type: string, description: 消息文本内容, }, }, required: [receive_id, content], }, }, { name: update_excel_range, description: 更新 OneDrive 上 Excel 文件中指定单元格范围的数据, inputSchema: { type: object, properties: { workbook_id: { type: string, description: Excel 工作簿的 Drive Item ID, }, range: { type: string, description: 单元格范围如 Sheet1!A1:B2, }, values: { type: array, items: { type: array }, description: 要写入的二维数组数据, }, }, required: [workbook_id, range, values], }, }, { name: read_excel_range, description: 读取 OneDrive 上 Excel 文件中指定单元格范围的数据, inputSchema: { type: object, properties: { workbook_id: { type: string, description: Excel 工作簿的 Drive Item ID, }, range: { type: string, description: 单元格范围如 Sheet1!A1:D10, }, }, required: [workbook_id, range], }, }, ], })); // 工具执行逻辑 server.setRequestHandler(CallToolRequestSchema, async (request) { const { name, arguments: args } request.params; if (name send_feishu_message) { try { const tokenResp await axios.post( https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal, { app_id: process.env.FEISHU_APP_ID, app_secret: process.env.FEISHU_APP_SECRET, } ); const tenantToken tokenResp.data.tenant_access_token; await axios.post( https://open.feishu.cn/open-apis/im/v1/messages?receive_id_typeopen_id, { receive_id: args?.receive_id, msg_type: text, content: JSON.stringify({ text: args?.content }), }, { headers: { Authorization: Bearer ${tenantToken} }, } ); return { content: [{ type: text, text: 飞书消息已送达。 }], }; } catch (e: any) { return { content: [ { type: text, text: 飞书接口报错: ${e.response?.data?.msg || e.message}, }, ], isError: true, }; } } if (name update_excel_range) { try { await axios.patch( https://graph.microsoft.com/v1.0/me/drive/items/${args?.workbook_id}/workbook/worksheets(Sheet1)/range(address${args?.range}), { values: args?.values }, { headers: { Authorization: Bearer ${process.env.MS_GRAPH_TOKEN} }, } ); return { content: [{ type: text, text: Excel 报表已同步更新。 }], }; } catch (e: any) { return { content: [ { type: text, text: 微软接口报错: ${e.message} }, ], isError: true, }; } } if (name read_excel_range) { try { const resp await axios.get( https://graph.microsoft.com/v1.0/me/drive/items/${args?.workbook_id}/workbook/worksheets(Sheet1)/range(address${args?.range}), { headers: { Authorization: Bearer ${process.env.MS_GRAPH_TOKEN} }, } ); return { content: [ { type: text, text: JSON.stringify(resp.data.values, null, 2), }, ], }; } catch (e: any) { return { content: [ { type: text, text: 读取失败: ${e.message} }, ], isError: true, }; } } throw new Error(未知工具: ${name}); }); const transport new StdioServerTransport(); await server.connect(transport);这段代码的关键点飞书 Token 每次调用时动态获取避免过期问题Excel 操作走 Microsoft Graph 的 workbook API支持读写单元格范围。工具描述写得越清楚AI 越容易正确调用。3.3 CC Switch 配置片段CC Switch 是管理多个 MCP Server 的客户端工具。在它的配置文件里加上这个 Server{ mcpServers: { office-feishu-bridge: { command: node, args: [/绝对路径/mcp-office-automation/dist/index.js], env: { TAOTOKEN_API_KEY: sk-你的TaoToken密钥, FEISHU_APP_ID: cli_你的飞书应用ID, FEISHU_APP_SECRET: 你的飞书应用密钥, MS_GRAPH_TOKEN: 你的微软Graph令牌 } } } }把路径换成你实际的dist/index.js绝对路径。env 里的变量会注入到 Server 进程中代码里用process.env读取。3.4 Cline 配置片段Cline 是 VS Code 里的 AI 编码助手也支持 MCP。在 Cline 的设置里找到 MCP Servers 配置填入{ mcpServers: { office-feishu-bridge: { command: npx, args: [tsx, /绝对路径/mcp-office-automation/src/index.ts], env: { TAOTOKEN_API_KEY: sk-你的TaoToken密钥, FEISHU_APP_ID: cli_你的飞书应用ID, FEISHU_APP_SECRET: 你的飞书应用密钥, MS_GRAPH_TOKEN: 你的微软Graph令牌 } } } }Cline 里用tsx直接跑 TypeScript 源码省去编译步骤适合调试阶段。生产环境建议用编译后的dist/index.js。4. 验证请求确认 MCP 服务连通与飞书消息触发配置写完后需要验证两件事MCP Server 能不能正常启动飞书消息能不能发出去。4.1 本地启动测试先在终端里直接跑 Server看有没有报错cd mcp-office-automation npm run build node dist/index.js如果没有任何输出说明 Server 在等待 stdio 输入这是正常的。MCP Server 通过标准输入输出通信不会主动打印日志。你可以按 CtrlC 退出。更直观的验证方式是用 MCP Inspector 工具npx modelcontextprotocol/inspector node dist/index.js这会启动一个本地 Web 界面你可以在里面看到所有注册的工具手动调用send_feishu_message测试飞书消息发送。填入 receive_id 和 content点执行如果返回“飞书消息已送达”说明链路通了。4.2 飞书消息触发验证在 MCP Inspector 里调用send_feishu_message时receive_id 需要填真实的 open_id 或 chat_id。获取方式在飞书开放平台的 API 调试台里用“获取用户列表”接口拿到某个用户的 open_id或者用“获取群列表”接口拿到 chat_id。调用成功后对应的飞书用户或群聊会收到一条文本消息。如果报错检查三个地方App ID 和 Secret 是否正确、应用是否开通了“发送消息”权限、receive_id 类型是否匹配open_id 和 chat_id 不能混用。4.3 在 AI 客户端里触发在 CC Switch 或 Cline 里配置好 MCP Server 后直接在对话里说“帮我在飞书给张三发一条消息内容是‘周报已更新’。”AI 会自动调用send_feishu_message工具你会在客户端里看到工具调用记录和返回结果。如果 AI 没有调用工具检查 MCP Server 是否在客户端里显示为已连接状态。CC Switch 和 Cline 都有 MCP 状态面板能看到每个 Server 的连接状态和工具列表。5. 本篇常见错排查5.1 MCP Server 启动报错 “Cannot find module”原因通常是dist/index.js路径不对或者 TypeScript 没编译成功。先跑npm run build看有没有编译错误确认dist目录下生成了index.js。如果用的是绝对路径检查路径里有没有中文或空格。5.2 飞书接口返回 “app_id not found”检查.env文件里的FEISHU_APP_ID是否和飞书开放平台里的一致。注意 App ID 以cli_开头不要漏掉前缀。另外确认应用已经发布上线未发布的应用无法调用 API。5.3 Microsoft Graph 返回 401 UnauthorizedGraph Token 过期了。Access Token 默认有效期一小时需要刷新。生产环境建议在 MCP Server 里加 Token 刷新逻辑用 Refresh Token 换新的 Access Token。调试阶段可以手动去 Azure Portal 重新获取。5.4 AI 客户端显示 MCP Server 已连接但工具调用失败检查 env 变量是否在客户端配置里正确传入。有些客户端不会自动读取.env文件需要在配置的env字段里显式写全。另外确认dotenv.config()在代码里被调用了否则process.env读不到值。5.5 飞书消息发送成功但收不到检查 receive_id 类型。如果填的是 open_idURL 参数必须是receive_id_typeopen_id如果填的是 chat_id要改成receive_id_typechat_id。代码里默认写的是 open_id发群消息时需要调整。6. 把 Key 和配置收拢到一处整套流程跑通后你会发现最省心的做法是把模型侧的 Key 统一交给 TaoToken 管理业务侧的 Token 放在 MCP Server 的 env 里。这样换机器或换客户端时只需要改一处配置。如果你还在调试阶段建议先用 MCP Inspector 把每个工具单独测通再接入 AI 客户端。直接上客户端调试的话出错时很难判断是 MCP Server 的问题还是客户端配置的问题。对于长期跑编码和 Agent 任务的场景可以看看 TaoToken 的 Coding Plan 页面里面有针对高频调用的配置建议。API Key 在控制台的 API Keys 页面管理接入文档在 doc 页面可以找到更详细的参数说明。整套配置下来你得到的是一个可扩展的 MCP 办公自动化骨架。想加新工具只需要在ListToolsRequestSchema里加定义、在CallToolRequestSchema里加执行逻辑AI 就能自动发现并调用。飞书和 Office 只是起点同样的模式可以套到 Notion、Slack、企业微信上。
RELATED READING

延伸阅读

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