Thin-client/daemon MCP server (fetch_page, brave_web_search) — Rust core compiled to WASM, no native binary required.
30 tools with mostly complete schemas and descriptions, but significant inconsistencies. Tool names follow verb_noun convention well (fetch_page, read_website, stapler_browser_navigate). Descriptions range 50 - 300+ chars, meeting baseline (194 avg). However, parameter descriptions are sparse or missing for many tools (e.g., stapler_browser_evaluate's 'script' param lacks format guidance; stapler_browser_wait_for's 'condition' param is vague). Output schemas are undocumented, LLMs cannot predict return structure. Error handling is absent from descriptions. Browser automation tools (stapler_browser_*) lack idempotency guidance despite being state-modifying. No secret injection pattern visible for credentials despite stapler_browser_type_secret existing.
Search the web via the Brave Search API. Requires BRAVE_API_KEY in the daemon's environment.
Fetch a URL (optionally crawling same-host links up to maxDepth/maxPages) and save each page's raw HTML under saveDir.
Render a URL in a headless browser and return its title and extracted text (optionally saving the rendered HTML to a local file). Backed by the shared stapler-mcp daemon's browser pool.
Search or page through a page's full Markdown previously saved by read_website (its savedPath). With query set, returns every matching line (case-insensitive) plus surrounding context, like grep -n -C; without it, returns a line-numbered page of content starting at offset. Works even when you're not on the same machine as the daemon.
Fetch a URL (optionally crawling same-host links up to maxDepth/maxPages), extract the main content via Readability-style extraction, and return it as Markdown. Cached by URL on the daemon. Once the combined Markdown across all pages returned passes ~60,000 characters (tunable via maxInlineChars, or force it for every page with alwaysSaveToFile), further pages come back as a short preview plus savedPath instead — use read_saved_page to search or page through the full content.
Output schemas undocumented. LLMs cannot predict return structure for any tool. Descriptions state what tools do but not what they return (fields, types, pagination). This violates pattern:tool and forces agents to guess at response shape.
Parameter descriptions missing or vague for browser automation tools. stapler_browser_evaluate's 'script' param lacks format guidance (JavaScript? Node.js? Constraints?). stapler_browser_wait_for's 'condition' param is opaque ('e.g., element visibility, navigation completion', what are valid values?). Violates pattern:tool-description.
No error handling guidance in tool descriptions. Agents cannot distinguish retryable errors from fatal ones. E.g., stapler_browser_navigate does not document what happens on invalid URL, network timeout, or JavaScript error. Violates pattern:recovery-guide.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Click an element in an existing browser session, identified by a `ref` from a previous snapshot, and return the accessibility-tree snapshot of the page after the click.
Close all active browser sessions.
Close an existing browser session, freeing its resources.
Execute JavaScript in an existing browser session and return the result.
Fill multiple form fields in an existing browser session and return the accessibility-tree snapshot of the page after filling.
Find text on the current page in an existing browser session and return matching elements with their positions.
Get the raw HTML of the current page or a specific element in an existing browser session.
Navigate through browser history (back/forward) in an existing browser session and return the accessibility-tree snapshot of the resulting page.
Hover over an element in an existing browser session, identified by a `ref` from a previous snapshot, and return the accessibility-tree snapshot of the page after hovering.
List all active browser sessions.
Navigate to a URL in a real browser session (creating a new session if sessionId is omitted, or reusing an existing one), returning the resolved session id, the final URL after any redirects, and an accessibility-tree snapshot of the resulting page. Part of the playwright-mcp-style browser automation tools backed by the shared daemon's browser pool.
Press a keyboard key in an existing browser session and return the accessibility-tree snapshot of the page after the key press.
Resize the browser viewport in an existing browser session and return the accessibility-tree snapshot of the page after resizing.
Take a screenshot of the current page in an existing browser session and return it as a base64-encoded image.
Select an option in a dropdown or select element in an existing browser session, identified by a `ref` from a previous snapshot, and return the accessibility-tree snapshot of the page after selection.
Set the checked state of a checkbox or radio button in an existing browser session and return the accessibility-tree snapshot of the page after the change.
Return an accessibility-tree snapshot of the current page in an existing browser session, without taking any action.
List all open tabs in an existing browser session.
Type text into an element in an existing browser session, identified by a `ref` from a previous snapshot, and return the accessibility-tree snapshot of the page after typing.
Use this instead of stapler_browser_type whenever a field is a password, TOTP/2FA code, or other secret you have a stored credential for. Types a credential resolved server-side from the daemon's configured vault into an element in an existing browser session, identified by a `ref` from a previous snapshot — the credential value never appears in this tool's request or in any returned accessibility-tree snapshot (a fixed [REDACTED] placeholder is used instead).
Wait for a condition in an existing browser session (e.g., element visibility, navigation completion) and return the accessibility-tree snapshot once the condition is met.
Crawl a URL (optionally following same-host links up to maxDepth/maxPages), extract text content, chunk it, embed each chunk with a sentence-similarity model, and store the indexed source for later search_docs queries.
List all indexed sources (created by stapler_index_docs) currently stored on the daemon, including metadata like page count and chunk count for each.
Delete an indexed source (created by stapler_index_docs) from the daemon's storage, freeing its disk space.
Search an indexed source (created by stapler_index_docs) using semantic similarity: embeds the query with the same model, finds the top-k most similar chunks, and returns them ranked by relevance score.
State-modifying browser tools lack idempotency guidance. stapler_browser_click, stapler_browser_type, stapler_browser_press_key are not documented as idempotent or non-idempotent. Agents retrying on ambiguous failures risk duplicate side effects (double-clicks, duplicate form submissions). Violates pattern:idempotent-operation.
Credentials and secrets handling unclear. stapler_browser_type_secret exists but no documentation on how vault is configured, what credential names are valid, or how to handle missing credentials. Violates pattern:secret-injection.