MCP server for controlling a cloud-based browser via Chrome DevTools Protocol
Cloud Browser exposes 13 tools with consistent naming (verb_noun pattern: yunbrowser_*) and basic descriptions. However, critical gaps undermine production readiness: (1) All tools require sessionId and apiKey as parameters, credentials should never be exposed as tool params per pattern:secret-injection; they belong in server-side injection. (2) Descriptions are minimal (10-40 chars), below the 50-200 char LLM-optimized baseline. (3) Input schemas are present but lack detail, no enums for constrained values, no min/max for numeric params (e.g., timeout in yunbrowser_wait_for_element has no bounds). (4) Output schemas are not documented, LLMs cannot infer what fields to expect from responses. (5) Error handling is absent, no guidance on retryability, user-fixable vs fatal errors, or recovery paths. (6) No tool annotations (readOnlyHint, destructiveHint) despite clear risk classifications. Tools like yunbrowser_execute_script (WRITE risk) and yunbrowser_navigate (WRITE risk) should be marked destructive.
Click on an element specified by CSS selector
Execute JavaScript code in the browser context
Retrieve the URLs of all open tabs in the browser session
Get the current URL from the browser address bar
Get the HTML content of an element specified by CSS selector
Get the text content of an element specified by CSS selector
Get the HTML content of the current page
Credentials exposed as tool parameters (sessionId, apiKey). Per pattern:secret-injection, credentials must never appear in tool params, they leak into logs and traces. Use server-side injection via environment variables or vault.
Descriptions are minimal (10-40 chars), far below the 50-200 char LLM-optimized baseline. LLMs cannot determine when/why to select tools. E.g., 'Retrieve the URLs of all open tabs in the browser session' (54 chars) lacks context on when to use it vs other discovery tools.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 35 | <=2025-11-25 | v2 |
Get the text content of the current page
Input text into an element specified by CSS selector
Navigate to a specified URL in the browser
Scroll the page by a specified amount
Take a screenshot of the current page
Wait for an element to appear on the page
Output schemas not documented. LLMs cannot infer response structure (fields, types, pagination). Per pattern:tool, every tool must document what it returns so agents can plan downstream calls.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools like yunbrowser_navigate, yunbrowser_click_element, yunbrowser_input_text, yunbrowser_execute_script, and yunbrowser_scroll are marked WRITE risk but lack destructiveHint annotation. Agents cannot distinguish safe from unsafe operations.
Input parameters lack constraints. yunbrowser_wait_for_element.timeout has no min/max bounds (unbounded integers let LLMs pass absurd values). yunbrowser_scroll.x and .y lack range documentation. Per pattern:constrained-input, numeric params must specify min/max.