claude/skills/write-ida-script/SKILL.md
Write an IDAPython script using verified API workflows from the IDA SDK MCP server
npx skillsauth add taardisaa/ida-script-helper write-ida-scriptInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Write an IDAPython script by first consulting the ida-api-mcp MCP tools to retrieve verified API call sequences, then composing the script from those patterns.
Follow these steps in order:
Break the user's request into discrete sub-tasks. For example, "list all functions and their cross-references" becomes:
For each sub-task, call get_workflows with a natural-language description:
get_workflows("enumerate all functions in the database")
get_workflows("get cross references to a function")
For any API function in the workflow results that you're not confident about, call get_api_doc:
get_api_doc("xrefblk_t")
get_api_doc("get_func_name")
If a workflow seems incomplete (e.g., you have iteration but no formatting), call list_related_apis:
list_related_apis("get_func")
Compose the script following these conventions:
import ida_funcs, not from ida_funcs import *main() wrapper: All logic inside def main(): with if __name__ == "__main__": main()get_func(), decompile(), etc. can return Noneprint() for output: Use print() in IDAPython, not ida_kernwin.msg()ida_funcs.get_func(ea), not bare get_func(ea)Canonical style example:
"""
Short summary of what the script does.
Longer description of the workflow: what it takes as input,
what it produces, and any prerequisites.
Usage: Run in IDA Pro via File -> Script file...
"""
import ida_funcs
import ida_hexrays
import ida_kernwin
def main():
ea = ida_kernwin.ask_addr(0, "Enter function address:")
if ea is None:
return
pfn = ida_funcs.get_func(ea)
if pfn is None:
print("No function found at 0x%X" % ea)
return
print("Function: 0x%X - 0x%X" % (pfn.start_ea, pfn.end_ea))
cf = ida_hexrays.decompile(pfn.start_ea)
if cf is None:
print("Decompilation failed at 0x%X" % pfn.start_ea)
return
print(str(cf))
if __name__ == "__main__":
main()
After writing the script, briefly explain:
User: "write an IDAPython script that lists all functions with their sizes"
get_workflows("enumerate all functions") → reveals idautils.Functions() + ida_funcs.get_func()get_api_doc("get_func") → confirms func_t has .start_ea and .end_eaidautils.Functions() iterator, ida_funcs.get_func() for each, size = end_ea - start_eadevelopment
Look up IDA SDK API documentation, related APIs, or task workflows
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------