方向、版本与真实能力发现
两个方向不要装反
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。
先核对:
codex --version
codex mcp-server --help然后在独立 Python 3.12 环境安装 mcp==1.12.4。保存 discover.py,此实验只初始化和发现工具,不启动 Codex 模型任务:
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 时返回明确不支持续接,而不自动创建新会话。
先记录自己的输出与解释,再核对本章答案。