A headless, extendable, multi-session MCP framework for IDA Pro, built with ida-domain and FastMCP.
- Headless: No GUI required, powered by ida-domain
- Multi-session: Analyze multiple binaries simultaneously
- Extensible: Custom plugin support via entry points
- Auto-docs: Generate documentation from plugins
| Plugin | Description |
|---|---|
| Functions | Analyze functions, boundaries, pseudocode |
| Xrefs | Data and code cross-references |
| Names | Symbol naming and demangling |
| Comments | Code comments (regular, repeatable) |
| Strings | String literal search/analysis |
| Segments | Memory segment queries |
| Bytes | Binary data read/patch |
| Types | Type information and structures |
| Entries | Entry points and exports |
For complete plugin documentation, see tenrec docs.
Note
Community plugins: tenrec-plugins
Solving Flare-On 9 Challenge 4 (darn mice) with a single prompt using tenrec and Claude Code:
Use tenrec to open a session and reverse the binary. Focus on getting a high-level understanding by finding entry points and tracing execution flow. Rename variables and functions as you work. The xref plugin can help. Look for a flag in email format.
darn-mice-solve.mp4
Challenge write-up: 04-darn-mice.pdf | Binary: fareedfauzi/Flare-On-Challenges
- Python 3.10+
- IDA Pro 9.1+
uv tool install tenrecVerify installation:
uv tool list # Should show tenrec
which tenrec # Should show path to executable# macOS
export IDADIR="/Applications/IDA Professional 9.1.app/Contents/MacOS"
# Linux
export IDADIR="/opt/idapro"
# Windows (PowerShell, as Administrator)
setx IDADIR "C:\Program Files\IDA Pro" /Mtenrec installSelect your MCP client from the list (Claude Code, Cursor, Windsurf, etc.).
tenrec runThe server runs with stdio transport by default. Use --transport sse for SSE.
# Add plugin
tenrec plugins add --plugin "package-name"
tenrec plugins add --plugin "/path/to/plugin"
tenrec plugins add --plugin "git+https://github.com/user/repo"
# List plugins
tenrec plugins list
# Remove plugin
tenrec plugins remove --dist plugin_nametenrec docs -p tenrec/plugins/plugins| Guide | Description |
|---|---|
| Plugin Development | Creating custom plugins |
| CLI Reference | Complete command reference |
| Architecture | System design |
| Testing | Testing patterns |
| Integrations | MCP client setup (including Codex) |
| Contributing | Development setup and guidelines |
| Roadmap | Future plans |
from tenrec.plugins.models import PluginBase, Instructions, operation
class MyPlugin(PluginBase):
"""Plugin description."""
name = "my_plugin" # Must be snake_case
version = "1.0.0" # Must be semver
instructions = Instructions(
purpose="What this plugin does",
interaction_style=["How to use effectively"],
examples=["my_plugin_operation()"],
anti_examples=["What NOT to do"],
)
@operation()
def my_operation(self) -> dict:
"""Operation docstring for LLM guidance."""
# Access IDA via self.database
return {"result": "value"}Package with entry point in pyproject.toml:
[project.entry-points."tenrec.plugins"]
my_plugin = "my_package:MyPlugin"See Plugin Development Guide for complete documentation.
- Windows support is in progress. See Issue #9.
See Contributing Guide for development setup and guidelines.
MIT