Codex Affinity Personal让 AI 真正进入可编辑设计工作流之所以给 Codex 搭配 Affinity 而非 Adobe 旗下 Photoshop、Illustrator、InDesign核心原因是 Affinity 面向个人用户可直接使用无需订阅付费而 PS、AI、ID 均采用订阅制才能合法使用。Codex 环境内无法运行盗版软件因此选用 Affinity 作为合规平替方案二者能够完美适配协同工作。很多 AI 设计工具擅长生成一张看起来不错的图片但真正进入设计生产流程后仅有图片通常并不够。设计师还需要可选择的文字、形状和图层需要修改尺寸、检查画布方向、保留历史版本并在 Affinity 中继续编辑。affinity-personal正是为这类工作设计的它把 Codex 与本机运行的 Affinity 连接起来让 Codex 不只是“描述一张图”而是能够读取 Affinity 的当前状态、执行脚本、生成原生对象、渲染画布并验证结果。本文记录这个个人插件的架构、功能、使用方法、真实测试结果以及开发过程中遇到的关键问题。QCodex为什么搭配Affinity不使用Photoshop、Illustrator、InDesignA主要出于正版合规与使用成本两大核心考量付费模式差异Adobe Photoshop、Illustrator、InDesign全部采用按月订阅模式个人长期使用需要持续续费而最新版Affinity套件支持个人免费使用无需订阅仅高级功能及部分 AI 功能可按需升级性价比更高。Codex环境禁用盗版软件Codex系统环境无法识别、运行各类破解盗版Adobe软件强行使用盗版会直接导致功能失效、程序无法正常启动。适配兼容性拉满Affinity作为Adobe全家桶合规平替工具能够和Codex深度适配、完美兼容联动整套工作流程可顺畅落地是兼顾合法使用与低成本的最优替代方案。QCodex为何选用Affinity替代PS、AI、IDAAdobe三款软件需订阅付费Codex无法运行盗版Affinity个人版免费使用迁移上手门槛低可与Codex无缝兼容是合规低成本的理想平替。QCodex 已有 Affinity 插件为何不用A原插件是企业版个人用户无法安装连接账户使用。Q自制 Affinity Personal 插件和插件商店已有的企业版 Affinity 插件有何不同A原企业插件采用专有许可证企业扩展源码许可证明确禁止未经授权的复制、修改和分发。因此我们已通过 clean-room 方法实现功能等价代理并增加了企业代理没有提供的诊断、重连、错误规范化和安全元数据制作了适配本地的 Affinity Personal 个人版插件。采用 MIT 许可你可以自由修改。关键词Codex搭配Affinity、Codex平替PS、不用Photoshop接入Codex、Affinity替代Illustrator InDesign、Codex禁止盗版软件、Affinity免费版适配Codex一、它解决了什么问题传统的 AI 图片生成流程通常是输入提示词得到 PNG 或 JPEG把图片放进设计软件需要修改文字或布局时重新生成。这种方式适合灵感草图却不适合需要持续修改的正式项目。通过 Affinity 的脚本和 MCP 能力工作流可以变成用户用自然语言描述任务Codex 查询当前 Affinity SDK 文档Codex 在 Affinity 中创建真实的文字、形状和图层读取实际文档尺寸与状态渲染完整画布进行视觉验证不符合要求时继续修正用户确认后保存为可继续编辑的 Affinity 文件或可复用脚本。关键差异在于最终交付物可以是由 Affinity 原生对象组成的设计而不只是嵌入文档的一张位图。AI 用自然语言操纵 Affinity 生成店招可编辑文件的成功流程复盘AI 操纵 Affinity 生成可编辑店招海报设计流程复盘 v1.0Windows 本地配置记录Codex 重启后识别 Affinity MCP绕过 Claude DesktopAffinity MCP 直连 WorkBuddy/Cursor 完整配置指南WindowsWindows 本地配置记录把 Affinity by Canva 的 MCP 连接到 Codex二、整体架构Affinity 桌面应用在启用 MCP 后会在本机提供一个 SSE 服务http://localhost:6767/sseaffinity-personal则运行在 Codex 一侧把 Codex 使用的标准输入输出 MCP 通信转换成本机 SSE 连接用户 ↓ Codex ↓ stdio MCP affinity-personal ↓ local SSE Affinity desktop MCP ↓ Affinity 文档、图层、画布和脚本库这里需要明确区分两层Affinity 内置 MCP 服务属于 Affinity 桌面应用负责真正执行设计操作affinity-personal是个人开发的 Codex 插件负责连接、能力发现、安全元数据、重连、错误处理和工作流约束。个人插件不会修改 Affinity 内部服务也不会绕过 Affinity 的产品许可或用户权限。三、插件提供的能力在真实 Affinity 会话中插件动态发现了 11 个上游工具。1. 文档脚本execute_script可以执行 Affinity JavaScript SDK 脚本。它是创建图层、文字、矢量形状、调整文档和构建设计工具的核心入口。Affinity SDK 类并不是默认全局变量。正确写法需要显式导入const { Document } require(/document); const doc Document.current; console.log(JSON.stringify({ hasDocument: !!doc, sessionUuid: doc ? doc.sessionUuid : null }));脚本需要使用console.log()输出诊断信息。仅仅在代码末尾写return并不是可靠的结果通道。2. 画布与选区渲染render_spread会直接从 Affinity 文档渲染完整画布render_selection则渲染当前选区。这两项能力非常重要因为桌面截图可能受到设置窗口、导出窗口或进度提示遮挡。MCP 渲染得到的是干净的文档内容更适合作为最终视觉验收依据。桌面截图仍然有价值但它主要用于判断是否有窗口遮挡当前位于哪个文档标签Affinity 是否处于等待或下载状态用户界面是否出现异常。它不能替代干净的画布渲染。3. SDK 文档插件可以列出和读取 Affinity 当前提供的 SDK 文档。每个新的脚本会话都应先读取preamble。其中包含当前版本的导入规则、参数范围、渲染要求、权限限制和已知实践。个人插件会在每次连接的第一个脚本调用前自动加载preamble但自动加载只是安全网Codex 仍然需要真正阅读内容后再编写脚本。4. Affinity 脚本库插件可以列出本地脚本读取已有脚本在用户确认后保存新的可复用脚本。这意味着一次成功的设计操作可以被整理成 Affinity 中长期使用的工具而不必每次重新生成。5. SDK 提示和问题反馈Affinity 还提供共享提示搜索、添加提示和报告 SDK 问题的能力。这些工具与纯本地操作不同搜索共享提示属于联网读取添加提示和报告问题会向本机以外发送信息。affinity-personal会为它们标记明确的联网和写入属性。除非用户明确要求否则不应自动提交提示或问题报告。四、个人版增加的能力个人插件没有简单复制某个固定工具列表而是每次连接时从 Affinity 动态读取当前能力。这样 Affinity 更新工具后插件不需要依赖过期的硬编码清单。此外它还增加了两个本地工具。affinity_personal_status用于检查当前连接地址是否成功连接连接建立时间SDKpreamble是否已加载重连次数已转发调用次数Affinity 当前暴露的工具清单。affinity_personal_reconnect当 Affinity 重启、MCP 被重新启用或连接失效时可以主动释放旧连接并重新发现工具。代理还会在普通调用失败后进行一次受控的自动重连避免短暂断线直接导致整个任务失败。五、最重要的改进不能把“执行过”当作“完成了”插件测试中出现过一个很典型的问题用户要求600 × 240 px的横版海报任务报告也声称已经创建横版画布但 Affinity 中实际显示的文档是竖版。这说明脚本虽然运行了但任务没有验证真实结果。现在尺寸和方向会被视为硬性验收条件横版actualWidth actualHeight 竖版actualHeight actualWidth 方形actualWidth actualHeight对于600 × 240 px 横版最低验收条件是actualWidth 600 actualHeight 240 actualWidth actualHeight正确流程是把自然语言要求转换为明确的宽度和高度创建文档从 Affinity 重新读取实际尺寸判断实际方向不符合时修正文档再次读取尺寸渲染完整画布验证后才能报告完成。如果文字写着“横版”但给出的尺寸却是高度大于宽度插件工作流应先请用户确认而不是自行猜测。六、错误处理为什么需要增强真实审计中还发现Affinity 上游有时会返回类似下面的内容ReferenceError: Document is not defined但 MCP 结果未必会同时设置isError: true。如果代理只检查状态字段Codex 就可能把失败脚本当成成功结果继续执行。个人版会识别以下失败信号ReferenceErrorTypeErrorSyntaxErrorRangeError普通Error:NOT_ALLOWED当这些内容出现在脚本响应中时代理会把结果规范化为真正的 MCP 错误。NOT_ALLOWED通常意味着 Affinity 设置限制了文件、网络或 AI 权限。遇到这种情况应尊重权限配置而不是尝试绕过。七、安全元数据个人插件为工具补充了明确的行为分类。只读本地操作包括读取 SDK 文档列出和读取本地脚本渲染画布渲染选区查询连接状态。可能修改文档或本地状态的操作包括执行任意 Affinity 脚本保存脚本到 Affinity 脚本库。涉及外部系统的操作包括搜索共享 SDK 提示添加共享提示报告 SDK 问题。这种分类可以帮助 Codex 更准确地决定何时需要用户确认。八、安装与使用插件源码目录为C:\Users\love\plugins\affinity-personal个人市场配置为C:\Users\love\.agents\plugins\marketplace.json首次使用前启动兼容版本的 Affinity打开 Affinity 设置启用 MCP Server在 Codex 的个人插件市场安装affinity-personal新建一个 Codex 任务让新插件和技能被完整加载。可以先使用以下指令检查连接插件 使用 Affinity Personal 检查当前 MCP 状态列出实时工具但不要修改文档。或者直接在对话框中 插件名 指令内容测试affinity-personal 检查当前 MCP 状态列出实时工具但不要修改文档。测试设计任务可以写成在 Affinity 中创建一张 600 × 240 px 的横版海报。 横版和尺寸是硬性约束。 创建后读取实际画布尺寸并验证宽度大于高度不符合就修正。 使用 render_spread 渲染完整画布确认内容无遮挡后再报告完成。 除非我明确确认不要覆盖已有文件。九、如何迭代插件更新插件时不应直接修改个人市场配置来制造刷新。正确流程是修改 clean-room 代理或技能说明检查 JavaScript 语法在 Affinity MCP 已开启时运行能力审计验证 Codex 插件清单验证技能清单使用插件创建工具提供的 cachebuster 更新脚本从个人市场刷新插件新建 Codex 任务测试。核心测试命令对应的文件包括scripts/affinity-personal.mjs scripts/smoke-test.mjs scripts/capability-audit.mjs skills/affinity-personal/SKILL.md能力审计应至少覆盖连接工具发现preambleSDK 文档脚本库读取只读脚本执行文档会话 UUID完整画布渲染选区渲染主动重连脚本错误规范化插件与技能清单验证。不要为了测试而随意提交 SDK 问题、上传共享提示、覆盖用户文档或往脚本库写入垃圾脚本。确认工具结构与实际执行写入操作是两件不同的事。十、源码和许可边界affinity-personal是独立编写的通用 MCP 代理使用 MIT 许可可以自由阅读、修改和继续开发。它不包含 Canva 企业扩展的专有源码、图标、身份信息或凭据也不尝试绕过 Affinity 的许可和权限。实现功能等价的正确方法是观察公开可见的工具行为和协议然后独立编写代码并进行真实测试而不是复制受限制的实现。十一、真实测试结果截至 2026 年 7 月 13 日实机审计结果如下测试项结果本机 MCP 连接通过动态发现 11 个 Affinity 工具通过读取 SDK preamble通过列出 SDK 文档通过列出本地脚本库通过使用显式/document导入执行只读脚本通过获取当前文档会话 UUID通过渲染完整画布 JPEG通过渲染选区 JPEG通过主动断线重连通过将脚本异常规范化为 MCP 错误通过Codex 插件验证通过Codex 技能验证通过这套插件目前已经不只是“让 Codex 连上 Affinity”的桥接器而是一层面向真实设计工作的控制和验收系统它知道怎样连接、怎样读取当前 SDK、怎样识别失败、怎样验证画布以及什么时候不能擅自写入或向外发送信息。对于需要可编辑图层、持续迭代、真实尺寸和可验证交付的设计任务这比单纯生成一张图片更接近完整的生产工作流。