miromiro
Server Details
Turn any live website into brand colors, fonts, design tokens, SVGs, Lottie and paste-ready code.
- Status
- Healthy
- Uptime
- 19.1% over 78 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- Repository
- SoraiaBarroso/miromiro-mcp
- GitHub Stars
- 0
- Server Listing
- miromiro-mcp
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 11 tools
Each tool targets a distinct asset type and the descriptions actively cross-reference alternatives ('Not for: icons and vector logos (use extract_svgs)'), which makes selection reliable. The only soft overlap is the brand/design-tokens/fonts triangle, where extract_brand, extract_design_tokens and extract_fonts all return typography and color data at different granularities; the descriptions differentiate them, but an agent could still hesitate on a vague request like 'tell me about this site's style'.
Ten of eleven tools use a uniform extract_<noun> pattern with nouns that name the resource precisely (assets, audio, svgs, videos, fonts, brand, code, page). The single list_site_pages follows the same verb_noun convention and is the one read-only listing operation, so the deviation is semantically meaningful rather than arbitrary.
Eleven tools is well within the ideal band and each maps to a genuine, non-redundant extraction target (raster, audio, video, SVG, Lottie, fonts, colors, tokens, section code, full page, page discovery). Nothing looks like filler, and the media-type splits are justified by very different parsing/rendering behavior.
The surface covers the full extraction lifecycle: discover pages (list_site_pages), extract one section (extract_code), extract a whole page (extract_page), plus every media and design-token category, with previews and downloads. Gaps are minor: there is no plain-text/markdown content extraction and no screenshot or metadata/SEO tool, though page copy is recoverable through extract_code.
Available Tools
11 toolsextract_assetsExtract imagesARead-onlyIdempotentInspect
Use when the user wants the images from a page - photos, illustrations, backgrounds, favicon, social image - as resolved URLs tagged by source (img, srcset, picture, CSS background, favicon, og). A URL that is itself an image file comes back as the single result (source file). Not for: icons and vector logos (use extract_svgs) or fonts (use extract_fonts). Returns up to 100 by default; pass limit (up to 200) for more.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The website URL | |
| fresh | No | Skip the 24-hour cache and re-extract the live page - use when the site just changed and a cached result would be stale. Charged normally; the fresh result replaces the cached copy. | |
| limit | No | Max images to return (default 100, up to 200). | |
| render | No | Force a real browser so the page's JavaScript runs before it is read. Slower, and adds 5 credits. Usually not needed: when the plain read comes back as a JavaScript app shell or the site refuses it (401/403/406) or timed out, the server already re-runs the page in a browser by itself at no extra cost, and usage.autoRender says so. Pass it for images, videos or Lottie that only load on scroll, with screenshot=true, or when a result is still thin after that automatic pass. If a 403 says the browser was refused too, the site cannot be extracted - do not retry. extract_code always runs in a real browser at no extra cost, so render=true is not needed there (only together with screenshot=true). On extract_design_tokens, render=true only permits the browser: the plain read still runs first, and the 5 credits are charged only if the browser was actually needed. | |
| screenshot | No | Requires render=true. Adds a screenshot field to the result: a public URL of a capture of the page (live 7 days), taken by the same browser that rendered it. Pass true for the 1440x900 viewport or 'full' for the entire page height. No extra credits beyond the render surcharge. Useful for showing the user what the extracted site looks like. | |
| full_output | No | Skip long-string trimming. Responses still cap at ~100KB total. | |
| response_format | No | How much to return. 'concise' keeps lists to 10 entries and strings short - right for a summary or a chat answer. 'detailed' returns everything the tool has (same as limit=200 + full_output=true). Omit for the default, which fits a typical chat context. The generated code is never trimmed in any mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| count | No | Total images found (before any trimming) |
| usage | No | Credit usage for the authed key (spent, remaining, monthly limit). |
| images | No | |
| truncation_note | No | Present when the result was trimmed to fit chat context - says what was dropped and how to get more (limit / full_output arguments, or the REST API). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description's added value is the extraction behavior: a URL that is itself an image returns a single 'source file' result, and results are capped at 100 by default with a 200 ceiling. It does not restate the widely documented caching and render/screenshot trade-offs that live in the schema, which is fine but leaves it short of fully rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: trigger, scope of results, special case, exclusions, and the one parameter nuance worth surfacing. The trigger and the sibling routing are front-loaded where an agent will read them first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return shape, and it correctly focuses on routing and scope. For a read-only extraction tool with a complete schema and annotations, nothing an agent needs to select or invoke it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter in depth (fresh/cache, render, screenshot, full_output, response_format). The description only echoes the limit defaults ('up to 100 by default; pass limit (up to 200)'), which is a restatement rather than added meaning. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('the images from a page'), enumerates the asset kinds covered (photos, illustrations, backgrounds, favicon, social image) and the tagging scheme, and explicitly names the siblings it is not for. An agent can distinguish it from extract_svgs and extract_fonts without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with the triggering condition ('Use when the user wants the images from a page') and gives explicit exclusions with named alternatives ('Not for: icons and vector logos (use extract_svgs) or fonts (use extract_fonts)'). It also resolves the ambiguous case where the input URL is itself an image.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_audioExtract audioARead-onlyIdempotentInspect
Use when the user wants the audio files on a page: / files, og:audio, podcast enclosures and download links, each tagged by source. A URL that is itself an audio file comes back as the single result (source file). If a JavaScript player mounts the audio at runtime, call again with render=true (+5 credits). Returns up to 40 by default; pass limit (up to 200) for more.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The website URL | |
| fresh | No | Skip the 24-hour cache and re-extract the live page - use when the site just changed and a cached result would be stale. Charged normally; the fresh result replaces the cached copy. | |
| limit | No | Max audio files to return (default 40, up to 200). | |
| render | No | Force a real browser so the page's JavaScript runs before it is read. Slower, and adds 5 credits. Usually not needed: when the plain read comes back as a JavaScript app shell or the site refuses it (401/403/406) or timed out, the server already re-runs the page in a browser by itself at no extra cost, and usage.autoRender says so. Pass it for images, videos or Lottie that only load on scroll, with screenshot=true, or when a result is still thin after that automatic pass. If a 403 says the browser was refused too, the site cannot be extracted - do not retry. extract_code always runs in a real browser at no extra cost, so render=true is not needed there (only together with screenshot=true). On extract_design_tokens, render=true only permits the browser: the plain read still runs first, and the 5 credits are charged only if the browser was actually needed. | |
| screenshot | No | Requires render=true. Adds a screenshot field to the result: a public URL of a capture of the page (live 7 days), taken by the same browser that rendered it. Pass true for the 1440x900 viewport or 'full' for the entire page height. No extra credits beyond the render surcharge. Useful for showing the user what the extracted site looks like. | |
| full_output | No | Skip long-string trimming. Responses still cap at ~100KB total. | |
| response_format | No | How much to return. 'concise' keeps lists to 10 entries and strings short - right for a summary or a chat answer. 'detailed' returns everything the tool has (same as limit=200 + full_output=true). Omit for the default, which fits a typical chat context. The generated code is never trimmed in any mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| note | No | Coverage caveat: only audio declared in the initial HTML is found - use render=true for JS-mounted players |
| audio | No | |
| count | No | Total audio files found (before any trimming) |
| usage | No | Credit usage for the authed key (spent, remaining, monthly limit). |
| truncation_note | No | Present when the result was trimmed to fit chat context - says what was dropped and how to get more (limit / full_output arguments, or the REST API). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description still adds real behavioral context beyond them: per-source tagging of results, the 40-item default cap, and the +5 credit surcharge for render=true. It stops short of describing failure modes or rate limits, which the schema's render note partially covers instead.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger, then the special cases and limits in four tight sentences with no filler. A minor redundancy with the schema on the limit/render details keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation. The description covers the edge case where the URL is itself an audio file, the JS-runtime case, the credit cost, and pagination limits, which is everything an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description restates limit ('up to 200') and the render surcharge, both of which the schema already documents in more depth, so it adds little parameter meaning of its own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('the audio files on a page') and enumerates exactly what counts as audio: <audio>/<source>, og:audio, podcast enclosures, download links. This distinguishes it cleanly from sibling extractors like extract_videos, extract_svgs and extract_fonts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ('Use when the user wants the audio files on a page') and a follow-up condition ('If a JavaScript player mounts the audio at runtime, call again with render=true'). It does not, however, name the sibling tools to prefer for non-audio media, so the routing guidance is clear but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_brandExtract brand identityARead-onlyIdempotentInspect
Use when the user wants a site's brand: its colors, fonts, logo, theme or social links - 'what colors does stripe use', 'match this brand', 'build something in the style of X'. Returns role colors (primary, accent, background, text) as hex with human-readable names, the wider palette, fonts by role, logo candidates, social profiles, dark/light theme, and a 0-1 confidence score with signals explaining where the colors came from: read signals.explanation and tell the user whether they were declared by the site ('css-var'/'theme-color') or inferred from usage frequency ('usage', a guess) - never present inferred colors as the official palette. Not for: markup or layout (use extract_code) or the full token list (use extract_design_tokens).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The website URL, e.g. stripe.com | |
| fresh | No | Skip the 24-hour cache and re-extract the live page - use when the site just changed and a cached result would be stale. Charged normally; the fresh result replaces the cached copy. | |
| render | No | Force a real browser so the page's JavaScript runs before it is read. Slower, and adds 5 credits. Usually not needed: when the plain read comes back as a JavaScript app shell or the site refuses it (401/403/406) or timed out, the server already re-runs the page in a browser by itself at no extra cost, and usage.autoRender says so. Pass it for images, videos or Lottie that only load on scroll, with screenshot=true, or when a result is still thin after that automatic pass. If a 403 says the browser was refused too, the site cannot be extracted - do not retry. extract_code always runs in a real browser at no extra cost, so render=true is not needed there (only together with screenshot=true). On extract_design_tokens, render=true only permits the browser: the plain read still runs first, and the 5 credits are charged only if the browser was actually needed. | |
| screenshot | No | Requires render=true. Adds a screenshot field to the result: a public URL of a capture of the page (live 7 days), taken by the same browser that rendered it. Pass true for the 1440x900 viewport or 'full' for the entire page height. No extra credits beyond the render surcharge. Useful for showing the user what the extracted site looks like. | |
| response_format | No | How much to return. 'concise' keeps lists to 10 entries and strings short - right for a summary or a chat answer. 'detailed' returns everything the tool has (same as limit=200 + full_output=true). Omit for the default, which fits a typical chat context. The generated code is never trimmed in any mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| logo | No | The site's real logo when we found one: the wordmark from its header, read in a real browser and hosted by MiroMiro (permanent URL, safe to embed); otherwise its best declared icon. Show this one to the user. |
| next | No | The most likely follow-up call for this result, with the tool and arguments to use. Offer it to the user when it fits what they are doing. |
| fonts | No | |
| logos | No | All logo/icon candidates, tagged by source: header (the wordmark, hosted, with background light|dark it is drawn for), icon, apple-touch-icon, mask-icon, og |
| theme | No | dark | light |
| title | No | Page/og title - the brand name |
| usage | No | Credit usage for the authed key (spent, remaining, monthly limit). |
| colors | No | Role colors as hex: primary, accent, background, text |
| ogImage | No | |
| palette | No | The wider brand palette |
| signals | No | WHY the result looks the way it does - the provenance behind `confidence`. Read `signals.explanation` and tell the user what it says instead of quoting the confidence number, which means nothing to them on its own. `primarySource` is the key field: 'css-var' or 'theme-color' means the site declared these colors and they are its real tokens; 'logo' means they were sampled from its logo; 'usage' means nothing was declared and the colors are a frequency-based GUESS - say so rather than presenting them as the brand's official palette. |
| socials | No | Social profiles found on the page |
| siteName | No | |
| colorNames | No | Human-readable names for the role colors ("Royal Blue") |
| confidence | No | 0-1: how much the site declared vs how much was inferred |
| themeColor | No | The site's own declared theme-color |
| typography | No | Fonts split by role: primary, mono |
| description | No | |
| logoVariants | No | The header logo per background: onLight is the file for a light background, onDark for a dark one. A one-color logo gets a recolored copy for the other background; a multi-color one only has its original. null when no header logo was found. |
| truncation_note | No | Present when the result was trimmed to fit chat context - says what was dropped and how to get more (limit / full_output arguments, or the REST API). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description goes beyond them by disclosing the confidence score and the meaning of `signals.explanation` ('css-var'/'theme-color' vs 'usage'), which is genuine interpretive guidance. However, it omits caching behavior and the credit costs that the schema documents for fresh/render, leaving a gap that a 3 reflects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger condition, then the return shape, then the presentation caveat, then the exclusions — a clean triage order. Despite its length, every clause carries distinct information (trigger, output, interpretation warning, sibling boundaries).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values, and the description still supplies the one thing an agent would otherwise get wrong: not to present inferred colors as the official palette. Combined with sibling routing for extract_code and extract_design_tokens, an agent has everything needed to call and report correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all five parameters are already documented in detail, including the render surcharge and cache semantics. The description adds nothing about url, fresh, render, screenshot or response_format, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('a site's brand: its colors, fonts, logo, theme or social links') and grounds it in concrete user phrasings like 'what colors does stripe use'. The 'Not for:' clause explicitly separates it from extract_code and extract_design_tokens, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both when-to-use ('Use when the user wants a site's brand') and when-not-to-use with named alternatives for markup/layout and the full token list. The alternative routing is explicit rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_codeExtract section as codeARead-onlyIdempotentInspect
Use when the user asks to rebuild, clone, copy, port, restyle or 'make it look like' part of a real website, or wants a site's section as Tailwind, HTML+CSS, React (JSX) or Vue - or as a file to import into a site builder: framework=elementor for an Elementor template (WordPress), framework=shopify for a Shopify theme section. Give it the URL and, when the user named a part of the page, section (hero, header, footer, pricing, features, testimonials, faq, cta) - never invent a CSS selector. With neither, it auto-detects the hero; every call also returns sections, each other extractable section with a label and a ready selector for a follow-up call. Returns a self-contained component with the page's real resolved styles (true colors, fonts, spacing, copy) plus the tokens and assets it uses, so you adapt real values instead of estimating from a screenshot. Not for: whole-page scraping, page text, or sites that need a login. Loads the page in a real browser and reads the styles, theme and images it actually shows, on every plan at no extra cost - no need to pass render=true. Large inline SVGs (logo walls, illustrations) come back as hosted files so the code stays small enough to use as-is (inline_svg=true keeps them inline). Ask for the format the user wants (framework=jsx for React, vue for Vue) instead of converting one into another. Build on code, never regenerate it: it is the section exactly as the site renders it. Then make it better to use where it can be: clear names for the component, props and variables; reusable small components with props instead of long repeated markup; hard-coded text and repeated items as props or a data array (jsx and vue already collapse repeated structures into .map()/v-for - keep that); shorter code by removing redundant wrappers, moving duplicated class lists into a shared component or constant, and dropping styles that do nothing (box-sizing: border-box is already Tailwind's default); and what the user asked for (their theme colors and fonts, removing parts). If the code is already clean, hand it over as it is. Every change must render the same: copy each className exactly as returned and never change a value (color, size, spacing, font) - retyping styles from memory loses the fidelity - and check your version against previewUrl. Elementor and Shopify files are imported as they are: do not edit them. Give the user downloadUrl, the code exactly as returned as a file in their format (.jsx, .vue, .html, .elementor.json, .liquid), and previewUrl, that code rendered as a page, to compare your version against. When rebuilding a whole page, extract each section and give them pagePreviewUrl: every section extracted so far, assembled in page order, also downloadable.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The website URL, e.g. stripe.com | |
| name | No | Component name for the jsx target (default ExtractedSection). Ignored by tailwind, html and vue. Renaming never re-runs the extraction - it costs 0 credits on a cached section. | |
| fresh | No | Skip the 24-hour cache and re-extract the live page - use when the site just changed and a cached result would be stale. Charged normally; the fresh result replaces the cached copy. | |
| theme | No | Which colour scheme to extract (default light). Pass 'dark' when the user is looking at the site in dark mode or asks for the dark version: the page's prefers-color-scheme: dark rules and custom properties become the component itself instead of riding along as dark: variants. Works whether the site expresses its themes as @media (prefers-color-scheme) or as a root attribute/class the CSS is scoped to ([data-theme=dark], html.dark). Sites that switch themes purely in JavaScript cannot be selected this way - you get the page default plus a hint saying so. No extra credits. | |
| render | No | Force a real browser so the page's JavaScript runs before it is read. Slower, and adds 5 credits. Usually not needed: when the plain read comes back as a JavaScript app shell or the site refuses it (401/403/406) or timed out, the server already re-runs the page in a browser by itself at no extra cost, and usage.autoRender says so. Pass it for images, videos or Lottie that only load on scroll, with screenshot=true, or when a result is still thin after that automatic pass. If a 403 says the browser was refused too, the site cannot be extracted - do not retry. extract_code always runs in a real browser at no extra cost, so render=true is not needed there (only together with screenshot=true). On extract_design_tokens, render=true only permits the browser: the plain read still runs first, and the 5 credits are charged only if the browser was actually needed. | |
| section | No | Which part of the page, by name - use this when the user asked for the pricing, footer, header/nav, features, testimonials, FAQ or call-to-action block. Resolved on the page itself from its ids, classes, headings and, failing those, its content (prices, blockquotes, FAQ items), so it works without seeing the markup and on pages that label nothing. Omit for the hero. If the page has no such section you get the hero plus a `note` listing what is there. | |
| selector | No | CSS selector for the section, ONLY when you have one from a previous result's `sections` list (e.g. "section.pricing-grid"). Do not guess selectors: a selector that matches nothing falls back to the hero with a `note`, and the guess costs a call. Prefer `section` for named parts of a page. | |
| framework | No | The code to generate (default tailwind). 'elementor' returns an importable Elementor template: tell the user to save `code` as a .json file and import it in WordPress under Templates > Saved Templates > Import. 'shopify' returns a theme section: save `code` as sections/<name>.liquid in the theme, then add it from the theme editor. Use the theme code editor's sections folder, not a Custom Liquid block (that block is capped at 50 KB and cannot hold the schema). Both arrive as one styled HTML block (edited as code, not as native widgets), with the section's responsive and hover styles included and its CSS scoped so it cannot clash with the theme. Give the user the file contents complete and unmodified. | |
| inline_svg | No | Keep large inline SVGs (logos, illustrations) inline in `code` instead of hosted <img> files. Only when the user needs fully self-contained code: a logo wall can add 50+ KB. | |
| screenshot | No | Requires render=true. Adds a screenshot field to the result: a public URL of a capture of the page (live 7 days), taken by the same browser that rendered it. Pass true for the 1440x900 viewport or 'full' for the entire page height. No extra credits beyond the render surcharge. Useful for showing the user what the extracted site looks like. | |
| response_format | No | How much to return. 'concise' keeps lists to 10 entries and strings short - right for a summary or a chat answer. 'detailed' returns everything the tool has (same as limit=200 + full_output=true). Omit for the default, which fits a typical chat context. The generated code is never trimmed in any mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| css | No | Companion CSS: always set for framework=html; for tailwind/jsx/vue it carries the @keyframes the section uses (add to the global stylesheet); null for elementor/shopify, whose file already contains its CSS |
| url | Yes | |
| code | No | The generated, paste-ready component code. For jsx/vue, repeated structures (tiers, cards, list items) are collapsed into a data array rendered with .map()/v-for. For elementor this is the complete template JSON (a .json file); for shopify the complete section file (a .liquid file) - hand either over whole |
| hint | No | Only present when the extraction looks degraded (client-rendered page, runtime-injected styles, or none of the page's stylesheets could be fetched) - says what to do (the server has already tried a browser where one would help); when the stylesheets failed, retry the same call in a moment; on a render=true call the styles could not be resolved even in a browser, do not retry |
| next | No | The most likely follow-up call for this result, with the tool and arguments to use. Offer it to the user when it fits what they are doing. |
| note | No | Present when the requested selector or section was not found and the hero was returned instead - says what was asked for and which sections the page does have. Tell the user. |
| theme | No | light | dark: which one the code you just received actually is. Measured from the page (its declared root theme, else the backgrounds the cascade resolved), never echoed from your request - so if you asked for a theme the site cannot serve, this reports what you really got. A site that expresses themes only through a prefers-color-scheme media query returns its light branch unless you pass theme=dark. Tell the user which theme they got when it may not match what they see on the site |
| usage | No | Credit usage for the authed key (spent, remaining, monthly limit). |
| assets | No | Images/fonts the section references |
| tokens | No | Design tokens the extracted section actually uses |
| section | No | The named section that was resolved, when one was requested |
| summary | No | What was extracted, at a glance. styledCoverage (0-100) is the quality signal: the % of elements the cascade found styles for |
| svgNote | No | Present when large inline SVGs were moved to hosted <img> files - how many and how much smaller the code got |
| sections | No | Every extractable section on the page - call again with one of these selectors for a specific part (an mm-range(...) selector is a block no single element wraps; pass it back the same way) |
| selector | No | The CSS selector that was extracted |
| framework | No | tailwind | html | jsx | vue | elementor | shopify |
| previewUrl | No | A page showing this section rendered from the same extraction (as HTML + CSS), so it looks exactly like the code you got. Give it to the user so they can compare it with the live site |
| downloadUrl | No | The code exactly as returned, as a file in the requested format (.jsx, .vue, .html, .elementor.json for elementor, .liquid for shopify). Give it to the user so they always have the original file, even after you adapt the code |
| autoDetected | No | True when the hero was auto-detected rather than passed in |
| pagePreviewUrl | No | The whole page: every section of this URL extracted in the last day, assembled in page order, with a Download HTML button. Grows as more sections are extracted - give it to the user after a whole-page rebuild |
| truncation_note | No | Present when the result was trimmed to fit chat context - says what was dropped and how to get more (limit / full_output arguments, or the REST API). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations by disclosing browser rendering behavior, caching, credit implications, auto-detection fallback, SVG hosting, Elementor/Shopify import constraints, and the `downloadUrl`/`previewUrl`/`pagePreviewUrl` outputs. The read-only, open-world, idempotent annotations are consistent with an extraction tool, and the description adds operational caveats the agent could not infer from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence is front-loaded and useful, but the description is extremely long and dense, mixing invocation guidance with extensive post-extraction editing, cleanup, and handoff instructions. Many sentences are valuable workflow rules, but they make the tool definition hard to scan and exceed what is needed for tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter extraction tool with an output schema, the description is more than complete: it covers framework-specific outputs, caching, rendering, fallback behavior, SVG handling, and follow-up page assembly. An agent has enough context to call it correctly and understand the main caveats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema carries most parameter definitions. The description still adds meaningful selection guidance around `section` vs `selector`, framework choices, and when to use `fresh` or ask the user for a target format, but much of its parameter detail duplicates the schema text rather than adding wholly new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb and resource ('extract section as code') and immediately scopes it to rebuilding, cloning, porting or restyling real website sections. It clearly distinguishes itself from the other extract_* siblings by focusing on generated component code rather than assets, tokens, fonts, or media.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it, which frameworks map to which user requests, how to pick `section` vs `selector`, and what not to use it for ('whole-page scraping, page text, or sites that need a login'). It also tells the agent to ask for the desired format rather than converting between formats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_design_tokensExtract design tokensARead-onlyIdempotentInspect
Use when the user wants a site's complete token system - every color, font family, size, weight, spacing value, radius, shadow, line height, gradient and breakpoint with usage counts - or a paste-ready :root block (format='css'), tailwind.config (format='tailwind') or W3C Design Tokens file (format='dtcg'). Returns values and counts only, not layout or which element uses what: if the user asked to rebuild or clone a section, use extract_code, which returns the markup with the values in place. A site shipping light and dark themes returns the union of both (see colorSchemes) - pick colors by role, not by frequency. Not for: a short brand summary (use extract_brand). Lists trim to 60 per group; pass limit (up to 200) for more.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The website URL | |
| fresh | No | Skip the 24-hour cache and re-extract the live page - use when the site just changed and a cached result would be stale. Charged normally; the fresh result replaces the cached copy. | |
| limit | No | Max entries per token list (default 60, up to 200). | |
| format | No | Output shape (default json). 'css'|'tailwind' return a paste-ready code block; 'dtcg' returns a standalone W3C Design Tokens file for Style Dictionary / Figma variables pipelines. | |
| render | No | Force a real browser so the page's JavaScript runs before it is read. Slower, and adds 5 credits. Usually not needed: when the plain read comes back as a JavaScript app shell or the site refuses it (401/403/406) or timed out, the server already re-runs the page in a browser by itself at no extra cost, and usage.autoRender says so. Pass it for images, videos or Lottie that only load on scroll, with screenshot=true, or when a result is still thin after that automatic pass. If a 403 says the browser was refused too, the site cannot be extracted - do not retry. extract_code always runs in a real browser at no extra cost, so render=true is not needed there (only together with screenshot=true). On extract_design_tokens, render=true only permits the browser: the plain read still runs first, and the 5 credits are charged only if the browser was actually needed. | |
| screenshot | No | Requires render=true. Adds a screenshot field to the result: a public URL of a capture of the page (live 7 days), taken by the same browser that rendered it. Pass true for the 1440x900 viewport or 'full' for the entire page height. No extra credits beyond the render surcharge. Useful for showing the user what the extracted site looks like. | |
| full_output | No | Skip long-string trimming. Responses still cap at ~100KB total. | |
| response_format | No | How much to return. 'concise' keeps lists to 10 entries and strings short - right for a summary or a chat answer. 'detailed' returns everything the tool has (same as limit=200 + full_output=true). Omit for the default, which fits a typical chat context. The generated code is never trimmed in any mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| next | No | The most likely follow-up call for this result, with the tool and arguments to use. Offer it to the user when it fits what they are doing. |
| usage | No | Credit usage for the authed key (spent, remaining, monthly limit). |
| colors | No | Every color with usage count |
| output | No | The paste-ready :root{} or tailwind.config block when format='css'|'tailwind' |
| spacing | No | The spacing scale from margin/padding/gap |
| summary | No | Count per token group |
| fontSizes | No | Font sizes with usage counts |
| gradients | No | Gradients with type (linear/radial/conic) and count |
| boxShadows | No | Box shadows |
| breakpoints | No | Responsive breakpoints from media queries |
| fontWeights | No | Font weights |
| lineHeights | No | Line heights |
| colorSchemes | No | The colour schemes this page declares: ["light"] or ["light","dark"]. When both, the counts above are the union of the two themes and neither is labelled - pick colours by role, not by frequency, and use extract_code with theme=dark when you need one theme on its own |
| fontFamilies | No | Font families with usage counts |
| borderRadiuses | No | Border radii |
| truncation_note | No | Present when the result was trimmed to fit chat context - says what was dropped and how to get more (limit / full_output arguments, or the REST API). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the read-only/idempotent annotations: it discloses that only values and counts are returned (not layout or element mapping), that light+dark themes return the union of both, and that lists trim to 60 per group unless limit is raised. It also warns against picking colors by frequency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded with routing and scope first, then format options, then exclusions and limit behavior. It is a long, multi-clause single paragraph with some run-on sequencing, but nearly every clause carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, return-value specifics need not be restated, and the description still covers scope, format choice, theme handling, trimming limits, and sibling routing. Nothing an agent needs to select and call this tool correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries full semantics for all 8 parameters including format, limit, render, and screenshot. The description echoes format semantics (paste-ready :root block, tailwind.config, W3C file) and the limit cap without adding new parameter-level detail. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (extract a site's complete token system) and enumerates the concrete scope covered (colors, fonts, spacing, radius, shadows, gradients, breakpoints) plus the three output formats. It explicitly differentiates from siblings extract_code and extract_brand by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (complete token system, or paste-ready code block), when-not-to ('Not for: a short brand summary'), and a routing rule with the alternative named ('if the user asked to rebuild or clone a section, use extract_code'). Format-selection guidance for json/css/tailwind/dtcg is folded in.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_fontsExtract fontsARead-onlyIdempotentInspect
Use when the user asks which fonts a site uses or wants to match its typography: every @font-face file with family/weight/style/format, Google Fonts links and preloads, grouped per family in families (pass fields='families' for just that). On a type-foundry site the families served are demo cuts (subset, features stripped), flagged demo:true with a note - pass that on, they are not the usable typeface. Not for: colors (use extract_brand) or code (use extract_code). Lists trim to 50; pass limit (up to 200) for more.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The website URL | |
| fresh | No | Skip the 24-hour cache and re-extract the live page - use when the site just changed and a cached result would be stale. Charged normally; the fresh result replaces the cached copy. | |
| limit | No | Max entries per list (default 50, up to 200). | |
| fields | No | Optional comma-separated fields to return (e.g. 'families') | |
| render | No | Force a real browser so the page's JavaScript runs before it is read. Slower, and adds 5 credits. Usually not needed: when the plain read comes back as a JavaScript app shell or the site refuses it (401/403/406) or timed out, the server already re-runs the page in a browser by itself at no extra cost, and usage.autoRender says so. Pass it for images, videos or Lottie that only load on scroll, with screenshot=true, or when a result is still thin after that automatic pass. If a 403 says the browser was refused too, the site cannot be extracted - do not retry. extract_code always runs in a real browser at no extra cost, so render=true is not needed there (only together with screenshot=true). On extract_design_tokens, render=true only permits the browser: the plain read still runs first, and the 5 credits are charged only if the browser was actually needed. | |
| screenshot | No | Requires render=true. Adds a screenshot field to the result: a public URL of a capture of the page (live 7 days), taken by the same browser that rendered it. Pass true for the 1440x900 viewport or 'full' for the entire page height. No extra credits beyond the render surcharge. Useful for showing the user what the extracted site looks like. | |
| full_output | No | Skip long-string trimming. Responses still cap at ~100KB total. | |
| response_format | No | How much to return. 'concise' keeps lists to 10 entries and strings short - right for a summary or a chat answer. 'detailed' returns everything the tool has (same as limit=200 + full_output=true). Omit for the default, which fits a typical chat context. The generated code is never trimmed in any mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| note | No | Only present when demo/trial families were found - tell the user, these files are subset and feature-stripped, not the usable typeface |
| count | No | |
| fonts | No | Every font file / stylesheet found |
| usage | No | Credit usage for the authed key (spent, remaining, monthly limit). |
| families | No | Grouped per-family summary - what most callers want |
| truncation_note | No | Present when the result was trimmed to fit chat context - says what was dropped and how to get more (limit / full_output arguments, or the REST API). |
| googleFontsLinks | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this is a read-only, idempotent, open-world operation, so the safety bar is low. The description contributes genuinely non-obvious domain behavior: on type-foundry sites the served families are demo cuts with stripped features, flagged demo:true, and the agent is told to pass that caveat on. Default trimming behavior is also disclosed, though caching/auto-render behavior is only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the use case, then payload, then the demo caveat, then exclusions — the ordering matches how an agent needs the information. It is dense with semicolons and clauses, but every clause carries a distinct instruction rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return shape need not be spelled out, and 8 parameters are fully covered by schema descriptions plus targeted guidance in the description. Accuracy-critical edge cases (demo fonts, list trimming, wrong-tool boundaries) are all addressed, so an agent has everything needed to call and interpret this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description earns above that by telling the agent why and when to use fields='families' and limit rather than merely restating their types. The caveat that the 50-entry trim is a default rather than a hard cap is the kind of semantic detail the schema alone would bury.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and enumerates exactly what is returned: every @font-face file with family/weight/style/format, Google Fonts links and preloads, grouped per family. It also explicitly disambiguates from siblings ('Not for: colors (use extract_brand) or code (use extract_code)'), so an agent can pick it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with the triggering user intent ('Use when the user asks which fonts a site uses or wants to match its typography') and names the two alternatives to use instead for adjacent asks. It goes further with narrower routing: pass fields='families' for just the grouped output, and pass limit up to 200 when the 50-entry trim cuts results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_lottieExtract Lottie animationsARead-onlyIdempotentInspect
Use when the user wants a site's Lottie or animation JSON files. Most Lotties are injected at runtime, so pass render=true (+5 credits) when the static call finds none. Returns up to 20 by default; pass limit (up to 200) for more.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The website URL | |
| fresh | No | Skip the 24-hour cache and re-extract the live page - use when the site just changed and a cached result would be stale. Charged normally; the fresh result replaces the cached copy. | |
| limit | No | Max Lottie files to return (default 20, up to 200). | |
| render | No | Force a real browser so the page's JavaScript runs before it is read. Slower, and adds 5 credits. Usually not needed: when the plain read comes back as a JavaScript app shell or the site refuses it (401/403/406) or timed out, the server already re-runs the page in a browser by itself at no extra cost, and usage.autoRender says so. Pass it for images, videos or Lottie that only load on scroll, with screenshot=true, or when a result is still thin after that automatic pass. If a 403 says the browser was refused too, the site cannot be extracted - do not retry. extract_code always runs in a real browser at no extra cost, so render=true is not needed there (only together with screenshot=true). On extract_design_tokens, render=true only permits the browser: the plain read still runs first, and the 5 credits are charged only if the browser was actually needed. | |
| screenshot | No | Requires render=true. Adds a screenshot field to the result: a public URL of a capture of the page (live 7 days), taken by the same browser that rendered it. Pass true for the 1440x900 viewport or 'full' for the entire page height. No extra credits beyond the render surcharge. Useful for showing the user what the extracted site looks like. | |
| full_output | No | Skip long-string trimming. Responses still cap at ~100KB total. | |
| response_format | No | How much to return. 'concise' keeps lists to 10 entries and strings short - right for a summary or a chat answer. 'detailed' returns everything the tool has (same as limit=200 + full_output=true). Omit for the default, which fits a typical chat context. The generated code is never trimmed in any mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| note | No | Coverage caveat: only Lotties declared in the initial HTML are found |
| count | No | |
| usage | No | Credit usage for the authed key (spent, remaining, monthly limit). |
| lotties | No | |
| truncation_note | No | Present when the result was trimmed to fit chat context - says what was dropped and how to get more (limit / full_output arguments, or the REST API). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the bar is lower. The description still adds behavior annotations don't carry: the +5 credit surcharge for render and the runtime-injection caveat that explains why a static pass may return nothing. It omits any note on caching or output shape, but the credit/cost context is genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the usage trigger, then the render fallback, then the limit caveat. No filler, and the most decision-relevant guidance (when to call, when to escalate to render) comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 100% schema coverage, an output schema present, and rich annotations, the description needs only the intent trigger and the render-escalation rule, both of which it supplies. It leaves pagination/return-shape explanation to the output schema, which is fine; nothing an agent needs to call correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the render/limit schemas are extremely thorough, so the schema does the heavy lifting. The description only restates the default 20 / up to 200 limit and the render cost, adding no syntax or semantics beyond what the schema already documents. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description frames the tool by intent ("Use when the user wants a site's Lottie or animation JSON files"), which pins the resource as specifically Lottie/animation JSON. That resource is distinct from siblings like extract_svgs, extract_videos and extract_audio, so an agent can tell it apart even though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear triggering condition (user wants Lottie/animation JSON) and a follow-up rule for the common failure mode ("pass render=true when the static call finds none"). It stops short of naming alternative extraction tools or stating when-not-to-use, keeping it at a strong-but-not-exhaustive level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_pageExtract a whole page as codeARead-onlyIdempotentInspect
Use after list_site_pages, or when the user wants one complete page (not a single section) as code. Returns every section of the page top to bottom as code in the requested framework, plus pagePreviewUrl: the whole page assembled, with a Download HTML button. Flat credits per page (see usage.creditsSpent), whatever its length; a page already extracted in the last 24 hours is free. Paid plans only: on a free plan this returns an error explaining why - relay it and point the user to extract_code for single sections. Call it once per page the user picked, one at a time, and tell them how many are left as you go. If complete is false, call again with the same url: the done sections come from cache and the page is not charged again. Build on each section's code the same way as extract_code's (never regenerate it), and give the user pagePreviewUrl for every page.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The page URL, e.g. linear.app/pricing - one of the pages from list_site_pages | |
| theme | No | Which colour scheme to extract (default light) | |
| framework | No | The code to generate for every section (default tailwind) |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| usage | No | Credit usage for the authed key (spent, remaining, monthly limit). |
| failed | No | Sections that could not be extracted, with the reason |
| complete | No | False when the page had more sections than fit in one call - call again with the same url (free) to finish |
| sections | No | Every section, top to bottom |
| framework | No | |
| sectionCount | No | |
| pagePreviewUrl | No | The whole page assembled in order, with a Download HTML button. Give it to the user |
| truncation_note | No | Present when the result was trimmed to fit chat context - says what was dropped and how to get more (limit / full_output arguments, or the REST API). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses billing behavior (flat credits per page, free within 24 hours), paid-plan restrictions, the free-plan error response, retry semantics when `complete` is false, cache behavior, and guidance not to regenerate section code. This is exactly the kind of operationally important context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and every sentence carries useful operational guidance, but it is a dense single paragraph mixing purpose, billing, retries, and workflow instructions. It could be structured more cleanly, though little is truly wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex paid extraction workflow, retry behavior, and sibling alternatives, the description covers what an agent needs before calling. An output schema exists, so it does not need to fully explain return values, and its mention of `pagePreviewUrl` and `complete` is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents `url`, `theme`, and `framework`, including enums and defaults. The description reinforces that the URL should come from `list_site_pages` and that the framework applies to every section, but it does not add substantial parameter syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: extract one complete page as code, returning every section top to bottom in the requested framework plus `pagePreviewUrl`. It explicitly distinguishes itself from `extract_code` by contrast with single sections, so an agent can route correctly among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: after `list_site_pages`, or when the user wants a complete page rather than a single section. It also states when-not/alternative guidance by directing users to `extract_code` for single sections and explains paid-plan-only behavior and the free-plan error path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_svgsExtract SVGsARead-onlyIdempotentInspect
Use when the user wants a site's icons or vector logos: inline SVGs as paste-ready markup plus external .svg file URLs. Not for: raster images (use extract_assets). Returns 20 by default with long markup trimmed; pass limit (up to 200) for more and full_output=true for complete SVG code.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The website URL | |
| fresh | No | Skip the 24-hour cache and re-extract the live page - use when the site just changed and a cached result would be stale. Charged normally; the fresh result replaces the cached copy. | |
| limit | No | Max SVGs to return (default 20, up to 200). | |
| render | No | Force a real browser so the page's JavaScript runs before it is read. Slower, and adds 5 credits. Usually not needed: when the plain read comes back as a JavaScript app shell or the site refuses it (401/403/406) or timed out, the server already re-runs the page in a browser by itself at no extra cost, and usage.autoRender says so. Pass it for images, videos or Lottie that only load on scroll, with screenshot=true, or when a result is still thin after that automatic pass. If a 403 says the browser was refused too, the site cannot be extracted - do not retry. extract_code always runs in a real browser at no extra cost, so render=true is not needed there (only together with screenshot=true). On extract_design_tokens, render=true only permits the browser: the plain read still runs first, and the 5 credits are charged only if the browser was actually needed. | |
| screenshot | No | Requires render=true. Adds a screenshot field to the result: a public URL of a capture of the page (live 7 days), taken by the same browser that rendered it. Pass true for the 1440x900 viewport or 'full' for the entire page height. No extra credits beyond the render surcharge. Useful for showing the user what the extracted site looks like. | |
| full_output | No | Return complete SVG markup instead of trimming long code. Responses still cap at ~100KB total. | |
| response_format | No | How much to return. 'concise' keeps lists to 10 entries and strings short - right for a summary or a chat answer. 'detailed' returns everything the tool has (same as limit=200 + full_output=true). Omit for the default, which fits a typical chat context. The generated code is never trimmed in any mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| svgs | No | |
| count | No | Total SVGs found (before any trimming) |
| usage | No | Credit usage for the authed key (spent, remaining, monthly limit). |
| truncation_note | No | Present when the result was trimmed to fit chat context - says what was dropped and how to get more (limit / full_output arguments, or the REST API). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, idempotent, open-world read (readOnlyHint/idempotentHint true, destructiveHint false), so the safety burden is lifted. The description adds genuinely useful behavior beyond that: long markup is trimmed by default, only 20 results come back unless asked, and full_output restores complete code. It does not cover caching or rate-limit behavior, and the limit/full_output defaults are partly restated from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight, front-loaded sentences: trigger first, exclusion second, output/defaults third. Slightly redundant with the schema on limit and full_output, which costs a bit of efficiency, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation; the description still tells the agent the response shape (inline markup + .svg URLs) and the trimming default. Combined with annotations covering safety, this is complete for a 7-parameter extraction tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented with rich guidance (fresh, render, screenshot, response_format all have detailed schema text). The description only restates the limit and full_output defaults, adding no syntax or format detail the schema lacks. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (extract SVGs) and immediately narrows the scope to a site's icons or vector logos, plus names the output form (inline markup plus external .svg URLs). It explicitly distinguishes itself from extract_assets, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a positive trigger ('when the user wants a site's icons or vector logos') and an explicit exclusion with the alternative named ('Not for: raster images (use extract_assets)'). Nothing about tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_videosExtract videosARead-onlyIdempotentInspect
Use when the user wants the videos on a page: / files, og:video, YouTube/Vimeo/Wistia/Loom embeds, direct video links and the JSON-LD VideoObject a page declares (source: "structured-data", how news sites describe a JS-mounted video), each tagged by source with a poster when declared. source: "embed" is a player page, not a downloadable file; a URL that is itself a video file comes back as the single result (source file). A YouTube, Vimeo, TikTok, Dailymotion or Loom video URL is answered from the URL alone with its player embed (source: "platform", no fetch, never pass render for these) - tell the user the file itself cannot be downloaded through MiroMiro. When any other page loads a JS player and declares nothing else, the hint names the player: call again with render=true (+5 credits) then. Returns up to 40 by default; pass limit (up to 200) for more.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The website URL | |
| fresh | No | Skip the 24-hour cache and re-extract the live page - use when the site just changed and a cached result would be stale. Charged normally; the fresh result replaces the cached copy. | |
| limit | No | Max videos to return (default 40, up to 200). | |
| render | No | Force a real browser so the page's JavaScript runs before it is read. Slower, and adds 5 credits. Usually not needed: when the plain read comes back as a JavaScript app shell or the site refuses it (401/403/406) or timed out, the server already re-runs the page in a browser by itself at no extra cost, and usage.autoRender says so. Pass it for images, videos or Lottie that only load on scroll, with screenshot=true, or when a result is still thin after that automatic pass. If a 403 says the browser was refused too, the site cannot be extracted - do not retry. extract_code always runs in a real browser at no extra cost, so render=true is not needed there (only together with screenshot=true). On extract_design_tokens, render=true only permits the browser: the plain read still runs first, and the 5 credits are charged only if the browser was actually needed. | |
| screenshot | No | Requires render=true. Adds a screenshot field to the result: a public URL of a capture of the page (live 7 days), taken by the same browser that rendered it. Pass true for the 1440x900 viewport or 'full' for the entire page height. No extra credits beyond the render surcharge. Useful for showing the user what the extracted site looks like. | |
| full_output | No | Skip long-string trimming. Responses still cap at ~100KB total. | |
| response_format | No | How much to return. 'concise' keeps lists to 10 entries and strings short - right for a summary or a chat answer. 'detailed' returns everything the tool has (same as limit=200 + full_output=true). Omit for the default, which fits a typical chat context. The generated code is never trimmed in any mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| note | No | Coverage caveat: only videos declared in the initial HTML are found - use render=true for JS-mounted players |
| count | No | Total videos found (before any trimming) |
| usage | No | Credit usage for the authed key (spent, remaining, monthly limit). |
| videos | No | |
| truncation_note | No | Present when the result was trimmed to fit chat context - says what was dropped and how to get more (limit / full_output arguments, or the REST API). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds behavior they cannot carry: the 24h cache, the +5 credit render surcharge, that platform URLs are answered without a fetch, that the file itself cannot be downloaded through MiroMiro, and the default 40 / max 200 return budget. This is unusually rich disclosure of cost and side-effect semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger and the primary source taxonomy, and nearly every sentence carries a distinct behavior (credits, caching, platform handling, pagination). It is dense with parentheticals and mid-sentence code spans, which slightly hurts scanability, but there is little genuinely dead text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description need not document return values, and annotations cover the safety profile, so the remaining burden is behavioral and cost guidance — all of which is supplied (cache, credits, automatic browser fallback, render re-call, pagination). Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description lifts above it by giving video-specific render semantics the schema only states generically ('never pass render for these' platform URLs) and restating the limit ceiling. It does not add much for url, fresh, screenshot or full_output, so it is not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and enumerates exactly what qualifies as a video on a page: <video>/<source>, og:video, YouTube/Vimeo/Wistia/Loom embeds, direct links, and JSON-LD VideoObject. This scope detail cleanly separates it from siblings like extract_audio, extract_lottie and extract_assets without the agent needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger ('Use when the user wants the videos on a page') and then gives hard when-not rules: never pass render for platform URLs, do not retry on a 403 that says the browser was refused, and call again with render=true only when the hint names a JS player. Alternative paths (platform-URL path vs fetch path vs structured-data path) are each tied to their condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_site_pagesList a website's pagesARead-onlyIdempotentInspect
Use when the user wants a whole website (or several of its pages) as code, or asks which pages a site has. Free on every plan (0 credits). Returns every page found (from the sitemap, else the homepage links), split into pages with their own layout (home, pricing, about...) and templates: groups of pages that share one layout (blog post x62, product x24) with example URLs - extracting one example gives that layout. suggested covers every layout once. Show the user the list and ask which pages they want before extracting anything: say how many pages and templates there are and what extract_page costs (creditsPerPage credits per page). Never extract every page of a big site unprompted. Then call extract_page once per chosen page. If the result has premium, the user's plan does not include whole-site extraction: tell them premium.reason and give them premium.upgradeUrl; single sections still work with extract_code.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The website, e.g. linear.app | |
| response_format | No | How much to return. 'concise' keeps lists to 10 entries and strings short - right for a summary or a chat answer. 'detailed' returns everything the tool has (same as limit=200 + full_output=true). Omit for the default, which fits a typical chat context. The generated code is never trimmed in any mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| pages | No | Pages with their own layout |
| usage | No | Credit usage for the authed key (spent, remaining, monthly limit). |
| source | No | sitemap | links - where the page list came from |
| premium | No | Present when the plan does not include whole-site extraction: reason (relay it) and upgradeUrl |
| summary | No | The scan in one sentence - a good opening for your reply |
| suggested | No | Unique pages + one example per template: every layout on the site once |
| templates | No | Groups of pages sharing one layout, biggest first. A guess from the URLs - check an example before promising the user the layouts are identical |
| truncated | No | |
| totalPages | No | |
| creditsPerPage | No | What extract_page charges per page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the tool is free on every plan (0 credits), where pages come from (sitemap, else homepage links), the exact result shape (`pages`, `templates`, `suggested`), template grouping behavior, and premium-gating behavior with `premium.reason` and `premium.upgradeUrl`. This is unusually rich behavioral context for a read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the trigger condition and is dense with useful workflow details. It is somewhat long as a single paragraph and could be easier to scan with bullets, but nearly every sentence earns its place and no significant repetition appears.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with an output schema and full annotation coverage, the description is complete: it covers trigger, source of data, result structure, cost, required user confirmation, next-step extraction, and premium failure handling. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both `url` and `response_format`. The description does not add syntax or format details beyond the schema; its cost discussion (`creditsPerPage`) applies to the follow-up extract_page call rather than this tool's parameters. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: listing a website's pages, either to get the site as code or to answer which pages exist. It clearly distinguishes the tool from extraction siblings by saying to call extract_page only after the user chooses pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit trigger conditions ('Use when the user wants a whole website... or asks which pages a site has'), a required workflow (show the list, state counts and costs, ask before extracting), an explicit prohibition ('Never extract every page of a big site unprompted'), and a fallback path when `premium` appears. Alternatives and exclusions are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Added
extract_page - Added
list_site_pages
1 tool update
- Changed
extract_code1 field changed- changed
Output schema / properties / sections / descriptionPrevious value: -"Every extractable section on the page - call again with one of these selectors for a specific part"New value: +"Every extractable section on the page - call again with one of these selectors for a specific part (an mm-range(...) selector is a block no single element wraps; pass it back the same way)"
1 tool update
- Changed
extract_code1 field changed- added
Output schema / properties / downloadUrlAdded value: +{ + "description": "The code exactly as returned, as a file in the requested format (.jsx, .vue, .html, .elementor.json for elementor, .liquid for shopify). Give it to the user so they always have the original file, even after you adapt the code", + "type": "string" +}
9 tool updates
- First observed
extract_assets - First observed
extract_audio - First observed
extract_brand - First observed
extract_code - First observed
extract_design_tokens - First observed
extract_fonts - First observed
extract_lottie - First observed
extract_svgs - First observed
extract_videos
Related MCP Connectors
See the rendered web: design tokens, fonts, animation timings, WebGL shaders and 3D from any URL.
DESIGN.md, clone prompts, HTML, screenshots, assets, fonts, colors and tech stack of any website.
Logo, colors, typefaces, tone of voice and CSS theme of any brand, read from its own website.
Build responsive HTML email campaigns from any brand website: design, QA, export.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceExtracts brand identity (colors, typography, spacing) from any website and generates HTML/CSS replicas or applies branding to templates.1MIT
- AlicenseAqualityBmaintenanceSearches design platforms for UI references and extracts design tokens such as colors, typography, spacing, and shadows from live websites.5MIT
- AlicenseNot gradedqualityAmaintenanceExtract design tokens, colors, typography, spacing and components from any live website, and compute design drift against an approved baseline. Exports DESIGN.md, DTCG, Tailwind and shadcn.5,798 npm3,878MIT
- AlicenseAqualityBmaintenanceAnalyzes and extracts design tokens, assets, and layout from live websites to enable AI clients to faithfully replicate them, with tools for screenshotting, component inspection, and pixel-diff verification.1423 npm4MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.