mrphrazer/ghidra-headless-mcp
Headless Ghidra MCP server — giving AI agents deep reverse-engineering capabilities.
- Repository: https://github.com/mrphrazer/ghidra-headless-mcp
- Commit:
307b461cdbbedfbafb3771333f21875b745f940e - Generated: 2026-11-13T23:57:06+00:00
- Scorer 0.1.0, scoring prov-4+qual-2+sec-2, report schema v2
Scores
| Pillar | Score | Signal | Confidence | Coverage |
|---|---|---|---|---|
| AI provenance (estimated AI-generated share) | 0 | possible | 43% | 100% |
| Code quality | 65 | weak | 90% | 100% |
| Security | 78 | adequate | 85% | 100% |
AI provenance
Weak signals consistent with AI-assisted development.
- Explicitly attributed share (lower bound): 0.0%
- Unattributed share in AI-consistent velocity bursts: 9.9%
- Estimated AI-generated share: 0.0%
| Month | Lines added | Attributed to AI |
|---|---|---|
| 2026-03 | 18,062 | 0% |
| 2026-05 | 68 | 0% |
| 2026-06 | 2,082 | 0% |
| 2026-07 | 91 | 0% |
| 2026-08 | 806 | 0% |
Evidence
- 2,082 lines of first-party code in ~4.0h (520 lines/hour, 1 commit session) (10a40eb99bdf)
AI provenance describes how code was produced; it is not a quality judgment. Unless attribution is explicit, these are signals consistent with AI generation, not proof. Squash/rebase workflows, imported code, and rewritten history reduce accuracy.
Code quality
Code quality is weak: test-to-source ratio 0.26, CI runs tests; 29% of function code in complex or long functions; 10% duplicated lines. Weakest area: type safety.
| Area | Score |
|---|---|
| Complexity (lizard) | 42 |
| Duplication | 56 |
| Code smells (Opengrep) | 73 |
| Tests and CI | 88 |
| Documentation | 85 |
| Type safety | 0 |
| Process (Scorecard review/maintenance) | n/a |
- Functions: 702; mean complexity 4.0, 90th percentile 7; 20 complex and 16 long functions
- Duplicated lines: 9.5% of 13,622 compared
- Tests: 4,251 test lines for 16,599 source lines (ratio 0.26); CI test commands: pytest; 75% of recent source commits also change tests
- Docs missing or thin: contributing
Most complex functions:
- _dispatch_reference_category in ghidra_headless_mcp/fake_ghidra.py: complexity 69, 200 lines
- _dispatch_layout_category in ghidra_headless_mcp/fake_ghidra.py: complexity 68, 219 lines
- _mutate_arguments in ghidra_headless_mcp/fuzzer.py: complexity 68, 166 lines
- _dispatch_listing_category in ghidra_headless_mcp/fake_ghidra.py: complexity 54, 191 lines
- _dispatch_graph_category in ghidra_headless_mcp/fake_ghidra.py: complexity 53, 138 lines
Security
Security posture is adequate: 1 high-severity SAST findings; 2 high-severity workflow issues. Weakest area: posture.
| Area | Score |
|---|---|
| Secrets (gitleaks, tree + history) | 100 |
| Static analysis (Opengrep) | 96 |
| Vulnerable dependencies (OSV) | n/a |
| CI workflows (zizmor) | 67 |
| Posture (policy, updates, signing, lockfiles) | 0 |
| OpenSSF Scorecard | n/a |
- Posture checks passed: lockfiles; missing: security policy, dependency updates, signed commits
Top findings
| Severity | Finding | Location |
|---|---|---|
| high | opengrep/python.lang.security.audit.dangerous-subprocess-use-audit: Detected subprocess function 'Popen' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low] |
ghidra_headless_mcp/ghidra_cli.py:839 |
| high | zizmor/unpinned-uses: unpinned action reference [confidence high] |
.github/workflows/ci.yml:17 |
| high | zizmor/unpinned-uses: unpinned action reference [confidence high] |
.github/workflows/ci.yml:20 |
| medium | opengrep/python.lang.security.audit.exec-detected: Detected the use of exec(). exec() can be dangerous if used to evaluate dynamic content. If this content can be input from outside the program, this may be a code injection vulnerability. Ensure evaluated content is not definable by external sources. [confidence low] |
ghidra_headless_mcp/backend.py:3145 |
| medium | opengrep/python.lang.security.audit.eval-detected: Detected the use of eval(). eval() can be dangerous if used to evaluate dynamic content. If this content can be input from outside the program, this may be a code injection vulnerability. Ensure evaluated content is not definable by external sources. [confidence low] |
ghidra_headless_mcp/backend.py:3148 |
| medium | opengrep/python.lang.security.audit.exec-detected: Detected the use of exec(). exec() can be dangerous if used to evaluate dynamic content. If this content can be input from outside the program, this may be a code injection vulnerability. Ensure evaluated content is not definable by external sources. [confidence low] |
ghidra_headless_mcp/fake_ghidra.py:1193 |
| medium | opengrep/python.lang.security.audit.eval-detected: Detected the use of eval(). eval() can be dangerous if used to evaluate dynamic content. If this content can be input from outside the program, this may be a code injection vulnerability. Ensure evaluated content is not definable by external sources. [confidence low] |
ghidra_headless_mcp/fake_ghidra.py:1196 |
| low | zizmor/artipacked: credential persistence through GitHub Actions artifacts [confidence low] |
.github/workflows/ci.yml:16 |
Static signals only: the scorer never runs the project's code. Secret findings are pattern matches that were not verified, and secret values are never stored.
Repository profile
- Source lines: 16,599; test lines: 4,251
| Language | Lines |
|---|---|
| Python | 20,840 |
| C | 10 |