
1. 为什么要在 Windows 上把 Affinity by Canva 的 MCP 接进 CodexAffinity by Canva 从 3.x 版本开始内置了 Model Context Protocol 能力简单说就是让 AI 助手能直接跟桌面设计软件对话帮你整理图层、批量导出、生成可复用的脚本。官方默认的路径是 Claude Desktop 通过 Affinity Connector 连到本地 MCP server再操作当前打开的文档。但很多人日常写代码、跑 Agent 用的是 Codex于是问题就来了Codex 能不能复用这套已经装好的 Connector我实测下来是可以的。Claude Desktop 安装的 Affinity Connector 本质上就是一个 Node.js 写的 stdio MCP bridge它自己不实现任何设计逻辑只负责把 MCP 协议转接到 Affinity 本地的 SSE endpoint。这意味着只要 Codex 能启动这个 Node 脚本就能拿到同一套工具。本文聚焦 Windows 环境围绕 Node.js 环境准备和 Codex 的 config.toml 骨架展开给出可直接复制的配置片段、TaoToken 统一 Key/API 通道的接入位置以及启动 Codex 后验证 MCP 连接是否生效的具体命令和排查动作。适合已经装好 Affinity by Canva、Claude Desktop并且本地有 Codex 开发环境的同学跟做。2. 前置准备Node.js 环境与 TaoToken 通道2.1 确认 Node.js 可用Affinity Connector 的入口是server/index.js必须由 Node 执行。先在 PowerShell 里确认版本node -v npm -v建议 Node.js 18 LTS 以上。如果提示找不到命令去 Node.js 官网下载 LTS 安装包安装时勾选 Add to PATH装完重开一个 PowerShell 窗口再验证。2.2 开启 Affinity 的 MCP打开 Affinity by Canva进入Edit - Settings - Model Context Protocol勾选Enable Affinity MCP。开启后必须完全退出 Affinity 再重新打开否则本地 SSE 服务不会监听。这一步很多人会漏掉重启导致后面端口探测一直失败。2.3 TaoToken 统一 Key/API 通道的接入位置Codex 本身要调用模型如果你希望用统一的 Key 和 API 通道管理模型调用可以在 TaoToken 控制台创建一个 API Key然后在 Codex 的模型配置里把 base_url 指向 TaoToken 的 API 地址。MCP 配置和模型配置是两回事MCP 负责让 Codex 能调用 Affinity 的工具TaoToken 负责 Codex 背后的模型请求走哪个通道。两者在 config.toml 里是分开的段落不要混在一起写。创建 Key 的入口在控制台的 API Keys 页面模型对话能力可以在模型对话页先验证通道是否通长期跑编码和 Agent 任务则建议看 Coding Plan 的额度说明。接入文档里有完整的 base_url 和鉴权头写法照着填即可。3. 可复制的 config.toml 骨架3.1 找到 Affinity Connector 的真实路径Windows 上 Claude Desktop 的扩展目录在用户目录下Affinity Connector 的路径类似C:\Users\你的用户名\AppData\Roaming\Claude\Claude Extensions\ant.dir.gh.canva.affinity进这个目录重点看四个文件manifest.json、package.json、README.md、server/index.js。其中manifest.json会声明 MCP server 的启动方式实测内容类似{ server: { type: node, entry_point: server/index.js, mcp_config: { command: node, args: [${__dirname}/server/index.js], env: { SSE_URL: http://localhost:6767/sse } } } }这说明链路是MCP client -node server/index.js-http://localhost:6767/sse- Affinity 桌面应用。注意网上流传的npx affinity/mcp-server这种写法我实测在 npm registry 里返回 404不能直接照抄必须以本机manifest.json为准。3.2 写入 Codex 的 config.toml在 Codex 的配置目录里找到config.toml加入下面这段。路径里的用户名替换成你自己的[mcp_servers.affinity] command node args [C:/Users/你的用户名/AppData/Roaming/Claude/Claude Extensions/ant.dir.gh.canva.affinity/server/index.js] startup_timeout_sec 30 [mcp_servers.affinity.env] SSE_URL http://localhost:6767/sse几个参数说明参数作用建议值command启动 MCP server 的可执行程序nodeargs入口脚本绝对路径指向 server/index.jsstartup_timeout_sec启动超时Node 冷启动较慢30SSE_URLAffinity 本地 SSE 地址http://localhost:6767/sse注意路径统一用正斜杠/Windows 的反斜杠在 TOML 字符串里容易被当转义符处理写错会导致启动失败。3.3 为什么用 localhost 而不是 127.0.0.1实测有些机器上 Affinity 只在 IPv6 的[::1]:6767上暴露服务写死127.0.0.1会连不上。localhost会同时尝试 IPv4 和 IPv6兼容性更好。先用命令确认监听情况netstat -ano | Select-String -Pattern 6767|LISTENING如果看到[::1]:6767就说明是 IPv6 监听配置里保持localhost即可。4. 验证 MCP 连接是否生效4.1 启动顺序正确的启动顺序是先开 Affinity 并确认 MCP 已启用再启动 Codex。顺序反了 Codex 启动时连不上 SSE工具列表里就不会出现 affinity。4.2 确认 Affinity 进程和端口Get-Process Affinity -ErrorAction SilentlyContinue netstat -ano | Select-String -Pattern 6767第一条能列出进程第二条能看到 6767 处于 LISTENING说明本地服务已就绪。4.3 在 Codex 里确认工具出现重启或刷新 Codex 工具环境后查看可用工具列表连接成功通常能看到这些 MCP toolsexecute_script render_spread render_selection list_sdk_documentation read_sdk_documentation_topic search_sdk_hints list_library_scripts read_library_script save_script_to_library add_sdk_hint report_sdk_issue第一次测试建议只调用只读工具按这个顺序来先list_sdk_documentation再read_sdk_documentation_topic读取preamble。preamble 会说明 Affinity JS SDK 的基本约束比如执行脚本前要先读它、脚本结果需要用console.log输出、文件系统能力可能受 Affinity 设置限制。不要一上来就调execute_script它会在 Affinity 里执行 JavaScript可能改动当前文档。4.4 成功结果长什么样调用list_sdk_documentation后返回的是一组文档主题列表调用read_sdk_documentation_topic传入preamble返回的是 SDK 约束说明文本。只要这两个能正常返回内容就说明 Codex 到 Affinity 的 MCP 链路已经打通后续再考虑render_spread这类只读渲染工具。5. 本篇常见错排查5.1 浏览器打开 localhost:6767/sse 是空白这是正常现象。这个地址不是普通网页而是给 MCP/SSE 客户端用的 endpoint直接用浏览器打开不一定有可读页面。判断是否可用要以 MCP client 能否 listTools、能否调用只读工具为准。5.2 curl /mcp 或 curl /sse 返回 404 或空响应Affinity 的本地 MCP 通信需要正确的 MCP/SSE 会话方式普通 GET/POST 探测不能等同于 MCP client 连接测试。别用 curl 的结果下结论回到 Codex 里看工具列表更准。5.3 Codex 工具列表里没有 affinity按顺序排查Affinity 是否已重启并开启 MCPnetstat是否看到 6767 监听config.toml 里args路径是否指向真实存在的server/index.js路径是否误用了反斜杠startup_timeout_sec是否太小导致 Node 冷启动被判定超时。改完配置后必须重启 Codex当前会话不会自动加载新工具。5.4 能不能直接改 Claude 的 Affinity Connector不建议。直接修改已安装的 connector 可能导致更新失败、签名状态变化或排查困难。更稳妥的做法是复用它的启动方式或者单独写一个本地 bridge。如果没装 Claude Desktop可以考虑第三方 bridge 路线但那需要单独验证版本和源码不在本文范围内。5.5 安全边界只读工具先行执行脚本前先读 SDK 文档不在未保存的文档上测试危险脚本不修改 Claude Connector 安装文件不读取或复制登录态、token、cookie不绕过 Affinity 或 Canva 的授权机制。execute_script和save_script_to_library能力很强适合在目标明确、可回滚的文档上使用。6. 把通道和工具分开管理配置跑通之后日常维护其实就两件事一是 Affinity 升级或 Claude Desktop 更新后Connector 路径可能变化需要重新核对manifest.json里的入口二是模型通道的 Key 和额度管理建议统一放在 TaoToken 控制台避免多个项目里散落不同的 Key。模型对话页适合快速验证通道是否正常接入文档里有 base_url 和鉴权头的完整写法长期跑编码和 Agent 任务可以对照 Coding Plan 的额度说明做规划。MCP 配置和模型通道配置在 config.toml 里各管一段分开维护出问题时也更容易定位是工具链路还是模型链路的问题。