
Headless Binary Ninja MCP server — предоставляющий агентам ИИ глубокие возможности реверс-инжиниринга через 180 инструментов.
Сервер Binary Ninja без графического интерфейса, работающий по протоколу MCP (Model Context Protocol), предоставляющий AI-агентам полный доступ к глубоким процессам реверс-инжиниринга — дизассемблированию, IL, патчингу, типам, перекрёстным ссылкам и многому другому — без GUI.
Спроектирован для запуска в том же Docker-контейнере, что и среда выполнения агента. Без сайдкаров, без дополнительных сервисов.
Весь этот проект — код, тесты и документация — на 100% сделан по принципу vibe coding.
Существующие MCP-серверы Binary Ninja либо привязаны к GUI, либо предоставляют ограниченный набор инструментов. Этот сервер работает исключительно без GUI и предназначен для управляемых агентами процессов в изолированных средах VM/контейнеров: агент получает полный контроль над системой анализа, автоматизируя большие части реверс-инжиниринга, пока вы интерактивно обсуждаете и направляете процесс.
Цель — интерфейс, в котором агенты могут со временем просматривать, уточнять и расширять анализ: обновлять типы, символы и метаданные, инкрементально улучшать базу данных анализа, безопасно применять патчи и итерации с помощью отмены/повтора, а также запускать пользовательские скрипты, когда рабочий процесс требует чего-то особенного.
binja.eval и binja.call для всего, что не покрывается каталогом инструментов.3.11+binaryninja Python, доступным для импорта в вашей среде выполнения (для реального анализа)git clone https://github.com/mrphrazer/binary-ninja-headless-mcp.git
cd binary-ninja-headless-mcp
pip install .
Или установите напрямую из корня репозитория без клонирования:
pip install git+https://github.com/mrphrazer/binary-ninja-headless-mcp.git
Транспорт Stdio (по умолчанию):
python3 binary_ninja_headless_mcp.py
Транспорт TCP:
python3 binary_ninja_headless_mcp.py --transport tcp --host 127.0.0.1 --port 8765
Режим фиктивного бэкенда (Binary Ninja не требуется):
python3 binary_ninja_headless_mcp.py --fake-backend
Этот сервер использует стандартный MCP через stdio (по умолчанию) или tcp, поэтому любой хост агента, поддерживающий MCP, может его использовать.
claude mcp add binary_ninja_headless_mcp -- python3 /path/to/binary-ninja-headless-mcp/binary_ninja_headless_mcp.py
Или добавьте его в .mcp.json вашего проекта:
{
"mcpServers": {
"binary_ninja_headless_mcp": {
"command": "python3",
"args": ["binary_ninja_headless_mcp.py"],
"cwd": "/path/to/binary-ninja-headless-mcp"
}
}
}
codex mcp add binary_ninja_headless_mcp -- python3 binary_ninja_headless_mcp.py
binary_ninja_headless_mcp.python3 с аргументами ["binary_ninja_headless_mcp.py"], когда cwd указывает на корень репозитория, или используйте абсолютный путь к скрипту в args.cwd в путь к репозиторию, если хотите, чтобы относительные пути, такие как samples/ls, разрешались правильно.--fake-backend.health.ping, затем session.open.Рекомендуемая модель развёртывания: запуск процесса агента и этого MCP-сервера в одном образе контейнера.
Пример базового образа:
FROM python:3.11-slim
WORKDIR /app
COPY . /app
RUN python -m pip install --upgrade pip && pip install ruff pytest
CMD ["python3", "binary_ninja_headless_mcp.py"]
Если вам нужен реальный анализ Binary Ninja внутри контейнера, добавьте среду выполнения Binary Ninja + настройку лицензии в этот же образ и запустите агента с настроенным MCP-сервером.
initializepingtools/listtools/callshutdownПоведение tools/list:
offset или limit, используется постраничный вывод (по умолчанию offset=0, limit=50 в постраничном режиме).prefix (например, binary.)query (поиск по подстроке в имени/описании инструмента)offset, limit, total, has_more.has_more=true), включает next_offset и подсказку notice.Поведение ответов на вызовы инструментов:
structuredContent — это каноническая полная нагрузка.content[0].text — это компактная строка сводки (не полное дублирование JSON).Этот репозиторий хорошо протестирован и имеет принудительные шлюзы качества.
pytest --collect-only -q для получения текущего количества собранных тестов.ruff format --check .ruff check .pytestBINARY_NINJA_HEADLESS_MCP_FAKE_BACKEND=1, поэтому проверки выполняются без необходимости установки Binary Ninja.read_only=true).binary.basic_blocks_at и function.basic_blocks имеют постраничный вывод (offset/limit).memory.read имеет жёсткое ограничение ответа: length <= 65536.stdio/tcp) по умолчанию не аутентифицировано.binja.eval и широкий доступ к API через binja.call.ruff format --check .
ruff check .
BINARY_NINJA_HEADLESS_MCP_FAKE_BACKEND=1 pytest -q
Используйте встроенный MCP-фаззер функций для тестирования широкого спектра инструментов на samples/ls.
Реальный бэкенд Binary Ninja:
python3 -m binary_ninja_headless_mcp.fuzzer --binary samples/ls --iterations 120 --seed 1337
Дымовое тестирование фиктивного бэкенда:
python3 -m binary_ninja_headless_mcp.fuzzer --binary samples/ls --fake-backend --iterations 20
Записать отчёт о покрытии в JSON:
python3 -m binary_ninja_headless_mcp.fuzzer --binary samples/ls --report-json /tmp/mcp-fuzzer-report.json
Полезные флаги:
--min-success-tools N: завершается с ненулевым кодом, если успешно выполнилось менее N инструментов.--verbose: выводить каждый вызов инструмента во время фаззинга.--update-analysis: открыть начальный сеанс с update_analysis=true.Сервер в настоящее время предоставляет 181 инструмент в 36 функциональных группах.
analysis.status: Получить статус анализа.analysis.progress: Получить снимок прогресса анализа.analysis.update: Запустить асинхронное обновление анализа.analysis.update_and_wait: Запустить обновление анализа и дождаться завершения.analysis.abort: Прервать анализ.analysis.set_hold: Приостановить/возобновить очередь анализа.annotation.rename_function: Переименовать функцию.annotation.rename_symbol: Переименовать символ по адресу.annotation.undefine_symbol: Отменить определение пользовательского символа по адресу.annotation.define_symbol: Определить символ по адресу.annotation.rename_data_var: Переименовать переменную данных.annotation.define_data_var: Определить переменную данных.annotation.undefine_data_var: Отменить определение переменной данных.annotation.set_comment: Установить комментарий по адресу.annotation.get_comment: Получить комментарий по адресу.annotation.add_tag: Добавить пользовательский тег данных по адресу.annotation.get_tags: Получить теги по адресу.arch.info: Получить метаданные архитектуры и платформы.arch.disasm_bytes: Дизассемблировать байты с выбранной архитектурой.arch.assemble: Ассемблировать текст инструкции с выбранной архитектурой.baseaddr.detect: Запустить определение базового адреса.baseaddr.reasons: Получить причины определения базового адреса.baseaddr.abort: Прервать определение базового адреса.binary.summary: Получить сводку бинарного файла/сеанса.binary.save: Сохранить текущее представление бинарного файла в файл.binary.functions: Список функций с постраничным выводом.binary.strings: Список обнаруженных строк с постраничным выводом.binary.search_text: Поиск необработанного текста/байтов в сеансе.binary.sections: Список секций с постраничным выводом.binary.segments: Список сегментов с постраничным выводом.binary.symbols: Список символов с постраничным выводом.binary.data_vars: Список переменных данных с постраничным выводом.binary.get_function_at: Найти функцию по адресу.binary.get_function_disassembly_at: Получить полный дизассемблер для функции, содержащей адрес.binja.info: Вернуть информацию о версии/установке Binary Ninja.binja.call: Универсальный мост API: вызов цели пути bn.* или bv.*.binja.eval: Вычислить код Python с bn, sessions и опционально bv.data.typed_at: Получить типизированную переменную данных по адресу.database.create_bndb: Создать .bndb из сеанса.database.save_auto_snapshot: Сохранить автоматический снимок.database.info: Получить статус базы данных для сеанса.database.snapshots: Список снимков базы данных.database.read_global: Прочитать глобальный строковый ключ базы данных.database.write_global: Записать глобальный строковый ключ базы данных.debug.parsers: Список парсеров отладочной информации, применимых к данному представлению.debug.parse_and_apply: Разобрать отладочную информацию и применить её к представлению.disasm.linear: Получить строки линейного дизассемблера.disasm.function: Получить полный дизассемблер для функции, содержащей адрес.disasm.range: Строки дизассемблера для диапазона адресов.external.library_add: Добавить внешнюю библиотеку.external.library_list: Список внешних библиотек.external.library_remove: Удалить внешнюю библиотеку.external.location_add: Добавить отображение внешнего расположения.external.location_get: Получить отображение внешнего расположения.external.location_remove: Удалить отображение внешнего расположения.function.basic_blocks: Список базовых блоков в функции с постраничным выводом.function.callers: Вызывающие функции.function.callees: Вызываемые функции.function.variables: Список переменных функции.function.var_refs: Список ссылок на переменные в MLIL/HLIL.function.var_refs_from: Список ссылок на переменные, исходящих из адреса.function.ssa_var_def_use: Получить определение и использование SSA-переменной.function.ssa_memory_def_use: Получить определение и использование SSA-памяти по версии памяти.function.metadata_store: Сохранить метаданные функции по ключу.function.metadata_query: Запросить метаданные функции по ключу.function.metadata_remove: Удалить метаданные функции по ключу.health.ping: Проверка работоспособности.il.function: Список IL-функции.il.instruction_by_addr: Получить IL-инструкцию по исходному адресу.il.address_to_index: Преобразовать адрес в индекс/индексы IL.il.index_to_address: Преобразовать индекс IL в исходный адрес.il.rewrite.capabilities: Список возможностей перезаписи IL для одной функции и уровня IL.il.rewrite.noop_replace: Выполнить замену IL-выражения на no-op.il.rewrite.translate_identity: Транслировать IL с помощью обратного вызова тождественного отображения.loader.rebase: Перебазировать BinaryView.loader.load_settings_types: Список имён типов настроек загрузчика.loader.load_settings_get: Получить значения настроек загрузчика.loader.load_settings_set: Установить одно значение настройки загрузчика.memory.read: Прочитать байты из представления (length <= 65536).memory.write: Записать байты (в hex) в представление.memory.insert: Вставить байты (в hex) в представление.memory.remove: Удалить байты из представления.memory.reader_read: Прочитать целочисленные значения через BinaryReader.memory.writer_write: Записать целочисленные значения через BinaryWriter.mcp.response_format: Объяснить поля результата инструмента (structuredContent полная нагрузка, content[0].text сводка).metadata.store: Сохранить метаданные по ключу.metadata.query: Запросить метаданные по ключу.metadata.remove: Удалить метаданные по ключу.patch.assemble: Ассемблировать и записать байты инструкции по адресу.patch.status: Проверить доступность патча по адресу.patch.convert_to_nop: Заменить инструкцию на NOP, если поддерживается.patch.always_branch: Заменить условный переход на безусловный, если поддерживается.patch.never_branch: Заменить условный переход на отсутствие перехода, если поддерживается.patch.invert_branch: Заменить условный переход на инвертированный, если поддерживается.patch.skip_and_return_value: Заменить инструкцию на пропуск и возврат значения, если поддерживается.plugin.valid_commands: Список команд плагинов, допустимых в контексте.plugin.execute: Выполнить команду плагина, допустимую в контексте.plugin_repo.status: Список репозиториев плагинов и их состояний.plugin_repo.check_updates: Проверить обновления репозиториев плагинов.plugin_repo.plugin_action: Выполнить действие установки/удаления/включения/отключения для плагина из репозитория.project.create: Создать проект.project.open: Открыть проект.project.close: Закрыть отслеживаемый проект.project.list: Список папок/файлов проекта.project.create_folder: Создать папку проекта.project.create_file: Создать файл проекта из данных в base64.project.metadata_store: Сохранить метаданные проекта.project.metadata_query: Запросить метаданные проекта.project.metadata_remove: Удалить метаданные проекта.search.data: Поиск необработанных байтовых шаблонов (hex-строка).search.next_text: Найти следующее текстовое совпадение.search.all_text: Найти все текстовые совпадения в диапазоне (опционально regex).search.next_data: Найти следующее совпадение данных/байтового шаблона.search.all_data: Найти все совпадения данных/байтового шаблона в диапазоне.search.next_constant: Найти следующее вхождение константы.search.all_constant: Найти все вхождения константы в диапазоне.section.add_user: Добавить пользовательскую секцию.section.remove_user: Удалить пользовательскую секцию.segment.add_user: Добавить пользовательский сегмент.segment.remove_user: Удалить пользовательский сегмент.session.open: Открыть бинарный файл и создать сеанс.session.open_bytes: Открыть сеанс бинарного файла из байтов в base64.session.open_existing: Открыть другой сеанс из файла существующего сеанса.session.close: Закрыть один открытый сеанс.session.list: Список открытых сеансов.session.mode: Получить режим безопасности/детерминизма сеанса.session.set_mode: Обновить режим безопасности/детерминизма сеанса.task.analysis_update: Запустить задачу асинхронного обновления анализа.task.search_text: Запустить асинхронную задачу поиска.task.status: Получить статус задачи.task.result: Получить результат задачи.task.cancel: Отменить задачу (по возможности).transform.inspect: Инспектировать/обработать конвейер извлечения трансформаций.type.parse_string: Разобрать одну строку типа.type.parse_declarations: Разобрать C-объявления типов/переменных/функций.type.define_user: Определить пользовательский тип из источника типа.type.rename: Переименовать тип.type.undefine_user: Отменить определение пользовательского типа.type.import_library_type: Импортировать тип из библиотеки типов.type.import_library_object: Импортировать тип объекта из библиотеки типов.type.export_to_library: Экспортировать тип в библиотеку типов.type_archive.create: Создать и опционально присоединить архив типов.type_archive.open: Открыть и опционально присоединить архив типов.type_archive.list: Список присоединённых архивов типов.type_archive.get: Получить один отслеживаемый архив типов.type_archive.pull: Извлечь типы из архива типов.type_archive.push: Отправить типы в архив типов.type_archive.references: Запросить входящие/исходящие ссылки архива для одного типа.type_library.create: Создать и опционально присоединить библиотеку типов.type_library.load: Загрузить и опционально присоединить библиотеку типов.type_library.list: Список библиотек типов, присоединённых к представлению.type_library.get: Получить одну отслеживаемую библиотеку типов.uidf.parse_possible_value: Разобрать строку набора возможных значений, заданных пользователем.uidf.set_user_var_value: Установить значение пользовательской переменной функции.uidf.clear_user_var_value: Очистить значение пользовательской переменной функции.uidf.list_user_var_values: Список всех значений пользовательских переменных для функции.undo.begin: Начать транзакцию отмены.undo.commit: Завершить транзакцию отмены.undo.revert: Откатить транзакцию отмены.undo.undo: Выполнить отмену.undo.redo: Выполнить повтор.value.reg: Получить значение регистра по/после адреса.value.stack: Получить содержимое стека по/после адреса.value.possible: Получить набор возможных значений IL по адресу.value.flags_at: Получить состояние чтения/записи флагов поднятого IL по адресу.workflow.list: Список зарегистрированных рабочих процессов.workflow.describe: Описать топологию и настройки рабочего процесса.workflow.clone: Клонировать рабочий процесс.workflow.insert: Вставить активности перед активностью.workflow.insert_after: Вставить активности после активности.workflow.remove: Удалить активность рабочего процесса.workflow.graph: Суммировать граф рабочего процесса.workflow.machine.status: Получить статус машины рабочего процесса.workflow.machine.control: Управлять временем выполнения машины рабочего процесса.xref.code_refs_to: Ссылки на код по адресу.xref.code_refs_from: Ссылки на код из адреса.xref.data_refs_to: Ссылки на данные по адресу.xref.data_refs_from: Ссылки на данные из адреса.Для получения дополнительной информации обращайтесь к Tim Blazytko (@mr_phrazer).
binary.get_function_il_atbinary.functions_at: Список функций по адресу.binary.basic_blocks_at: Список базовых блоков по адресу с постраничным выводом.