← 返回博客

Codex 怎么接 MCP 自动发布内容:mcp add 明明加成功了,工具却读不出来

·Codex MCPcodex mcp addconfig.toml 配置AI CLI 发布AI 自动发布

Codex 怎么接 MCP 自动发布内容:mcp add 明明加成功了,工具却读不出来

一句话回答:Codex 是纯终端工具,没有 Cursor、Trae 那种一键装插件的图形界面,接 MCP 只能靠 codex mcp add --url 命令或者手写 ~/.codex/config.toml;PublishPort 走远程 Streamable HTTP,token 存进 bearer_token_env_var 指定的环境变量最省事,但项目级的 .codex/config.toml 只有这个目录被标记成 trusted 才会生效,配完没反应十有八九是卡在这一步。

在终端里用 Codex 把一个功能改完、顺手让它把改动思路记成一篇笔记,这半小时它自己就能包办。笔记写完想发到 CSDN 或掘金存档,还是得开浏览器、登录后台、把 Markdown 一段段贴过去。Codex 本身没有窗口可以点“发布”这个按钮——它就是个终端程序,能接的东西全靠 MCP,但市面上给内容平台做的 MCP 服务器几乎没有,这件事跟用什么客户端接 MCP 关系不大,是平台那头一直没开放布这个口子。

Codex 接 MCP 和 Cursor、Trae 完全不是一回事

Cursor 有 Marketplace,点一下 Add to Cursor 就能装完;Trae 在设置里点几下鼠标就能填完一个 MCP 服务器。Codex 没有这层图形界面,官方文档里写的接入方式就两种:命令行 codex mcp add,或者直接编辑 ~/.codex/config.toml(也可以放到项目目录下的 .codex/config.toml,只对被信任的项目生效)。ChatGPT 桌面版和 IDE 插件用的是同一份配置,配一次三边都能用。

这不是缺陷,是 Codex 作为纯 CLI 工具的定位决定的——它面向的是习惯在终端里工作的开发者,配置这件事本来就该能写进脚本、能进版本控制,而不是每台机器都点一遍鼠标。代价是没有图形化的“已连接/未连接”状态提示,接没接成功得自己用命令确认。

PublishPort 的思路:接口一样,只是换了个入口

PublishPort 给 AI 的不是按平台注册的插件,而是两个通用工具:list_capabilities() 告诉 Codex 这台设备当前登录了哪些平台账号,local_bash(cmd) 把具体的发布命令下发到本机执行,跑的是驱动真实登录态的开源命令行工具。Codex 该传什么参数,自己读一遍命令的 --help 就知道,不需要为每个平台单独写死一套工具定义。

装好 PublishPort 客户端、用真实浏览器登录要发布的平台账号后,在客户端「接入 AI」页面能拿到一条 MCP 接入地址,这条地址在 Codex、Cursor、Trae 里都能用,接入方式跟着各自的客户端走,地址和 token 是同一份。

具体接入:mcp add 一条命令,或者手写 config.toml

最省事的是命令行方式,一条命令加完,把 token 放进环境变量而不是命令行参数里(避免留在 shell 历史里):

export PUBLISHPORT_TOKEN="<PublishPort 接入 AI 页面给的 token>"
codex mcp add publishport --url "<PublishPort 接入 AI 页面给的 MCP 接入地址>" --bearer-token-env-var PUBLISHPORT_TOKEN

codex mcp list 能看到刚加的这一条;想确认工具是不是真的读到了,进 Codex 的 TUI 敲 /mcp 看一眼。

想要能进版本控制、方便团队照抄,就手写 config.toml。全局配置在 ~/.codex/config.toml,只想在写博客这一个项目里生效就放项目目录下的 .codex/config.toml

[mcp_servers.publishport]
url = "<PublishPort 接入 AI 页面给的 MCP 接入地址>"
bearer_token_env_var = "PUBLISHPORT_TOKEN"

这里跟 Cursor 的 ${env:变量名} 插值语法不是一回事——Codex 的 bearer_token_env_var 只填一个环境变量的名字,真正的 token 值永远不进这个文件,连插值语法都不用记,运行时自动去环境变量里取。startup_timeout_secenabled_tools 这类不常用但排查问题时用得上的字段,官方配置参考里有完整列表。

一个例子:改完代码,笔记直接发到掘金和 CSDN

功能改完、技术笔记写完,跟 Codex 说一句“把这篇笔记发到掘金和 CSDN”。它会先调 list_capabilities() 确认这台设备上掘金、CSDN 账号是不是都在线,再翻一遍这两个平台发文各自要传哪些必填参数——掘金的分类标签不能瞎填,CSDN 发完不代表审核过了,这些细节跟人手动敲命令没差别,AI 自己会先读清楚再动手。确认没问题后分两次调 local_bash 真正执行发布,两条发布回执分别传回来,能确认是不是两边都真发出去了。

接完看着没反应?大概率卡在“信任”这一步

命令加完了、config.toml 也写对了,但工具列表就是空的,这是 Codex 用户在项目级配置上最常踩的坑,跟 PublishPort 本身没关系。Codex 只在项目被标记为 trusted 时才加载项目目录下 .codex/ 里的配置,包括 MCP 服务器、hooks 和 rules;没标记的话,项目级的 [mcp_servers.publishport] 整段直接被跳过,只有全局配置里的内容还生效。

这个信任状态存在全局~/.codex/config.toml 里,按项目的绝对路径精确匹配,写通配符不认:

[projects."/Users/你的用户名/my-project"]
trust_level = "trusted"

第一次在某个目录运行 Codex 时它会弹出“是否信任这个目录”的提示,选是就会自动写上面这段;如果记不清有没有选过,与其猜,不如直接去 ~/.codex/config.toml 里搜一下这个项目的绝对路径。想图省事全局生效不受这层限制,就把 MCP 服务器配置写进 ~/.codex/config.toml 而不是项目目录下的 .codex/config.toml。这个信任状态目前是跟全局配置文件绑在一起的,社区里已经有人在 GitHub 上提过希望把它拆成单独的状态文件,方便把 config.toml 提交进 dotfiles 仓库时不带上这些本机专属的信任记录。

边界:省的是复制粘贴,不是审核和判断

跟接 Cursor、Trae 一样,不建议把这条链路做成“写完直接发、没人看一眼”的流水线,内容质量和平台合规判断最好留一道人工确认。也不能保证账号从此不被限流——真实设备、真实登录态去掉的是最明显的自动化信号,但发帖节奏还是得照真人的样子来,短时间内连续发同一篇文章到好几个平台,节奏拿捏不好照样会被平台盯上。

接进去之前,值得先过一遍这份清单:

常见问题 / FAQ

codex mcp add 加完了,codex mcp list 也能看到,但对话里读不到工具怎么办?

先排除信任问题——项目目录如果没被标记 trusted,即使命令加成功了,Codex 实际对话时也不会去加载这个服务器的工具。其次看服务器本身是不是启动失败了:本地进程型(command)常见是命令路径写错或缺环境变量;PublishPort 这类远程服务型(url)常见是接入地址填错、token 过期,或者 startup_timeout_sec(默认 10 秒)不够,服务器还没响应就被判超时。

项目级 .codex/config.toml 和全局 ~/.codex/config.toml 都配了同名服务器,听哪个?

Codex 官方文档没有像 Cursor 那样明确写“项目级优先覆盖全局”的合并规则,两边配置会分别生效;如果同名服务器在两处定义冲突,更稳妥的做法是只在一处配置,不要两边都写,省得排查到底哪边在起作用。

bearer_token_env_var 和 Cursor 的 ${env:变量名} 插值有什么区别?

效果类似,都是配置文件里不出现明文 token,运行时才去读环境变量。区别是 Cursor 的插值语法可以用在任意字段里拼接字符串,Codex 的 bearer_token_env_var 是专门给 Streamable HTTP 服务器认证用的固定字段,只认一个环境变量名,用法更窄但也更不容易配错。

codex mcp add 命令行方式和手写 config.toml 该选哪个?

只在这台机器上用、图省事,用 codex mcp add 一条命令就够;想把配置提交进项目仓库、给团队成员照抄,或者要精确控制 startup_timeout_secenabled_tools 这类命令行不好传的参数,直接手写 config.toml。两者最终改的是同一个文件,命令行方式本质是帮你把这段 TOML 追加进去。

Codex 和 Cursor、Trae 接同一个 PublishPort MCP 地址,能不能共用同一个 token?

能。PublishPort 的接入地址和 token 跟客户端无关,同一份凭证在 Codex、Cursor、Trae 里都能用,已经在别的客户端接过一次的可以直接照抄地址和 token,不用重新生成。已经在 Cursor 里配过的可以参考《Cursor 接 MCP 自动发布内容》,两边概念上都是 Streamable HTTP + Bearer Token,只是字段名和配置文件格式不一样。


不同 AI 客户端接 PublishPort 的方式大同小异,字节 Trae 怎么接可以看《Trae 怎么接 MCP 自动发布内容》,扣子和 Dify 这类 no-code 工作流平台怎么接看《扣子、Dify 智能体自动发布内容怎么做》;MCP 发布服务器背后的完整机制拆解见《MCP 内容发布服务器到底是怎么工作的》。本文若有出入或过时,以 PublishPort 文档Codex 官方 MCP 文档为准。