1. 四层连通之前:先把 Codex 的模型通道补齐
按 ida-pro-mcp 的 README 顺着插件市场把 idalib-mcp 装进 Codex,重启客户端时才发现:Codex 本身还需要一个可用的模型 Key 和 Base URL,否则代理能装,对话窗口却一直报连接错误。这篇文章把这一层补上——用 TaoToken 作为 Codex 的模型供应商,官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 上创建 API Key 之后,再回到 Codex 配置里填好地址,四层连通才有第一层底座。
安装成功的标准,不是安装器没有报错,而是客户端、代理、IDA 插件和 IDB 查询四层真的连通。只是有一条隐藏前提:Codex 这个客户端自己也得能先跑起来。它可以没有专属官方额度,也可以不想切来切去换 Key,但必须有一个它能认识的 Base URL 和 API Key。TaoToken 在这里承担的就是接入配置动作——它只提供统一 Key 和 Base URL,不碰 IDA 的插件逻辑;ida_mcp.py、PLUGIN_ENTRY、Ctrl-Alt-M 这些仍然按原样在 IDA 内部运行。
1.1 没有模型通道,代理装好也白搭
把四层连通想成一次景区游览:Codex 是游客,模型通道是门票,TaoToken 是售票窗口,IDA 插件是景区里的讲解员。游客没票,讲解员站在景点前也没法服务;对应到技术上,就是 MCP 代理装得再完整,Codex 因为缺模型通道而无法启动,后面三层始终不会被触发。
这在报错表现上很有迷惑性。Codex 启动对话窗口时,如果先报的是模型连接错误,很多人会以为是插件没装好,反复重装 ida-pro-mcp,其实问题根本不在代理层,而在客户端的模型供应商配置。先把模型通道接通,再去查插件加载,顺序不能反。
1.2 安装前检查:三件事之外,补一次 Key
原文建议安装前确认三件事:终端里的 Python 能被安装器找到,IDA Pro 能正常加载测试二进制,目标 MCP 客户端的配置范围是用户级还是项目级。在 Codex 路线上,我会补上第四件事:确认 Codex 的模型供应商配置写在 ~/.codex/config.toml,而不是在一个你事后找不到的临时会话里。
Python 3.11+ 和 IDA Pro 8.3+ 的基线不变;IDA 9.0 以上自带 Python 3.12,版本不够就用 IDA 目录里的 idapyswitch 切换解释器。写 Codex 配置前需要准备三样材料:
- 官网账号与 API Key:打开 TaoToken 注册并按提示创建,Key 名称随意,只要能认出来。
- Base URL:一字不差填
https://taotoken.net/api,末尾不要加/v1,也不要带 UTM 参数。 - 模型 ID:以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的模型广场展示为准,不要照抄旧文档里的过期 ID。
2. 路线 A:Codex 插件市场装 idalib-mcp,模型供应商填 TaoToken
官方当前推荐的路线 A 使用 Codex 插件市场安装 idalib-mcp,这条路线不需要先执行 python -m ida_pro_mcp.server --install。插件的安装动作本身和模型通道是两件事,很多人卡在「插件装完但 Codex 还是不能用」上,正是因为漏了后者。
2.1 插件市场三条命令
在终端按顺序执行:
codex plugin marketplace add mrexodia/codex-marketplace
codex plugin remove ida-pro-mcp@mrexodia
codex plugin add ida-pro-mcp@mrexodia
如果此前没有安装过该插件,第二条 remove 会提示未找到对应条目,这个报错可以忽略。插件安装完成后重启 Codex,首次运行可能需要等待 uv 解析依赖,耐心等它跑完,不要看到进度条停下就立刻杀掉进程。
2.2 config.toml 把模型供应商指到 TaoToken
装完插件只代表 Codex 知道了「有一个 MCP 服务器可以连」,但 Codex 自己怎么调用模型还不知道。打开 ~/.codex/config.toml,把模型供应商指到 TaoToken:
# ~/.codex/config.toml
model = "taotoken/YOUR_MODEL_ID"
model_provider = "taotoken"
[model_providers.taotoken]
name = "TaoToken"
base_url = "https://taotoken.net/api"
wire_api = "chat"
YOUR_MODEL_ID 不要凭记忆猜,去模型广场核对当前可用标识,把 gpt-5、带日期后缀这类写法统统忘掉。wire_api 按 TaoToken 模型广场标注来填:这里默认给 chat,如果模型广场写明支持 Responses API,再改成 responses。
API Key 不需要写进 config.toml。Codex 启动后如果发现认证信息缺失,会提示你登录或输入 Key,此时把官网创建的 YOUR_API_KEY 粘贴进去即可。习惯用环境变量的,也可以先执行 export OPENAI_API_KEY="YOUR_API_KEY" 再启动 Codex。注意 Key 一定从 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建,不要拿测试用的临时 token 顶替。
3. 路线 B:IDA GUI 插件也躲不开模型通道
路线 B 是兼容方案,原文已经说明 GUI MCP 插件不再是推荐选项,未来可能弃用。确实需要 GUI 插件时,先安装当前 GitHub 主分支版本。
3.1 主分支安装与模块启动
python -m pip uninstall -y ida-pro-mcp
python -m pip install "https://github.com/mrexodia/ida-pro-mcp/archive/refs/heads/main.zip"
python -m ida_pro_mcp.server --install
最后一条是模块方式启动,不依赖 ida-pro-mcp 可执行文件是否在 PATH 里。如果下面的短命令能正常输出帮助,也可以继续用:
ida-pro-mcp --help
ida-pro-mcp --install
python -m ida_pro_mcp.server --config
安装器会同时处理两件事:把插件部署到 IDA 用户插件目录,并向检测到的 MCP 客户端写入服务器配置。但无论走哪条路线,Codex 的模型通道都要先配好。GUI 插件解决的是「IDA 里的服务谁来起」的问题,解决不了「Codex 客户端自身能不能出话」的问题。
3.2 插件目录两部分与常见位置
插件由轻量加载器 ida_mcp.py 和实际包目录 ida_mcp/ 构成:
IDA 用户插件目录/
├── ida_mcp.py # 插件入口与热重载加载器
└── ida_mcp/ # HTTP、RPC、同步层及 API 模块
常见插件目录:Windows 在 %APPDATA%\Hex-Rays\IDA Pro\plugins\,macOS 和 Linux 在 ~/.idapro/plugins/。安装器优先创建符号链接,方便开发时热重载;失败后回退为文件复制。Windows 创建符号链接通常需要开发者模式或相应权限。
4. IDA 如何发现 ida_mcp.py:PLUGIN_ENTRY 与 Ctrl-Alt-M
这一层和 TaoToken 没有直接关系,但它是四层连通里最容易被误判的一层。很多人把 Codex 配好 Base URL 后发现 MCP 工具依然不可见,原因往往不是模型通道,而是插件没真正进入 IDA 的扫描路径。
4.1 文件名负责发现,PLUGIN_ENTRY 负责声明
IDA 并不是根据 Python 包名去找 MCP,而是在启动时扫描插件搜索路径中的所有脚本。ida_mcp.py 进入 plugins/ 目录后,会按这个顺序被加载:IDA 启动,扫描用户目录与安装目录下的 plugins/,导入 ida_mcp.py,调用全局 PLUGIN_ENTRY(),得到 idaapi.plugin_t 实例,再根据 wanted_name = "MCP" 注册菜单与快捷键。
文件名只是让 IDA 找到并导入脚本,真正声明插件身份的是 PLUGIN_ENTRY():
class MCP(idaapi.plugin_t):
flags = idaapi.PLUGIN_KEEP
wanted_name = "MCP"
wanted_hotkey = "Ctrl-Alt-M"
def PLUGIN_ENTRY():
return MCP()
类里的 wanted_name 决定 Edit → Plugins → MCP 的菜单名,wanted_hotkey 声明默认快捷键 Ctrl-Alt-M。初始化完成后,加载器再去导入旁边的 ida_mcp/ 包,所以入口脚本和实现目录缺一不可。
4.2 用 IDA Python Console 核对搜索路径
IDA 的用户目录可以被环境变量 IDAUSR 覆盖。Windows 未设置该变量时,默认用户插件目录是 %APPDATA%\Hex-Rays\IDA Pro\plugins;设置后,应以 IDA 自己报告的搜索路径为准。可以在 IDA 的 Python Console 里检查:
import ida_diskio
print("用户目录:", ida_diskio.get_user_idadir())
print("插件搜索路径:")
for path in ida_diskio.get_ida_subdirs("plugins"):
print(" ", path)
如果菜单没出现,先确认实际搜索路径下同时存在 ida_mcp.py 和 ida_mcp/。只有旧版 mcp-plugin.py、只装了 Codex 的 idalib-mcp、或者安装器写入的目录不在当前搜索路径中,都不会加载新版 GUI 菜单。
5. 启动顺序与首次调用:先让 Codex 出话,再按 Ctrl-Alt-M
安装结束后,操作顺序比安装本身更容易翻车。
5.1 启动顺序六步
- 完全退出并重新启动 IDA Pro。
- 在 IDA 中加载一个二进制。
- 通过 Edit → Plugins → MCP 或 Ctrl-Alt-M 启动插件。
- 完全退出并重新启动 Codex;部分客户端需要先退出托盘后台进程。
- 先随便发一句话,确认模型通道正常、Codex 能出话。
- 再让 Codex 读取 IDB 元数据或列出函数,验证只读调用。
第 5 步是原文没有强调、但接入配置场景最容易漏的。按完插件就急着让 Codex 调工具,它可能先报模型连接错误,而不是 MCP 工具错误。两个错误长得像,实际差着一层。如果你走的是路线 A 的 idalib-mcp,它会在后台按需初始化无头 IDA,不需要手动打开 GUI 点 Ctrl-Alt-M;但第 5 步的「先确认 Codex 能出话」依然成立。
5.2 端口机制与 profile 白名单
插件默认监听 127.0.0.1:13337。如果端口被占用,它会继续尝试后续最多 100 个端口。主机和起始端口可以在 Edit → Plugins → MCP Configuration 里调整。调用链路可以这样看:
Codex 发起 tools/call
→ ida-pro-mcp 代理
→ 发现运行中的 IDA 实例
→ IDA 插件 HTTP 服务
→ 主线程执行
→ 返回 IDB 查询结果
profile 是工具白名单。triage 用于第一次快速盘点,只留函数列表、导入、反编译等少量工具;readonly 提供完整只读分析,包括读取内存、查询类型,不修改 IDB。首连时优先用只读 profile,这样即使模型理解有偏差,也不会直接改动数据库。
6. MCP Inspector 验证 get_metadata:钉死四层连通
四层里最容易被「看起来通了」骗过去的,是代理层和 IDB 层。Codex 对话正常只代表第一层通;要确认后面三层,最好用 MCP Inspector 直接连代理,绕过客户端本身的干扰。
6.1 图形界面先看工具列表
启动图形界面版:
npx @modelcontextprotocol/inspector
界面里填 http://127.0.0.1:13337/mcp,连接后先看工具列表。能列出 get_metadata、list_functions 等只读工具,说明代理层、IDA 插件层、IDB 查询层都已就绪。
6.2 CLI 直接调 get_metadata
命令行版更适合快速验证,不用开浏览器:
npx @modelcontextprotocol/inspector --cli \
--server-url http://127.0.0.1:13337/mcp \
--transport http \
--method tools/list
然后调用一次只读工具:
npx @modelcontextprotocol/inspector --cli \
--server-url http://127.0.0.1:13337/mcp \
--transport http \
--method tools/call \
--tool-name get_metadata \
--tool-args-json '{}'
这一步返回的元数据来自 IDB,由插件在主线程执行查询。它是纯只读调用,不会改动任何数据,可以放心跑。四层连通到这里才算被钉死:Codex 有模型通道、代理能转发、插件在监听、IDB 能回数据。注意 Inspector 直接连代理,不经过 Codex 的模型通道,所以它验证的是代理到 IDB 的链路;Codex 到代理这一段,靠的是前面配好的 TaoToken 模型供应商。
7. 分层排障:从 Codex 404 到 Python 3.9 SyntaxError
原文的分层排错结构很值得保留,我在最上面补了「客户端模型层」,因为这是接入配置场景里最先碰到的一层。
7.1 在原文排错树前面再加一层
调用失败
├─ 客户端自身报模型错误:Key、Base URL、模型 ID
├─ 客户端没看到服务器:检查配置文件和客户端重启
├─ 代理启动失败:检查 Python 解释器与环境变量
├─ 提示 IDA 未连接:打开二进制并启动 MCP 插件
├─ 端口冲突:检查插件实际监听端口和配置
└─ 工具不可见:检查 profile、扩展组和 unsafe 设置
实测下来,接入配置最常见的组合错误是:Base URL 带了 /v1,wire_api 填错,以及把官网链接当 Base URL 填进工具。Codex 报 401 时,回官网重新创建 YOUR_API_KEY,粘贴时注意不要带多余空格。报 404 时,八成是地址写成了 https://taotoken.net/api/v1 或 https://taotoken.net/,改成 https://taotoken.net/api 即可。提示模型找不到时,回模型广场核对 YOUR_MODEL_ID。官网用 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 拿 Key、看模型广场、核对用量,这都是给人点开看的;工具里填的 Base URL 永远只有 https://taotoken.net/api。
7.2 代理与 IDA 层:-32000 和 Python 版本
代理找不到插件时,会返回 JSON-RPC 错误 -32000,并提示启动插件的快捷键。这个错误说明客户端已经到达代理,问题范围收缩到 IDA 实例发现和插件服务。
另一个高频坑是 Python 版本不够。原文章节里有这样一个报错:IDA 打开 PE 文件后,ida_mcp.py 内部 match urlparse(self.path).path: 直接抛出 SyntaxError: invalid syntax,终端显示 Python 3.9.9,不符合要求。解决办法是去 IDA 同目录下找 idapyswitch.exe,打开后把解释器切换到 3.11+,重新打开 IDA,插件即可正常加载。这个报错与模型通道无关,但很容易被误判成 Codex 配置问题,排障时先看终端里的 Python 版本行,能省下大量时间。
8. 最小照抄流程:拿 Key、配 Codex、跑通 get_metadata
最后整理一份可以直接照着做的清单,顺序不要调换。
8.1 一次性跑通的核对清单
- 打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册,创建 API Key 并记为 YOUR_API_KEY,在模型广场记下模型 ID。
- 安装 Codex 插件:
codex plugin marketplace add mrexodia/codex-marketplace
codex plugin remove ida-pro-mcp@mrexodia
codex plugin add ida-pro-mcp@mrexodia
- 编辑
~/.codex/config.toml:
model = "taotoken/YOUR_MODEL_ID"
model_provider = "taotoken"
[model_providers.taotoken]
name = "TaoToken"
base_url = "https://taotoken.net/api"
wire_api = "chat"
- 重启 Codex,输入或粘贴 YOUR_API_KEY,确认能正常对话。
- 加载二进制到 IDA,按 Ctrl-Alt-M 启动 MCP 插件;路线 A 的 idalib-mcp 由 Codex 后台触发,不要求手动操作。
- 用 MCP Inspector 验证:
npx @modelcontextprotocol/inspector --cli \
--server-url http://127.0.0.1:13337/mcp \
--transport http \
--method tools/call \
--tool-name get_metadata \
--tool-args-json '{}'
返回元数据说明四层已通。之后回到 Codex 做只读分析时,先选 triage 或 readonly profile,别急着开修改类工具。刚才那次 Inspector 调用会在官网控制台显示用量记录,顺手核对一下有没有正常计账,整个接入配置就收尾了。




被折叠的 条评论
为什么被折叠?



