Binary Ninja
A Binary Ninja plugin, MCP server, and bridge that seamlessly integrates Binary Ninja with your favorite MCP client.
Binary Ninja MCP
This repository contains a Binary Ninja plugin, MCP server, and bridge that enables seamless integration of Binary Ninja's capabilities with your favorite LLM client.

Features
- Seamless, real-time integration between Binary Ninja and MCP clients
- Enhanced reverse engineering workflow with AI assistance
- Support for every MCP client (Cline, Claude desktop, Roo Code, etc.)
- Open multiple binaries and switch the active target automatically
Examples
Solving a CTF Challenge
Check out this demo video on YouTube that uses the extension to solve a CTF challenge.
Components
This repository contains two separate components:
- A Binary Ninja plugin that provides an MCP server that exposes Binary Ninja's capabilities through HTTP endpoints. This can be used with any client that implements the MCP protocol.
- A separate MCP bridge component that connects your favorite MCP client to the Binary Ninja MCP server.
Prerequisites
- Binary Ninja
- Python 3.12+
- MCP client (those with auto-setup support are listed below)
Installation
MCP Client
Please install the MCP client before you install Binary Ninja MCP so that the MCP clients can be auto-setup. We currently support auto-setup for these MCP clients:
1. Cline (recommended)
2. Roo Code
3. Claude Desktop (recommended)
4. Cursor
5. Windsurf
6. Claude Code
7. LM Studio
Extension Installation
After the MCP client is installed, you can install the MCP server using the Binary Ninja Plugin Manager or manually. Both methods support auto-setup of MCP clients.
If your MCP client is not set, you should install it first then try to reinstall the extension.
Binary Ninja Plugin Manager
You may install the extension through Binary Ninja's Plugin Manager (Plugins > Manage Plugins).

Manual Install
To manually install the extension, this repository can be copied into the Binary Ninja plugins folder.
[Optional] Manual Setup of the MCP Client
You do NOT need to set this up manually if you use a supported MCP client and follow the installation steps before.
You can also manage MCP client entries from the command line:
python scripts/mcp_client_installer.py --install # auto setup supported MCP clients
python scripts/mcp_client_installer.py --uninstall # remove entries and delete `.mcp_auto_setup_done`
python scripts/mcp_client_installer.py --config # print a generic JSON config snippet
Using npm package (Recommended)
The recommended way to set up the MCP client is using the official npm package:
npx -y binary-ninja-mcp
For MCP clients, use this configuration:
{
"mcpServers": {
"binary-ninja-mcp": {
"command": "npx",
"args": ["-y", "binary-ninja-mcp", "--host", "localhost", "--port", "9009"]
}
}
}
Or if installed globally:
{
"mcpServers": {
"binary-ninja-mcp": {
"command": "binary-ninja-mcp",
"args": ["--host", "localhost", "--port", "9009"]
}
}
}
Using Python Bridge (Legacy)
For other MCP clients, use the Python bridge directly:
{
"mcpServers": {
"binary_ninja_mcp": {
"command": "/ABSOLUTE/PATH/TO/Binary Ninja/plugins/repositories/community/plugins/fosdickio_binary_ninja_mcp/.venv/bin/python",
"args": [
"/ABSOLUTE/PATH/TO/Binary Ninja/plugins/repositories/community/plugins/fosdickio_binary_ninja_mcp/bridge/binja_mcp_bridge.py"
]
}
}
}
Note: Replace /ABSOLUTE/PATH/TO with the actual absolute path to your project directory. The virtual environment's Python interpreter must be used to access the installed dependencies.
Usage
- Open Binary Ninja and load a binary
- Click the button shown at left bottom corner
- Start using it through your MCP client
You may now start prompting LLMs about the currently open binary (or binaries). Example prompts:
CTF Challenges
You're the best CTF player in the world. Please solve this reversing CTF challenge in the <folder_name> folder using Binary Ninja. Rename ALL the function and the variables during your analyzation process (except for main function) so I can better read the code. Write a python solve script if you need. Also, if you need to create struct or anything, please go ahead. Reverse the code like a human reverser so that I can read the decompiled code that analyzed by you.
Malware Analysis
Your task is to analyze an unknown file which is currently open in Binary Ninja. You can use the existing MCP server called "binary_ninja_mcp" to interact with the Binary Ninja instance and retrieve information, using the tools made available by this server. In general use the following strategy:
- Start from the entry point of the code
- If this function call others, make sure to follow through the calls and analyze these functions as well to understand their context
- If more details are necessary, disassemble or decompile the function and add comments with your findings
- Inspect the decompilation and add comments with your findings to important areas of code
- Add a comment to each function with a brief summary of what it does
- Rename variables and function parameters to more sensible names
- Change the variable and argument types if necessary (especially pointer and array types)
- Change function names to be more descriptive, using mcp_ as prefix.
- NEVER convert number bases yourself. Use the convert_number MCP tool if needed!
- When you finish your analysis, report how long the analysis took
- At the end, create a report with your findings.
- Based only on these findings, make an assessment on whether the file is malicious or not.
Supported Capabilities
The following table lists the available MCP functions for use:
| Function | Description |
|---|---|
decompile_function | Decompile a specific function by name and return HLIL-like code with addresses. |
get_il(name_or_address, view, ssa) | Get IL for a function in hlil, mlil, or llil (SSA supported for MLIL/LLIL). |
define_types | Add type definitions from a C string type definition. |
delete_comment | Delete the comment at a specific address. |
delete_function_comment | Delete the comment for a function. |
declare_c_type(c_declaration) | Create/update a local type from a single C declaration. |
format_value(address, text, size) | Convert a value and annotate it at an address in BN (adds a comment). |
function_at | Retrieve the name of the function the address belongs to. |
fetch_disassembly | Get the assembly representation of a function by name or address. |
get_entry_points() | List entry point(s) of the loaded binary. |
get_binary_status | Get the current status of the loaded binary. |
get_comment | Get the comment at a specific address. |
get_function_comment | Get the comment for a function. |
get_user_defined_type | Retrieve definition of a user-defined type (struct, enumeration, typedef, union). |
get_xrefs_to(address) | Get all cross references (code and data) to an address. |
get_data_decl(name_or_address, length) | Return a C-like declaration and a hexdump for a data symbol or address. |
hexdump_address(address, length) | Text hexdump at address. length < 0 reads exact defined size if available. |
hexdump_data(name_or_address, length) | Hexdump by data symbol name or address. length < 0 reads exact defined size if available. |
get_xrefs_to_enum(enum_name) | Get usages related to an enum (matches member constants in code). |
get_xrefs_to_field(struct_name, field_name) | Get all cross references to a named struct field. |
get_xrefs_to_struct(struct_name) | Get xrefs/usages related to a struct (members, globals, code refs). |
get_xrefs_to_type(type_name) | Get xrefs/usages related to a struct/type (globals, refs, HLIL matches). |
get_xrefs_to_union(union_name) | Get xrefs/usages related to a union (members, globals, code refs). |
get_stack_frame_vars(function_identifier) | Get stack frame variable information for a function (names, offsets, sizes, types). |
get_type_info(type_name) | Resolve a type and return declaration, kind, and members. |
get_callers(identifiers) | List callers plus call sites for one or more function identifiers. |
get_callees(identifiers) | List callees plus call sites for one or more function identifiers. |
make_function_at(address, platform) | Create a function at an address. platform optional; use default to pick the BinaryView/platform default. |
list_platforms() | List all available platform names. |
list_binaries() | List managed/open binaries with ids and active flag. |
select_binary(view) | Select active binary by id or filename. |
list_all_strings() | List all strings (no pagination; aggregates all pages). |
list_classes | List all namespace/class names in the program. |
list_data_items | List defined data labels and their values. |
list_exports | List exported functions/symbols. |
list_imports | List imported symbols in the program. |
list_local_types(offset, count) | List local Types in the current database (name/kind/decl). |
list_methods | List all function names in the program. |
list_namespaces | List all non-global namespaces in the program. |
list_segments | List all memory segments in the program. |
list_strings(offset, count) | List all strings in the database (paginated). |
list_strings_filter(offset, count, filter) | List matching strings (paginated, filtered by substring). |
rename_data | Rename a data label at the specified address. |
rename_function | Rename a function by its current name to a new user-defined name. |
rename_single_variable | Rename a single local variable inside a function. |
rename_multi_variables | Batch rename multiple local variables in a function (mapping or pairs). |
set_local_variable_type(function_address, variable_name, new_type) | Set a local variable's type. |
retype_variable | Retype variable inside a given function. |
search_functions_by_name | Search for functions whose name contains the given substring. |
search_types(query, offset, count) | Search local Types by substring (name/decl). |
set_comment | Set a comment at a specific address. |
set_function_comment | Set a comment for a function. |
set_function_prototype(name_or_address, prototype) | Set a function's prototype by name or address. |
patch_bytes(address, data, save_to_file) | Patch raw bytes at an address (byte-level, not assembly). Can patch entire instructions by providing their bytecode. Address: hex (e.g., "0x401000") or decimal. Data: hex string (e.g., "90 90"). save_to_file (default True) saves to disk and re-signs on macOS. |
These are the list of HTTP endpoints that can be called:
/allStrings: All strings in one response./formatValue?address=<addr>&text=<value>&size=<n>: Convert and set a comment at an address./getXrefsTo?address=<addr>: Xrefs to address (code+data)./getDataDecl?name=<symbol>|address=<addr>&length=<n>: JSON with declaration-style string and a hexdump for a data symbol or address. Keys:address,name,size,type,decl,hexdump.length < 0reads exact defined size if available./hexdump?address=<addr>&length=<n>: Text hexdump aligned at address;length < 0reads exact defined size if available./hexdumpByName?name=<symbol>&length=<n>: Text hexdump by symbol name. Recognizes BN auto-labels likedata_<hex>,byte_<hex>,word_<hex>,dword_<hex>,qword_<hex>,off_<hex>,unk_<hex>, and plain hex addresses./makeFunctionAt?address=<addr>&platform=<name|default>: Create a function at an address (idempotent if already exists).platform=defaultuses the BinaryView/platform default./platforms: List all available platform names./binariesor/views: List managed/open binaries with ids and active flag./selectBinary?view=<id|filename>: Select active binary for subsequent operations./data?offset=<n>&limit=<m>&length=<n>: Defined data items with previews.lengthcontrols bytes read per item (capped at defined size). Default behavior reads exact defined size when available;length=-1forces exact-size./getXrefsToEnum?name=<enum>: Enum usages by matching member constants./getXrefsToField?struct=<name>&field=<name>: Xrefs to struct field./getXrefsToType?name=<type>: Xrefs/usages related to a struct/type name./getTypeInfo?name=<type>: Resolve a type and return declaration and details./getXrefsToUnion?name=<union>: Union xrefs/usages (members, globals, refs)./getStackFrameVars?name=<function>|address=<addr>: Get stack frame variable information for a function./getCallers?identifiers=<name|addr>[,...]: Return caller summaries (functions, call sites, HLIL/IL snippets) for one or more identifiers. Acceptsidentifiers,identifier,names, oraddressesquery params./getCallees?identifiers=<name|addr>[,...]: Return callee summaries with the same schema as/getCallers, detailing every outgoing call target per request identifier./localTypes?offset=<n>&limit=<m>: List local types./strings?offset=<n>&limit=<m>: Paginated strings./strings/filter?offset=<n>&limit=<m>&filter=<substr>: Filtered strings./searchTypes?query=<substr>&offset=<n>&limit=<m>: Search local types by substring./patchor/patchBytes?address=<addr>&data=<hex>&save_to_file=<bool>: Patch raw bytes at an address (byte-level, not assembly). Can patch entire instructions by providing their bytecode. Address: hex (e.g., "0x401000") or decimal. Data: hex string (e.g., "90 90").save_to_file(default True) saves to disk and re-signs on macOS./renameVariables: Batch rename locals in a function. Parameters:- Function: one of
functionAddress,address,function,functionName, orname. - Provide renames via one of:
renames: JSON array of{old, new}objectsmapping: JSON object ofold->newpairs: compact stringold1:new1,old2:new2Returns per-item results plus totals. Order is respected; later pairs can refer to earlier new names.
- Function: one of
Development
Code Quality
This project uses Ruff for linting and formatting. Configuration is in ruff.toml.
Running Ruff Manually
Check for issues:
ruff check .
Auto-fix issues:
ruff check --fix .
Check formatting issues:
ruff format --check .
Format code:
ruff format .
GitHub Actions
A GitHub Action workflow (.github/workflows/lint-format.yml) automatically runs Ruff on:
- Every push to the
mainbranch - Every pull request targeting the
mainbranch
The workflow will fail if there are linting errors or formatting issues, ensuring code quality in CI.
Contributing
Contributions are welcome. Please feel free to submit a pull request.
Related Servers
Scout Monitoring MCP
sponsorPut performance and error data directly in the hands of your AI assistant.
Alpha Vantage MCP Server
sponsorAccess financial market data: realtime & historical stock, ETF, options, forex, crypto, commodities, fundamentals, technical indicators, & more
BCMS MCP
Give me a one - two sentence description of the BCMS MCP # MCP The BCMS Model Context Protocol (MCP) integration enables AI assistants like Claude, Cursor, and other MCP-compatible tools to interact directly with your BCMS content. This allows you to create, read, and update content entries, manage media files, and explore your content structure—all through natural language conversations with AI. ## What is MCP? The [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is an open standard developed by Anthropic that allows AI applications to securely connect to external data sources and tools. With BCMS MCP support, you can leverage AI assistants to: - Query and explore your content structure - Create new content entries with AI-generated content - Update existing entries - Manage your media library - Get intelligent suggestions based on your content model --- ## Getting Started ### Prerequisites 1. A BCMS account with an active instance 2. An MCP key with appropriate permissions 3. An MCP-compatible client (Claude Desktop, Cursor, or any MCP client) ### Step 1: Create an MCP Key 1. Navigate to your BCMS dashboard 2. Go to Settings → MCP 3. Click Create MCP Key 4. Configure the permissions for templates you want the AI to access:GET: Read entries 5. POST: Create entries 6. PUT: Update entries 7. DELETE: Delete entries Note: Right now, MCP only supports creating, reading and updating content. ### Step 2: Configure Your MCP Client You can find full instructions for integrating BCMS with your AI tools right inside BCMS, on the MCP page. But in general, installing BCMS MCP works in a standard way: ``` { "mcpServers": { "bcms": { "url": "https://app.thebcms.com/api/v3/mcp?mcpKey=YOUR_MCP_KEY" } } } ``` ## Available Tools Once connected, your AI assistant will have access to the following tools based on your MCP key permissions: ### Content Discovery #### list_templates_and_entries Lists all templates and their entries that you have access to. This is typically the first tool to call when exploring your BCMS content. Returns: - Template IDs, names, and slugs - Entry IDs with titles and slugs for each language Example prompt: "Show me all the templates and entries in my BCMS" --- ### Entry Management #### list_entries_for_{templateId} Retrieves all entries for a specific template with full content data. A separate tool is generated for each template you have access to. Returns: - Complete entry data including all meta fields - Content in all configured languages - Entry statuses Example prompt: "List all blog posts from my Blog template" --- #### create_entry_for_{templateId} Creates a new entry for a specific template. The input schema is dynamically generated based on your template's field structure. Input: - statuses: Array of status assignments per language - meta: Array of metadata for each language (title, slug, custom fields) - content: Array of content nodes for each language Example prompt: "Create a new blog post titled 'Getting Started with BCMS' with a brief introduction paragraph" --- #### update_entry_for_{templateId} Updates an existing entry for a specific language. Input: - entryId: The ID of the entry to update - lng: Language code (e.g., "en") - status: Optional status ID - meta: Updated metadata - content: Updated content nodes Example prompt: "Update the introduction paragraph of my 'Getting Started' blog post" --- ### Media Management #### list_all_media Lists all media files in your media library. Returns: - Media IDs, names, and types - File metadata (size, dimensions for images) - Parent directory information Example prompt: "Show me all images in my media library" --- #### list_media_dirs Lists the directory structure of your media library. Returns: - Hierarchical directory structure - Directory IDs and names Example prompt: "Show me the folder structure of my media library" --- #### create-media-directory Creates a new directory in your media library. Input: - name: Name of the directory - parentId: Optional parent directory ID (root if not specified) Example prompt: "Create a new folder called 'Blog Images' in my media library" --- #### request-upload-media-url Returns a URL you use to upload a file (for example via POST with multipart form data), which avoids pushing large binaries through the MCP tool payload. You still need a valid file name and MIME type when uploading, as described in the tool response. Availability: Only when the MCP key has Can mutate media enabled. Example prompt: “Give me an upload URL for a new hero image, then tell me how to upload it.” Input: - fileName: Name of the file with extension - fileData: Base64-encoded file data (with data URI prefix) - parentId: Optional parent directory ID Example prompt: "Upload this image to my Blog Images folder" --- ### Linking Tools #### get_entry_pointer_link Generates an internal BCMS link to an entry for use in content. Input: - entryId: The ID of the entry to link to Returns: - Internal link format: entry:{entryId}@*_{templateId}:entry Example prompt: "Get me the internal link for the 'About Us' page entry" --- #### get_media_pointer_link Generates an internal BCMS link to a media item for use in content. Input: - mediaId: The ID of the media item Returns: - Internal link format: media:{mediaId}@*_@*_:entry Example prompt: "Get the link for the hero image so I can use it in my blog post" --- ## Content Structure ### Entry Content Nodes When creating or updating entries, content is structured as an array of nodes. Supported node types include: Type Description paragraph Standard text paragraph heading Heading (h1-h6) bulletList Unordered list orderedList Numbered list listItem List item codeBlock Code block with syntax highlighting blockquote Quote block image Image node widget Custom widget with props ### Example Content Structure ``` { "content": [ { "lng": "en", "nodes": [ { "type": "heading", "attrs": { "level": 1 }, "content": [ { "type": "text", "text": "Welcome to BCMS" } ] }, { "type": "paragraph", "content": [ { "type": "text", "text": "This is your first paragraph." } ] } ] } ] } ``` ## Security & Permissions ### MCP Key Scopes Your MCP key controls what the AI can access: - Template Access: Only templates explicitly granted in the MCP key are visible - Operation Permissions: Each template can have independent GET/POST/PUT/DELETE permissions - Media Access: Media operations are controlled separately ### Best Practices 1. Principle of Least Privilege: Only grant the permissions needed for your use case 2. Separate Keys: Create different MCP keys for different purposes or team members 3. Regular Rotation: Periodically rotate your MCP keys ## Use Cases ### Content Creation Workflows Blog Post Creation "Create a new blog post about the benefits of headless CMS. Include an introduction, three main benefits with explanations, and a conclusion. Use the Blog template." Product Updates "Update the price field for all products in the Electronics category to apply a 10% discount" ### Content Exploration Content Audit "List all blog posts that don't have a featured image set" Translation Status "Show me which entries are missing German translations" ### Media Organization Library Cleanup "Show me all unused images in the media library" Folder Setup "Create folder structure for: Products > Categories > Electronics, Clothing, Home" ## Troubleshooting ### Common Issues #### "MCP key not found" - Verify your MCP key format: keyId.keySecret.instanceId - Ensure the MCP key hasn't been deleted or deactivated - Check that you're using the correct instance #### "MCP key does not have access to template" - Review your MCP key permissions in the dashboard - Ensure the required operation (GET/POST/PUT/DELETE) is enabled for the template #### Session Expired - MCP sessions may timeout after periods of inactivity - Simply start a new conversation to establish a fresh session ### Getting Help - Documentation: [thebcms.com/docs](https://thebcms.com/docs) - Support: [[email protected]](mailto:[email protected]) - Community: [Join BCMS Discord](https://discord.com/invite/SYBY89ccaR) for community support ## Technical Reference ### Endpoint POST https://app.thebcms.com/api/v3/mcp?mcpKey={MCP_KEY} ### Transport BCMS MCP uses the Streamable HTTP transport with session management. Sessions are maintained via the mcp-session-id header. ### Response Format All tools return structured JSON responses conforming to the MCP specification with: - content: Array of content blocks - structuredContent: Typed response data ## Rate Limits MCP requests are subject to the same rate limits as API requests: - Requests are tracked per MCP key - Contact support if you need higher limits for production workloads
SitemapKit
SitemapKit is an API and MCP server that discovers and extracts sitemaps from any website. Developers and AI agents use it to get the full URL list of any domain instantly — useful for SEO audits, web crawling, content indexing, and AI workflows.
Universal Infinite Loop MCP Server
A goal-agnostic parallel orchestration framework implementing Infinite Agentic Loop patterns as a Model Context Protocol (MCP) server.
Skills-ContextManager
Don’t pollute your AI agent’s context with 1,000 skills. Use Skills-ContextManager, a self-hosted web UI for managing AI skills and workflows by providing skills to an AI agent via MCP only when needed. Simply add skills to your library and enable or disable them with a toggle. Choose whether a skill is always loaded into context or dynamically activated when the AI agent determines it’s needed.
Postman API
An MCP server for interacting with the Postman API, requiring an API key.
BrainBox
Hebbian memory for AI agents — learns file access patterns, builds neural pathways, predicts next tools/files, saves tokens
Fyers MCP Server
An MCP server for the Fyers API v3, featuring automated OAuth authentication.
Flowise
Integrate with the Flowise API to create predictions and manage chatflows and assistants.
Gemini Image Generator
Generate high-quality images from text prompts using Google's Gemini model.
MCP Gemini CLI
Integrate with Google Gemini through its command-line interface (CLI).