Skip to main content

vulkro mcp serve

Runs Vulkro as a Model Context Protocol server, so an AI coding agent can scan your code, read the proof behind a finding and check a fix before applying it.

vulkro mcp serve # stdio (default)
vulkro mcp serve --port 9100 # SSE on http://127.0.0.1:9100/sse

Set up in Claude Code, Cursor and Codex​

Claude Code: register the server once.

claude mcp add vulkro -- vulkro mcp serve

Cursor: add this to ~/.cursor/mcp.json, then restart Cursor.

{
"mcpServers": {
"vulkro": { "command": "vulkro", "args": ["mcp", "serve"] }
}
}

Codex uses the Vulkro skill instead of the server. The installer appends instructions to ~/.codex/AGENTS.md, and Codex runs the vulkro CLI directly:

curl -fsSL https://dist.vulkro.com/skill-install.sh | bash -s -- --agent codex

The same installer takes --agent claude-code or --agent cursor (see Claude Code skill).

VS Code agent mode: the VS Code extension registers the server for you.

Other MCP hosts​

Claude Desktop, Windsurf and Continue use the same mcpServers JSON as Cursor, in their own config file:

HostConfig file
Claude Desktop~/Library/Application Support/Claude/claude_desktop_config.json (macOS), ~/.config/Claude/claude_desktop_config.json (Linux), %APPDATA%\Claude\claude_desktop_config.json (Windows)
Windsurf~/.windsurf/mcp.json (older versions: ~/.codeium/windsurf/mcp_config.json)
Continue~/.continue/mcp.json
VS Code MCP client~/.vscode/mcp_settings.json

Restart the host after editing.

Tools exposed​

Every tool is deterministic, calls no model and never writes to your repository.

ToolWhat it does
scan_project({path, format?})Full scan. Returns findings and a scan_id. Agents should pass format: "compact".
scan_file({path})Findings for one file.
scan_diff({path, base_ref?})Findings on the lines a git diff added or changed (default base HEAD~1).
get_findings({scan_id, severity?, finding_ids?})Re-filter a prior scan without rescanning.
prove({finding_id or file+line, scan_id or path})The hop-by-hop proof for one finding. An empty chain means unproven, never safe.
explain({rule_id})Markdown explanation of a rule.
list_rules()The rule catalogue.
suggest_fixes({scan_id, finding_id?, verify?})Fix patches, each re-scanned on a temporary copy: fixed, not-fixed or regressed.
verify_fix({diff, scan_id or path, finding_id?})Apply your diff to a temporary copy, re-scan, return the same verdict.
verify_sarif({sarif, path})Mark another scanner's SARIF results proven, not-provable or not-examined.
inspect_repo({path})Review a just-cloned repo for malicious-code patterns. Never a "safe" verdict.
read_code({path, target})Read FILE, FILE:NAME or FILE:START-END without reading a whole file.
check_change({path, base?, fast?})After an edit: broken call sites, removed names still used, tests to run, findings on changed lines.
assess_change({path, symbol?, base?})Blast radius before an edit, or dependents, tests and new findings after one.
code_graph({path, mode?, ...})Scan-free code graph: file outline, usages of a name, one function's body, callers.
from_trace({path, trace})Map a stack trace onto symbols and findings.
evidence_graph({path})The evidence-graph/1.0 document for a project.
aggregate({graphs})Link evidence graphs across repositories.

Without an active trial or Pro, each tool call fails with JSON-RPC error -32001 and reason: "license_required". The server keeps running.

The server also exposes the local AI memory under .vulkro/ai/ as read-only resources (vulkro-ai-memory:///<id>).

AI-usable evidence-graph workflow​

  1. Call evidence_graph({path}) once per repository.
  2. Pass the documents to aggregate({graphs}).
  3. Read the returned cross-repo links, each with the callee's auth posture.

Vulkro supplies the evidence; the AI coding agent does the reasoning.

Flags​

FlagDescription
--port <PORT>Use SSE on 127.0.0.1:<PORT> (/sse and /messages) instead of stdio.
--offlineBlock every outbound network call.
VariableEffect
VULKRO_MCP_LOG=1Trace lines on stderr.
VULKRO_OFFLINE=1Same as --offline. Other VULKRO_* scan variables also apply.

Exit codes​

0 clean shutdown. 1 a refused tool call the caller treated as fatal. 2 bind failure, IO error or bad argument.

See also: vulkro mcp-audit, vulkro-sf mcp serve.