Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
a897bc4
feat(skills): add NestJS security testing module
ms6rb Mar 8, 2026
19e7511
feat(mcp): add strix-mcp server with orchestration enhancements
ms6rb Mar 8, 2026
50d01da
fix(skills): address review feedback on nestjs module
ms6rb Mar 8, 2026
77acabb
Merge branch 'feat/nestjs-skill' into feat/mcp-orchestration
ms6rb Mar 8, 2026
84067c2
feat(mcp): expand module coverage, probe paths, and report fields
ms6rb Mar 8, 2026
4617024
feat(mcp): framework-specific agents, OpenAPI auto-import, OWASP fixes
ms6rb Mar 8, 2026
fbf3d70
feat(mcp): add category filter to list_modules tool
ms6rb Mar 8, 2026
14cdff1
feat(mcp): task-based agent naming in register_agent and get_scan_status
ms6rb Mar 8, 2026
4d8fbaf
docs(mcp): add severity auto-suggestion guide to methodology
ms6rb Mar 8, 2026
2e17b75
feat(mcp): concurrent probing in fingerprint_web_target with asyncio.…
ms6rb Mar 8, 2026
102aad7
docs(mcp): add concrete Phase 2 chaining patterns to methodology
ms6rb Mar 8, 2026
58cd7f0
feat(mcp): add signal_strength to agent templates and confidence to p…
ms6rb Mar 8, 2026
9fbdb3f
feat(mcp): scan persistence — write findings and reports to disk
ms6rb Mar 8, 2026
abdcf8b
Merge main (upstream sync: NestJS PR #348 squash-merged, pypdf bump)
ms6rb Mar 8, 2026
821aef6
docs(mcp): Phase 2 chaining design — auto-detection and dispatch_agen…
ms6rb Mar 8, 2026
8f85019
docs(mcp): Phase 2 chaining implementation plan
ms6rb Mar 8, 2026
33503b4
feat(mcp): add chaining rules and detect_chains logic
ms6rb Mar 8, 2026
5d7f567
feat(mcp): add agent prompt templates and build_agent_prompt
ms6rb Mar 8, 2026
c71ae72
feat(mcp): replace persistence with upstream strix_runs/ format
ms6rb Mar 8, 2026
e59db6f
feat(mcp): add dispatch_agent and suggest_chains tools
ms6rb Mar 8, 2026
7dafc68
feat(mcp): wire chain detection into create_vulnerability_report
ms6rb Mar 8, 2026
fbdeee7
feat(mcp): add pending_chains count to get_scan_status
ms6rb Mar 8, 2026
554080a
docs(mcp): update methodology for dispatch_agent, chain detection, an…
ms6rb Mar 8, 2026
aa9ccef
chore: remove implementation plan docs
ms6rb Mar 8, 2026
7ffadb9
docs: add design for MCP UX improvements
ms6rb Mar 8, 2026
a0d634e
docs: add MCP UX implementation plan
ms6rb Mar 8, 2026
e5b27ac
docs: update MCP UX plan with gap fixes
ms6rb Mar 8, 2026
c4e260c
docs: fix coverage map gaps in MCP UX plan
ms6rb Mar 8, 2026
a000d0d
docs: fix remaining plan gaps
ms6rb Mar 8, 2026
390272a
refactor(mcp): remove register_agent, improve all tool descriptions
ms6rb Mar 8, 2026
58f3da2
docs(mcp): rewrite README, update server resources, add strix-agent dep
ms6rb Mar 8, 2026
6fe3b7d
docs(mcp): add docker pull command, remove size references
ms6rb Mar 8, 2026
9556c64
fix(mcp): address code quality issues from PR review
ms6rb Mar 8, 2026
6fa557d
chore: remove plan docs from PR
ms6rb Mar 8, 2026
9fd668b
chore: remove plan doc from strix-mcp
ms6rb Mar 8, 2026
0a46526
fix(mcp): address second round of PR review issues
ms6rb Mar 8, 2026
276c4a8
fix(mcp): address third round of PR review issues
ms6rb Mar 8, 2026
596fec5
docs(mcp): update tool docstrings to reflect recent code changes
ms6rb Mar 8, 2026
f743b20
fix(mcp): handle non-JSON proxy responses and fix "ws" false positive
ms6rb Mar 8, 2026
e46fe69
fix(mcp): word-boundary regex for "next" dep and sanitise scan_id path
ms6rb Mar 8, 2026
f5a04f0
fix(mcp): chain detection same-report bug and express regex
ms6rb Mar 8, 2026
a7506ab
fix(mcp): proxy_tool status check and remaining fuzzy dep regex
ms6rb Mar 8, 2026
46131d2
docs: add MCP Phase 3 design — tests, tools, and E2E verification
ms6rb Mar 9, 2026
d58a4d1
docs: add MCP Phase 3 implementation plan
ms6rb Mar 9, 2026
22cd8df
feat(mcp): expand str_replace_editor to support all 5 commands
ms6rb Mar 9, 2026
dae46a9
feat(mcp): add notes tools (create, list, update, delete) — MCP-side …
ms6rb Mar 9, 2026
b2b16eb
docs(mcp): add native agent capabilities section to methodology
ms6rb Mar 9, 2026
b240c5f
test: add vulnerable Flask app and docker-compose for integration tes…
ms6rb Mar 9, 2026
342144c
test(mcp): expand integration tests for all proxied tools
ms6rb Mar 9, 2026
1443c5c
docs(mcp): add E2E verification checklist for MCP clients
ms6rb Mar 9, 2026
8eb486e
fix(test): use port 5001 for vulnerable app (macOS AirPlay uses 5000)
ms6rb Mar 9, 2026
61cabd6
fix(mcp): address Greptile review — Flask regex, note ID length, asyn…
ms6rb Mar 9, 2026
01c1513
fix(mcp): revert redis detection to _has_dep() for requirements.txt c…
ms6rb Mar 9, 2026
ef461a0
fix(mcp): address Greptile review round 2
ms6rb Mar 9, 2026
c8b8e3b
fix(mcp): tighten scan_id validation, handle unknown module in resource
ms6rb Mar 9, 2026
0cbc64b
fix(mcp): reject scan_id with path separators to prevent silent overw…
ms6rb Mar 9, 2026
2f10feb
fix(mcp): detect @redis/client in fuzzy Node.js dep matching
ms6rb Mar 9, 2026
1919b8f
fix(mcp): handle malformed chain_context in dispatch_agent
ms6rb Mar 9, 2026
55b05a0
chore: remove implementation plan docs
ms6rb Mar 9, 2026
5d721f6
Merge branch 'main' into feat/mcp-orchestration
ms6rb Mar 14, 2026
6071821
docs(mcp): add upstream integration opportunities analysis
ms6rb Mar 14, 2026
3291a39
docs(mcp): add telemetry integration design
ms6rb Mar 14, 2026
1725533
docs(mcp): add telemetry integration implementation plan
ms6rb Mar 14, 2026
382a198
docs(mcp): fix plan issues found in review
ms6rb Mar 14, 2026
f2478ba
feat(mcp): add tracer logging to proxy_tool
ms6rb Mar 14, 2026
0486334
feat(mcp): wire Tracer into start_scan and end_scan lifecycle
ms6rb Mar 14, 2026
0a7f1e5
feat(mcp): migrate vulnerability reports to upstream Tracer
ms6rb Mar 14, 2026
922a492
feat(mcp): log agent creation in dispatch_agent
ms6rb Mar 14, 2026
437d0c6
test(mcp): update tests for tracer integration
ms6rb Mar 14, 2026
449602b
chore(mcp): add .gitignore for strix-mcp
ms6rb Mar 15, 2026
ef86448
fix(mcp): use consistent tracer accessor in end_scan and reorder tear…
ms6rb Mar 15, 2026
006b492
fix(mcp): add @redis/client to exact-path Redis detection
ms6rb Mar 15, 2026
8954cca
docs: add recon phase design spec
ms6rb Mar 17, 2026
85591ee
docs: fix spec issues from review
ms6rb Mar 17, 2026
7df24f2
docs: fix review round 2 issues in recon spec
ms6rb Mar 17, 2026
bf00895
docs: fix plan issues from review
ms6rb Mar 17, 2026
99d29a7
docs: fix plan issues from self-review
ms6rb Mar 17, 2026
dbfebc7
docs: fix tool placement in plan
ms6rb Mar 17, 2026
631db0c
feat(mcp): add 'recon' to valid note categories
ms6rb Mar 17, 2026
bc1878b
feat(mcp): add recon templates and phase field to generate_plan
ms6rb Mar 17, 2026
2854766
feat(mcp): add nuclei_scan tool with auto-report filing
ms6rb Mar 17, 2026
82dc0ee
feat(mcp): add download_sourcemaps tool with auto-extraction
ms6rb Mar 17, 2026
b7b839c
feat(mcp): add Phase 0 reconnaissance to methodology
ms6rb Mar 17, 2026
a4f2ea7
feat: add 6 recon knowledge modules
ms6rb Mar 17, 2026
f0da502
fix(mcp): make tracer failures visible in vulnerability reporting
ms6rb Mar 17, 2026
b122c33
fix(mcp): write merge directly to tracer.vulnerability_reports
ms6rb Mar 17, 2026
97243f6
fix(mcp): expose tracer status in start_scan response
ms6rb Mar 17, 2026
cd45939
fix(mcp): don't pass None values to sandbox in list_requests
ms6rb Mar 17, 2026
11be7e6
fix(mcp): improve diagnostics for download_sourcemaps and nuclei_scan
ms6rb Mar 17, 2026
a544c4e
Merge branch 'main' into feat/mcp-orchestration
ms6rb Mar 24, 2026
a198956
feat(mcp): upstream sync + 7 new recon tools + browser security skill
ms6rb Mar 24, 2026
d57fba8
refactor(mcp): extract module-level helpers to tools_helpers.py
ms6rb Mar 24, 2026
080acdc
refactor(mcp): extract analysis tools to tools_analysis.py
ms6rb Mar 24, 2026
528bb41
refactor(mcp): extract proxy tools to tools_proxy.py
ms6rb Mar 24, 2026
18ebc53
refactor(mcp): extract notes tools to tools_notes.py
ms6rb Mar 24, 2026
9e02bc1
refactor(mcp): extract recon tools to tools_recon.py
ms6rb Mar 24, 2026
208706f
refactor(mcp): split test files to match source module structure
ms6rb Mar 24, 2026
f1e8b1c
chore(mcp): clean up unused imports after refactoring
ms6rb Mar 24, 2026
1da5be5
fix(mcp): revert to sandbox image 0.1.12 — 0.1.13 has empty entrypoint
ms6rb Mar 24, 2026
e206b39
feat(skills): add 9 new attack skills — CSPT, smuggling, cache poison…
ms6rb Mar 25, 2026
a3c0398
feat(mcp): enhance tools and methodology for new attack skills
ms6rb Mar 25, 2026
465f537
feat(mcp): add test_request_smuggling and test_cache_poisoning tools
ms6rb Mar 25, 2026
bc40ff1
fix(mcp): address review feedback on smuggling/cache tools
ms6rb Mar 25, 2026
633d94f
feat(skills): add 4 skills from Neon engagement — oauth_audit, webhoo…
ms6rb Mar 25, 2026
a515c10
feat(mcp): add k8s_enumerate, ssrf_oracle tools + agent auth context …
ms6rb Mar 25, 2026
f239412
fix(mcp): address review — add tests, methodology refs for new tools
ms6rb Mar 25, 2026
0e4e260
fix(mcp): fix download_sourcemaps module scripts, k8s_enumerate outpu…
ms6rb Mar 25, 2026
86780fa
fix(mcp): fix nuclei_scan timeouts — smart template defaults, bypass …
ms6rb Mar 25, 2026
94e4e99
fix(mcp): k8s_enumerate even distribution + load_skill summary paragr…
ms6rb Mar 25, 2026
970cf82
fix(mcp): k8s_enumerate namespace affinity, ssrf_oracle https probes
ms6rb Mar 25, 2026
9920355
fix(mcp): fix view_request crash — don't pass None values to sandbox
ms6rb Mar 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,16 @@ strix --target api.your-app.com --instruction "Focus on business logic flaws and
strix --target api.your-app.com --instruction-file ./instruction.md
```

### MCP Server (AI Agent Integration)

Use Strix as an MCP server to integrate with AI coding agents like Claude Code, Cursor, and Windsurf:

```bash
pip install strix-mcp
```

See [`strix-mcp/README.md`](strix-mcp/README.md) for setup instructions and the full tool coverage map.

### Headless Mode

Run Strix programmatically without interactive UI using the `-n/--non-interactive` flag—perfect for servers and automated jobs. The CLI prints real-time vulnerability findings, and the final report before exiting. Exits with non-zero code when vulnerabilities are found.
Expand Down
1,083 changes: 1,083 additions & 0 deletions docs/superpowers/plans/2026-03-17-recon-phase.md

Large diffs are not rendered by default.

567 changes: 567 additions & 0 deletions docs/superpowers/specs/2026-03-17-recon-phase-design.md

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions strix-mcp/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.mcp.json
docs/
89 changes: 89 additions & 0 deletions strix-mcp/E2E_CHECKLIST.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# MCP E2E Verification Checklist

Manual verification steps for testing strix-mcp across MCP clients.

## Prerequisites

- [ ] Docker running
- [ ] Sandbox image pulled: `docker pull ghcr.io/usestrix/strix-sandbox:0.1.12`
- [ ] strix-mcp installed: `cd strix-mcp && pip install -e .`

## Claude Code

Config in `.mcp.json` or `~/.claude/mcp_servers.json`:
```json
{
"mcpServers": {
"strix": {
"command": "strix-mcp"
}
}
}
```

- [ ] Server starts without errors
- [ ] `start_scan` with web target launches sandbox
- [ ] `terminal_execute` runs commands (e.g. `whoami` returns `pentester`)
- [ ] `browser_action` with `launch` then `goto` returns screenshots
- [ ] `send_request` sends HTTP through proxy and returns response
- [ ] `list_requests` shows captured proxy traffic
- [ ] `str_replace_editor` with `create` creates files in sandbox
- [ ] `str_replace_editor` with `view` reads files from sandbox
- [ ] `str_replace_editor` with `str_replace` edits files in sandbox
- [ ] `create_note` creates a note and returns note_id
- [ ] `list_notes` shows created notes with category filtering
- [ ] `update_note` modifies note content
- [ ] `delete_note` removes a note
- [ ] `create_vulnerability_report` stores finding and returns report_id
- [ ] `list_vulnerability_reports` shows filed reports
- [ ] `get_finding` returns full markdown detail from disk
- [ ] `dispatch_agent` returns agent_id + ready-to-use prompt
- [ ] `suggest_chains` returns chain opportunities (after 2+ findings)
- [ ] `get_scan_status` shows elapsed time, agents, and severity counts
- [ ] `get_module` loads a security knowledge module (e.g. "sql_injection")
- [ ] `list_modules` returns module catalog with categories
- [ ] `end_scan` returns summary with OWASP grouping and severity counts
- [ ] `strix_runs/` directory created with `vulnerabilities/*.md`, `vulnerabilities.csv`, and `summary.md`

## Cursor

Config in `.cursor/mcp.json`:
```json
{
"mcpServers": {
"strix": {
"command": "strix-mcp"
}
}
}
```

- [ ] Server starts without errors
- [ ] `start_scan` launches sandbox
- [ ] Basic tool execution works (terminal, HTTP, files)
- [ ] `create_vulnerability_report` and `list_vulnerability_reports` work
- [ ] `end_scan` completes cleanly

## Windsurf

Config in `~/.codeium/windsurf/mcp_config.json`:
```json
{
"mcpServers": {
"strix": {
"command": "strix-mcp"
}
}
}
```

- [ ] Server starts without errors
- [ ] `start_scan` launches sandbox
- [ ] Basic tool execution works (terminal, HTTP, files)
- [ ] `end_scan` completes cleanly

## Post-Verification

- [ ] Run `docker ps` — no orphaned strix containers remain after `end_scan`
- [ ] Second scan starts cleanly after first ends
- [ ] `strix_runs/` contains expected files from the scan
179 changes: 179 additions & 0 deletions strix-mcp/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
# Strix MCP Server

MCP (Model Context Protocol) server that exposes Strix's Docker security sandbox to AI coding agents. Works with any MCP-compatible client — Claude Code, Cursor, Windsurf, Cline, and others.

## Prerequisites

- Docker (running)
- Python 3.12+

## Installation

```bash
pip install strix-mcp
```

Pull the Docker image before your first scan:

```bash
docker pull ghcr.io/usestrix/strix-sandbox:0.1.12
```

## Client Configuration

### Claude Code

Add to your project's `.mcp.json` or `~/.claude/mcp_servers.json`:

```json
{
"mcpServers": {
"strix": {
"command": "strix-mcp",
"args": []
}
}
}
```

### Cursor

Add to `.cursor/mcp.json`:

```json
{
"mcpServers": {
"strix": {
"command": "strix-mcp",
"args": []
}
}
}
```

### Windsurf

Add to `~/.codeium/windsurf/mcp_config.json`:

```json
{
"mcpServers": {
"strix": {
"command": "strix-mcp",
"args": []
}
}
}
```

### Other MCP Clients

Any client that supports MCP stdio transport can use strix-mcp. Point it at the `strix-mcp` command with no arguments.

## Quick Start

Ask your AI agent:

> "Start a security scan on ./my-app and test for OWASP Top 10 vulnerabilities"

The agent will boot a Kali Linux sandbox, copy your code, and begin testing.

## Workflow

1. `start_scan` — boot sandbox, detect tech stack, get recommended scan plan
2. `dispatch_agent` — for each testing area, register a subagent and get a ready-to-use prompt
3. Pass each prompt to your AI agent's sub-agent/tool system — agents test in parallel with isolated sessions
4. Agents file findings with `create_vulnerability_report` (auto-dedup, auto-chain detection)
5. `suggest_chains` — review chaining opportunities, dispatch follow-up agents
6. `end_scan` — tear down sandbox, get deduplicated OWASP-categorized summary

## Strix Feature Coverage

This MCP server exposes Strix's sandbox tools to external AI agents. Below is the coverage map against the full Strix tool suite.

### Proxied Tools

These tools are forwarded directly to the Strix sandbox container — same behavior as native Strix.

| Tool | Description | Parity |
|------|-------------|--------|
| `terminal_execute` | Execute commands in persistent Kali Linux terminal | Full |
| `send_request` | Send HTTP requests through Caido proxy | Full |
| `repeat_request` | Replay captured requests with modifications | Full |
| `list_requests` | Filter proxy traffic with HTTPQL | Full |
| `view_request` | Inspect request/response details | Full |
| `browser_action` | Control Playwright browser (returns screenshots) | Full |
| `python_action` | Run Python in persistent interpreter sessions | Full |
| `list_files` | List sandbox workspace files | Full |
| `search_files` | Search file contents by pattern | Full |
| `str_replace_editor` | Edit files in sandbox | Full |
| `scope_rules` | Manage proxy scope filtering | Full |
| `list_sitemap` | View discovered attack surface | Full |
| `view_sitemap_entry` | Inspect sitemap entry details | Full |

### MCP Orchestration Layer

Tools implemented by the MCP server for AI agent coordination — not proxied from the Strix sandbox.

| Tool | Description |
|------|-------------|
| `start_scan` | Boot sandbox, detect tech stack, generate scan plan |
| `end_scan` | Tear down sandbox, deduplicate findings, OWASP summary |
| `create_vulnerability_report` | File findings with auto-dedup, chain detection, and disk persistence (simplified interface vs native) |
| `dispatch_agent` | Register subagent and compose ready-to-use prompt |
| `get_scan_status` | Monitor scan progress and pending chains |
| `list_vulnerability_reports` | List filed reports (summaries, deduplication check) |
| `get_finding` | Read full finding details from disk |
| `get_module` | Load security knowledge module |
| `list_modules` | List available knowledge modules |
| `suggest_chains` | Review vulnerability chaining opportunities |
| `create_note` | Create structured notes during scans |
| `list_notes` | List and filter scan notes |
| `update_note` | Update existing notes |
| `delete_note` | Delete notes |

### Not Yet Supported

These Strix tools are not yet available through the MCP server.

| Tool | Category | Notes |
|------|----------|-------|
| `create_todo` / `list_todos` / `update_todo` / `mark_todo_done` / `mark_todo_pending` / `delete_todo` | Todos | Task tracking within scans |
| `finish_scan` | Completion | Native scan finalization with executive summary, methodology, and recommendations |
| `create_vulnerability_report` (native) | Reporting | Full CVSS XML breakdown, CWE/CVE, code locations, PoC scripts (MCP uses simplified interface) |
| `view_agent_graph` / `create_agent` / `send_message_to_agent` / `agent_finish` / `wait_for_message` | Agent Graph | Native multi-agent orchestration (MCP uses `dispatch_agent` instead) |

> **Note:** `think` and `web_search` are intentionally not proxied — agents should use their native reasoning and web search capabilities instead. See the methodology resource for details.

### Resources

| URI | Description |
|-----|-------------|
| `strix://methodology` | Penetration testing playbook and orchestration guide |
| `strix://modules` | List of available security knowledge modules |
| `strix://modules/{name}` | Specific module content (e.g. `strix://modules/sql_injection`) |

## Architecture

The MCP server acts as a bridge between AI agents and a Strix Docker sandbox:

```
AI Agent (Claude Code, Cursor, etc.)
↕ MCP (stdio)
strix-mcp server
↕ HTTP
Strix Docker Container (Kali Linux)
├── Caido proxy
├── Playwright browser
├── Terminal sessions
├── Python interpreter
└── Security tools (nuclei, sqlmap, ffuf, etc.)
```

All agents share one container but get isolated sessions (terminal, browser, Python) via `agent_id`.

## Known Limitations

- One scan at a time per MCP server instance
- Requires Docker image pull before first scan (see Installation)
- Agent graph tools not supported — MCP uses its own orchestration via `dispatch_agent`
85 changes: 85 additions & 0 deletions strix-mcp/docs/plans/2026-03-14-telemetry-integration-design.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# Telemetry Integration Design

> Integrate upstream `strix.telemetry.tracer.Tracer` into the MCP server as the single source of truth for findings, agent lifecycle, and tool execution events.

## Decision: Use Upstream Tracer Directly

The upstream strix project uses a global singleton pattern:
- Entrypoint creates `Tracer(run_name)` and calls `set_global_tracer()`
- All code accesses it via `get_global_tracer()`
- The Tracer stores findings, writes per-vuln markdown/CSV, emits JSONL events, and manages OTEL spans

The MCP will follow this pattern exactly. The MCP's `start_scan` is the equivalent of the CLI/TUI entrypoint.

## Tracer Lifecycle

**`start_scan`:**
- Create `Tracer(run_name=scan_id)`, call `set_global_tracer(tracer)`
- Call `tracer.set_scan_config({"targets": targets, ...})`
- Guard with try/except — if Tracer init fails, continue without telemetry

**`end_scan`:**
- Call `tracer.save_run_data(mark_complete=True)` — writes all output files
- Call `set_global_tracer(None)` to clear for next scan
- Clear `fired_chains` and `notes_storage` (MCP-only state)

## Vulnerability Reports Migration

Replace MCP's in-memory `vulnerability_reports` list with `tracer.vulnerability_reports`.

**`create_vulnerability_report`:**
- MCP keeps title-normalization dedup as pre-check via `tracer.get_existing_vulnerabilities()`
- New findings stored via `tracer.add_vulnerability_report()` — Tracer handles markdown output, JSONL events, posthog
- Merge logic (upgrade severity, append evidence) mutates `tracer.vulnerability_reports` entries directly
- Chain detection reads from `tracer.get_existing_vulnerabilities()`

**`list_vulnerability_reports`:** reads from `tracer.get_existing_vulnerabilities()`.

**`get_finding`:** reads from `tracer.get_run_dir() / "vulnerabilities" / f"{id}.md"`.

## Agent & Tool Event Logging

**`dispatch_agent`:** after `sandbox.register_agent()`, call `tracer.log_agent_creation(agent_id, name, task, parent_id)`.

**Proxy tool logging:** add tracer calls inside `SandboxManager.proxy_tool()` — one integration point covers all 20+ proxied tools:
- Before: `tracer.log_tool_execution_start(agent_id, tool_name, args)` → returns `execution_id`
- After: `tracer.update_tool_execution(execution_id, status, result)`

**`get_scan_status`:** enrich with `tracer.agents` and `tracer.get_real_tool_count()`.

## What Gets Removed

**Functions deleted from `tools.py`:**
- `_write_finding_md()` — Tracer's `save_run_data()` writes per-vuln markdown
- `_write_vuln_csv()` — Tracer writes `vulnerabilities.csv`
- `_write_summary_md()` — Tracer writes `penetration_test_report.md`
- `_get_run_dir()` — use `tracer.get_run_dir()` instead

**Closure variables removed:**
- `vulnerability_reports: list` → `tracer.vulnerability_reports`
- `scan_dir: Path | None` → `tracer.get_run_dir()`

**Closure variables kept:**
- `fired_chains: set[str]` — MCP-only
- `notes_storage: dict` — MCP-only

**Kept but modified:**
- `_normalize_title()`, `_find_duplicate()`, `_deduplicate_reports()` — MCP's title-based dedup
- `_categorize_owasp()`, `_OWASP_KEYWORDS` — used in `end_scan` summary
- `_normalize_severity()`, `_SEVERITY_ORDER` — dedup merge logic

## Error Handling

- Every tracer call guarded with `if tracer:` + try/except
- Tracer init failure in `start_scan` logs warning, scan continues without telemetry
- Proxy tool logging failures don't block tool execution
- Upstream `STRIX_TELEMETRY=0` disables JSONL/OTEL but Tracer still works as in-memory store

## No New Dependencies

`opentelemetry`, `scrubadub` already available transitively via `strix-agent` dependency.

## Testing

- Existing unit tests: mock `get_global_tracer()` returning `None` — behavior unchanged
- New tests: verify tracer integration (agent logging, tool logging, finding storage, file output)
Loading