新闻详情

新闻详情

首页 / 资讯中心 / 详情

用MCP+Electron写了个服务,让Cursor Trae提醒我不要忘记点外卖:TaoToken统一Key接入与config.toml骨架

发布时间:2026/9/25 11:42:59来源:尧图网络
用MCP+Electron写了个服务,让Cursor Trae提醒我不要忘记点外卖:TaoToken统一Key接入与config.toml骨架
1. 为什么我要让 Cursor 提醒我点外卖写代码写到下午两点肚子叫了才想起来午饭没点外卖平台再等四十分钟——这种事我经历过太多次。Cursor 和 Trae 作为日常主力编辑器本身没有系统级提醒能力它们专注在代码补全和对话上这很正常。但我想的是既然 MCP 能让编辑器调用外部工具那我完全可以写一个本地提醒服务让 Cursor 或 Trae 在我说「提醒我 12 点前点外卖」的时候真的弹出一个系统通知。这个项目的核心思路是Electron 负责系统级通知和日程管理界面MCP Server 负责把「添加日程」这个能力暴露给 Cursor/Trae两者之间用本地 HTTP 通信。而 AI 工具本身要能稳定调用 MCP就需要一个统一的 API 通道来管理 Key 和模型接入——我用的是 TaoToken后面会给出完整的 config.toml 和 settings.json 骨架。适合谁看已经在用 Cursor 或 Trae、想尝试 MCP 自定义工具、又不想折腾多平台 Key 管理的开发者。跟着做大概需要 30 分钟前提是你本地有 Node.js 18 环境。2. TaoToken 前置统一 Key 与 API 通道在写 MCP Server 之前先解决一个容易被忽略的问题Cursor 和 Trae 各自要配置模型 API如果你同时用多个模型比如 Claude 做代码审查、GPT 做日程解析每个平台都要单独填 Key、单独改 base_url改来改去很容易乱。TaoToken 的做法是提供一个统一的 API 通道你只需要在它那里生成一个 Key然后在各个工具里把 base_url 指向同一个地址就行。具体操作打开 https://taotoken.net/api 对应的控制台在 API Keys 页面创建一个新 Key。这个 Key 同时适用于 Cursor 的模型配置、Trae 的模型配置以及你后面可能接入的其他 AI 工具。创建完之后先复制保存后面 config.toml 和 settings.json 里都要用。注意Key 只显示一次建议创建后立刻粘贴到本地配置文件里不要留在浏览器剪贴板里过夜。TaoToken 在这里的角色是「统一入口」——你的 MCP Server 本身不直接调用大模型它只是被 Cursor/Trae 调用但 Cursor/Trae 在理解你的自然语言指令比如「帮我加一个每天中午 12 点的外卖提醒」时需要调用模型这个模型请求就走 TaoToken 的通道。所以整个链路是你在 Cursor 里说一句话 → Cursor 用 TaoToken Key 调用模型解析意图 → 模型决定调用 add-schedule 工具 → MCP Server 收到请求 → 转发给 Electron 的 Express 服务 → Electron 弹出通知。如果你还没创建 Key可以先到 https://taotoken.net/api 的文档页看一下接入说明再回来继续。模型对话调试可以用 https://taotoken.net/api 对应的模型对话页面先验证 Key 是否可用。3. 可复制配置config.toml 与 settings.json 骨架MCP Server 写完之后最关键的一步是让 Cursor 和 Trae 知道它的存在。两个编辑器的配置方式略有不同下面给出可直接复制的骨架。3.1 Cursor 的 MCP 配置config.toml 风格Cursor 目前通过mcp.json或项目级配置来注册 MCP Server但如果你用的是支持 TOML 的版本或想统一管理可以按下面的结构写。核心是command和args要指向你编译后的 MCP Server 入口文件。# cursor_mcp_config.toml # 放在项目根目录或 Cursor 的全局配置目录 [mcp_servers.schedule-electron] command node args [/Users/yourname/projects/cursor_mcp_schedule_with_electron/mcp-server/dist/index.js] env { TAOTOKEN_API_KEY sk-你的TaoTokenKey, ELECTRON_API_BASE http://localhost:3001 } [mcp_servers.schedule-electron.env] # 如果不想把 Key 写死在文件里可以用环境变量引用 # TAOTOKEN_API_KEY ${TAOTOKEN_API_KEY}这里command用node直接跑编译后的 JS比用npx或ts-node更稳定启动速度也快。args里的路径要换成你本地的实际路径。ELECTRON_API_BASE指向 Electron 里 Express 服务的地址默认 3001 端口。3.2 Trae 的 MCP 配置settings.json 风格Trae 的配置更接近 VS Code 的 settings.json 结构MCP Server 注册在mcp.servers字段下{ mcp: { servers: { schedule-electron: { command: node, args: [ /Users/yourname/projects/cursor_mcp_schedule_with_electron/mcp-server/dist/index.js ], env: { TAOTOKEN_API_KEY: sk-你的TaoTokenKey, ELECTRON_API_BASE: http://localhost:3001 } } } }, ai.model.baseUrl: https://taotoken.net/api, ai.model.apiKey: sk-你的TaoTokenKey }注意ai.model.baseUrl和ai.model.apiKey这两行——这是让 Trae 的模型请求走 TaoToken 统一通道的关键。Cursor 那边同理在模型设置里把 base_url 改成https://taotoken.net/apiKey 填同一个。3.3 Electron 端的 Express 服务骨架MCP Server 本身不存日程数据它只做转发。真正的数据存在 Electron 的 electron-store 里通过 Express 暴露增删查接口。下面是 Express 服务的核心骨架// electron/main/express-server.js const express require(express) const cors require(cors) const schedule require(node-schedule) const { expandRecurringSchedules } require(./schedule-utils) const expressApp express() const PORT 3001 expressApp.use(cors()) expressApp.use(express.json()) // 获取所有日程 expressApp.get(/api/schedules, (req, res) { const schedules store.get(scheduleList, []) res.json(schedules) }) // 按时间范围查询支持循环日程展开 expressApp.get(/api/schedules/range, (req, res) { const { start, end } req.query if (!start || !end) { return res.status(400).json({ error: 请提供 start 和 end 参数 }) } const schedules store.get(scheduleList, []) const rangeSchedules expandRecurringSchedules( schedules, new Date(start.replace( , T)), new Date(end.replace( , T)) ) res.json({ schedules: rangeSchedules }) }) // 新增日程并注册定时提醒 expressApp.post(/api/schedules, (req, res) { const schedules store.get(scheduleList, []) const newSchedule { ...req.body, id: Date.now().toString(), hasNotified: false } schedules.push(newSchedule) store.set(scheduleList, schedules) // 如果是循环任务只为今天范围内的实例创建提醒 if (newSchedule.repeatType newSchedule.repeatType ! none) { const today new Date() const tomorrow new Date(today) tomorrow.setDate(tomorrow.getDate() 1) const todayInstances expandRecurringSchedules([newSchedule], today, tomorrow) todayInstances.forEach(instance { if (instance.reminder) checkSingleReminder(instance) }) } else if (newSchedule.reminder) { checkSingleReminder(newSchedule) } res.status(201).json(newSchedule) }) expressApp.listen(PORT, () { console.log(Schedule API server running on port ${PORT}) })checkSingleReminder函数负责用 node-schedule 注册具体时刻的提醒任务到点后调用 Electron 的showReminderNotification弹出系统通知。这里有个细节每天 23:59 要跑一次checkTomorrowReminders把第二天的循环日程实例提前注册好否则第二天开机后不会自动提醒。4. 验证请求从 Cursor 里触发一次外卖提醒配置写完之后先别急着在 Cursor 里试用 curl 直接打 Express 接口确认服务本身是通的。# 1. 确认 Express 服务在跑 curl http://localhost:3001/api/schedules # 2. 添加一条测试日程今天 12:00 提醒点外卖 curl -X POST http://localhost:3001/api/schedules \ -H Content-Type: application/json \ -d { title: 点外卖, start: 2025-05-20 12:00:00, end: 2025-05-20 12:30:00, reminder: 2025-05-20 11:55:00, type: normal, repeatType: daily, repeatInterval: 1, repeatDays: [], repeatEnd: } # 3. 查询今天范围内的日程确认循环实例被展开 curl http://localhost:3001/api/schedules/range?start2025-05-20%2000:00:00end2025-05-20%2023:59:59如果第三步返回的 JSON 里能看到title: 点外卖且reminder字段有值说明 Express 和循环展开逻辑都正常。接下来在 Cursor 里测试 MCP 调用打开 Cursor 的对话窗口输入「帮我加一个每天中午 11:55 提醒点外卖的日程」观察 Cursor 是否自动调用add-schedule工具。如果 Cursor 没有自动识别可以手动指定「使用 schedule-electron 的 add-schedule 工具添加日程标题点外卖开始时间今天 12:00提醒时间今天 11:55重复类型 daily」。Trae 那边类似但 Trae 可能更偏向代码上下文对日程类指令的自动识别不如 Cursor 敏感。实测下来在 Trae 里需要把指令写得更明确比如「调用 MCP 工具 add-schedule参数如下...」它才会稳定触发。成功的结果是Electron 托盘图标弹出系统通知标题是「点外卖」内容是你设置的日程描述。同时 Electron 的日程界面里能看到这条记录并且第二天 23:59 之后会自动注册后天的提醒。5. 本篇常见错排查MCP Server 启动后 Cursor 里看不到工具先确认command和args路径完全正确用node /path/to/index.js手动跑一次看是否有报错。常见的是modelcontextprotocol/sdk没装或版本不匹配建议锁定1.x版本。另外 Cursor 的 MCP 日志在输出面板里可以看搜「MCP」就能找到。Express 端口 3001 被占用改PORT常量同时把 MCP Server 里的ELECTRON_API_BASE和 Cursor/Trae 配置里的地址一起改掉。三个地方要同步漏一个就连不上。提醒到点不弹通知Electron 的showReminderNotification依赖系统通知权限。macOS 上要在「系统设置 → 通知」里允许 Electron 应用发送通知Windows 上检查「专注助手」是否屏蔽了通知。另外 node-schedule 注册的任务在 Electron 窗口关闭后如果进程还在任务会继续跑如果进程被杀了任务就丢了所以开机自启要配好。循环日程第二天不提醒检查checkTomorrowReminders是否在app.whenReady()里注册了schedule.scheduleJob(59 23 * * *, ...)。这个定时任务负责在每天 23:59 把第二天的循环实例展开并注册提醒。如果电脑在 23:59 时是关机状态这个任务不会补跑需要加一个启动时的补偿逻辑app.whenReady()里先跑一次checkTodayReminders()再跑一次checkTomorrowReminders()。TaoToken Key 在 Cursor 里报 401确认 base_url 填的是https://taotoken.net/api不要多加/v1或结尾斜杠。Key 要完整复制不要带空格。如果 Cursor 版本较老可能需要在设置里手动开启「自定义 API 端点」选项。6. 接入文档与后续调试MCP Server 的调试比较依赖日志建议在server.tool的回调里加console.error输出因为 MCP 走 stdio 通信console.log会污染协议数据必须用console.error。Cursor 和 Trae 都会把 MCP Server 的 stderr 输出到日志面板方便排查。如果你在接入过程中遇到 Key 配置或模型调用的问题可以直接到 https://taotoken.net/api 的 API Keys 页面重新生成一个 Key 测试排除 Key 本身的问题。接入文档里有各编辑器的 base_url 填写示例对照检查一遍通常能解决大部分 401/404 错误。日程数据存在 Electron 的 electron-store 里默认路径在用户目录下的config.json。如果想重置直接删掉这个文件再重启 Electron 就行。MCP Server 本身无状态重启 Cursor 或 Trae 不会丢数据。最后提一个实际踩过的坑Electron 的 Express 服务在开发模式下用nodemon热重载时node-schedule 注册的定时任务会重复叠加导致同一时间弹多次通知。解决办法是在app.on(before-quit)里遍历所有 job 并cancel()或者开发时干脆不用热重载改完手动重启。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

MFC坐标转换实战:GetClientRect/GetWindowRect/ClientToScreen/GetCursorPos/ScreenToClient 配 TaoToken 统一 Key 通 2026/9/25 12:17:18

MFC坐标转换实战:GetClientRect/GetWindowRect/ClientToScreen/GetCursorPos/ScreenToClient 配 TaoToken 统一 Key 通

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
ESPnet2 语音情感分析实战:基于 Switchboard 情感标注数据的 Conformer ASR 多任务方案 2026/9/25 12:17:18

ESPnet2 语音情感分析实战:基于 Switchboard 情感标注数据的 Conformer ASR 多任务方案

人工智能语音音频深度学习NLP 【免费下载链接】espnet End-to-End Speech Processing Toolkit 项目地址: https://gitcode.com/gh_mirrors/es/espnet 点击查看 免费下载 导读 本文围绕 ESPnet2 仓库中的 egs2/swbd_sentiment/asr1 语音情感分析(Speech…

阅读更多 →
STM32红外PM2.5通信原理与NEC协议解析实战 2026/9/25 12:17:11

STM32红外PM2.5通信原理与NEC协议解析实战

1. 为什么STM32接红外PM2.5传感器不是“插上线就能用”的事在嵌入式课程设计、毕业项目甚至小型环境监测设备开发中,“STM32连接红外PM2.5传感器”这个标题听起来简单直接——不就是把传感器模块的VCC、GND、TX/RX接到单片机上,串口读数据吗?…

阅读更多 →
纯2D Canvas绘制立体机器人头像:Libraries.dev的bot-avatars塑料材质渲染原理 2026/9/25 12:17:11

纯2D Canvas绘制立体机器人头像:Libraries.dev的bot-avatars塑料材质渲染原理

纯2D Canvas绘制立体机器人头像:Libraries.dev的bot-avatars塑料材质渲染原理 【免费下载链接】Libraries.dev High-crafted UI libraries for AI agents: Border beam, Orbs, Metal, Gooey, Voice, Image, Avatar bots 项目地址: https://gitcode.com/gh_mirrors…

阅读更多 →
OpenClaw-China-Docker企业微信机器人完整配置:多账号、Webhook与欢迎消息一次搞懂 2026/9/25 12:16:52

OpenClaw-China-Docker企业微信机器人完整配置:多账号、Webhook与欢迎消息一次搞懂

OpenClaw-China-Docker企业微信机器人完整配置:多账号、Webhook与欢迎消息一次搞懂 【免费下载链接】openclaw-china-docker OpenClaw 的中国IM平台整合Docker版本,预装并配置了飞书、钉钉、QQ机器人、企业微信等主流中国IM软件的插件,让您可…

阅读更多 →
read语音听书全攻略:70种TTS语音包+在线语音包生成器完整使用教程 2026/9/25 12:16:45

read语音听书全攻略:70种TTS语音包+在线语音包生成器完整使用教程

read语音听书全攻略:70种TTS语音包在线语音包生成器完整使用教程 【免费下载链接】read 整理各大佬的阅读书源合集(自用) 项目地址: https://gitcode.com/gh_mirrors/read3/read read 是一个「阅读」APP 书源合集项目,除了…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉