About harness-mcp-scan
harness-mcp-scan is a static-analysis skill for reviewing declared MCP servers and tools for policy, permission, and dependency issues. It is suited to repository maintainers and CI pipelines; it does not execute tools and can produce JSON or Markdown output.
Key features
- 01Enumerates declared MCP servers and tools
- 02Flags policy, permission, and dependency issues
- 03Fails at a configurable severity threshold
- 04Outputs JSON or Markdown
- 05Degrades gracefully when harness is unavailable
Use cases
- 01Check MCP configurations in CI
- 02Review scan findings as JSON artifacts
- 03Run scans when harness is locally available
MCP support
Scans declared MCP servers and tools for static findings; it does not call or execute their tools.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ ruvnet/ ruflo --skill harness-mcp-scanAfter installing, type/harness-mcp-scanin Claude Code to confirm it loaded.
Details
From the project READMECalls harness mcp-scan to enumerate every declared MCP server + tool
and flag policy / permission / dependency issues. Never executes any
tool; pure static analysis.
Algorithm
Implementation: scripts/mcp-scan.mjs.
- Invoke the pinned
harnessbinary (metaharness@~0.4.1, resolved from a local install or the one-time~/.ruflo/metaharness-cache-<pin>cache — never@latest):harness mcp-scan <path> --json. - Parse
findings[]with{ severity, id, server, tool, message }. --fail-on <severity>: exit 1 when any finding is at or above that level. Defaulthigh.- Output JSON (default) or markdown table.
Severity rank
| Severity | Rank |
|---|---|
| low | 1 |
| medium | 2 |
| high | 3 |
--fail-on high (default) only fails on HIGH; --fail-on medium also
fails on MEDIUM; --fail-on low fails on any finding.
CI integration
- name: MCP static scan
run: node plugins/ruflo-metaharness/scripts/mcp-scan.mjs --fail-on high
The exit code is the only thing CI watches; the JSON output goes to artifacts for human review.
Graceful degradation
When harness binary is unavailable (no network, blocked registry),
emits structured { degraded: true, reason: 'metaharness-not-available' }
and exits 0. Ruflo continues — ADR-150 architectural constraint.