rtk-mcp

rtk-mcp

MCP proxy that filters oversized tool responses, downscaling screenshots and pruning accessibility snapshots to reduce token usage in LLM interactions.

Category
访问服务器

README

rtk-mcp

MCP proxy that filters oversized tool responses. Companion to rtk — rtk handles CLI output; rtk-mcp handles MCP tool responses.

Wraps another MCP server (Playwright, custom, etc.), intercepts tool responses, and filters the ones that are known token sinks: browser_take_screenshot (via downscale), browser_snapshot (via role pruning).

Status

Early scaffold. Filters are implemented and benchmarked against real Playwright fixtures (see BENCHMARKS.md):

  • Screenshot filter: 36–79% LLM token savings on captured fixtures, quality gates pass.
  • Snapshot filter: 0–0.6% savings on the fixtures tested. Structural role-pruning has diminishing returns on well-formed a11y trees. The screenshot filter is the primary win.

End-to-end testing against a live Playwright MCP server is pending. See Roadmap.

Why

Claude vision tokenizes images by dimensions, not file size. A 1920×1080 screenshot costs ~2,765 tokens regardless of PNG vs WebP. The lever is downscaling, not format conversion.

Playwright's a11y snapshots run 10–100 KB per call. Interactive elements (buttons, links, inputs) are usually <10% of the payload; the rest is landmarks, static text, and structural noise.

rtk-mcp targets these two hotspots without changing your Claude Code setup beyond registering it as your MCP server.

Install

npm install -g rtk-mcp
# or from source
git clone https://github.com/KCuppens/rtk-mcp.git
cd rtk-mcp && npm install && npm run build && npm link

Configure

Create ~/.config/rtk-mcp/config.toml (see examples/config.toml):

[target]
command = "npx"
args = ["-y", "@playwright/mcp"]

[filters.browser_take_screenshot]
enabled = true
maxLongEdge = 1024
format = "webp"
quality = 85

[filters.browser_snapshot]
enabled = true
dropRoles = ["separator"]

[telemetry]
logPath = "~/.local/share/rtk-mcp/savings.jsonl"

Then in Claude Code's MCP config, point at rtk-mcp instead of the target server directly.

Design

  • Line-based JSON-RPC. Newline-delimited on stdio, per MCP convention.
  • Passthrough default. Unknown tools, unknown message types, unfilterable content — all forwarded verbatim with zero overhead.
  • Fallback on filter failure. If a filter throws, the raw response is forwarded and the failure is logged to stderr. The proxy is never allowed to break the wrapped tool.
  • No config = no filtering. If you don't enable a filter, that tool passes through untouched.
  • Never drop interactive roles. The snapshot filter refuses to drop button, link, textbox, and other interactive roles even if you configure them in dropRoles. Safety rail.

Filters

browser_take_screenshot

Downscales to maxLongEdge (default 1024px) via sharp, re-encodes as configured format.

  • Zero LLM-token quality loss at 1024px+ for most UI screenshots.
  • OCR floor around 800px for small text. Below that, the LLM may misread numeric values or short labels.
  • Below minTriggerBytes (default 20 KB), images pass through untouched.

browser_snapshot

Line-based pruning of Playwright's YAML-ish a11y tree. Drops configured roles (dropRoles) and their child subtrees.

  • Interactive elements always preserved. button, link, textbox, checkbox, radio, combobox, menuitem, tab, switch, searchbox, slider, spinbutton, listbox, option, menu, form, dialog, heading.
  • Default drops: separator. Landmarks (region, main, nav) are NOT dropped by default because they aid orientation.
  • On parse anomaly (indentation confusion, unexpected format), the raw snapshot is forwarded.

Telemetry

If [telemetry].logPath is set, one JSON line is written per filtered call:

{"ts":"2026-07-08T19:20:00Z","tool":"browser_take_screenshot","rawSize":184320,"filteredSize":42188,"savingsPct":77.1,"note":"1920x1080→1024x576 (180.0KB→41.2KB)"}

Consume with jq, tail, or a future rtk gain --mcp command.

Roadmap

  • [x] Benchmark harness with quality gates (see BENCHMARKS.md)
  • [ ] End-to-end test against a real Playwright MCP server (needs browser_snapshot refs — current fixtures use page.ariaSnapshot())
  • [ ] Smarter snapshot pruning: drop leaf regions with no interactive descendants (subtree-aware)
  • [ ] Additional benchmark fixtures: e-commerce, SPA-heavy, forms, admin dashboards
  • [ ] WebFetch selector-scoped extraction (if any MCP server exposes it)
  • [ ] Delta snapshots (diff vs prior snapshot within a session)
  • [ ] Config validator: rtk-mcp --check
  • [ ] Publish to npm

License

MIT

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选