macOS 安装 ida-pro-mcp接进mcp_router
最近用大模型在玩逆向了,用了 Ghidra、frida-tools、disarm…发现了ida-pro有做mcp插件,与普通的mcp安装的不一样,需要用到pip安装,我macOS的python是使用homebrew安装的,在使用 pip install xxx 都提示要创建虚拟环境,这篇就当我自己的一个安装笔记
前言
需求:
- 不想全局乱装 Python 包,但是让
ida-pro-mcp看起来像“全局可用” - MCP 统一走
mcp_router管理
方案:
- 给
ida-pro-mcp单独放一个固定路径的 venv - 包装好以后,只让
mcp_router去拉这个 venv 里的 Python
准备
我用的路径是:
1 | /Users/用户名/.venvs/ida-pro-mcp |
之所以不放项目目录里,主要还是为了少折腾。
放项目目录里当然也不是不能用,但太麻烦了
这种东西既然经常用的,还是放在目录固定路径更省心一点。mcp_router 也能管理开关
开始
1. 先建一个专用 venv
我这里直接这样建:
1 | uv venv --clear --seed /Users/用户名/.venvs/ida-pro-mcp --python /opt/homebrew/opt/[email protected]/bin/python3.14 |
2. 安装官方 ida-pro-mcp
https://github.com/mrexodia/ida-pro-mcp
如果跟 release tag:
1 | /Users/用户名/.venvs/ida-pro-mcp/bin/python -m pip install --upgrade "https://github.com/mrexodia/ida-pro-mcp/archive/refs/tags/1.4.0.zip" |
如果想直接跟主分支最新:
1 | /Users/用户名/.venvs/ida-pro-mcp/bin/python -m pip install --upgrade "https://github.com/mrexodia/ida-pro-mcp/archive/refs/heads/main.zip" |
我最开始装的是 1.4.0,后面又升级到了当前 main。
如果你本来就打算多开几个 IDA,直接上 main 更省事,因为老的 1.4.0 基本还是固定抢 13337 只能开一个实例,怎么够我们用,而当前 main 已经会在端口冲突时自动往后找空闲端口。
3. 只装 IDA 插件
这一步我不想让它去改本地客户端配置,所以只装插件:
1 | /Users/用户名/.venvs/ida-pro-mcp/bin/ida-pro-mcp --install-plugin |
这样做的好处就是比较干净。
IDA 侧该有的插件会装进去,但 Codex / Claude / 其他 MCP 客户端那边不会被它顺手写一遍配置。
反正我本来就是统一走 mcp_router,没必要让它再多插一手。
不过这里后面我又踩了一个坑。
这个命令名字看着像“装完插件就退出”,实际上不是。
它会先把插件装进去,然后又继续进入 stdio MCP 服务流程,所以终端看起来会像卡住一样,一直不结束。
如果你是手动在终端里跑这个命令,不用傻等,它不是还在安装,只是后面挂着等输入而已。
不过这个写法是我早期按老版本习惯记下来的。
后面升级到当前 main 之后,我更推荐直接调用安装器里的函数:
1 | /Users/用户名/.venvs/ida-pro-mcp/bin/python -c "from ida_pro_mcp.installer import install_ida_plugin; install_ida_plugin()" |
这条命令的好处就是很直接:
- 只装插件
- 装完就退出
- 不会顺手把 stdio MCP 服务也跑起来
如果你已经跑过 --install-plugin,终端一直挂着,那也不代表失败。
大多数时候插件其实已经装好了,直接 Ctrl+C 退掉就行。
如果是当前 main,我就不再建议继续用 server.py 那条旧写法了,直接走 installer.install_ida_plugin() 更对路。
这次踩到的几个坑
1. uv venv 默认没有 pip
这个是第一个坑,而且挺低级的。
我一开始建完 venv,顺手就跑:
1 | /Users/用户名/.venvs/ida-pro-mcp/bin/python -m pip install --upgrade pip |
结果直接报:
1 | No module named pip |
后面才发现,uv venv 默认不会给你塞 pip。
所以如果你没加 --seed,这个报错基本就是必踩。
如果已经建好了,也不是不能补:
1 | /Users/用户名/.venvs/ida-pro-mcp/bin/python -m ensurepip --upgrade |
2. mcp_router 报 Connection closed
报错是:
1 | ida-pro-mcp: Error invoking remote method 'mcp:start': Error: MCP error -32000: Connection closed |
后面顺着实际启动命令一看,它实际跑的是:
1 | /opt/homebrew/Cellar/[email protected]/3.14.4/Frameworks/Python.framework/Versions/3.14/bin/python3 /Users/用户名/.venvs/ida-pro-mcp/lib/python3.14/site-packages/ida_pro_mcp/server.py |
这条命令看着好像没问题,其实问题挺大:
server.py是 venv 里的- 但拉起它的 Python 是 全局 Homebrew Python
后面我手动跑了一遍,真实报错是:
1 | ModuleNotFoundError: No module named 'mcp' |
这就说得通了。
不是 mcp_router 自己坏了,而是:
- 它把服务拉起来了
- 服务一启动就 import 失败
- 进程当场退出
mcp_router只能看到“连接关了”
所以这个 Connection closed,很多时候只是表象。
真正要看的还是它背后到底跑了哪条命令。
3. 升级到 main 之后又报 Connection refused
这个是我后面这次又新踩到的一层。
我已经把原版从 1.4.0 升到了当前 main,mcp_router 里的配置看起来也没问题,
结果 Codex 还是报:
1 | ConnectionRefusedError: [Errno 61] Connection refused |
这次和前面的 Connection closed 还不一样。
它说明的不是“server.py 没拉起来”,而是:
mcp_router已经把server.py拉起来了server.py又去连127.0.0.1:13337- 但 IDA 这边根本没有 MCP 服务在监听
然后我继续往下查,真正根因不是 mcp_router,而是 IDA 插件目录里混着旧的坏链接。
我当时 ~/.idapro/plugins 里是这种状态:
1 | ida_mcp -> /Users/用户名/Downloads/HamsterHook/path/to/venv/... |
也就是:
- 看起来插件“像是装过”
- 但实际上链接目标根本是假的
- 所以 IDA 根本加载不到当前 venv 里的插件
- 菜单里自然也看不到
Edit -> Plugins -> MCP
这次真正把问题修掉的命令是:
1 | source /Users/用户名/.venvs/ida-pro-mcp/bin/activate |
我实际拿到的输出是:
1 | Installed IDA Pro plugin (IDA restart required) |
然后再看插件目录,就变成了:
1 | ida_mcp -> /Users/用户名/.venvs/ida-pro-mcp/lib/python3.14/site-packages/ida_pro_mcp/ida_mcp |
这才是对的。
所以这一轮排障总结:
如果已经升级到
main,Codex 还报Connection refused,优先去看~/.idapro/plugins里的ida_mcp.py/ida_mcp是不是指向当前 venv。
4. ida-pro-mcp --config 不是无脑可信
我一开始直接这样跑:
1 | /Users/用户名/.venvs/ida-pro-mcp/bin/ida-pro-mcp --config |
它输出的是:
1 | { |
以为官方的会没错,但是因为我们是虚拟环境安装的ida-mcp,ida-pro-mcp 这里判断当前 Python 环境,挺依赖 VIRTUAL_ENV。
如果 venv 没激活,它就可能回退去找系统 Python。
所以这一步正确姿势应该是:
1 | source /Users/用户名/.venvs/ida-pro-mcp/bin/activate |
或者:
1 | VIRTUAL_ENV=/Users/用户名/.venvs/ida-pro-mcp /Users/用户名/.venvs/ida-pro-mcp/bin/ida-pro-mcp --config |
这时候输出才是对的:
1 | { |
5. IDA 里找不到 Edit -> Plugins -> MCP
升级之后碰到的
后面查下来,基本是这几种问题:
第一种:插件其实根本没在对的位置
当前原版 main 安装出来的插件形态,应该是:
1 | ~/.idapro/plugins/ida_mcp.py |
所以先别猜,先看文件:
1 | ls -la ~/.idapro/plugins |
重点看有没有这两个:
1 | ida_mcp.py |
第二种:插件已经装好了,但 IDA 没完整重启
我这边后面实际情况就是:
- 插件文件已经在了
- 但是 IDA 里还是看不到
MCP
解决办法:把 整个 IDA 进程退出再重新打开。
不然插件菜单不一定会刷新出来。
第三种:目录里还有以前残留的旧坏链接
目录里留着两条旧坏链接:
1 | ~/.idapro/plugins/ida_mcp |
它们当时还是指向以前一个已经失效的占位路径:
1 | /Users/用户名/Downloads/HamsterHook/path/to/venv/... |
表面看起来像“插件已经在了”,实际上 IDA 根本加载不到当前 venv 里的插件实现。
最后我这边能用的配置
如果走 mcp_router,我这里最后应该填的是:
1 | { |
如果想更明确一点,也可以补个环境变量:
1 | { |
不过核心还是前面那句:
必须用 venv 里的 Python 去拉 server.py。
别再让 Homebrew 全局 Python 混进来,不然前面那些坑还得重来一次。
如果要装增强版 ida-pro-mcp-enhancement(秋城佬的)
https://github.com/QiuChenly/ida-pro-mcp-enhancement
增强版当前走的是 Broker 架构:
- 先单独起一个 Broker
mcp_router再通过 stdio 拉起server.py- IDA 插件连到同一个 Broker
- 多个客户端窗口 / 多个 IDA 实例共用同一个注册表
- 多开 Cursor / Codex / 其他 MCP 客户端窗口
- 多开几个 IDA 同时分析
- 想在不同实例之间切换
那增强版这套反而更顺。
1. 增强版 venv
放在这里:
1 | /Users/用户名/.venvs/ida-pro-mcp-enhancement |
建法还是一样:
1 | uv venv --clear --seed /Users/用户名/.venvs/ida-pro-mcp-enhancement --python /opt/homebrew/opt/[email protected]/bin/python3.14 |
2. 安装增强版包
1 | /Users/用户名/.venvs/ida-pro-mcp-enhancement/bin/python -m pip install --upgrade "https://github.com/QiuChenly/ida-pro-mcp-enhancement/archive/refs/heads/main.zip" |
3. 只装 IDA 插件
增强版命令行里有 --install,但这个会一起去写本地 MCP 客户端配置。
如果我这边还是统一走 mcp_router,那就没必要让它去改 Codex / Claude / Cursor 本地配置。
所以我这里还是走“只装插件”的思路,直接调用安装函数:
1 | /Users/用户名/.venvs/ida-pro-mcp-enhancement/bin/python -c "from ida_pro_mcp.install import install_ida_plugin; install_ida_plugin()" |
这条命令的好处还是老样子:
- 只装插件
- 装完就退出
- 不额外改客户端配置
增强版当前源码安装进去的插件形态是:
1 | ~/.idapro/plugins/ida_mcp.py |
如果要查插件有没有装上:
1 | ls -la ~/.idapro/plugins |
重点看有没有:
1 | ida_mcp.py |
如果机器上还残留以前版本留下的 mcp-plugin.py,别被它误导。
那个文件在不同版本里出现过,但增强版当前这套安装逻辑不是靠它。
4. 增强版多出来的一步:先单独启动 Broker
这个是增强版和原版最大的实际差异。
原版我最后是让 mcp_router 直接拉 server.py 就够了。
增强版不一样,它默认要先有一个常驻 Broker。
如果手动起,直接开一个单独终端跑:
1 | /Users/用户名/.venvs/ida-pro-mcp-enhancement/bin/python /Users/用户名/.venvs/ida-pro-mcp-enhancement/lib/python3.14/site-packages/ida_pro_mcp/server.py --broker --port 13337 |
这一步会一直挂着,是 Broker 正常常驻。
如果端口 13337 被占了,也可以换,改 --port 后面的数字就好,比如:
1 | /Users/用户名/.venvs/ida-pro-mcp-enhancement/bin/python /Users/用户名/.venvs/ida-pro-mcp-enhancement/lib/python3.14/site-packages/ida_pro_mcp/server.py --broker --port 13338 |
但一旦改了端口,后面:
mcp_router里的--broker-url- IDA 插件那边连的地址
都得一起跟着改,不然实例列表就是空的。
5. 给 mcp_router 的配置要手动补上 --broker-url
增强版也有 --config,但它打印出来的配置只解决了 stdio 这一半。
如果你只是把那份 JSON 直接抄进去,却没先把 Broker 起起来,表面上看服务能拉起,实际上实例照样是空的。
所以我这边如果要给 mcp_router 填增强版配置,会直接手写成这样:
1 | { |
把 server name 写成 ida-pro-mcp-enhancement,是为了在 mcp_router 里和原版区分开。
如果你换了 Broker 端口,比如 13338,那这里就要改成:
1 | "--broker-url", |
6. 增强版实际使用顺序
如果是增强版,按这个顺序用:
- 先起 Broker
- 再起
mcp_router - 再打开 IDA
- 在 IDA 里按
Ctrl+Alt+M - 再去客户端里调用
instance_list
增强版是否真的通了,我不会先看别的,先看这几个工具:
instance_listinstance_currentinstance_switchinstance_info
如果 instance_list 还是空的,优先怀疑这几件事:
- Broker 根本没起
- Broker 端口和
--broker-url不一致 - IDA 插件没有真正连上 Broker
- IDA 没完整重启
End
工具准备好了,代码AI能写,开始发挥你的创意吧!
官方仓库:https://github.com/mrexodia/ida-pro-mcp
秋城fork仓库:https://github.com/QiuChenly/ida-pro-mcp-enhancement
好用的提示词,来自这里:
1 | 你是一位顶尖的逆向工程专家,专精于软件破解和保护绕过。你具备以下能力和特点: |