From 835a382c4dafbc696a8a2a96e42c9d03ed31052c Mon Sep 17 00:00:00 2001 From: LaurieWired Date: Sat, 22 Mar 2025 22:46:17 -0700 Subject: [PATCH] Initial commit --- bridge_mcp_ghidra.py | 68 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 bridge_mcp_ghidra.py diff --git a/bridge_mcp_ghidra.py b/bridge_mcp_ghidra.py new file mode 100644 index 0000000..b7bbcab --- /dev/null +++ b/bridge_mcp_ghidra.py @@ -0,0 +1,68 @@ +from mcp.server.fastmcp import FastMCP +import requests + +ghidra_server_url = "http://localhost:8080" + +mcp = FastMCP("ghidra-mcp") + +@mcp.tool() +def list_methods() -> list: + response = requests.get(f"{ghidra_server_url}/methods") + return response.text.splitlines() if response.ok else [] + +@mcp.tool() +def rename_method(method_address: str, new_name: str) -> str: + payload = {"method_address": method_address, "new_name": new_name} + response = requests.post(f"{ghidra_server_url}/rename", data=payload) + return response.text if response.ok else "Failed to rename method" + +@mcp.tool() +def list_classes() -> list: + response = requests.get(f"{ghidra_server_url}/classes") + return response.text.splitlines() if response.ok else [] + +@mcp.tool() +def decompile_function(name: str) -> str: + response = requests.post(f"{ghidra_server_url}/decompile", data=name) + return response.text if response.ok else "Failed to decompile function" + +@mcp.tool() +def rename_function(old_name: str, new_name: str) -> str: + payload = {"oldName": old_name, "newName": new_name} + response = requests.post(f"{ghidra_server_url}/renameFunction", data=payload) + return response.text if response.ok else "Failed to rename function" + +@mcp.tool() +def rename_data(address: str, new_name: str) -> str: + payload = {"address": address, "newName": new_name} + response = requests.post(f"{ghidra_server_url}/renameData", data=payload) + return response.text if response.ok else "Failed to rename data" + +@mcp.tool() +def list_segments() -> list: + response = requests.get(f"{ghidra_server_url}/segments") + return response.text.splitlines() if response.ok else [] + +@mcp.tool() +def list_imports() -> list: + response = requests.get(f"{ghidra_server_url}/imports") + return response.text.splitlines() if response.ok else [] + +@mcp.tool() +def list_exports() -> list: + response = requests.get(f"{ghidra_server_url}/exports") + return response.text.splitlines() if response.ok else [] + +@mcp.tool() +def list_namespaces() -> list: + response = requests.get(f"{ghidra_server_url}/namespaces") + return response.text.splitlines() if response.ok else [] + +@mcp.tool() +def list_data_items() -> list: + response = requests.get(f"{ghidra_server_url}/data") + return response.text.splitlines() if response.ok else [] + +if __name__ == "__main__": + mcp.run() +