mcghidra/bridge_mcp_ghidra.py
2025-03-22 22:46:17 -07:00

69 lines
2.3 KiB
Python

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()