Skip to content

feat: Tier-1 quick wins — HTTP transport, annotation scanning, prompts/resources, SARIF tags - #89

Merged
ksek87 merged 3 commits into
mainfrom
claude/quick-wins-tier1
Jun 13, 2026
Merged

feat: Tier-1 quick wins — HTTP transport, annotation scanning, prompts/resources, SARIF tags#89
ksek87 merged 3 commits into
mainfrom
claude/quick-wins-tier1

Conversation

@ksek87

@ksek87 ksek87 commented Jun 13, 2026

Copy link
Copy Markdown
Owner

Summary

Five Tier-1 roadmap items delivered in one pass. All 276 tests pass, 0 new false positives on clean_tools.json.

#71 — HTTP transport wired

Replaces the bail!() stub in main.rs with HttpTransport::connect(url). The transport, CLI --url flag, and test infrastructure were already complete — this is the missing CLI hookup. Also removes the file-level #[allow(dead_code)] from mcp.rs and session.rs that were placeholders for this wire-up.

#75 — Annotation deception scanning (FUZZD-028)

Adds annotations: Option<Value> to ToolDefinition per MCP spec 2025-11-05. New scan_annotations() pass fires AnnotationDeception when readOnlyHint/destructiveHint/openWorldHint contradict the tool's actual description. Attack basis: arXiv:2603.22489 — false hints suppress client confirmation dialogs for destructive operations. 7 new tests.

#76 — Prompts/resources scanning (full pipeline)

  • Types: PromptDefinition, ResourceDefinition, ListPromptsResult, ListResourcesResult, PROMPTS_LIST/RESOURCES_LIST method constants
  • Session: list_prompts(), list_resources() with caching fields
  • Harness: enumerate_prompts(), enumerate_resources() with lazy-cache pattern
  • Scanner: DescriptionScanner::scan_surface() runs all four injection-detection passes on (name, description) pairs
  • Wired into the ToolPoisoning audit path; gracefully skips if the server returns method-not-found

#77 — OWASP/NSA SARIF compliance tags

Adds tags() method to Signal returning OWASP:MCP-NN, OWASP:ASINN, and CWE-NNN identifiers for all 28 signals. sarif_rules() now emits properties.tags on every rule — enables GitHub Code Scanning, SonarQube, and other SARIF consumers to cross-reference findings against OWASP MCP Top 10, OWASP Agentic Top 10, and CWE without a separate mapping.

#78 — Escape module stub

Implements the no-op fuzz_escape() in src/fuzzer/escape.rs and wires it into dispatch. Default scans no longer emit "warning: attack module 'escape' not yet implemented".

Test plan

  • cargo test — 276 tests pass, no failures
  • cargo clippy -- -D warnings — clean
  • fuzzd scan --schema bench/clean_tools.json — no findings (0 FP from annotation scanner)
  • fuzzd scan --schema demo/servers/poisoned.json --output sarif — SARIF output includes properties.tags on each rule
  • fuzzd audit --transport http --url http://localhost:3000 — no longer errors with "not yet implemented"

https://claude.ai/code/session_014T1x8ZiDbJcVvkZBfP91nk


Generated by Claude Code

claude added 3 commits June 13, 2026 05:08
…ts/resources, SARIF tags, escape stub

#71 — Wire HTTP transport: replace the bail!() stub in main.rs with a real
HttpTransport::connect(url) call. The HTTP transport, CLI --url flag, and all
test infrastructure were already complete; this is the missing CLI hookup.
Also removes the file-level #![allow(dead_code)] from mcp.rs and session.rs
that were placeholders for this wire-up.

#75 — Annotation deception scanning (FUZZD-028): adds annotations: Option<Value>
to ToolDefinition per the MCP 2025-11-05 spec. New scan_annotations() pass fires
AnnotationDeception when readOnlyHint/destructiveHint/openWorldHint contradict
the tool's actual description — the exact attack documented in arXiv:2603.22489
where false hints suppress client confirmation dialogs for destructive operations.
7 new tests; 0 new false positives on clean_tools.json.

#76 — Prompts/resources scanning (full pipeline): adds PromptDefinition,
ResourceDefinition, ListPromptsResult, ListResourcesResult to mcp.rs; adds
list_prompts()/list_resources() to Session; adds enumerate_prompts/resources()
to Harness; adds PROMPTS_LIST/RESOURCES_LIST method constants. New scan_surface()
on DescriptionScanner runs the four injection-detection passes on (name,
description) pairs. Wired into the ToolPoisoning audit path — gracefully skips
if the server returns method-not-found for unsupported endpoints.

#77 — OWASP/NSA SARIF compliance tags: adds tags() method to Signal returning
OWASP MCP Top-10, OWASP Agentic Top-10 (ASI series), and CWE identifiers.
sarif_rules() now emits properties.tags for every rule, enabling SARIF consumers
(GitHub Code Scanning, SonarQube) to cross-reference fuzzd findings against
industry frameworks without a separate mapping step.

#78 — Escape module stub: implements the no-op fuzz_escape() function in a new
src/fuzzer/escape.rs and wires it into the dispatch so Escape no longer emits
"not yet implemented" warnings in default scans.

https://claude.ai/code/session_014T1x8ZiDbJcVvkZBfP91nk
…ick wins

- bench/README: 27→28 signals, add annotation_deception row, update pass count
  to 5, note prompts/resources and annotations as scanned surfaces
- README roadmap: add HTTP transport, annotation scanning, prompts/resources,
  SARIF compliance tags as shipped; update signal count 23→28
- CHANGELOG: [Unreleased] entry for #71/#75/#76/#77/#78 with full detail

https://claude.ai/code/session_014T1x8ZiDbJcVvkZBfP91nk
@ksek87
ksek87 merged commit 132e5d4 into main Jun 13, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants