Multi-output browser automation MCP server: load URLs/HTML/local files with Playwright and extract accessibility trees, design tokens, screenshots, Claude-consumable YAML DSL, Figma JSON, and Figma plugin scripts
Server has 5 tools with complete input schemas and detailed descriptions. Naming follows verb_noun convention (analyze_page, to_claude, to_figma, seed_auth_session, to_figma_script). Descriptions are comprehensive (150-400 chars) and explain WHAT, WHEN, and HOW. However, output schemas are NOT documented, LLMs cannot predict return structure. Parameters lack type constraints (e.g., viewport is object but no required fields declared). Error handling guidance is absent. No tool annotations (readOnlyHint/destructiveHint). seed_auth_session is marked WRITE but lacks confirmation/dry-run pattern. Missing per-parameter descriptions for nested objects (viewport.width/height have defaults but no explicit descriptions).
Multi-output bundle MVP: load a source (URL OR inline HTML OR local file/zip) with Playwright (persistent Chromium context) and return any subset of {a11y tree, basic design tokens, full-page screenshot}. v0.7.0 adds paste-HTML inputs (`html` / `html_path`) for localhost/auth-gated/staging/email content bypass. Supports pre_render_script for JS injection before capture.
v0.8.0: opens a headed Chromium tab on `url`, lets the operator log in manually, and persists cookies + localStorage to the user-data-dir profile. Subsequent analyze_page / to_claude / to_figma calls reuse that auth IF caller passes `clear_cookies_after: false`. Closes when the user closes the window OR after `idle_timeout_ms` (default 5min, max 30min). Closes the shared headless context first (single-process lock on profile dir).
htmltoclaude v0.1: convert a source (URL OR inline HTML OR local file/zip) to a compact YAML DSL (cbm/htmltoclaude/v0) Claude-consumable representation. Hoists colors+fonts to tokens, captures box/role/style per node, walks shadowRoot, captures CSS pseudo-elements (::before/::after), preserves SVG outerHTML, captures raw gradient strings. v0.7.0 adds paste-HTML inputs (`html` / `html_path`). Supports pre_render_script for JS injection + max_nodes override.
Phase 2 v0.1 DOM→Figma JSON adapter (cbm/htmltofigma/v0). Reuses htmltoclaude walker then maps to Figma REST node format (FRAME/TEXT/RECTANGLE/VECTOR/GROUP). v0.6.0 SVG outerHTML + GRADIENT_LINEAR/RADIAL + pseudo + max_nodes. v0.7.0 adds paste-HTML inputs (`html` / `html_path`) for localhost/auth/staging/email content bypass. Supports pre_render_script for JS injection before capture.
Output schemas not documented. LLMs cannot predict return structure (e.g., analyze_page returns {a11y, tokens, screenshot} but format/fields are undocumented). Agents cannot plan downstream tool calls or extract required data.
Nested object parameters (viewport) lack explicit type/required field declarations. viewport.width and viewport.height have defaults but no descriptions. LLMs may omit or misuse these parameters.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). seed_auth_session is marked WRITE but lacks confirmation/dry-run pattern for destructive operations. Agents cannot distinguish safe from risky calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Phase 3 v0.1 (v0.10.0): same input shape as `to_figma`, but emits a Figma Plugin API JS string (`code`) ready to paste into Claude.ai Figma MCP `use_figma({ skillNames: "figma-use", code })`. Pair with `create_new_file` to materialize the bundle as a real Figma file. Returns { schema, source_url, page_name, code, estimated_ops, bundle_warnings, emit_warnings, metrics, recipe_md }. Emitter scope v0.1 : FRAME/GROUP/TEXT/RECTANGLE/VECTOR via createNodeFromSvg + SOLID/GRADIENT_LINEAR/GRADIENT_RADIAL fills + cornerRadius + clipsContent + page-per-site. Image fills SKIPPED (deferred v0.2 hybrid generate_figma_design). No multi-call chunking (client splits if ops > 30 per Figma's 10-op rule).
Error handling guidance absent. No recovery hints (e.g., 'If URL fails, try html parameter instead'). Agents cannot self-correct on failures.
Mutually exclusive parameters (url XOR html XOR html_path) documented in descriptions but not enforced via schema. LLMs may pass multiple conflicting parameters.