Same SDK calls as qa/mcp, different interface. Where qa/mcp exposes the agent as an MCP server, this example exposes it as a shell command and uses a Claude Code skill to teach Claude when to invoke it.
uv run qa-cli review --url https://example.com --instruction "look for broken links"
uv run qa-cli visual --url https://example.com --question "what color is the heading?"reviewprints aReviewResultJSON on stdout (verdict, summary, findings, steps_taken).visualprints a short free-text answer.- Progress logs go to stderr.
The skill lives at skills/hai-qa-via-cli/SKILL.md. Claude Code picks it up automatically and triggers when the user asks to QA a URL or get a quick visual answer about a page.
"QA https://example.com for accessibility issues."
Claude invokes the CLI via Bash, parses stdout, and surfaces findings in chat.
| Aspect | qa/mcp (MCP) |
qa/cli (CLI + skill) |
|---|---|---|
| Wiring | .mcp.json registers an MCP server |
skills/hai-qa-via-cli/SKILL.md |
| Invocation in Claude | Native mcp__... tool call |
Bash invocation of qa-cli |
| Result handling | Structured tool return | Claude parses stdout JSON |
| Runnable outside Claude | Need an MCP client | Just run the CLI |
| Server process | Yes (FastMCP, stdio) | No — one-shot subprocess |
Same agent definition, same prompt, same answer_format. Choose the surface that fits — MCP when you want a long-lived tool surface in Claude Code; CLI when you want a thing humans and scripts can run too.