Thanks for wanting to contribute. This is a short guide.
git clone https://github.com/mitsuakki/reverse-mcp.git
cd reverse-mcp
docker compose build
docker compose up -dGateway listens on localhost:3100. Drop test binaries in ./workspace.
- Open an issue first for anything bigger than a typo fix. Saves us both time.
- Branch from
main. Use a descriptive branch name:fix/gateway-timeout,feat/python-tool,docs/contributing. - Keep PRs focused. One thing per PR. Refactors mixed with features get held up.
- Write what you changed and why. The PR template covers the rest.
docker compose build # must succeed
docker compose up -d # must start without errors
curl http://localhost:3100/mcp # gateway responding?If you change the Dockerfile, also verify:
docker compose down -v && docker compose build --no-cache && docker compose up -d| What | Where |
|---|---|
| New MCP tool (ghidra bridge) | scripts/mcp/bridge_mcp_ghidra.py |
| New MCP tool (shell) | scripts/mcp/shell-mcp.py |
| Gateway logic | scripts/mcp/gateway.py |
| Docker packages / build | docker/Dockerfile |
| Agent definitions | .claude/agents/*.md |
| CI | .github/workflows/ |
| Docs | README.md, CLAUDE.md, or new .md in root |
Create .claude/agents/<name>.md:
---
name: agent-name
description: One-line summary
model: haiku | sonnet | opus
tools: [Read, Bash, mcp__toolbox__ghidra__*, mcp__toolbox__r2__*]
---Then write the agent instructions below the frontmatter. Keep agents
single-purpose — one agent per .md.
-
Write the server (Python script that speaks MCP over stdio). Use
scripts/mcp/shell-mcp.pyas a minimal reference —Server+list_tools+call_tool+stdio_server. For HTTP servers, the gateway only speaks stdio to children; run your server's HTTP transport separately if needed. -
Wire it in
gateway.py— add aChildDefentry at line ~90:ChildDef( namespace="mytool", command="python3", args=["/opt/tools/scripts/mcp/my-tool.py"], timeout_connect=10.0, ),
-
Install any dependencies in the Dockerfile. Add a
RUN pip3 installline in thepythonstage, orapt-get installinbase. If your tool needs a build step, add a new stage (seer2-ghidraorfuzzingfor patterns) andCOPY --fromin thefinalstage. -
Pick a namespace prefix that won't collide (
r2,ghidra,shell,angrare taken). -
Update the server catalog in
README.mdand the architecture diagram in bothREADME.mdandCLAUDE.md. -
If your tools change at runtime (appear/disappear after a state change), set
dynamic=Trueon theChildDefand add trigger tool names to_REFRESH_TRIGGERSingateway.py.
- Python: follow the surrounding code.
gateway.pyandbridge_mcp_ghidra.pyare the reference. - Shell scripts:
set -euo pipefail,shellcheckclean. - Markdown: one sentence per line. Fenced code blocks with language tags.
The labeler bot auto-tags PRs by changed paths (labeler.yml). Core labels:
bug,enhancement— issue typedocker,gateway,ghidra,shell-mcp,r2mcp,angr,agents,docs,ci— component touchedtriage— auto-applied to new issues; removed on first human reviewbreaking-change— manual; marks PRs that need migration
MIT. By contributing, you agree your code goes under the same license.