Mcp Snapshot Filter — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Snapshot Filter (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
MCP proxy that sits between Claude Code and chrome-devtools-mcp, intercepting content-heavy responses and applying smart filtering to reduce token usage by 40-60%.
Claude Code <--stdio--> mcp-snapshot-filter <--stdio--> chrome-devtools-mcpBrowser MCP tools (especially take_snapshot) return massive accessibility trees that fill up the context window fast. A single snapshot of a data-heavy page can be 30-40KB of text. This proxy transparently filters that down without breaking any tool interactions.
Real-world results:
| Page | Original | Filtered | Reduction |
|---|---|---|---|
| GitHub repo page | 29.5KB | 22.8KB | 23% |
| Portal with 36-row data table | 38.5KB | 17.3KB | 55% |
# Clone and build
git clone https://github.com/Akarda/mcp-snapshot-filter.git
cd mcp-snapshot-filter
npm install
npm run buildAdd to ~/.claude.json (replace any existing chrome-devtools entry):
{
"mcpServers": {
"chrome-devtools": {
"type": "stdio",
"command": "node",
"args": [
"/path/to/mcp-snapshot-filter/dist/index.js",
"--filter-level=moderate",
"--",
"npx", "-y", "chrome-devtools-mcp@latest"
]
}
}
}Restart Claude Code to pick up the new config.
| Setting | Light | Moderate (default) | Aggressive |
|---|---|---|---|
| maxNodes | 1000 | 500 | 300 |
| maxDepth | 20 | 15 | 10 |
| maxSimilarSiblings | 5 | 3 | 2 |
| Strip decorative nodes | yes | yes | yes |
| Collapse navigation | no | yes | yes |
| Focus main content only | no | no | yes |
| Est. reduction | 20-30% | 40-60% | 60-80% |
Use --filter-level=off to disable all filtering and pass through raw responses.
role=none/presentation/separator, empty text nodes, unnamed generic wrappers are stripped (children promoted up)StaticText nodes in a table), keeps first N and shows ... [47 more StaticText elements collapsed]navigation/banner/contentinfo/menu subtrees reduced to a single summary: [navigation: 21 items, 9 links]role=main exists, sibling subtrees are summarizedStrips image, font, stylesheet (and media in aggressive) entries from list_network_requests output. All xhr, fetch, document requests remain visible. get_network_request is never filtered — individual request details always pass through in full.
Strips debug, verbose (and dir, trace at higher levels) from list_console_messages. Error and warning messages are always preserved.
Large responses from evaluate_script and take_memory_snapshot are truncated:
get_network_request, get_console_message are unfilteredemulate, performance_*, screencast_*, etc. pass through as-isAll UIDs of visible nodes are preserved in filtered output. After taking a filtered snapshot, you can click, fill, or hover any UID shown in the output — the proxy forwards these calls to the upstream server unchanged.
Each filtered response includes a stats line:
[cdp-filter-proxy: 20.7KB saved (55%) | session: 22.4KB saved across 2 calls (52%)]The proxy uses the MCP SDK's low-level Server class (not McpServer) to avoid JSON Schema to Zod conversion issues when proxying tool definitions. On startup it:
chrome-devtools-mcp as a subprocess via StdioClientTransportlistTools()setRequestHandler(ListToolsRequestSchema) and setRequestHandler(CallToolRequestSchema)## Latest page snapshot, etc.), applies the appropriate filter to each section, and returns the filtered result--slim modechrome-devtools-mcp supports a --slim flag that reduces the server to just 3 tools (navigate, evaluate, screenshot) for maximum token savings (~368 tokens). If the proxy detects --slim in the upstream args, it will warn that filtering has no effect — slim mode responses are already minimal. The proxy is designed for full mode where it preserves all tools while reducing response sizes by 40-60%.
npm run build # compile TypeScript to dist/After rebuilding, restart Claude Code to pick up changes (MCP servers are long-lived processes).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.