69 lines
2.3 KiB
Python
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()
|
|
|