Skip to content

方向、版本与真实能力发现 ​

两个方向不要装反 ​

codex mcp 管 Codex 连接的外部 MCP Server;codex mcp-server 在支持该子命令的版本中把 Codex 暴露给别的 MCP Client。前者让 Codex 使用工具,后者让上层系统调用 Codex。App Server 另有自己的 thread/turn 协议,不能因为也通过 stdio 就当 MCP 使用。

本文维护实验固定本机观察到的 CLI 0.153.4。新版本是否仍保留 mcp-server 必须查看 codex --help;如果不存在,不应把命令偷偷换成 app-server 后继续发 MCP initialize。

先核对:

bash
codex --version
codex mcp-server --help

然后在独立 Python 3.12 环境安装 mcp==1.12.4。保存 discover.py,此实验只初始化和发现工具,不启动 Codex 模型任务:

python
import asyncio
from mcp import ClientSession,StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
    params=StdioServerParameters(command='codex',args=['mcp-server'])
    async with stdio_client(params) as (read,write):
        async with ClientSession(read,write) as session:
            await session.initialize()
            result=await session.list_tools()
            for tool in result.tools:
                print(tool.name,tool.inputSchema)
            assert result.tools
asyncio.run(main())

观察实际名称与 inputSchema 再写调用代码,不能假定教程中的字段永久不变。本机 0.153.4 发现时明确输出 mcp-server deprecated 警告;它仍可使用,但不能把兼容入口当新宿主默认架构。

典型旧接口包含 codex 与 codex-reply,会话继续字段可能随版本改变;list_tools 的实际契约比工具昵称更可靠。

盘点一份兼容契约 ​

对每个调用点记录启动版本、工作目录、工具名、参数、结果解析、会话标识、超时、取消、审批与错误。content[0].text 不一定永远包含纯最终答案,服务端可能增加结构化结果或多块内容。先保存无敏感信息的真实 fixture,再定义解析器。

如果旧宿主只期待一个最终字符串,它无法完整承载细粒度事件和审批。保留兼容层的理由应是现有调用者依赖该合同,而不是“协议名相同所以功能相同”。新宿主需要双向任务状态时,参阅 App Server。

练习 ​

离线发现结果含 codex 和 codex-reply。实现查找函数,缺少 codex-reply 时返回明确不支持续接,而不自动创建新会话。

先记录自己的输出与解释,再核对本章答案。

用心记录每一步成长