Serveur MCP local-first et déterministe pour IDA Pro/Home : 109 opérations de reverse engineering à schéma strict, des conclusions étayées par des preuves et des modifications d'IDB contrôlées par des politiques.

IDA Pro MCP est un serveur local Model Context Protocol pour IDA Pro. Il permet à un client MCP d'inspecter un IDB, de demander à IDA des résultats d'analyse déterministes et, lorsque cela est explicitement autorisé, d'écrire des annotations ou d'autres modifications dans l'IDB. Le processus hôte s'exécute en dehors d'IDA et démarre par défaut un processus IDA headless distinct pour chaque session.
ida_* à schéma strict avec découverte en direct via tools/list et ida_help.La version actuelle est 1.0.0a3. Il s'agit d'un logiciel alpha. Les noms d'opérations publiques ida_*, les schémas et le format d'espace de travail peuvent changer avant une version stable 1.0.0. La surface client par défaut contient 109 opérations à schéma exact. Utilisez la découverte en direct pour le contrat complet : tools/list énumère chaque opération avec son schéma, et ida_help(topic="...") renvoie les arguments exacts et un exemple pour une opération.
Vous avez besoin de :
idat/idat64 utilisable. Les preuves de tests en direct du dépôt couvrent IDA 9.3 et 9.4 ; 9.2 est le seuil de compatibilité déclaré.L'analyse normale ne nécessite ni modèle de langage ni modèle d'embedding. Les fonctionnalités optionnelles de recherche sémantique utilisent un modèle local par défaut et restent désactivées lorsqu'aucun modèle n'est configuré.
Le runtime par défaut est idat : un processus IDA headless par session. Le backend idalib est expérimental, nécessite une installation IDA 9.3 ou plus récente avec le paquet idapro activé, et n'est pas nécessaire pour une première installation.
L'installateur crée un environnement géré sous la racine d'installation, y installe une copie figée du checkout et écrit la configuration client pour les emplacements clients pris en charge. Depuis la racine du dépôt, exécutez :
python3 install.py
Pour une installation IDA connue, passez-la explicitement :
python3 install.py --ida-dir /path/to/ida-pro-9.3
Pour une exécution non interactive :
python3 install.py --yes --no-ida-prompt --ida-dir /path/to/ida-pro-9.3
L'installateur peut également trouver IDA via IDADIR, IDA_DIR, les exécutables IDA présents dans le PATH et les répertoires d'installation courants. --ida-version sélectionne une version lorsque plusieurs installations sont présentes. Utilisez --dry-run pour inspecter d'abord les changements prévus.
L'installateur ne télécharge pas de modèle d'embedding sauf si vous en sélectionnez ou en demandez un. Il peut créer ou mettre à jour des fichiers de configuration pour chaque emplacement client de sa carte de clients intégrée, y compris des clients qui ne sont pas installés sur votre machine. Vérifiez install-report.json dans la racine d'installation et supprimez les entrées inutilisées si nécessaire. Les fichiers de configuration réguliers existants sont sauvegardés avant d'être modifiés ; les fichiers malformés, liés symboliquement ou non réguliers sont refusés plutôt qu'écrasés.
Redémarrez le client MCP après l'installation afin qu'il recharge sa configuration.
Les harnais d'agents découvrent la surface d'outils en direct : tools/list énumère chaque opération avec son schéma, et ida_help(topic="...") renvoie les arguments exacts et un exemple. Aucun fichier de compétence statique n'est installé.
La racine d'installation par défaut est :
~/.local/share/ida-pro-mcp%LOCALAPPDATA%/ida-pro-mcpDéfinissez IDA_PRO_MCP_HOME ou passez --install-root pour choisir un autre emplacement.
Les versions alpha sont construites par GitHub Actions et publiées manuellement en tant que préversions. Lorsqu'une release est disponible, téléchargez l'asset bundle.zip ou bundle.tar.gz et son fichier SHA256SUMS depuis la
page des releases. Vérifiez la somme de contrôle, extrayez le bundle et exécutez l'installateur depuis son répertoire de premier niveau :
python3 install.py --yes --no-ida-prompt --ida-dir /path/to/ida-pro-9.3
La release contient également une wheel et une distribution source pour les installations Python scriptées. Le bundle est la voie la plus simple car il inclut l'installateur et tous les fichiers du projet nécessaires pour configurer un client MCP. Les releases sont de qualité alpha ; conservez le binaire et l'IDB d'origine et lisez les notes de version avant de mettre à niveau.
L'installateur écrit l'entrée serveur pour les chemins de configuration client qu'il connaît. Il prend en charge Gemini CLI, Antigravity, Antigravity IDE, Antigravity CLI, Claude Code, Codex, Copilot CLI, OpenCode, Claude Desktop, Cursor, VS Code, Windsurf, Cline et Roo Code. OpenCode et les clients de la famille Copilot utilisent des formats de configuration différents ; laissez l'installateur écrire ces fichiers ou suivez le guide de configuration OpenCode.
Pour un client qui utilise le format JSON courant, l'entrée est équivalente à :
{
"mcpServers": {
"ida-pro-mcp": {
"command": "/path/to/ida-pro-mcp/.venv/bin/python",
"args": ["-u", "-m", "ida_pro_mcp.host.server"],
"env": {
"IDA_PRO_MCP_HOME": "/path/to/ida-pro-mcp",
"IDADIR": "/path/to/ida-pro-9.3",
"IDA_MCP_TOOL_SURFACE": "agent"
}
}
}
}
Sous Windows, utilisez l'interpréteur géré à l'emplacement
<install-root>/.venv/Scripts/python.exe. Les détails importants sont l'interpréteur géré, -u -m ida_pro_mcp.host.server, le répertoire IDA sélectionné et IDA_MCP_TOOL_SURFACE=agent. Ne pointez pas le client vers install.py ; ce fichier est l'installateur, pas le serveur MCP.
Après avoir modifié une configuration client, redémarrez complètement le client et vérifiez que ida_help apparaît dans ses opérations disponibles. Si le client n'affiche qu'une ancienne interface étendue tool(action=...), vérifiez que l'environnement sélectionne la surface agent par défaut plutôt que
IDA_MCP_TOOL_SURFACE=legacy.
Utilisez d'abord un chemin absolu vers un binaire de test. L'ouverture d'un binaire attend normalement la fin de l'analyse initiale d'IDA ; un binaire volumineux peut prendre du temps.
ida_open_binary(binary_path="/absolute/path/to/sample")
ida_session_status()
ida_overview()
ida_list_imports(limit=30)
ida_list_strings(query="http", limit=30)
ida_find(query="main", limit=20)
ida_decompile(address="<address returned by IDA>")
ida_xrefs_to(address="<same address>")
Utilisez ida_help(topic="ida_decompile") chaque fois que vous avez besoin du schéma d'arguments exact. Les schémas d'opérations publiques sont stricts : les arguments inconnus sont rejetés. Les adresses peuvent être acceptées sous forme d'entiers ou de chaînes selon le contrat de chaque opération ; utilisez la forme indiquée par ida_help pour l'opération dans votre client.
Pour un petit enregistrement d'investigation, les opérations de constats de l'espace de travail sont :
ida_write_finding(title="Input reaches parser", address="<address returned by IDA>", kind="finding", status="confirmed", confidence=0.8, evidence=[{"type":"call", "value":"recv", "address":"<evidence address>"}])
ida_analysis_brief()
ida_next_target()
ida_export_findings(format="markdown")
Les constats de l'espace de travail sont conservés séparément des modifications de l'IDB. Si la politique active autorise l'écriture dans l'espace de travail, ida_write_finding enregistre un constat localement ; sinon le serveur renvoie une erreur de politique. ida_publish_findings(dry_run=true) prévisualise les modifications de l'IDB. La publication, le renommage, le patch et les autres mutations de l'IDB sont soumis à la politique et nécessitent l'accusé de réception documenté de l'opération lorsque celle-ci en expose un.
La page d'accueil reste orientée tâches, mais cet index compact permet de parcourir facilement la surface publique. Chaque nom ci-dessous est préfixé par ida_ lors de l'appel. Les schémas et exemples complets sont disponibles en direct via tools/list et
ida_help(topic="...").
| Groupe | Opérations |
|---|---|
| Session | open_binary, open_background, session_state, session_status, session_health, close_session, session_get, session_list, sso_activate, agent_login, agent_logout, session_switch |
| Découverte | overview, find, semantic_search, reranker_status, function_families, index_functions, index_status, cancel_index, list_functions, list_strings, list_imports, list_types, list_segments, list_sigs, sreg_get, sreg_list, auto_wait, events, registers, search_data_value, search_query_lang, r2_status, r2_bininfo, r2_load_hints, r2_disassemble_hypothesis, r2_vxrefs, fw_detect_vector_table, fw_detect_load_base, fw_detect_mmio, fw_rtos_scan, fw_carve |
| Code | decompile, disassemble, compare_functions, diff_sessions, xrefs_to, callers, callees, read_bytes, get_type, callgraph, emulate |
| Constats |
La politique de base du serveur est assist. Une session peut resserrer la politique de base de l'opérateur mais ne peut pas la relâcher. La politique est déterministe ; elle ne décide pas qu'une opération risquée est sûre parce qu'un client le demande.
L'inspection en lecture seule est le point de départ normal. Les exemples incluent
ida_overview, ida_find, ida_list_functions, ida_list_strings,
ida_list_imports, ida_decompile, ida_disassemble, ida_xrefs_to,
ida_callers, ida_callees, ida_callgraph, ida_read_bytes et les opérations de calcul. Celles-ci consomment tout de même des fichiers locaux et des ressources IDA, et le client MCP reçoit leurs résultats.
Les actions suivantes modifient un état durable ou exécutent du code et doivent être considérées comme à fort impact :
ida_rename, ida_comment, ida_patch_bytes, les modifications de fonctions/types/segments/données, l'application de signatures, ida_save_idb, les snapshots et les opérations d'annulation/restauration peuvent modifier l'IDB ou un état associé.ida_publish_findings écrit les constats dans l'IDB. Exécutez d'abord sa forme dry-run ; la forme non dry-run est soumise à contrôle.ida_close_session détruit le runtime IDA actif et est destructif du point de vue de la session.ida_python exécute du Python arbitraire dans le processus IDA actif. Il est bloqué en mode sûr et nécessite un accusé de réception explicite des risques sous la politique normale.ida_emulate est utile pour des vérifications contrôlées, mais les actions de l'émulateur qui modifient l'état nécessitent l'accusé de réception correspondant.ida_til_export et ida_til_import accèdent au système de fichiers et sont soumis à contrôle. Les chemins du système de fichiers sont contraints par la racine mémoire configurée là où cette protection s'applique.N'utilisez pas --disable-policy comme option de commodité. Cela définit
IDA_MCP_POLICY_MODE=off et désactive tous les contrôles de politique, y compris les accusés de réception d'écriture et les autres contrôles de workflow. Si un appel est refusé, lisez l'entrée ida_help de l'opération et fournissez l'argument d'accusé de réception exact uniquement lorsque le schéma de cette opération le prend en charge.
Pendant qu'IDA effectue encore l'analyse initiale, le mode sûr bloque certaines opérations d'analyse de binaire complet, d'indexation et de script. Il est destiné à garder les appels de début de session restreints ; interrogez ida_session_status ou
ida_session_health plutôt que de contourner la protection.
Le pont écoute sur le loopback et utilise un jeton par session. Ce n'est pas un service réseau : n'exposez pas et ne transférez pas le port du pont vers un réseau non fiable. Traitez les scripts importés, les traces, les binaires, les données de corpus et les requêtes client comme des entrées non fiables.
Le chemin normal hôte-vers-IDA est local. Le projet n'exécute pas de service LLM intégré dans le chemin d'analyse, et l'embedding local est opt-in. Cela ne rend pas pour autant l'ensemble du workflow automatiquement hors ligne :
llama-server, les téléchargements optionnels de corpus de menaces et les intégrations externes Rizin/radare2 peuvent effectuer des requêtes réseau lorsqu'ils sont activés.Pour une configuration entièrement locale, utilisez le runtime local par défaut, laissez Gemini et les autres téléchargements optionnels désactivés, et configurez le client MCP et son modèle conformément à la politique de données de votre organisation. « Entièrement local » nécessite tout de même de vérifier ce que le client envoie à son propre fournisseur de modèle.
Passez explicitement le répertoire d'installation :
python3 install.py --ida-dir /path/to/ida-pro-9.3
Vous pouvez également définir IDADIR ou IDA_DIR. Si plusieurs installations sont trouvées, utilisez --ida-version 9.3 ou --no-ida-prompt pour contrôler la sélection. Confirmez que le répertoire sélectionné contient un idat ou idat64 exécutable.
Redémarrez le client et inspectez son entrée de configuration. Confirmez que sa commande utilise le Python du venv géré et -u -m ida_pro_mcp.host.server, et que le bloc env contient le bon IDADIR. Consultez
install-report.json ; l'installateur enregistre les échecs de mise à jour des clients et conserve des sauvegardes à côté des fichiers modifiés. Les formats de configuration d'OpenCode et de la famille Copilot diffèrent de l'exemple JSON courant.
L'appel normal ida_open_binary attend l'analyse initiale. Vérifiez
ida_session_status et ida_session_health, accordez plus de temps pour un binaire volumineux et consultez les journaux par session sous le répertoire d'installation/de données. L'opération d'ouverture en arrière-plan est disponible, mais elle est destinée aux cas où vous comprenez son comportement asynchrone et les restrictions du mode sûr.
C'est généralement la politique qui fonctionne comme configuré. Utilisez ida_help pour inspecter le schéma exact de l'opération et son exigence d'accusé de réception. N'ajoutez pas d'arguments arbitraires : les schémas sont stricts. Vérifiez IDA_MCP_POLICY_MODE et le fichier de politique de l'opérateur avant de modifier la politique. Désactiver tous les contrôles de politique est un choix distinct et délibérément dangereux.
La recherche sémantique est optionnelle et nécessite un index et un backend d'embedding compatible. Le listage ordinaire, la recherche, la décompilation et le travail de références croisées n'en ont pas besoin. Pour configurer le chemin local optionnel, utilisez les options explicites d'embedder de l'installateur, par exemple :
python3 install.py --setup-embedder
L'installateur peut également exécuter --embedder-doctor, utiliser un chemin de modèle explicite, ou télécharger un modèle sélectionné et llama-server lorsqu'on le lui demande. Les licences de modèles, l'utilisation du disque et les téléchargements réseau sont de votre responsabilité. Si le modèle est absent, le serveur doit signaler la recherche sémantique comme indisponible plutôt que de prétendre qu'elle s'est exécutée.
Corrigez la syntaxe JSON, JSONC ou TOML signalée et relancez l'installateur. Il refuse également les chemins de configuration liés symboliquement et non réguliers afin d'éviter d'écraser une cible inattendue. Les fichiers réguliers existants sont sauvegardés ; le comportement de rollback par défaut de l'installateur peut restaurer ces sauvegardes si une phase ultérieure échoue.
Vérifiez ida_session_health, le journal de session et le journal du pont. Confirmez que le client utilise la même racine d'installation et le même IDADIR que ceux enregistrés par l'installateur. Le backend idat par défaut donne à chaque session son propre processus ; ne passez pas à l'expérimental idalib pendant le diagnostic d'une installation de base.
tools/list et
ida_help exposent chaque opération publique, schéma et exemple.Pour les noms d'opérations exacts, utilisez la référence générée ou demandez au serveur en cours d'exécution avec ida_help. L'ancien backend tool(action=...) reste disponible pour compatibilité et est sélectionné avec IDA_MCP_TOOL_SURFACE=legacy ; les nouvelles intégrations doivent utiliser la surface ida_* à schéma exact.
write_finding, mark_examined, list_findings, search_findings, update_finding, export_findings, publish_findings, import_annotations, analysis_brief, next_target |
| Édition | create_function, change_function, rename, comment, patch_bytes, save_idb, make_code, undefine, rename_local, declare_type, apply_type, add_segment, set_segment_attrs, apply_sig, sreg_set, create_data, create_strlit, undo_begin, undo_end, add_entry, idb_snapshot, idb_restore_snapshot, struct_member_add, struct_member_del, struct_member_rename, struct_member_set_type, enum_member_add, enum_member_rename, enum_member_revalue, til_delete, til_export, til_import, mark_dangerous |
| Calcul | calc_eval, calc_offset, calc_convert, calc_resolve, calc_deref, calc_chain, calc_align, calc_bitops |
| Support | python, continue, help |
| Workflow | batch |