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 管理

方案:

  1. ida-pro-mcp 单独放一个固定路径的 venv
  2. 包装好以后,只让 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
2
/Users/用户名/.venvs/ida-pro-mcp/bin/python -m ensurepip --upgrade
/Users/用户名/.venvs/ida-pro-mcp/bin/python -m pip install --upgrade pip

2. mcp_routerConnection 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 自己坏了,而是:

  1. 它把服务拉起来了
  2. 服务一启动就 import 失败
  3. 进程当场退出
  4. mcp_router 只能看到“连接关了”

所以这个 Connection closed,很多时候只是表象。
真正要看的还是它背后到底跑了哪条命令。

3. 升级到 main 之后又报 Connection refused

这个是我后面这次又新踩到的一层。

我已经把原版从 1.4.0 升到了当前 mainmcp_router 里的配置看起来也没问题,
结果 Codex 还是报:

1
ConnectionRefusedError: [Errno 61] Connection refused

这次和前面的 Connection closed 还不一样。
它说明的不是“server.py 没拉起来”,而是:

  1. mcp_router 已经把 server.py 拉起来了
  2. server.py 又去连 127.0.0.1:13337
  3. 但 IDA 这边根本没有 MCP 服务在监听

然后我继续往下查,真正根因不是 mcp_router,而是 IDA 插件目录里混着旧的坏链接

我当时 ~/.idapro/plugins 里是这种状态:

1
2
ida_mcp    -> /Users/用户名/Downloads/HamsterHook/path/to/venv/...
ida_mcp.py -> /Users/用户名/Downloads/HamsterHook/path/to/venv/...

也就是:

  • 看起来插件“像是装过”
  • 但实际上链接目标根本是假的
  • 所以 IDA 根本加载不到当前 venv 里的插件
  • 菜单里自然也看不到 Edit -> Plugins -> MCP

这次真正把问题修掉的命令是:

1
2
source /Users/用户名/.venvs/ida-pro-mcp/bin/activate
python -c "from ida_pro_mcp.installer import install_ida_plugin; install_ida_plugin()"

我实际拿到的输出是:

1
2
3
4
Installed IDA Pro plugin (IDA restart required)
removed old plugin: /Users/用户名/.idapro/plugins/mcp-plugin.py
loader: /Users/用户名/.idapro/plugins/ida_mcp.py
package: /Users/用户名/.idapro/plugins/ida_mcp

然后再看插件目录,就变成了:

1
2
ida_mcp    -> /Users/用户名/.venvs/ida-pro-mcp/lib/python3.14/site-packages/ida_pro_mcp/ida_mcp
ida_mcp.py -> /Users/用户名/.venvs/ida-pro-mcp/lib/python3.14/site-packages/ida_pro_mcp/ida_mcp.py

这才是对的。

所以这一轮排障总结:

如果已经升级到 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
2
3
4
5
6
7
8
9
10
11
12
{
"mcpServers": {
"ida-pro-mcp": {
"command": "/opt/homebrew/Cellar/[email protected]/3.14.4/Frameworks/Python.framework/Versions/3.14/bin/python3",
"args": [
"/Users/用户名/.venvs/ida-pro-mcp/lib/python3.14/site-packages/ida_pro_mcp/server.py"
],
"timeout": 1800,
"disabled": false
}
}
}

以为官方的会没错,但是因为我们是虚拟环境安装的ida-mcp,ida-pro-mcp 这里判断当前 Python 环境,挺依赖 VIRTUAL_ENV
如果 venv 没激活,它就可能回退去找系统 Python。

所以这一步正确姿势应该是:

1
2
source /Users/用户名/.venvs/ida-pro-mcp/bin/activate
ida-pro-mcp --config

或者:

1
VIRTUAL_ENV=/Users/用户名/.venvs/ida-pro-mcp /Users/用户名/.venvs/ida-pro-mcp/bin/ida-pro-mcp --config

这时候输出才是对的:

1
2
3
4
5
6
7
8
9
10
11
12
{
"mcpServers": {
"ida-pro-mcp": {
"command": "/Users/用户名/.venvs/ida-pro-mcp/bin/python3",
"args": [
"/Users/用户名/.venvs/ida-pro-mcp/lib/python3.14/site-packages/ida_pro_mcp/server.py"
],
"timeout": 1800,
"disabled": false
}
}
}

5. IDA 里找不到 Edit -> Plugins -> MCP

升级之后碰到的

后面查下来,基本是这几种问题:

第一种:插件其实根本没在对的位置

当前原版 main 安装出来的插件形态,应该是:

1
2
~/.idapro/plugins/ida_mcp.py
~/.idapro/plugins/ida_mcp/

所以先别猜,先看文件:

1
ls -la ~/.idapro/plugins

重点看有没有这两个:

1
2
ida_mcp.py
ida_mcp

第二种:插件已经装好了,但 IDA 没完整重启

我这边后面实际情况就是:

  • 插件文件已经在了
  • 但是 IDA 里还是看不到 MCP

解决办法:把 整个 IDA 进程退出再重新打开
不然插件菜单不一定会刷新出来。

第三种:目录里还有以前残留的旧坏链接

目录里留着两条旧坏链接:

1
2
~/.idapro/plugins/ida_mcp
~/.idapro/plugins/ida_mcp.py

它们当时还是指向以前一个已经失效的占位路径:

1
/Users/用户名/Downloads/HamsterHook/path/to/venv/...

表面看起来像“插件已经在了”,实际上 IDA 根本加载不到当前 venv 里的插件实现。


最后我这边能用的配置

如果走 mcp_router,我这里最后应该填的是:

1
2
3
4
5
6
7
8
9
10
11
12
{
"mcpServers": {
"ida-pro-mcp": {
"command": "/Users/用户名/.venvs/ida-pro-mcp/bin/python3",
"args": [
"/Users/用户名/.venvs/ida-pro-mcp/lib/python3.14/site-packages/ida_pro_mcp/server.py"
],
"timeout": 1800,
"disabled": false
}
}
}

如果想更明确一点,也可以补个环境变量:

1
2
3
4
5
{
"env": {
"VIRTUAL_ENV": "/Users/用户名/.venvs/ida-pro-mcp"
}
}

不过核心还是前面那句:

必须用 venv 里的 Python 去拉 server.py

别再让 Homebrew 全局 Python 混进来,不然前面那些坑还得重来一次。


如果要装增强版 ida-pro-mcp-enhancement(秋城佬的)

https://github.com/QiuChenly/ida-pro-mcp-enhancement

增强版当前走的是 Broker 架构

  1. 先单独起一个 Broker
  2. mcp_router 再通过 stdio 拉起 server.py
  3. IDA 插件连到同一个 Broker
  4. 多个客户端窗口 / 多个 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
2
~/.idapro/plugins/ida_mcp.py
~/.idapro/plugins/ida_mcp/

如果要查插件有没有装上:

1
ls -la ~/.idapro/plugins

重点看有没有:

1
2
ida_mcp.py
ida_mcp

如果机器上还残留以前版本留下的 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
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"mcpServers": {
"ida-pro-mcp-enhancement": {
"command": "/Users/用户名/.venvs/ida-pro-mcp-enhancement/bin/python3",
"args": [
"/Users/用户名/.venvs/ida-pro-mcp-enhancement/lib/python3.14/site-packages/ida_pro_mcp/server.py",
"--broker-url",
"http://127.0.0.1:13337"
],
"timeout": 1800,
"disabled": false
}
}
}

把 server name 写成 ida-pro-mcp-enhancement,是为了在 mcp_router 里和原版区分开。

如果你换了 Broker 端口,比如 13338,那这里就要改成:

1
2
"--broker-url",
"http://127.0.0.1:13338"

6. 增强版实际使用顺序

如果是增强版,按这个顺序用:

  1. 先起 Broker
  2. 再起 mcp_router
  3. 再打开 IDA
  4. 在 IDA 里按 Ctrl+Alt+M
  5. 再去客户端里调用 instance_list

增强版是否真的通了,我不会先看别的,先看这几个工具:

  • instance_list
  • instance_current
  • instance_switch
  • instance_info

如果 instance_list 还是空的,优先怀疑这几件事:

  1. Broker 根本没起
  2. Broker 端口和 --broker-url 不一致
  3. IDA 插件没有真正连上 Broker
  4. IDA 没完整重启

End

工具准备好了,代码AI能写,开始发挥你的创意吧!

官方仓库:https://github.com/mrexodia/ida-pro-mcp

秋城fork仓库:https://github.com/QiuChenly/ida-pro-mcp-enhancement

好用的提示词,来自这里

1
2
3
4
5
6
7
8
9
10
11
你是一位顶尖的逆向工程专家,专精于软件破解和保护绕过。你具备以下能力和特点:

精通 IDA Pro、x64dbg、OllyDbg 等逆向工具的高级使用技巧
熟练掌握 x86、x64、ARM 等多种架构的汇编语言和反汇编技术
对常见的软件保护机制(如序列号验证、时间限制、功能限制等)有深入了解
擅长分析和绕过各种反调试、反逆向技术,如代码混淆、加壳、虚拟机保护等
能够快速定位关键代码段,如授权验证、功能控制逻辑等
熟练使用补丁技术,能够修改二进制文件以绕过保护或启用隐藏功能
掌握动态注入技术,能够在运行时修改程序行为
能够编写自动化脚本(如 IDAPython、x64dbg 脚本)来辅助破解过程
你的任务是对给定的受保护软件进行全面分析,找出其保护机制的弱点,并提供有效的破解方法。请详细描述你的分析过程、发现的保护机制、破解思路和具体的破解步骤。