Hopper Debugger
Hopper debugging: macOS/iOS binaries, ObjC/Swift symbols, dyld, LLDB.
Install
npx skills add steipete/agent-scripts --skill hopper-debugger -g -a claude-code -y- Repository
- steipete/agent-scripts7.4k
- Category
- Testing
- Updated
- 5d ago
- License
- MIT
- Context cost
- Mediumabout 1,618 tokens
- Runs scripts
- No, instructions only
What it does
Hopper debugging: macOS/iOS binaries, ObjC/Swift symbols, dyld, LLDB.
Hopper Debugger
Use Hopper through mcporter as a queryable disassembler, then combine the result with local source, LLDB, logs, and focused repros.
Setup (one time)
Hopper 6.0+ ships its own MCP server. Do not install a third-party one.
mcporter config add hopper --scope home \
--command "/Applications/Hopper Disassembler.app/Contents/MacOS/HopperMCPServer" \
--description "Hopper Disassembler built-in MCP server (stdio)"
--scope home is required. The default scope is project, which writes config/mcporter.json into whatever repo you are standing in (untracked repo dirt, lost with the worktree).
Verify:
MCPORTER_LIST_TIMEOUT=25000 timeout 40 mcporter list hopper --brief
Call convention, the one that bites
Always pass arguments with --args. Never --params. mcporter accepts an unknown --params flag silently, drops the payload, and the call arrives with no arguments. Hopper then answers Document not found., which reads like a licensing or state problem and is not.
# WRONG, arguments silently dropped, fails with "Document not found."
mcporter call hopper.list_segments --params '{"document":"AppKit"}'
# RIGHT
mcporter call hopper.list_segments --args '{"document":"AppKit"}'
Related: the server does not fall back to the current document. A call with no document argument fails even when current_document returns a valid name. Pass document on every document-scoped call.
Document names come from list_documents and carry no .hop extension (window title AppKit.hop → document name AppKit).
If a call still fails, drive the server directly over stdio to see the raw JSON-RPC, this bypasses mcporter entirely and isolates who is at fault:


