Skip to main content
Glama

OpenGraph MCP Server (og-mcp)

og‑mcp is a Model‑Context‑Protocol (MCP) server that makes every OpenGraph.io ( https://opengraph.io ) API endpoint available to AI agents (e.g. Anthropic Claude, Cursor, LangGraph) through the standard MCP interface.

Why? If you already use OpenGraph.io to unfurl links, scrape HTML, extract article text, or capture screenshots, you can now give the same capabilities to your autonomous agents without exposing raw API keys.

Global Installation

You can install this package globally via npm:

npm install -g opengraph-io-mcp

Related MCP server: @hauntapi/mcp-server

Quick Install

The easiest way to configure OpenGraph MCP for any supported client:

# Interactive mode - guides you through setup
npx opengraph-io-mcp-install

# Direct mode - specify client and app ID
npx opengraph-io-mcp-install --client cursor --app-id YOUR_APP_ID

Supported clients: cursor, claude-desktop, windsurf, vscode, zed, jetbrains

Claude Desktop Extension

For Claude Desktop users, you can also download the .mcpb extension for one-click installation from the Releases page.

Authentication

The hosted MCP server supports two authentication methods:

OAuth lets you authorize access through your OpenGraph.io dashboard without copying API keys into config files. The MCP client handles the entire browser login flow automatically.

Supported by: MCP clients that implement the Authorization Code + PKCE flow (Cursor, Claude Desktop 0.10+, VS Code with the MCP extension).

When the client connects with no credentials, the server returns 401 with a WWW-Authenticate header pointing to:

GET /.well-known/oauth-protected-resource
→ { "authorization_servers": ["https://dashboard-api.opengraph.io"] }

The client then fetches the authorization server metadata and starts the PKCE flow, redirecting your browser to https://dashboard.opengraph.io/oauth/consent where you log in and choose which API key to authorize.

No client-side config needed — the client discovers everything automatically.

Option 2 — x-app-id header (legacy / local dev)

Pass your App ID as an HTTP header. Suitable for local dev, CI, or clients that do not support OAuth.

Replace YOUR_OPENGRAPH_APP_ID with your OpenGraph.io App ID.


Client Configuration

All configurations below use the hosted HTTPS transport. OAuth is the recommended approach for shared/production use; the x-app-id header config is provided as a fallback.

OAuth (no static config needed)

For clients that support OAuth discovery, simply point at the hosted URL with no headers — the server will request authorization automatically:

{
  "mcpServers": {
    "opengraph": {
      "url": "https://mcp.opengraph.io/mcp"
    }
  }
}

x-app-id fallback

If your client does not support OAuth, or you prefer static config:

Claude Desktop

Config location:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "opengraph": {
      "url": "https://mcp.opengraph.io/mcp",
      "headers": {
        "x-app-id": "YOUR_OPENGRAPH_APP_ID"
      }
    }
  }
}

Claude Code

One-command installation:

claude mcp add --transport http --header "x-app-id: YOUR_OPENGRAPH_APP_ID" opengraph https://mcp.opengraph.io/mcp

Cursor

Config location: ~/.cursor/mcp.json

{
  "mcpServers": {
    "opengraph": {
      "url": "https://mcp.opengraph.io/mcp",
      "headers": {
        "x-app-id": "YOUR_OPENGRAPH_APP_ID"
      }
    }
  }
}

VS Code

Config location: .vscode/mcp.json (in your project directory)

VS Code supports input prompts for secure credential handling:

{
  "inputs": [
    {
      "type": "promptString",
      "id": "opengraph-app-id",
      "description": "OpenGraph App ID",
      "password": true
    }
  ],
  "servers": {
    "opengraph": {
      "type": "http",
      "url": "https://mcp.opengraph.io/mcp",
      "headers": {
        "x-app-id": "${input:opengraph-app-id}"
      }
    }
  }
}

Windsurf

Config location: ~/.codeium/windsurf/mcp_config.json

{
  "mcpServers": {
    "opengraph": {
      "url": "https://mcp.opengraph.io/mcp",
      "headers": {
        "x-app-id": "YOUR_OPENGRAPH_APP_ID"
      }
    }
  }
}

JetBrains AI Assistant

Add to your JetBrains AI Assistant MCP configuration:

{
  "mcpServers": {
    "opengraph": {
      "url": "https://mcp.opengraph.io/mcp",
      "headers": {
        "x-app-id": "YOUR_OPENGRAPH_APP_ID"
      }
    }
  }
}

Zed

Config location: ~/.config/zed/settings.json

Note: Zed uses context_servers instead of mcpServers:

{
  "context_servers": {
    "opengraph": {
      "transport": "http",
      "url": "https://mcp.opengraph.io/mcp",
      "headers": {
        "x-app-id": "YOUR_OPENGRAPH_APP_ID"
      }
    }
  }
}

Available Tools

Two authentication tiers: Data and Image Generation tools work with either OAuth or a simple x-app-id API key — including the stdio transport and the Claude Desktop extension. Site Audit and Link Preview tools require OAuth (hosted HTTPS transport only), since they bill against your organization's Site Audit plan rather than a single API key.

OpenGraph.io Data Tools

All scraping/metadata tools default to the v3 API which enables auto_render, auto_proxy, and retry by default for higher success rates on complex pages. The query and extract tools use v1.1 (see notes).

Tool Name

API Endpoint

Description

Documentation

Get OG Data

/api/3.0/site/<URL>

Fetch Open Graph metadata, HTML-inferred tags, and hybrid social preview data. Supports use_ai, ai_sanitize, load-more, proxy/retry, and all v3 smart defaults.

Docs

Get OG Scrape Data

/api/3.0/scrape/<URL>

Scrape raw HTML with full v3 rendering options including scroll-to-bottom, load-more clicks, and AI sanitization.

Docs

Get OG Screenshot

/api/3.0/screenshot/<URL>

Capture a screenshot. Supports full_page, dark_mode, capture_delay, navigationTimeout, hideSelectors, and custom viewport dimensions.

Docs

Get OG Query

/api/1.1/query/<URL>

Ask a natural-language question about a page's content. Uses v1.1 (100–200 credits/request) until billing path is updated for v3.

Docs

Get OG Extract

/api/1.1/extract/<URL>

Extract specific HTML elements (h1, p, a, img, etc.) by tag name. Stays on v1.1 — no v3 GET route exists for this endpoint.

Docs

Get OG Markdown

/api/3.0/markdown/<URL>

Convert any URL's HTML to clean Markdown. Strips nav/ads by default (only_main_content: true) and supports include_tags/exclude_tags selectors. For long pages, pass query with chunking to get back only the relevant passages, ranked, rather than the whole document. include_links/include_images/include_headings return structured link, image, and outline data. Returns page metadata, character and token usage, and — with ai_sanitize — a prompt-injection safety report.

Docs

Language detection: All tools send accept_lang: auto by default, which mirrors the request's Accept-Language header. Pass an explicit BCP 47 tag (e.g. en-US, fr) to override.

Requires OAuth 2.1 (see Authentication) and an active Site Audit plan. These tools are only available over the hosted HTTPS transport — they are not available via the x-app-id header or the stdio/Claude Desktop extension, since they need your organization identity, not just an API key.

Tool Name

Description

Discover Site URLs

Crawl a domain (sitemap + link discovery) and return every page found, grouped by depth, along with your remaining monthly audit quota.

Start Site Audit

Kick off an async, multi-page SEO/social audit. Pass an explicit urls[] list (from discovery, a sitemap, or a codebase route scan) or let the backend crawl the domain itself. Returns an auditId immediately.

Get Site Audit Status

Poll an in-progress audit (QUEUEDCRAWLINGSCORINGCOMPLETE).

Get Site Audit Report

Retrieve the full report once complete: overall score (0–100), an AI-generated executive summary, prioritized fixes, per-page scores, and Open Graph coverage rates.

Preview Page Audit

Instant, synchronous single-URL quality check with score + issues. Does not consume audit quota.

Get Link Preview

Instant, synchronous check of how a URL will render when shared — returns Facebook, Twitter/X, LinkedIn, and Google preview cards plus a quality score and fix list. Does not consume audit quota.

Delete Site Audit

Permanently delete an audit and all of its results. Cannot be undone.

Monitoring & History Tools

Recurring audits, trend tracking, and change reporting. OAuth required; setMonitoringSchedule additionally requires the Site Audit scheduling entitlement.

Tool Name

Description

List Websites

Every site the organization has audited, with current score and trend against the previous run, critical issue and regression counts, known page count, and next scheduled run. Pass a websiteId for one in detail.

List Site Audits

Past audits, newest first, filterable by domain, status, date range, or website.

Get Site Audit Changes

What changed since the previous run — new, fixed, and regressed issues, pages added or removed, and the score delta — plus prioritized issue groups. A regressed issue is one previously verified as fixed that has come back; this is tracked across runs by durable issue identity, not by diffing two lists.

Get Monitoring Schedule

A website's recurring-audit settings: frequency, anchored day and time, paused state, next run.

Set Monitoring Schedule

Enable, change, or remove recurring audits. Commits ongoing page-quota spend and can trigger alert email. enabled: false deletes the configuration — use paused: true to keep it. Alert recipients are dashboard-only.

Get Connection Context

Which organization this connection acts for, and which Site Audit features its plan allows. The organization is chosen during authorization and is what every tool defaults to.

Fix List Tools

Turn an audit into work a developer can action. OAuth required.

Tool Name

Description

List Fix Items

Proposed metadata changes and notes saved against an audit, grouped by page, each with an ID.

Save Fix Items

Record proposed changes for one page. Overwrites existing items for the same page and field. A blank or unchanged proposedValue is rejected — it means "remove" upstream, so use Delete Fix Item deliberately.

Delete Fix Item

Permanently remove one entry. Fix items are hand-authored and are not regenerated by re-auditing.

Export Fix Items CSV

The fix list as CSV text for handoff. PDF export is available in the dashboard only.

Email Site Audit Report

Email the report with PDF attachments to the authenticated account's own address. Sends real email on every call and is not idempotent; the recipient cannot be chosen.

Image Generation Tools

Tool Name

Description

Generate Image

Create professional images: illustrations, diagrams (Mermaid/D2/Vega), icons, social cards, or QR codes

Iterate Image

Refine, modify, or create variations of existing generated images

Inspect Image Session

Retrieve session metadata and asset history for image generation sessions

Export Image Asset

Export generated image assets as inline base64, with optional disk write when running locally

Image Generation

The og-mcp server includes powerful AI-driven image generation capabilities, perfect for creating social media cards, architecture diagrams, icons, and more.

Generate Image

Create images from natural language prompts or diagram code.

Supported Image Types (kind):

  • illustration - General-purpose AI-generated images

  • diagram - Technical diagrams from Mermaid, D2, or Vega syntax

  • icon - App icons and logos

  • social-card - OG images optimized for social sharing

  • qr-code - QR codes with optional styling

Preset Aspect Ratios:

  • Social: og-image, twitter-card, twitter-post, linkedin-post, facebook-post, instagram-square, instagram-portrait, instagram-story, youtube-thumbnail

  • Standard: wide, square, portrait

  • Icons: icon-small, icon-medium, icon-large

Style Presets: github-dark, github-light, notion, vercel, linear, stripe, neon-cyber, pastel, minimal-mono, corporate, startup, documentation, technical

Diagram Templates: auth-flow, oauth2-flow, crud-api, microservices, ci-cd, gitflow, database-schema, state-machine, user-journey, cloud-architecture, system-context

Example Usage:

// Generate a social card
generateImage({
  prompt: "A modern tech startup hero image with abstract geometric shapes",
  kind: "social-card",
  aspectRatio: "og-image",
  stylePreset: "vercel",
  brandColors: ["#0070F3", "#000000"]
})

// Generate a diagram from Mermaid syntax
generateImage({
  prompt: "graph TD; A[User] --> B[API]; B --> C[Database]",
  kind: "diagram",
  diagramSyntax: "mermaid",
  stylePreset: "github-dark"
})

Iterate Image

Refine or modify an existing generated image.

Use cases:

  • Edit specific parts: "change the background to blue"

  • Apply style changes: "make it more minimalist"

  • Fix issues: "remove the text", "make the icon larger"

  • Crop to specific coordinates

Example:

iterateImage({
  sessionId: "uuid-from-generate",
  assetId: "uuid-from-generate",
  prompt: "Change the primary color to #0033A0 and add a subtle drop shadow"
})

Inspect Image Session

Review session details and find asset IDs for iteration.

Returns:

  • Session metadata (creation time, name, status)

  • List of all assets with prompts, toolchains, and status

  • Parent-child relationships showing iteration history

Example:

inspectImageSession({
  sessionId: "uuid-from-generate"
})

Export Image Asset

Export a generated image asset by session and asset ID. Returns the image inline as base64 along with metadata (format, dimensions, size).

When running locally (stdio transport), you can optionally provide a destinationPath to save the image to disk. On hosted/HTTP transport, the path is ignored and the image is returned inline only.

Examples:

// Inline only (works everywhere)
exportImageAsset({
  sessionId: "uuid-from-generate",
  assetId: "uuid-from-generate"
})

// Save to disk (stdio/local only)
exportImageAsset({
  sessionId: "uuid-from-generate",
  assetId: "uuid-from-generate",
  destinationPath: "/Users/me/project/images/hero.png"
})

Guided Workflows (Prompts)

In addition to tools, the server exposes named prompts — pre-built, multi-step workflows that MCP clients can surface directly to users (e.g. as slash commands) or that agents can invoke by name for a more reliable result than freeform tool-calling.

Prompt Name

What it does

analyze-webpage

Fetches a page's metadata and readable content in parallel, then summarizes or answers a specific question about it.

extract-structured-data

Extracts named fields (title, price, SKU, etc.) from a page using CSS selectors — ideal for ecommerce, job listings, and articles.

get-page-content

Converts a URL to clean readable text/Markdown, stripping boilerplate — ready to read or pass to another model.

run-site-audit

Full site-audit workflow: asks the user their preferred scope (whole site / core pages / specific section / codebase scan), discovers URLs if needed, starts the audit, polls status, and returns a readable report. Requires OAuth.

create-branded-diagram

Guided workflow for creating diagrams (flowchart, sequence, architecture, ER, state) that match your brand identity.

iterate-and-refine

Best practices for iterating on a previously generated image to reach the desired result.

create-asset-set

Generates a visually consistent set of icons, social cards, diagrams, or illustrations.

quick-icon

Quickly generates a single icon with sensible defaults.

How it works

og-mcp Architecture Diagram Diagram generated with og-mcp's image generation tools

The og-mcp server acts as a bridge between AI clients (like Claude or other LLMs) and the OpenGraph.io API:

  1. AI client makes a tool call to one of the available MCP functions

  2. og-mcp server receives the request and formats it for the OpenGraph.io API

  3. OpenGraph.io processes the request and returns data

  4. og-mcp transforms the response into a format suitable for the AI client

  5. AI client receives the structured data ready for use

This abstraction prevents exposing API keys directly to the AI while providing full access to OpenGraph.io capabilities.

Setup and Running

  1. Clone this repository

  2. Install dependencies:

    npm install
  3. Build the TypeScript code:

    npm run build
  4. Start the server:

    npm start

The server will run on port 3010 by default (configurable via PORT environment variable).

Configuration

OAuth 2.1 (hosted HTTP server)

When running the Streamable HTTP server (npm start), set these env vars:

# Required: URL of the apifur-api JWKS endpoint
OAUTH_JWKS_URL=https://dashboard-api.opengraph.io/oauth/jwks.json

# Optional: Issuer string to validate in bearer tokens (defaults to OAUTH_ISSUER)
OAUTH_ISSUER=https://dashboard-api.opengraph.io

# Optional: Expected audience claim (default: https://mcp.opengraph.io/mcp)
OAUTH_AUDIENCE=https://mcp.opengraph.io/mcp

# Optional: Override the canonical MCP resource URL returned in 401 headers
MCP_RESOURCE_URL=https://mcp.opengraph.io/mcp

When OAUTH_JWKS_URL is not set, bearer-token verification is disabled and only the x-app-id fallback is active.

x-app-id fallback / local dev

Omit the OAuth env vars and use a static App ID instead:

OPENGRAPH_APP_ID=your_app_id_here
# or
APP_ID=your_app_id_here

This also works as the fallback for any HTTP request that includes an x-app-id header.

Stdio transport

For command-line usage pass the App ID directly:

opengraph-io-mcp --app-id YOUR_APP_ID

Transport Options

For command-line usage and npm global installation, the server can be run with stdio transport:

npm run start:stdio

You can pass the OpenGraph API key directly via command-line argument:

npm run start:stdio -- --app-id YOUR_APP_ID

When installed globally:

opengraph-io-mcp --app-id YOUR_APP_ID

This mode allows the server to be invoked directly by other applications that use MCP.

HTTP/SSE Transport

This method runs a web server that can be accessed over HTTP and uses SSE for streaming:

npm start

Troubleshooting

  • If tools aren't showing up, check that the server is running and the URL is correctly configured in Cursor

  • Check the server logs for any connection or authorization issues

  • Verify that Claude has been instructed to use the specific tools by name

Available Tools

28 tools
deleteFixItemA
DestructiveIdempotent

Permanently remove one entry from an audit's fix list.

Fix items are hand-authored and cannot be regenerated by re-running the audit, so confirm with the user first. Item IDs come from listFixItems.

ParametersJSON Schema
NameRequiredDescriptionDefault
auditIdYesAudit ID.
fixItemIdYesFix item ID from listFixItems.

Output Schema

ParametersJSON Schema
NameRequiredDescription
auditIdYes
deletedYes
fixItemIdYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the operation as destructive and idempotent, so the description need not repeat those. It adds meaningful context by stating the deletion is permanent and the fix items cannot be regenerated by re-running the audit, which informs the agent about irreversible consequences beyond the annotation flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, stating the core action in the first sentence. The second sentence earns its place by explaining irreversibility and providing a confirmation instruction, with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter destructive action with an output schema and strong annotations, the description covers what the tool does, how to confirm usage, and where to source the item ID. Nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is adequate. The description adds real value by specifying that fixItemId must come from listFixItems, preventing arbitrary or guessed IDs. auditId remains minimally documented, but the high schema coverage keeps this dimension strong.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('remove') and a clear resource ('entry from an audit's fix list'), making the operation unmistakable. It also distinguishes the tool from sibling fix-list tools like listFixItems and saveFixItems by framing this as a permanent deletion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides actionable usage guidance: confirm with the user before deleting, and obtain fixItemId from listFixItems. It does not explicitly enumerate when not to use this tool versus other deletion tools like deleteSiteAudit, but the guidance is clear and sufficient for the intended use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

deleteSiteAuditA
DestructiveIdempotent

Permanently delete one audit and all of its results — page scores, issues, and any fix items saved against it.

This cannot be undone. The audit disappears from history and from the website's trend. Re-running an audit produces a new one; it does not restore this. Confirm with the user and delete exactly the audit they named.

ParametersJSON Schema
NameRequiredDescriptionDefault
auditIdYesThe audit to delete.

Output Schema

ParametersJSON Schema
NameRequiredDescription
auditIdYes
deletedYes
alreadyGoneYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations (destructiveHint=true) by detailing the permanent consequences: results disappear, history and trend are affected, and re-running produces a new audit that does not restore the old one. It also adds a user-confirmation requirement, which is critical for a destructive operation. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with the core action in the first sentence, followed by a concise explanation of irreversibility and the confirm-with-user instruction. Every sentence adds value, with no redundancy or unnecessary details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool, the description is fully complete: it states what is deleted, the irreversible nature, the impact on history and trend, and the need for user confirmation. Since an output schema exists, the lack of return-value explanation is not a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides a clear description for auditId ('The audit to delete.') with 100% coverage. The description reiterates that the exact named audit should be deleted, which adds minimal extra meaning. It does not introduce new parameter details, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb (delete), the resource (audit), and the full scope (all results, page scores, issues, fix items). It is easily distinguishable from sibling tools like deleteFixItem or startSiteAudit, as it explicitly targets audits and their associated data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context on when to use it (to permanently delete an audit) and includes a safety instruction to confirm with the user before deleting. It does not explicitly list alternatives or when not to use it, but the specificity of 'audit' versus other tools makes the usage unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discoverSiteUrlsA
Read-onlyIdempotent

Discover all pages on a domain by crawling it and parsing its sitemap. Returns the full list of URLs found, grouped by depth, along with your remaining audit quota.

Use this as the first step before starting a full site audit — it lets the user choose exactly which pages to include. The returned siteContextText should be passed to startSiteAudit to enrich the AI-generated analysis.

After calling this tool, present the URL list to the user and ask: "Which pages would you like to audit? You can say 'all', pick specific numbers, or describe a section (e.g. 'all blog posts' or 'just the homepage and product pages')."

Pick the right tool: discoverSiteUrls → Step 1: find and review all pages on the domain startSiteAudit → Step 2: audit the pages the user selected previewPageAudit → Skip discovery — instantly audit a single specific URL

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesThe domain to crawl (e.g. https://example.com). Include the protocol.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlsYesAll discovered URLs — pass a subset to startSiteAudit as the urls array
domainYes
totalFoundYesTotal URLs found across crawl and sitemap
remainingQuotaNoPages remaining in your monthly audit quota
siteContextTextNoHomepage text captured during discovery — pass this to startSiteAudit to enrich AI analysis

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds valuable behavioral context: crawling and sitemap parsing, return of URL list grouped by depth, remaining audit quota, and 'siteContextText' to be passed to startSiteAudit. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: purpose first, then return info, usage instructions, and sibling differentiation. Every sentence adds value without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully explains the tool's input (one domain parameter), output (URLs grouped by depth, audit quota, siteContextText), and how to use the output (pass siteContextText to startSiteAudit, discuss with user). With an output schema present, the description covers all necessary context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with one parameter 'domain' already described as needing protocol. The description does not add new semantic meaning beyond the schema; it repeats the requirement to include the protocol. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Discover all pages on a domain by crawling it and parsing its sitemap.' It uses a specific verb 'discover' and resource 'all pages on a domain'. The sibling differentiation section explicitly distinguishes it from startSiteAudit and previewPageAudit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use: 'Use this as the first step before starting a full site audit.' It also provides a post-call instruction: present URL list to user and ask for page selection. The 'Pick the right tool' section gives clear alternatives and steps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

emailSiteAuditReportA
Destructive

Email an audit report, with PDF attachments, to the authenticated account's own address.

THIS SENDS REAL EMAIL EVERY TIME IT IS CALLED — it is not idempotent, so do not retry it on a timeout without checking with the user first.

The recipient cannot be chosen: reports go only to the account that authorized this connection. Sending to a colleague or client is a dashboard action. Requires the PDF export entitlement, and is rate limited.

ParametersJSON Schema
NameRequiredDescriptionDefault
auditIdYesThe completed audit to send.

Output Schema

ParametersJSON Schema
NameRequiredDescription
auditIdYes
filenamesYes
recipientYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It goes well beyond the annotations by warning 'THIS SENDS REAL EMAIL EVERY TIME IT IS CALLED,' stating non-idempotence, and advising not to retry on timeout without user confirmation. It also adds recipient, entitlement, and rate-limit constraints that annotations alone do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The primary action is front-loaded, the critical side-effect warning is prominent, and every subsequent sentence adds operational value. There is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the annotations, schema, and output schema, the description supplies all remaining operational facts needed for safe invocation: fixed recipient, real-email side effect, retry guidance, entitlement, and rate limiting. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single auditId parameter is already fully described in the schema as 'The completed audit to send,' and schema coverage is 100%. The description reinforces that an audit report is emailed but adds no new parameter-level semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Email an audit report, with PDF attachments, to the authenticated account's own address.' It also distinguishes itself from view/export siblings by explicitly constraining the recipient to the authenticated account.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: reports go only to the authenticated account, sending to a colleague/client is a dashboard action, and the tool requires the PDF export entitlement and is rate limited. It does not explicitly name an alternative tool, but the exclusions are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

exportFixItemsCsvA
Read-onlyIdempotent

Export an audit's fix list as CSV — the developer-handoff format, with one row per proposed change.

Returns the CSV as text you can read, transform, or write to a file. PDF export is dashboard-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
auditIdYesAudit ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
csvYes
auditIdYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered. The description adds useful behavioral context: the CSV is returned as text, can be consumed programmatically, and represents one row per proposed change. This goes beyond what the annotations alone express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no wasted words. The first sentence states the core operation and format; the second explains what can be done with the output and adds the PDF limitation. It does not repeat schema fields or annotation information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only export tool, the description covers everything needed to invoke it correctly: the required auditId is in the schema, the response format is stated as CSV text, and the PDF limitation is explicit. An output schema is present, so detailed return structure does not need to be duplicated here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, auditId, is fully documented in the input schema with 100% coverage. The description does not add further detail about the parameter, but the schema already carries the semantic burden. This is the appropriate baseline case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the exact verb ('Export'), resource ('an audit's fix list'), and format ('as CSV'), and adds the semantic 'developer-handoff format, with one row per proposed change.' This distinguishes it from sibling listFixItems and other audit-related tools. The CSV-vs-PDF caveat further disambiguates what this tool produces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly communicates the use case: obtain a machine-readable CSV fix list that can be read, transformed, or written to a file. It also gives an exclusion by stating that PDF export is dashboard-only. It does not explicitly name an alternative sibling tool, but the CSV-versus-PDF distinction is sufficient routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

exportImageAssetA
DestructiveIdempotent

Export a generated image asset by session and asset ID.

Returns the image inline as base64 along with metadata (format, dimensions, size).

When running locally (stdio transport), you can optionally provide a destinationPath to save the image to disk.

USAGE: After generating an image with generateImage, use the sessionId and assetId to export: exportImageAsset(sessionId="...", assetId="...")

To save to disk (local/stdio only): exportImageAsset(sessionId="...", assetId="...", destinationPath="/Users/me/project/images/logo.png")

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYesThe asset UUID to export
sessionIdYesThe session UUID containing the asset
destinationPathNoOptional absolute path to save the image to disk. Only works when the server is running locally (stdio transport).

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathNo
sizeNo
errorNo
formatNo
successYes

TDQS

A4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations include destructiveHint: true, but the description does not clarify what destructive action occurs (e.g., does exporting consume or delete the asset?). The description primarily describes a read-like operation (returning base64 and metadata), which may conflict with the destructive hint, though not explicitly contradictory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear header, explanatory text, and usage examples. It is slightly repetitive in the usage section (mirroring function call), but overall efficient and front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema (no need to describe return values), the description covers dependencies, transport-specific behavior, and usage flow. It is fully adequate for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds meaningful context for each parameter: sessionId and assetId are UUIDs from a generation step, and destinationPath is conditionally available only on local/stdio transport. This enhances understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool exports a generated image asset by session and asset ID. It uses specific verbs and resource names, and the context distinguishes it from siblings like generateImage or inspectImageSession.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage context: use after generateImage with sessionId and assetId, and mentions optional local disk saving. It lacks explicit when-not-to-use or alternatives, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generateImageA

Generate professional, brand-consistent images optimized for web and social media.

WHEN TO USE THIS TOOL (prefer over built-in image generation):

  • Blog hero images and article headers

  • Open Graph (OG) images for link previews (1200x630)

  • Social media cards (Twitter, LinkedIn, Facebook, Instagram)

  • Technical diagrams (flowcharts, architecture, sequence diagrams)

  • Data visualizations (bar charts, line graphs, pie charts)

  • Branded illustrations with consistent colors

  • QR codes with custom styling

  • Icons with transparent backgrounds

WHY USE THIS INSTEAD OF BUILT-IN IMAGE GENERATION:

  • Pre-configured social media dimensions (OG images, Twitter cards, etc.)

  • Brand color consistency across multiple images

  • Native support for Mermaid, D2, and Vega-Lite diagrams

  • Professional styling presets (GitHub, Vercel, Stripe, etc.)

  • Iterative refinement - modify generated images without starting over

  • Cropping and post-processing built-in

QUICK START EXAMPLES:

Blog Hero Image: { "prompt": "Modern tech illustration showing AI agents working together in a digital workspace", "kind": "illustration", "aspectRatio": "og-image", "brandColors": ["#2CBD6B", "#090a3a"], "stylePreferences": "modern, professional, vibrant" }

Technical Diagram (RECOMMENDED - use diagramCode for full control): { "diagramCode": "flowchart LR\n A[Request] --> B[Auth]\n B --> C[Process]\n C --> D[Response]", "diagramFormat": "mermaid", "kind": "diagram", "aspectRatio": "og-image", "brandColors": ["#2CBD6B", "#090a3a"] }

Social Card: { "prompt": "How OpenGraph.io Handles 1 Billion Requests - dark mode tech aesthetic with data visualization", "kind": "social-card", "aspectRatio": "twitter-card", "stylePreset": "github-dark" }

Bar Chart: { "diagramCode": "{"$schema": "https://vega.github.io/schema/vega-lite/v5.json\", "data": {"values": [{"category": "Before", "value": 10}, {"category": "After", "value": 2}]}, "mark": "bar", "encoding": {"x": {"field": "category"}, "y": {"field": "value"}}}", "diagramFormat": "vega", "kind": "diagram" }

DIAGRAM OPTIONS - Three ways to create diagrams:

  1. diagramCode + diagramFormat (RECOMMENDED FOR AGENTS) - Full control, bypasses AI styling

  2. Natural language in prompt - AI generates diagram code for you

  3. Pure syntax in prompt - Provide Mermaid/D2/Vega directly (AI may style it)

Benefits of diagramCode:

  • Bypasses AI generation/styling - no risk of invalid syntax

  • You control the exact syntax - iterate on errors yourself

  • Clear error messages if syntax is invalid

  • Can omit 'prompt' entirely when using diagramCode

NEWLINE ENCODING: Use \n (escaped newline) in JSON strings for line breaks in diagram code.

diagramCode EXAMPLES (copy-paste ready):

Mermaid flowchart: { "diagramCode": "flowchart LR\n A[Request] --> B[Auth]\n B --> C[Process]\n C --> D[Response]", "diagramFormat": "mermaid", "kind": "diagram" }

Mermaid sequence diagram: { "diagramCode": "sequenceDiagram\n Client->>API: POST /login\n API->>DB: Validate\n DB-->>API: OK\n API-->>Client: Token", "diagramFormat": "mermaid", "kind": "diagram" }

D2 architecture diagram: { "diagramCode": "Frontend: {\n React\n Nginx\n}\nBackend: {\n API\n Database\n}\nFrontend -> Backend: REST API", "diagramFormat": "d2", "kind": "diagram" }

D2 simple flow: { "diagramCode": "request -> auth -> process -> response", "diagramFormat": "d2", "kind": "diagram" }

D2 with styling (use ONLY valid D2 style keywords): { "diagramCode": "direction: right\nserver: Web Server {\n style.fill: "#2CBD6B"\n style.stroke: "#090a3a"\n style.border-radius: 8\n}\ndatabase: PostgreSQL {\n style.fill: "#090a3a"\n style.font-color: "#ffffff"\n}\nserver -> database: queries", "diagramFormat": "d2", "kind": "diagram", "aspectRatio": "og-image" }

D2 IMPORTANT NOTES:

  • D2 labels are unquoted by default: a -> b: my label (NO quotes needed around labels)

  • Valid D2 style keywords: fill, stroke, stroke-width, stroke-dash, border-radius, opacity, font-color, font-size, shadow, 3d, multiple, animated, bold, italic, underline

  • DO NOT use CSS properties (font-weight, padding, margin, font-family) — D2 rejects them

  • DO NOT use vars.* references unless you define them in a vars: {} block

Vega-Lite bar chart (JSON as string): { "diagramCode": "{"$schema": "https://vega.github.io/schema/vega-lite/v5.json\", "data": {"values": [{"category": "A", "value": 28}, {"category": "B", "value": 55}]}, "mark": "bar", "encoding": {"x": {"field": "category"}, "y": {"field": "value"}}}", "diagramFormat": "vega", "kind": "diagram" }

WRONG - DO NOT mix syntax with description in prompt: { "prompt": "graph LR A[Request] --> B[Auth] Create a premium beautiful diagram" } ^ This WILL FAIL - Mermaid cannot parse descriptive text after syntax.

WHERE TO PUT STYLING:

  • Visual preferences → "stylePreferences" parameter

  • Colors → "brandColors" parameter

  • Project context → "projectContext" parameter

  • NOT in "prompt" when using diagram syntax

OUTPUT STYLES:

  • "draft" - Fast rendering, minimal processing

  • "standard" - AI-enhanced with brand colors (recommended for diagrams)

  • "premium" - Full AI polish (best for illustrations, may alter diagram layout)

CROPPING OPTIONS:

  • autoCrop: true - Automatically remove transparent edges

  • Manual: cropX1, cropY1, cropX2, cropY2 - Precise pixel coordinates

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoThe type of image to createillustration
modelNoModel: 'gpt-image-1.5', 'gemini-flash', 'gemini-pro'
cropX1NoManual crop: top-left X
cropX2NoManual crop: bottom-right X
cropY1NoManual crop: top-left Y
cropY2NoManual crop: bottom-right Y
labelsNoLabels for templates/diagrams
promptNoFor diagrams: Either natural language description OR pure Mermaid/D2/Vega syntax. For illustrations: Describe the image content, style, and composition. Optional when using diagramCode + diagramFormat.
qualityNoQuality setting
autoCropNoAuto-crop transparent edges
templateNoTemplate name for template-based graphics
aspectRatioNoPreset aspect ratio (e.g., 'og-image' for 1200x630)
brandColorsNoBrand colors as hex codes (e.g., ['#0033A0', '#FF8C00'])
diagramCodeNoPre-validated diagram syntax (Mermaid/D2/Vega-Lite JSON). When provided, bypasses AI generation/styling and renders directly. Caller is responsible for valid syntax. Must be used with diagramFormat.
outputStyleNoPolish level: 'draft' (fast), 'standard' (AI-enhanced), 'premium' (full AI polish)
stylePresetNoPreset style with brand colors
transparentNoRequest transparent background
cornerRadiusNoCorner radius for rounded corners
diagramFormatNoFormat of the diagramCode. Required when diagramCode is provided. Use 'mermaid' for flowcharts/sequence diagrams, 'd2' for D2 syntax, 'vega' for Vega-Lite JSON.
diagramSyntaxNoPreferred diagram syntax
projectContextNoDescription of the project this image is for
autoCropPaddingNoPadding for auto-crop (default: 20)
diagramTemplateNoPre-built diagram template
referenceAssetIdNoAsset UUID to use as style reference
stylePreferencesNoStyle preferences: 'modern', 'minimalist', 'corporate', etc.
layoutPreservationNoHow strictly to preserve layout during premium polish

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
widthNo
formatNo
heightNo
statusYes
assetIdYes
sessionIdYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description extensively discloses behaviors: three methods for diagram creation, newline encoding, D2 syntax rules, output styles (draft/standard/premium), cropping options, and warnings about mixing syntax. Annotations indicate readOnlyHint=false and destructiveHint=false, and the description aligns with these, providing additional context about iterative refinement and non-destructive edits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is excessively long, containing multiple sections, numerous examples, and detailed warnings. While well-organized with headings, it lacks conciseness; an AI agent would need to parse a large amount of text to extract key information. Front-loading is present but the sheer volume makes it inefficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (26 parameters, 0 required, output schema exists), the description is highly complete. It covers all major usage patterns, error-prone cases (e.g., mixing syntax), parameter interdependencies, and provides practical examples. The output schema exists, so return value explanation is not required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 100% schema description coverage, the description adds substantial value beyond the schema: it explains how diagramCode and prompt interact, provides copy-paste ready examples for each diagram format, details aspect ratio presets, stylePreset meanings, outputStyle effects, and cropping usage. This greatly enhances understanding of parameter usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Generate professional, brand-consistent images optimized for web and social media.' It lists specific use cases (blog heroes, OG images, social cards, diagrams, etc.) and provides quick start examples, distinguishing it from sibling tools which are URL/image inspection tools, not generation tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a section 'WHEN TO USE THIS TOOL (prefer over built-in image generation)' listing explicit scenarios and 'WHY USE THIS INSTEAD OF BUILT-IN IMAGE GENERATION' with reasons. It provides clear context for when to use this tool versus alternatives, and since siblings are not image generation tools, the guidelines are unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getConnectionContextA
Read-onlyIdempotent

Report which OpenGraph organization this connection is working on behalf of, and which Site Audit features its plan allows.

Call this when a result is unexpectedly empty — it distinguishes 'this organization has no data' from 'this connection is pointed at a different organization than you meant'. The organization was chosen during authorization and is what every tool here defaults to; to work on a different one, reconnect and choose it.

Also use it before suggesting a feature: entitlements here say whether audits, recurring monitoring, PDF export, and link preview are actually available on the plan.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
entitlementsYes
organizationIdYes
organizationNameYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is read-only and idempotent, and the description adds valuable behavioral context: the organization is fixed during authorization, all tools default to it, and reconnecting is the way to change it. It also clarifies that entitlements determine feature availability, which helps an agent interpret results correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a concise statement of what the tool reports, then gives two concrete use cases. Each paragraph serves a distinct purpose and no sentence is redundant or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter introspection tool with an output schema, the description covers everything an agent needs: what the tool reports, when to call it, why empty results may appear, and how entitlements affect feature recommendations. The output schema handles return-value details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and schema coverage is 100%, so there is nothing for the description to add about parameter meaning. The baseline of 4 is appropriate here because the description cannot meaningfully elaborate on an empty parameter list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Report') and a clear resource: the connection's OpenGraph organization and plan entitlements. This distinguishes it from all sibling tools, which focus on audits, websites, images, or fix items.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Call this when a result is unexpectedly empty' and 'Also use it before suggesting a feature.' It does not explicitly name alternative tools or exclusion conditions, but it clearly explains the diagnostic scenarios and how the information affects subsequent actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getLinkPreviewA
Read-onlyIdempotent

Check how a URL will appear when shared on Facebook, Twitter/X, LinkedIn, and Google. Returns platform-specific preview cards showing the title, description, and image each platform will render, plus a quality score (0–100) and a list of issues to fix.

Use this tool when the user asks:

  • 'check the link preview for example.com'

  • 'how does this page look when shared on social media?'

  • 'check my og tags'

  • 'what will this look like on Twitter / Facebook / LinkedIn?'

This is synchronous — results are returned immediately. Does not count against your monthly audit quota. Requires OAuth authentication.

For a full multi-page audit with per-page scoring and an AI report, use startSiteAudit instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe full URL to preview (e.g. https://example.com/pricing).

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
scoreYesQuality score 0–100
issuesNoIssues found — fix these to improve scores and previews
platformsYesWhat each platform will display when this URL is shared
scoreLabelYesScore tier: Well Optimized / Good / Room for Improvement / Needs Attention / Poor

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint. Description adds synchronous nature, immediate results, that it does not count against monthly audit quota, and requires OAuth authentication. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, no wasted words, front-loaded with core purpose, then usage triggers, then behavioral notes, then alternative. Perfectly structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single parameter, good annotations, and an output schema, the description covers purpose, usage, behavioral constraints, and the return format in a summary. Completeness is high.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single 'url' parameter that already has a description. The description does not add additional parameter semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Check' and resource 'URL', specifies the platforms (Facebook, Twitter/X, LinkedIn, Google), and distinguishes itself from sibling tool 'startSiteAudit' for full multi-page audits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly lists example user queries that trigger the tool ('check the link preview', 'how does this page look when shared', 'check my og tags', etc.) and provides an explicit alternative ('For a full multi-page audit... use startSiteAudit instead').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getMonitoringScheduleA
Read-onlyIdempotent

Read a website's recurring-audit schedule: how often it runs, the anchored day and time, whether it is paused, when the next run is due, and whether newly discovered pages are included.

Returns no schedule when the website is not monitored. Website IDs come from listWebsites.

ParametersJSON Schema
NameRequiredDescriptionDefault
websiteIdYesWebsite ID from listWebsites.

Output Schema

ParametersJSON Schema
NameRequiredDescription
scheduleNo
websiteIdYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context by stating that no schedule is returned for unmonitored websites and by listing exactly what the schedule read includes. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the purpose, followed by a concise list of returned fields. The final sentences about unmonitored websites and IDs from listWebsites earn their place; there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one parameter, rich annotations, an output schema, and a description that already enumerates the returned schedule details plus the no-schedule edge case, nothing essential is missing for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents websiteId as 'Website ID from listWebsites', and schema description coverage is 100%. The description repeats this guidance rather than adding new parameter semantics, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Read') and identifies the exact resource ('a website's recurring-audit schedule'), then enumerates the concrete data points returned. This clearly differentiates it from siblings like setMonitoringSchedule and getSiteAuditStatus.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: it notes that website IDs come from listWebsites and explains the 'no schedule' case. However, it does not explicitly state when to prefer this tool over alternatives or mention exclusions, stopping short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getOgDataA
Read-onlyIdempotent

Fetch Open Graph metadata, HTML-inferred tags, and hybrid social preview data for any URL via the OpenGraph.io API (v3). Returns og:title, og:description, og:image, og:type, favicon, and more, merged from three sources: raw Open Graph tags (openGraph), HTML-inferred fallbacks (htmlInferred), and a best-of hybrid (hybridGraph). Use hybridGraph as your primary source — it fills gaps automatically.

Pick the right tool: getOgData → Open Graph tags, social preview metadata (title, description, image, favicon) getOgMarkdown → Clean readable text / article prose — ideal for feeding into an LLM getOgScrapeData → Raw HTML — use when you need to do your own parsing or link extraction getOgExtract → Targeted elements by tag (html_elements) or named CSS selectors (selectors) getOgScreenshot → Visual capture of a page as an image getOgQuery → Natural-language question answered from page content (100–200 credits/request)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL of the webpage to analyze.
retryNoAutomatically retry failed requests with escalating proxy tiers. Defaults to true on v3.
use_aiNoEnhance the metadata response with AI-generated fields. Requires an AI-enabled plan.
cache_okNoUse cached results. Set to false to bypass cache and get fresh data. Defaults to true.
use_proxyNoRoute the request through a standard proxy.
auto_proxyNoAutomatically escalate to a proxy if the direct request fails. Defaults to true on v3.
accept_langNoAccept-Language header for the outbound request. Use 'auto' to mirror the caller's language. Defaults to 'auto'.
ai_sanitizeNoScan the fetched content for prompt-injection attempts before returning it.
auto_renderNoAutomatically detects JS-heavy / SPA pages and re-fetches with browser rendering when needed. Enabled by default on v3 — leave unset unless you want to disable it. For guaranteed JS execution on every request use full_render: true instead.
full_renderNoForces a full browser execution pass on every request regardless of page type. Use when auto_render hasn't produced the content you expected, or when you need guaranteed JavaScript execution. Slower than auto_render — prefer auto_render for most cases.
max_retriesNoMaximum number of retry attempts (1–4). Defaults to 4.
use_premiumNoRoute the request through a premium proxy.
use_superiorNoRoute the request through a superior-tier proxy.
max_cache_ageNoMaximum cache age in milliseconds. Results older than this will be re-fetched. Defaults to 432000000 (5 days).
proxy_countryNoTwo-letter ISO country code for geo-targeted proxy exit node (e.g. 'US', 'GB').
load_more_waitNoMilliseconds to wait after each load_more click (0–5000). Defaults to 1500.
retry_escalateNoEscalate proxy tier on each retry attempt. Defaults to true.
ai_sanitize_modeNo'sanitize' cleans the content, 'warn' returns it with a safety report, 'block' returns HTTP 422 when risk_score >= 0.7.
load_more_clicksNoNumber of times to click the load_more_selector (1–10). Defaults to 3.
load_more_scrollNoScroll between load_more clicks. Defaults to true.
scroll_to_bottomNoScroll to the bottom of the page before extraction. Useful for lazy-loaded content. Forces full_render.
wait_for_selectorNoCSS selector to wait for before extracting data. Forces full_render.
load_more_selectorNoCSS selector for a 'load more' button to click before extraction. Forces full_render.
load_more_item_selectorNoCSS selector to watch for new items when using load_more_selector.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
openGraphNoRaw Open Graph tag values
hybridGraphNoBest-of merged metadata from all sources
requestInfoNoRequest metadata (cache status, version, options echo)
htmlInferredNoHTML-inferred fallback values

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint. The description adds valuable behavioral context: three data sources merging behavior, automatic gap-filling by hybridGraph, and hints about defaults (retry, cache_ok). Does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, followed by a clear sibling comparison table. Every sentence adds value, and it is concise given the complexity (24 parameters).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (24 parameters, output schema exists), the description explains the data sources, hybrid nature, and usage guidance. It could mention that the output schema provides detailed field descriptions, but overall it is complete enough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 does not elaborate on individual parameters beyond the schema, but provides overall context about data sources and output structure that helps understand parameter relevance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches Open Graph metadata, HTML-inferred tags, and hybrid social preview data. It specifies the verb 'Fetch' and resource, and distinguishes from siblings by listing what each sibling tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides a 'Pick the right tool' section that tells when to use getOgData versus alternatives like getOgMarkdown, getOgScrapeData, etc. It also advises using hybridGraph as the primary source.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getOgExtractA
Read-onlyIdempotent

Extract specific content from any URL via the OpenGraph.io API (v3). Two modes — choose based on what you need:

Mode 1 — Tag-based (html_elements): pass an array of HTML tag names, e.g. ['h1','h2','p','a']. The API collects all matching elements and joins their text into a single concatenatedText string. Best for bulk content extraction where you want all headings, paragraphs, or links as one block of text.

Mode 2 — Selector-based (selectors): pass a CSS selector map where each key is your chosen label and each value is a CSS selector, e.g. { "title": "article h1", "price": ".price-box .price", "sku": "#product-sku" }. The API returns a data object keyed by those labels — ideal for structured scraping of specific named fields.

Response shape by mode:

  • html_elements only → { concatenatedText }

  • selectors only → { data, concatenatedText }

  • Both provided → { data, concatenatedText }

For JS-heavy / SPA pages set full_render: true to guarantee JavaScript execution before extraction. Use wait_for_selector when content loads asynchronously.

Pick the right tool: getOgData → Open Graph tags, social preview metadata (title, description, image, favicon) getOgMarkdown → Clean readable text / article prose — ideal for feeding into an LLM getOgScrapeData → Raw HTML — use when you need to do your own parsing or link extraction getOgExtract → Targeted elements by tag (html_elements) or named CSS selectors (selectors) getOgScreenshot → Visual capture of a page as an image getOgQuery → Natural-language question answered from page content (100–200 credits/request)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL of the webpage to extract content from.
retryNoAutomatically retry failed requests. Defaults to true on v3.
cache_okNoUse cached results. Set to false to bypass cache. Defaults to true.
selectorsNoCSS selector map for structured extraction. Keys are output labels; values are CSS selectors. Example: { "article_title": "article h1", "price": ".price-box .price", "description": "#product-description p" }. When provided, returns a structured `data` object keyed by label instead of a raw element list. Can be combined with html_elements.
use_proxyNoRoute the request through a standard proxy.
auto_proxyNoAutomatically escalate to a proxy if the direct request fails. Defaults to true on v3.
accept_langNoAccept-Language header for the outbound request. Defaults to 'auto'.
ai_sanitizeNoScan the fetched content for prompt-injection attempts.
auto_renderNoAutomatically detect and switch to headless rendering for SPA pages. Defaults to true on v3.
full_renderNoFully render the page with JavaScript before extracting. Useful for SPAs.
max_retriesNoMaximum number of retry attempts (1–4). Defaults to 4.
use_premiumNoRoute the request through a premium proxy.
use_superiorNoRoute the request through a superior-tier proxy.
html_elementsNoList of HTML tag names to extract (e.g. ['h1', 'h2', 'a', 'img', 'p']). Defaults to ['title','h1','h2','h3','h4','h5','p'] when neither html_elements nor selectors is provided.
max_cache_ageNoMaximum cache age in milliseconds. Defaults to 432000000 (5 days).
proxy_countryNoTwo-letter ISO country code for geo-targeted proxy exit node.
load_more_waitNoMilliseconds to wait after each load_more click (0–5000). Defaults to 1500.
retry_escalateNoEscalate proxy tier on each retry attempt. Defaults to true.
ai_sanitize_modeNo'sanitize' cleans the content, 'warn' returns a safety report, 'block' returns HTTP 422.
load_more_clicksNoNumber of times to click the load_more_selector (1–10). Defaults to 3.
load_more_scrollNoScroll between load_more clicks. Defaults to true.
scroll_to_bottomNoScroll to the bottom of the page before extracting. Useful for lazy-loaded content.
wait_for_selectorNoCSS selector to wait for before extracting.
load_more_selectorNoCSS selector for a 'load more' button to click before extracting.
load_more_item_selectorNoCSS selector to watch for new items when using load_more_selector.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
dataNoStructured object keyed by your selector labels. Only present when the selectors param was used.
concatenatedTextNoAll matched element text joined into one string. Present in both html_elements and selectors modes.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, etc. The description adds mode behavior, default values (e.g., html_elements default list), response shapes per mode, and proxy escalation logic. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively long but well-structured with clear sections (modes, response shapes, special params, sibling comparison). Every sentence has purpose, though a few technical details could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 25 parameters and an output schema, the description covers the two primary modes, default behaviors, and important options. It lacks some edge-case clarifications but is sufficiently complete for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds significant meaning: explains the two parameter groups (html_elements vs selectors) with examples, describes defaults, and clarifies how modes affect output. Some parameters (e.g., retry, cache_ok) get less attention, but overall adds value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it extracts specific content from URLs via OpenGraph.io API v3, and lists two distinct modes with examples. It distinguishes itself from siblings by contrasting each sibling's purpose in a dedicated bullet list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use tag-based vs selector-based mode, and provides a complete sibling comparison table. It also gives guidance on when to use parameters like full_render and wait_for_selector.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getOgMarkdownA
Read-onlyIdempotent

Convert any URL's HTML into clean Markdown via the OpenGraph.io API (v3 markdown endpoint). Strips navigation, ads, and boilerplate by default — the result is main-content prose, headings, links, and images ready to read or feed into another model. Use include_tags / exclude_tags to target or remove specific page sections.

LONG PAGES — prefer retrieval over truncation. Set query with chunking: true to get back only the passages that answer your question (ranked by relevance) instead of the whole page. Use max_chars to cap raw output when you genuinely need prose. chunk_size and chunk_overlap tune the split; heading_aware keeps sections intact.

EXTRAS — include_links, include_images, and include_headings return structured link, image, and outline data, which avoids a second scrape call just to enumerate them.

UNTRUSTED CONTENT — this fetches arbitrary pages. Set ai_sanitize: true when the result will be fed to a model: it scans for prompt-injection attempts and returns a safety report. ai_sanitize_mode: 'block' rejects a risky page outright (HTTP 422) rather than returning it.

The Markdown text block is capped at 6 000 characters; the full content is always available in the structured markdown field.

Pick the right tool: getOgData → Open Graph tags, social preview metadata (title, description, image, favicon) getOgMarkdown → Clean readable text / article prose — ideal for feeding into an LLM getOgScrapeData → Raw HTML — use when you need to do your own parsing or link extraction getOgExtract → Targeted elements by tag (html_elements) or named CSS selectors (selectors) getOgScreenshot → Visual capture of a page as an image getOgQuery → Natural-language question answered from page content (100–200 credits/request)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL of the webpage to convert to Markdown.
queryNoNatural-language question. Returns only the most relevant chunks, ranked (BM25), instead of the whole page. Requires chunking (enabled automatically when set).
retryNoAutomatically retry failed requests.
cache_okNoUse cached results. Set to false to bypass cache. Defaults to true.
chunkingNoSplit the Markdown into chunks. Implied by `query`.
max_charsNoTruncate the Markdown to this many characters. Prefer `query` + `chunking` when you want the relevant part of a long page rather than an arbitrary prefix.
use_proxyNoRoute the request through a standard proxy.
auto_proxyNoAutomatically escalate to a proxy if the direct request fails.
chunk_sizeNoTarget characters per chunk (200–20000). Defaults to 2000.
max_chunksNoMaximum chunks to return (1–2000). Defaults to 500.
accept_langNoAccept-Language header for the outbound request. Defaults to 'auto'.
ai_sanitizeNoScan the fetched content for prompt-injection attempts and return a safety report.
full_renderNoForce full browser rendering before conversion. Rendering is applied automatically for pages detected as JavaScript-heavy; set this when that detection is insufficient.
max_retriesNoMaximum number of retry attempts (1–4). Defaults to 4.
query_top_kNoHow many ranked chunks to return when `query` is set. Defaults to 5.
use_premiumNoRoute the request through a premium proxy.
exclude_tagsNoCSS selectors to remove before conversion. Supports wildcard/regex patterns. Example: ['nav', 'footer', '.sidebar', '.ad*'].
include_tagsNoCSS selectors — keep only elements matching these selectors. Example: ['article', 'main', '.content'] to target the main content area only.
use_superiorNoRoute the request through a superior-tier proxy.
chunk_overlapNoCharacters of overlap between consecutive chunks, for context. Max half of chunk_size.
heading_awareNoSplit on heading boundaries where possible, so sections stay intact. Defaults to true.
include_linksNoInclude every hyperlink with its text and rel attributes.
max_cache_ageNoMaximum cache age in milliseconds. Defaults to 432000000 (5 days).
proxy_countryNoTwo-letter ISO country code for geo-targeted proxy exit node.
include_chunksNoSet false to get chunk counts in `usage` without the chunk bodies.
include_imagesNoInclude every image with its src and alt text.
load_more_waitNoMilliseconds to wait after each load_more click (0–5000). Defaults to 1500.
retry_escalateNoEscalate proxy tier on each retry attempt. Defaults to true.
ai_sanitize_modeNo'sanitize' cleans the content, 'warn' reports without changing it, 'block' returns HTTP 422. Only takes effect when ai_sanitize is true.
include_headingsNoInclude the heading outline, plus table/code-block detection flags.
include_markdownNoSet false to omit the prose body — useful when you only want structure or chunks.
include_metadataNoInclude page metadata (title, description, language, canonical URL). Defaults to true.
load_more_clicksNoNumber of times to click the load_more_selector (1–10). Defaults to 3.
load_more_scrollNoScroll between load_more clicks. Defaults to true.
scroll_to_bottomNoScroll to the bottom of the page before conversion. Forces full_render.
only_main_contentNoHeuristically strip navigation, header, footer, and ads, keeping only main prose content. Defaults to true server-side. Set to false to convert the full page.
wait_for_selectorNoCSS selector to wait for before converting. Forces full_render.
load_more_selectorNoCSS selector for a 'load more' button to click before conversion.
heading_aware_levelNoDeepest heading level treated as a split boundary (1–6). Defaults to 2.
load_more_item_selectorNoCSS selector for the repeating item, used to detect when clicking stopped adding content.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
debugNoWhether rendering, a proxy, or retries were used
linksNo
usageNoCharacter/token counts and truncation status
chunksNoChunk objects, ranked by relevance when `query` is set
imagesNo
lengthYesCharacter count of the returned Markdown
headingsNo
markdownYesFull Markdown content of the page
metadataNoTitle, description, language, canonical and final URL
ai_safetyNoPrompt-injection report; present when ai_sanitize is true
request_idNo
onlyMainContentNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, idempotent, open-world, and non-destructive, and the description adds valuable behavior beyond that: it strips navigation/ads/boilerplate by default, caps the Markdown text block at 6,000 characters while keeping full content in the structured field, and discloses prompt-injection scanning and HTTP 422 blocking behavior. No contradiction exists between the description and annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but the tool has 40 parameters and multiple behavioral nuances, so the length is justified. It is well structured with clear section headers (LONG PAGES, EXTRAS, UNTRUSTED CONTENT, Pick the right tool), front-loads the core purpose, and uses bolded parameter names for scannability without wasted sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 40-parameter, 1-required-parameter tool with an output schema and rich annotations, the description covers everything an agent needs to invoke it correctly: purpose, sibling routing, chunking strategy, security handling, output cap behavior, and tuning knobs. The existence of an output schema means return-value details do not need to be repeated in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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, but this description adds substantial cross-parameter meaning: it explains why query+chunking is preferred over max_chars, that include_links/include_images/include_headings avoid a second scrape call, how ai_sanitize_mode coordinates with ai_sanitize, and how include_tags/exclude_tags control page sections. This goes well beyond the individual schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: converts any URL's HTML into clean Markdown via the OpenGraph.io v3 markdown endpoint. It distinguishes itself from siblings by describing what the output contains (main-content prose, headings, links, images) and by including an explicit 'Pick the right tool' list that contrasts getOgMarkdown with getOgData, getOgScrapeData, getOgExtract, getOgScreenshot, and getOgQuery.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit and actionable: it tells agents to prefer query+chunking over max_chars for long pages, use include_tags/exclude_tags to target sections, and set ai_sanitize when feeding untrusted content to a model. The 'Pick the right tool' section directly lists when each sibling should be used instead, so an agent can route correctly without inferring.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getOgQueryA
Read-only

Ask a natural-language question about the content of any URL and receive an AI-generated answer via the OpenGraph.io API. Optionally pass a responseStructure schema to extract structured data. Note: uses 100 API credits per request (or 200 with a large model). Query API remains on v1.1 until the billing path check is updated for v3.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL of the webpage to query.
queryYesNatural-language question to answer about the page content.
retryNoAutomatically retry failed requests.
cache_okNoUse cached page results. Set to false to bypass cache. Defaults to true.
modelSizeNoAI model size. 'small' uses 100 credits; 'large' uses 200 credits. Defaults to 'small'.
use_proxyNoRoute the request through a standard proxy.
accept_langNoAccept-Language header for the outbound request. Defaults to 'auto'.
ai_sanitizeNoScan the fetched content for prompt-injection attempts.
auto_renderNoAutomatically detect and switch to headless rendering for SPA pages.
full_renderNoFully render the page with JavaScript before querying.
max_retriesNoMaximum number of retry attempts (1–4). Defaults to 4.
use_premiumNoRoute the request through a premium proxy.
use_superiorNoRoute the request through a superior-tier proxy.
max_cache_ageNoMaximum cache age in milliseconds. Defaults to 432000000 (5 days).
proxy_countryNoTwo-letter ISO country code for geo-targeted proxy exit node.
ai_sanitize_modeNo'sanitize' cleans the content, 'warn' returns a safety report, 'block' returns HTTP 422 when risk_score >= 0.7.
responseStructureNoOptional JSON schema describing the shape of the desired response. When provided, the model returns a structured JSON answer.
wait_for_selectorNoCSS selector to wait for before querying.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
resultNoAI-generated answer. May be a string or structured object.
questionYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare `readOnlyHint: true` and `destructiveHint: false`. The description adds credit consumption details (100 or 200 credits) and a version note. No contradictions; additional behavioral context beyond annotations is minimal but adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: two sentences plus a brief note. It front-loads the core purpose and critical details (API credit usage, version status). Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given high schema coverage, existence of an output schema (not shown), and annotations that cover safety, the description is mostly complete. It could mention return format or pagination, but output schema likely handles that. Overall adequate for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (all 18 parameters have descriptions). The description adds no extra parameter meaning beyond what the schema provides, except for highlighting `responseStructure` for structured data. Baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Ask a natural-language question about the content of any URL and receive an AI-generated answer.' It distinguishes from sibling tools like `getOgData` or `getOgExtract` by focusing on natural-language queries and optional structured extraction via `responseStructure`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for querying URL content with NL questions but provides no explicit guidance on when to use this tool versus alternatives (e.g., `getOgExtract` for structured data without AI). No when-not or exclusion cases are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getOgScrapeDataA
Read-onlyIdempotent

Scrape and return the raw HTML of a URL via the OpenGraph.io API (v3). Returns the complete page HTML — use this when you need to do your own parsing, extract all links, inspect the DOM structure, or feed raw markup into another tool or model. The text response includes the first 3 000 characters; the full HTML is in the structured html field.

For JS-heavy or single-page applications set full_render: true to guarantee JavaScript execution before the HTML is captured. For most sites, the default auto_render handles this automatically.

Pick the right tool: getOgData → Open Graph tags, social preview metadata (title, description, image, favicon) getOgMarkdown → Clean readable text / article prose — ideal for feeding into an LLM getOgScrapeData → Raw HTML — use when you need to do your own parsing or link extraction getOgExtract → Targeted elements by tag (html_elements) or named CSS selectors (selectors) getOgScreenshot → Visual capture of a page as an image getOgQuery → Natural-language question answered from page content (100–200 credits/request)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL of the webpage to scrape.
retryNoAutomatically retry failed requests with escalating proxy tiers. Defaults to true on v3.
cache_okNoUse cached results. Set to false to bypass cache and get fresh data. Defaults to true.
use_proxyNoRoute the request through a standard proxy.
auto_proxyNoAutomatically escalate to a proxy if the direct request fails. Defaults to true on v3.
accept_langNoAccept-Language header for the outbound request. Use 'auto' to mirror the caller's language. Defaults to 'auto'.
ai_sanitizeNoScan the fetched content for prompt-injection attempts before returning it.
auto_renderNoAutomatically detects JS-heavy / SPA pages and re-fetches with browser rendering when needed. Enabled by default on v3 — leave unset unless you want to disable it. For guaranteed JS execution on every request use full_render: true instead.
full_renderNoForces a full browser execution pass on every request regardless of page type. Use when auto_render hasn't produced the content you expected, or when you need guaranteed JavaScript execution. Slower than auto_render — prefer auto_render for most cases.
max_retriesNoMaximum number of retry attempts (1–4). Defaults to 4.
use_premiumNoRoute the request through a premium proxy.
use_superiorNoRoute the request through a superior-tier proxy.
max_cache_ageNoMaximum cache age in milliseconds. Results older than this will be re-fetched. Defaults to 432000000 (5 days).
proxy_countryNoTwo-letter ISO country code for geo-targeted proxy exit node (e.g. 'US', 'GB').
load_more_waitNoMilliseconds to wait after each load_more click (0–5000). Defaults to 1500.
retry_escalateNoEscalate proxy tier on each retry attempt. Defaults to true.
ai_sanitize_modeNo'sanitize' cleans the content, 'warn' returns it with a safety report, 'block' returns HTTP 422 when risk_score >= 0.7.
load_more_clicksNoNumber of times to click the load_more_selector (1–10). Defaults to 3.
load_more_scrollNoScroll between load_more clicks. Defaults to true.
scroll_to_bottomNoScroll to the bottom of the page before scraping. Useful for lazy-loaded content.
wait_for_selectorNoCSS selector to wait for before scraping. Forces full_render.
load_more_selectorNoCSS selector for a 'load more' button to click before scraping.
load_more_item_selectorNoCSS selector to watch for new items when using load_more_selector.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
htmlYesFull raw HTML of the scraped page
lengthYesCharacter count of the HTML
requestInfoNoRequest metadata (cache status, version, options echo)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that first 3000 chars are in text response, full HTML in structured field, explains auto_render vs full_render, and retry behavior. Annotations already declare readOnlyHint, etc., and description adds valuable context without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear paragraphs, but slightly verbose. Could be trimmed slightly, but overall effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high parameter count, rich schema descriptions, and output schema, the description provides sufficient context for correct tool invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds extra context for auto_render and full_render parameters, earning a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool scrapes raw HTML and distinguishes from siblings by listing their specific use cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides a 'Pick the right tool' section with each sibling's purpose, giving clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getOgScreenshotA
Read-onlyIdempotent

Capture a screenshot of any URL via the OpenGraph.io API (v3). Supports full-page or viewport captures, custom viewport dimensions, dark mode, image format/quality control, cookie-banner dismissal, and CSS selector-based element targeting or exclusion.

Returns a screenshotUrl — a hosted URL pointing to the screenshot image file, not inline image data. Use this URL directly in a browser, an tag, or pass it to another tool.

Pick the right tool: getOgData → Open Graph tags, social preview metadata (title, description, image, favicon) getOgMarkdown → Clean readable text / article prose — ideal for feeding into an LLM getOgScrapeData → Raw HTML — use when you need to do your own parsing or link extraction getOgExtract → Targeted elements by tag (html_elements) or named CSS selectors (selectors) getOgScreenshot → Visual capture of a page as an image getOgQuery → Natural-language question answered from page content (100–200 credits/request)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL of the webpage to screenshot.
retryNoAutomatically retry failed requests. Defaults to true on v3.
formatNoImage format. Defaults to 'jpg'.
qualityNoImage compression quality 1–100. Only applies to jpg/webp. Defaults to 80.
cache_okNoUse cached results. Set to false to bypass cache. Defaults to true.
selectorNoCSS selector — crop the screenshot to just this element.
dark_modeNoEnable dark mode (prefers-color-scheme: dark). Defaults to false.
full_pageNoCapture the full scrollable page height. Defaults to false (viewport only).
use_proxyNoRoute the request through a standard proxy.
auto_proxyNoAutomatically escalate to a proxy if the direct request fails. Defaults to true on v3.
dimensionsNoViewport dimensions as WxH (e.g. '1280x800'). Defaults to '1366x768'.
accept_langNoAccept-Language header for the outbound request. Defaults to 'auto'.
full_renderNoFully render the page with JavaScript before capturing. Defaults to true for screenshots.
max_retriesNoMaximum number of retry attempts (1–4). Defaults to 4.
use_premiumNoRoute the request through a premium proxy.
use_superiorNoRoute the request through a superior-tier proxy.
capture_delayNoMilliseconds to wait after page load before capturing (0–10 000). Defaults to 0.
hideSelectorsNoWhether to apply the exclude_selectors hiding. Defaults to true when exclude_selectors is set.
max_cache_ageNoMaximum cache age in milliseconds. Defaults to 432000000 (5 days).
proxy_countryNoTwo-letter ISO country code for geo-targeted proxy exit node (e.g. 'US', 'GB').
exclude_selectorsNoComma-separated CSS selectors to hide (set visibility: hidden) before capturing.
navigationTimeoutNoNavigation timeout in milliseconds (1 000–60 000). Defaults to 30 000.
wait_for_selectorNoCSS selector to wait for before capturing.
block_cookie_bannerNoAttempt to dismiss cookie consent banners before capturing. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYesSource URL that was screenshotted
formatNo
fullPageNo
dimensionsNo
screenshotUrlYesHosted URL of the screenshot image

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey readOnlyHint, idempotentHint, destructiveHint. The description adds context about the return format (hosted screenshotUrl), usage in browser/img tag, and proxy/retry behaviors, which are beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized: opening sentence, return format explanation, sibling comparison. It is efficient but the sibling list is somewhat lengthy; still no wasted content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (24 parameters, many options), the description covers key capabilities, return value, and usage notes. It lacks only detailed output schema but mentions the hosted URL, so completeness is high.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaningful summary of key parameter groups (full-page, viewport, dark mode, etc.) and their effects, providing extra context beyond individual schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool captures a screenshot via OpenGraph.io API v3, lists key features, and distinguishes from siblings by presenting a 'Pick the right tool' list with each sibling's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides a 'Pick the right tool' section that details when to use this screenshot tool versus alternatives like getOgData, getOgMarkdown, etc., offering clear selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getSiteAuditChangesA
Read-onlyIdempotent

Answer 'what changed on this site, and what should I fix first?' for a completed audit.

Combines two things the dashboard shows together: the change report against the previous audit (issues that are new, fixed, or regressed, plus pages added or removed and the score delta), and the prioritized issue groups (fix-first, fix-as-pattern, review-next, low-priority).

A regressed issue is one that was previously verified as fixed and has come back — that is tracked across runs by durable issue identity, not by comparing two lists, so it stays accurate even when the baseline advances automatically.

Pass baseline to compare against a specific earlier audit instead of the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
auditIdYesID of a completed audit (from startSiteAudit or listSiteAudits).
baselineNoAudit ID to compare against. Defaults to the audit's recorded baseline.

Output Schema

ParametersJSON Schema
NameRequiredDescription
diffNo
auditIdYes
degradedNo
prioritiesNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds meaningful behavioral nuance: regression is tracked via durable issue identity, not list comparison, and the baseline advances automatically unless overridden. This goes beyond the annotations and gives the agent confidence in how results are computed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three paragraphs but each sentence earns its place: purpose first, then composition, then the regression nuance, then the baseline override. It is well-structured and front-loaded, though slightly longer than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with an output schema and rich annotations, the description covers the essential context: what it returns conceptually, the default/comparison behavior, and the underlying accuracy mechanism. The agent has everything needed to invoke it correctly without further investigation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter descriptions for both auditId and baseline. The description adds extra semantic value by explaining the default baseline behavior and referencing source tools (startSiteAudit, listSiteAudits) for auditId. It clarifies usage beyond the schema, which is a bonus.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the exact question it answers: 'what changed on this site, and what should I fix first?' It then lists the concrete components (new/fixed/regressed issues, score delta, prioritized groups) and distinguishes itself from sibling tools like getSiteAuditReport by focusing on delta vs. a full report. This is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states it applies to completed audits and explains the optional baseline parameter to compare against a specific earlier audit. It does not explicitly name alternatives or when not to use it, but the context is clear enough that an agent can infer its place among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getSiteAuditReportA
Read-onlyIdempotent

Retrieve the full structured report for a completed site audit. Returns an overall site score (0–100), per-page scores and issues, an AI-generated site overview with top priorities and issue rollup, and social preview data for each audited page.

Only available once the audit status is COMPLETE. Use getSiteAuditStatus to check progress first.

Report contents:

  • Overall site score and summary (critical issues, total issues, passed checks)

  • AI overview: site summary, top priorities, strength areas

  • Issue rollup: business impact, affected page count, fix guidance

  • Per-page: score, check results, issues, social card previews (Facebook, Twitter, LinkedIn, Google)

Pick the right tool: getSiteAuditReport → Full results after audit is COMPLETE getSiteAuditStatus → Check status while audit is running previewPageAudit → Instant single-URL audit without waiting

ParametersJSON Schema
NameRequiredDescriptionDefault
auditIdYesThe audit ID returned by startSiteAudit. The audit must be in COMPLETE status.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pagesNoPer-page scores, checks, issues, and social previews
scoreNoOverall site score 0–100
domainYes
statusYes
auditIdYes
summaryNo
completedAtNo
pagesAuditedNo
aiSiteOverviewNoAI-generated overview: siteSummary, reportHighlights, issueRollup

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. Description adds the crucial constraint that audit must be COMPLETE, which is not in annotations. It also lists report contents, providing additional context beyond safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points and a decision table. It is front-loaded with the main purpose. Slightly verbose but every section adds value; could be trimmed slightly but still effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of output schema, annotations, and sibling tools, the description is fully complete. It enumerates report contents, specifies prerequisites, and provides clear usage guidance, leaving no ambiguity for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description mentions the auditId parameter and its required status, but this is already documented in the schema. No additional parameter details beyond schema are provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verb 'Retrieve' and resource 'full structured report for a completed site audit'. It distinguishes from siblings like getSiteAuditStatus and previewPageAudit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the prerequisite (audit must be COMPLETE) and names the alternative tool getSiteAuditStatus for checking progress. The 'Pick the right tool' section clearly differentiates when to use each sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getSiteAuditStatusA
Read-onlyIdempotent

Poll the status of a running site audit. Returns the current status (QUEUED, CRAWLING, SCORING, COMPLETE, or FAILED), plus progress counters and summary scores once the audit finishes.

Call this repeatedly every 10–15 seconds after startSiteAudit until status is COMPLETE, then call getSiteAuditReport to retrieve the full results.

Pick the right tool: getSiteAuditStatus → Poll progress after startSiteAudit getSiteAuditReport → Get the full report once status is COMPLETE

ParametersJSON Schema
NameRequiredDescriptionDefault
auditIdYesThe audit ID returned by startSiteAudit.

Output Schema

ParametersJSON Schema
NameRequiredDescription
scoreNo
domainYes
statusYes
auditIdYes
completedAtNo
totalIssuesNo
errorMessageNo
pagesAuditedNo
pagesFetchedNo
criticalIssuesNo
pagesRequestedYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior, so the description only needs to add operational context, which it does: return statuses, progress counters, summary scores appearing after completion, and a polling cadence. There is no contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, followed by precise usage instructions and a compact disambiguation list. Every sentence earns its place and no redundant phrasing is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This tool has a single well-documented parameter, an output schema, and safety-relevant annotations. The description supplies the remaining operational details needed to use it correctly: polling interval, termination condition, status values, and the follow-up tool to call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the auditId parameter is already described as 'The audit ID returned by startSiteAudit.' The description reinforces that the ID comes from startSiteAudit, but adds no substantive new meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Poll') and resource ('status of a running site audit'), enumerates the exact status values returned, and distinguishes itself from getSiteAuditReport and startSiteAudit. An agent can immediately know what this tool does and how it differs from its siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs when to call it ('repeatedly every 10–15 seconds after startSiteAudit'), when to stop ('until status is COMPLETE'), and which tool to use next ('then call getSiteAuditReport'). The 'Pick the right tool' section further clarifies the boundary between status polling and report retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspectImageSessionA
Read-onlyIdempotent

Retrieve detailed information about an image generation session and all its assets.

Returns:

  • Session metadata (creation time, name, status)

  • List of all assets with their prompts, toolchains, and status

  • Parent-child relationships showing iteration history

Use this to:

  • Review what was generated in a session

  • Find asset IDs for iteration

  • Understand the generation history and toolchains used

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdYesThe session UUID to inspect

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
assetsYes
statusYes
sessionIdYes
assetCountNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and destructiveHint=false. The description adds valuable context beyond that by detailing what information is returned (metadata, assets, relationships), which helps the agent understand the tool's output without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, uses bullet points for clarity, and front-loads the main purpose. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description covers the essential aspects: returns session metadata, asset lists, and relationships. It is complete for a read-only inspection tool with clear use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with the only parameter sessionId having a format and description. The description does not add additional semantic details about the parameter, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Retrieve detailed information about an image generation session and all its assets,' specifying the verb, resource, and scope. It distinguishes from sibling tools like generateImage and iterateImage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly lists three use cases: reviewing session content, finding asset IDs for iteration, and understanding history/toolchains. This provides clear guidance on when to use this tool, with no mention of when not to use, but the use cases imply exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iterateImageA

Refine, modify, or create variations of an existing generated image.

Use this to:

  • Edit specific parts of an image ("change the background to blue", "add a title")

  • Apply style changes ("make it more minimalist", "use darker colors")

  • Fix issues ("remove the text", "make the icon larger")

  • Crop the image to specific coordinates

For diagram iterations:

  1. Include the original Mermaid/D2/Vega source in your prompt to preserve structure

  2. Be explicit about visual issues (e.g., "the left edge is clipped")

ParametersJSON Schema
NameRequiredDescriptionDefault
cropX1NoCrop: X coordinate of the top-left corner in pixels
cropX2NoCrop: X coordinate of the bottom-right corner in pixels
cropY1NoCrop: Y coordinate of the top-left corner in pixels
cropY2NoCrop: Y coordinate of the bottom-right corner in pixels
promptYesDetailed instruction for the iteration. Be specific about what to change. Examples: 'Change the primary color to #0033A0', 'Add a subtle drop shadow'
assetIdYesThe asset UUID of the image to iterate on
sessionIdYesThe session UUID containing the image to iterate on

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
widthNo
formatNo
heightNo
statusYes
assetIdYes
sessionIdYes
parentAssetIdYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false (mutation) and destructiveHint=false. The description adds value by detailing behaviors like editing parts, style changes, cropping, and fixing issues, and advising to include source for diagrams to preserve structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points and numbered steps, front-loading the main purpose. Every sentence adds value, and it is appropriately concise without being terse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, 3 required, output schema present), the description covers editing, cropping, and diagram iterations with guidance on preserving source. It fulfills all informational needs for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, providing descriptions for all 7 parameters. The description enhances this with examples for the prompt parameter (e.g., 'Change the primary color to #0033A0') and clarifies the cropping coordinates as top-left and bottom-right, aiding the agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verbs like 'refine', 'modify', and 'create variations' on an existing image, clearly distinguishing it from sibling tools like generateImage (new image) and exportImageAsset (exporting). The list of use cases further clarifies the scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states 'Use this to:' followed by concrete scenarios, and provides a specific 'For diagram iterations:' section with numbered steps. While it doesn't explicitly state when NOT to use, the purpose is clear and contrasts well with siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listFixItemsA
Read-onlyIdempotent

Read the fix list saved against an audit — the proposed metadata changes and notes a user has recorded for each page, ready to hand to a developer.

These are hand-authored and are not regenerated by re-running an audit. Returns each item's ID for use with deleteFixItem.

ParametersJSON Schema
NameRequiredDescriptionDefault
auditIdYesAudit ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
auditIdYes
fixItemsYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it readOnlyHint=true and idempotentHint=true, and the description adds that the fix list is hand-authored and not regenerated, which is a valuable behavioral nuance beyond the annotations. It also discloses that each item's ID is returned for use with deleteFixItem, providing operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no fluff. The core action and the key caveat (hand-authored, not regenerated) are front-loaded, and the reference to deleteFixItem is appended naturally. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one required parameter, an output schema present, and annotations covering safety, the description provides all essential context: what the data is, how it is created, and how the returned IDs are used. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter auditId is documented in the schema with a brief description ('Audit ID.'). The tool description only implies it is the audit identifier, adding no new meaning beyond the schema. With 100% schema coverage, a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it 'reads the fix list saved against an audit' — a specific verb and resource. It distinguishes itself from the sibling deleteFixItem by noting it returns each item's ID for that tool, and clarifies that the list is hand-authored and not regenerated, setting it apart from audit-result tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for viewing proposed metadata changes and notes, and contrasts with regenerated audit data ('not regenerated by re-running an audit'). It references deleteFixItem as the deletion counterpart, but does not explicitly name other alternative tools for audit outputs, so guidance is implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listSiteAuditsA
Read-onlyIdempotent

List past site audits for the connected organization — newest first by default. Use this to find an audit to inspect, to track a domain's score over time, or to get the previous audit ID for a comparison.

Filter with q (domain substring), status, from / to (ISO dates), or websiteId to see every run for one monitored site. Page with limit and offset.

Returns audit IDs — feed one to getSiteAuditReport for full results, or to getSiteAuditChanges to see what moved since the previous run.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFilter by domain substring.
toNoOnly audits created on or before this ISO date.
fromNoOnly audits created on or after this ISO date.
sortNoServer-supported sort key, e.g. '-createdAt'.
limitNoHow many audits to return (1–100). Defaults to the server's page size.
offsetNoRows to skip, for paging.
statusNoOnly return audits in these states.
websiteIdNoOnly audits for this monitored website — use it to build a single site's history.

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitNo
totalYes
auditsYes
offsetNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, and non-destructive. The description adds behavior not in annotations: newest-first default, filtering/paging semantics, and that it returns audit IDs for downstream tools. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact paragraphs, each purposeful: purpose and use cases, filtering/paging, and return value/next steps. No filler; front-loads the most important fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no required params, rich annotations, and an output schema, the description covers what the tool returns, how to filter/page, and how to continue to getSiteAuditReport/getSiteAuditChanges. Nothing essential is missing for an agent to select and invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 8 params at 100%, so baseline is 3, but the description adds use-case semantics: websiteId builds a single site's history, from/to are ISO dates, and limit/offset page. It does not explain sort, but the default sort is stated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List past site audits') plus scoping ('for the connected organization') and default ordering. It also names downstream tools, distinguishing it from getSiteAuditReport/getSiteAuditChanges and from mutation siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use it: to find an audit to inspect, track scores over time, or get previous audit ID for comparison. It does not spell out exclusions versus startSiteAudit/deleteSiteAudit, but the purpose and filter guidance make context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listWebsitesA
Read-onlyIdempotent

List the websites this organization has audited, with their current health: score and trend against the previous audit, critical issue count, how many issues have regressed, known page count, and when the next scheduled audit runs.

Pass websiteId to get one website in detail instead of the list.

A website is the durable object behind repeated audits of the same domain — use its ID with getMonitoringSchedule to see recurring-audit settings, or with listSiteAudits as websiteId to page through that site's history.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFilter by domain substring.
sortNoServer-supported sort key.
limitNo
healthNoFilter by health status.
offsetNo
websiteIdNoReturn this one website in detail instead of the list.
monitoringNoFilter by monitoring state — whether a recurring schedule is configured.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNo
websiteNo
websitesNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description adds meaningful behavior: it lists the returned health dimensions, explains the websiteId overload, and clarifies the durable-object relationship across repeated audits. This goes beyond what annotations alone convey without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core listing purpose, then the websiteId detail, then the sibling-tool relationship. Every sentence earns its place and the structure makes important scoping information immediately visible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 7 parameters, an output schema, and safety annotations already present, the description covers the essential semantics: what is returned, how the websiteId overload behaves, and how the tool relates to nearby sibling tools. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 71%, and most parameters already have descriptive entries. The description reinforces websiteId's special behavior but does not add meaning for q, sort, limit, health, offset, or monitoring beyond what the schema provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific operation ('List the websites this organization has audited') and details the output fields, making the resource and scope unambiguous. It also distinguishes itself from listSiteAudits by defining a website as the durable object behind repeated audits and referencing sibling tools that operate on its ID.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete usage context: passing websiteId returns a single website in detail instead of the list, and it explicitly names getMonitoringSchedule and listSiteAudits as the tools to use with that ID. It does not explicitly state when listWebsites should not be used, but the routing guidance is strong enough for an agent to choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

previewPageAuditA
Read-onlyIdempotent

Run an instant quality audit of a single URL. Returns a score (0–100), a score label (Well Optimized / Good / Needs Attention / Poor), a breakdown of Open Graph and social metadata checks, any issues found, and mock social previews for Facebook, Twitter, LinkedIn, and Google.

This is a synchronous, single-URL check — it returns results immediately without creating a persisted audit. It does not count against your audit page quota.

Score labels: Well Optimized (≥90) · Good (≥80) · Room for Improvement (≥70) · Needs Attention (≥60) · Poor (<60)

Pick the right tool: previewPageAudit → Instant check of one URL (no quota consumed, returns immediately) startSiteAudit → Crawl and audit an entire domain (async, uses quota)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe full URL of the page to audit (e.g. https://example.com/product).

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
scoreYesQuality score 0–100
checksNoIndividual check results keyed by check name
issuesNoIssues found on the page with severity and guidance
summaryNo
previewsNoSocial card mock previews: facebook, twitter, linkedin, google
scoreLabelYesHuman-readable score tier

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds that the check is synchronous, returns immediately, does not persist an audit, and does not count against quota, complementing annotations perfectly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured: first sentence states core action and output, then clarifies synchronous/non-persisting nature, then lists score labels, then provides tool comparison. No superfluous sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema, the description sufficiently explains the return values (score, label, breakdown, issues, mock previews) and score ranges. It covers all necessary context for an agent to use this tool effectively without needing to inspect the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single 'url' parameter, with description 'The full URL of the page to audit (e.g. https://example.com/product).' The tool description repeats the example but adds no new semantic value beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it runs an instant quality audit of a single URL and lists the returned data (score, label, breakdown, issues, mock previews). It clearly differentiates from sibling tools like startSiteAudit which is async and crawls an entire domain.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description directly provides a 'Pick the right tool' section comparing previewPageAudit (instant, no quota) with startSiteAudit (async, uses quota), giving explicit guidance on when to use each.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saveFixItemsA
DestructiveIdempotent

Record proposed metadata changes for one page of an audit — the developer handoff list.

THIS OVERWRITES existing items for the same page and field. The fix list is hand-authored and is not reproducible by re-running the audit, so read it with listFixItems first and confirm with the user before replacing entries.

An edit needs a proposedValue that is non-empty and different from originalValue; a note may leave it blank. A blank or unchanged value is treated as a removal upstream and is rejected here — use deleteFixItem to remove an entry deliberately.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesItems to save for this page.
auditIdYesAudit ID.
pageUrlYesThe page these items apply to, as audited.

Output Schema

ParametersJSON Schema
NameRequiredDescription
savedYes
resultNo
auditIdYes
pageUrlYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that this overwrites existing items for the same page/field, that the fix list is hand-authored and non-reproducible, and that blank/unchanged values are treated as removals upstream. However, there is an internal inconsistency: it says a note may leave proposedValue blank, but later says a blank value is rejected here, which slightly clouds the behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: purpose first, overwrite warning second, validation and alternative tooling last. Every sentence carries operational weight, and the critical caveats are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, non-reproducible write operation, the description covers read-before-write behavior, user confirmation, validation rules, and the correct deletion alternative. The only notable gap is the unresolved contradiction about whether a note with a blank proposedValue is actually accepted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 auditId, pageUrl, items, and proposedValue semantics. The description adds the upstream-removal context and validation rationale, but it largely restates the schema and introduces the blank-note ambiguity, so it does not unambiguously improve parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Record proposed metadata changes for one page of an audit — the developer handoff list.' It clearly identifies the write operation and the narrow scope, and it differentiates the tool from its siblings by mentioning listFixItems and deleteFixItem.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent to read with listFixItems first and confirm with the user before replacing entries, and it directs deliberate removals to deleteFixItem. This is exactly the when-to-use / when-not-to-use guidance needed for a destructive hand-authored tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

setMonitoringScheduleA
DestructiveIdempotent

Turn recurring audits on, change their settings, or turn them off for a website.

THIS COMMITS ONGOING SPEND. Each scheduled run consumes the organization's page quota indefinitely until the schedule is changed or removed, and completed runs can trigger alert email. Confirm with the user before enabling or changing a schedule.

Set enabled: false to stop monitoring. That DELETES the schedule configuration — frequency, timing and options are not retained, and re-enabling means setting them again. To pause temporarily and keep the configuration, use paused: true instead.

Settings you do not pass are carried over from the stored schedule, so you can change one field without re-sending the rest. Alert recipients cannot be set here; they are managed in the dashboard. Requires the Site Audit scheduling entitlement — the call fails with a plan message without it.

ParametersJSON Schema
NameRequiredDescriptionDefault
pausedNoPause without deleting — the configuration is kept and can be resumed.
enabledNofalse removes the schedule and stops recurring audits. Defaults to true.
runHourNoHour of day to run (0–23). Anchoring needs runHour and timezone together.
timezoneNoIANA zone, e.g. 'America/New_York'. Runs stay at the same wall-clock time across DST.
dayOfWeekNoDay for a weekly schedule — 0 is Sunday.
frequencyNoHow often the audit runs. Required when enabling.
runMinuteNoMinute of the hour.
websiteIdYesWebsite ID from listWebsites.
dayOfMonthNoDay for a monthly schedule (1–28, so the day exists in every month).
pageScopeModeNoWhich pages each run covers.
includeNewPagesNoAudit pages discovered after the schedule was created. Increases quota use over time.
notificationModeNoWhen alert email is sent for this schedule.
autoAdvanceBaselineNoMove the comparison baseline forward after each run, so changes are measured against the previous run rather than a fixed point.

Output Schema

ParametersJSON Schema
NameRequiredDescription
enabledYes
scheduleNo
websiteIdYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructiveHint, readOnlyHint, etc.), the description discloses critical behavior: ongoing spend, indefinite quota consumption, alert emails, permanent deletion of schedule configuration when disabled, partial-update carryover semantics, and failure without the entitlement. These are exactly the hidden behavioral traits an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although longer than average, every sentence carries operational weight. High-risk information is front-loaded with 'THIS COMMITS ONGOING SPEND,' and the pause-vs-disable distinction is clearly separated from the general behavior. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 13-parameter tool, the description covers cost implications, destructive semantics, partial-update behavior, entitlement requirements, and parameter relationships. Since an output schema exists, missing return-value details are acceptable. Nothing essential is left unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are already well described. The description adds valuable cross-parameter context: frequency is required when enabling, unpassed settings are carried over, and includeNewPages increases quota use over time. This goes beyond the schema and helps correct parameter decisions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the exact resource and verbs: turn recurring audits on, change their settings, or turn them off for a website. It clearly differentiates this from related tools like getMonitoringSchedule (reading) and startSiteAudit (manual runs) by emphasizing recurring schedule configuration.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use and when-not-to-use guidance: use `paused: true` to keep configuration, use `enabled: false` to permanently stop and delete, and know that alert recipients are managed in the dashboard, not here. It also calls out the entitlement prerequisite and the need to confirm with the user before enabling or changing a schedule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

startSiteAuditA

Start a full site audit for a domain. Audits each page for Open Graph, social media, and SEO metadata quality, then generates an AI-powered overview and per-page scores.

The urls array can be sourced from anywhere — discoverSiteUrls structured output, a codebase route scan (read route files and construct full URLs), a sitemap, or a manually provided list. Calling discoverSiteUrls first is NOT required.

For 'audit all': pass every URL from discoverSiteUrls structured output directly. For 'codebase scan': find routes in the project files (Next.js app/, pages/, React Router config, etc.), prepend the domain, and pass them here. If urls is omitted the backend crawls the domain internally.

Audits are asynchronous and can take several minutes. This tool returns an audit ID immediately — use getSiteAuditStatus to poll progress, then getSiteAuditReport to retrieve the completed report.

Pick the right tool: discoverSiteUrls → Crawl-based page discovery (use when you don't have the codebase) startSiteAudit → Run the audit — accepts URLs from any source getSiteAuditStatus → Poll until COMPLETE getSiteAuditReport → Get the full report previewPageAudit → Instantly audit a single URL without waiting

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsNoSpecific URLs to audit. Pass the user-selected subset from **discoverSiteUrls**. When omitted, the audit crawls the domain internally.
domainYesThe domain to audit. Include the protocol (e.g. https://example.com).
pagesRequestedNoNumber of pages to audit (1–500). Defaults to the length of the `urls` array if provided, otherwise 10. Your plan's monthly URL quota limits the maximum across all audits.
siteContextTextNoHomepage text from **discoverSiteUrls** structured output (`siteContextText`). Including this enriches the AI-generated overview and top-priority analysis.

Output Schema

ParametersJSON Schema
NameRequiredDescription
domainYes
statusYesInitial status — always QUEUED on creation
auditIdYesID to pass to getSiteAuditStatus and getSiteAuditReport
pagesRequestedYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that audits are asynchronous and can take several minutes, returns an audit ID, and instructs to use getSiteAuditStatus for polling. Also explains behavior when `urls` is omitted (backend crawls). No contradiction with annotations (readOnlyHint=false, etc.).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with core purpose, then parameter guidance, then async behavior and tool selection. It is somewhat lengthy but every sentence adds value. Minor redundancy in repeating 'audit all' explanation could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given complexity (asynchronous, multiple URL sources, polling), and full schema coverage plus output schema existence, the description is complete. It covers all aspects needed for correct tool invocation and result handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds significant context: for `urls`, explains sourcing methods; for `domain`, includes protocol requirement; for `pagesRequested`, explains default and plan limits; for `siteContextText`, explains its role in enriching the overview. This goes well beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action ('start a full site audit') and what it audits (Open Graph, social media, SEO metadata). It distinguishes from sibling tools by listing alternatives and their purposes, such as discoverSiteUrls for crawl-based discovery and getSiteAuditStatus for polling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use this tool vs. siblings, including a dedicated section 'Pick the right tool'. Explains how the `urls` array can be sourced from discoverSiteUrls, codebase scan, sitemap, or manual list, and that calling discoverSiteUrls first is not required.

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.

  1. 13 tool updatesv2.1.0
    • AddeddeleteFixItem
    • AddeddeleteSiteAudit
    • AddedemailSiteAuditReport
    • AddedexportFixItemsCsv
    • AddedgetConnectionContext
    • AddedgetMonitoringSchedule
    • ChangedgetOgMarkdown31 fields changed
      • changedInput schema / properties / ai_sanitize / description
        Previous value: -"Scan the fetched content for prompt-injection attempts."New value: +"Scan the fetched content for prompt-injection attempts and return a safety report."
      • changedInput schema / properties / ai_sanitize_mode / description
        Previous value: -"'sanitize' cleans the content, 'warn' returns a safety report, 'block' returns HTTP 422."New value: +"'sanitize' cleans the content, 'warn' reports without changing it, 'block' returns HTTP 422. Only takes effect when ai_sanitize is true."
      • addedInput schema / properties / chunk_overlap
        Added value: +{
        +  "description": "Characters of overlap between consecutive chunks, for context. Max half of chunk_size.",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / chunk_size
        Added value: +{
        +  "description": "Target characters per chunk (200–20000). Defaults to 2000.",
        +  "maximum": 20000,
        +  "minimum": 200,
        +  "type": "integer"
        +}
      • addedInput schema / properties / chunking
        Added value: +{
        +  "description": "Split the Markdown into chunks. Implied by `query`.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / full_render / description
        Previous value: -"Fully render the page with JavaScript before conversion. REQUIRED for SPAs and JS-heavy sites — v3 auto_render does NOT apply to the markdown pipeline."New value: +"Force full browser rendering before conversion. Rendering is applied automatically for pages detected as JavaScript-heavy; set this when that detection is insufficient."
      • addedInput schema / properties / heading_aware
        Added value: +{
        +  "description": "Split on heading boundaries where possible, so sections stay intact. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / heading_aware_level
        Added value: +{
        +  "description": "Deepest heading level treated as a split boundary (1–6). Defaults to 2.",
        +  "maximum": 6,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / include_chunks
        Added value: +{
        +  "description": "Set false to get chunk counts in `usage` without the chunk bodies.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_headings
        Added value: +{
        +  "description": "Include the heading outline, plus table/code-block detection flags.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_images
        Added value: +{
        +  "description": "Include every image with its src and alt text.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_links
        Added value: +{
        +  "description": "Include every hyperlink with its text and rel attributes.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_markdown
        Added value: +{
        +  "description": "Set false to omit the prose body — useful when you only want structure or chunks.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_metadata
        Added value: +{
        +  "description": "Include page metadata (title, description, language, canonical URL). Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / load_more_item_selector
        Added value: +{
        +  "description": "CSS selector for the repeating item, used to detect when clicking stopped adding content.",
        +  "type": "string"
        +}
      • addedInput schema / properties / load_more_scroll
        Added value: +{
        +  "description": "Scroll between load_more clicks. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / max_chars
        Added value: +{
        +  "description": "Truncate the Markdown to this many characters. Prefer `query` + `chunking` when you want the relevant part of a long page rather than an arbitrary prefix.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / max_chunks
        Added value: +{
        +  "description": "Maximum chunks to return (1–2000). Defaults to 500.",
        +  "maximum": 2000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / query
        Added value: +{
        +  "description": "Natural-language question. Returns only the most relevant chunks, ranked (BM25), instead of the whole page. Requires chunking (enabled automatically when set).",
        +  "maxLength": 512,
        +  "type": "string"
        +}
      • addedInput schema / properties / query_top_k
        Added value: +{
        +  "description": "How many ranked chunks to return when `query` is set. Defaults to 5.",
        +  "maximum": 25,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / ai_safety
        Added value: +{
        +  "description": "Prompt-injection report; present when ai_sanitize is true"
        +}
      • addedOutput schema / properties / chunks
        Added value: +{
        +  "description": "Chunk objects, ranked by relevance when `query` is set"
        +}
      • addedOutput schema / properties / debug
        Added value: +{
        +  "description": "Whether rendering, a proxy, or retries were used"
        +}
      • addedOutput schema / properties / headings
        Added value: +{}
      • addedOutput schema / properties / images
        Added value: +{}
      • changedOutput schema / properties / length / description
        Previous value: -"Character count of the Markdown content"New value: +"Character count of the returned Markdown"
      • addedOutput schema / properties / links
        Added value: +{}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "description": "Title, description, language, canonical and final URL"
        +}
      • removedOutput schema / properties / requestInfo
        Removed value: -{}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / usage
        Added value: +{
        +  "description": "Character/token counts and truncation status"
        +}
    • AddedgetSiteAuditChanges
    • AddedlistFixItems
    • AddedlistSiteAudits
    • AddedlistWebsites
    • AddedsaveFixItems
    • AddedsetMonitoringSchedule
  2. 16 tool updatesv1.3.6
    • AddeddiscoverSiteUrls
    • ChangedexportImageAsset1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "type": "string"
        +    },
        +    "format": {
        +      "type": "string"
        +    },
        +    "path": {
        +      "type": "string"
        +    },
        +    "size": {
        +      "type": "number"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "success"
        +  ],
        +  "type": "object"
        +}
    • ChangedgenerateImage1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "assetId": {
        +      "type": "string"
        +    },
        +    "format": {
        +      "type": "string"
        +    },
        +    "height": {
        +      "type": "number"
        +    },
        +    "sessionId": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    },
        +    "width": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "sessionId",
        +    "assetId",
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • AddedgetLinkPreview
    • ChangedgetOgData25 fields changed
      • addedInput schema / properties / accept_lang
        Added value: +{
        +  "description": "Accept-Language header for the outbound request. Use 'auto' to mirror the caller's language. Defaults to 'auto'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / ai_sanitize
        Added value: +{
        +  "description": "Scan the fetched content for prompt-injection attempts before returning it.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / ai_sanitize_mode
        Added value: +{
        +  "description": "'sanitize' cleans the content, 'warn' returns it with a safety report, 'block' returns HTTP 422 when risk_score >= 0.7.",
        +  "enum": [
        +    "sanitize",
        +    "warn",
        +    "block"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / auto_proxy
        Added value: +{
        +  "description": "Automatically escalate to a proxy if the direct request fails. Defaults to true on v3.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / auto_render
        Added value: +{
        +  "description": "Automatically detects JS-heavy / SPA pages and re-fetches with browser rendering when needed. Enabled by default on v3 — leave unset unless you want to disable it. For guaranteed JS execution on every request use full_render: true instead.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / cache_ok
        Added value: +{
        +  "description": "Use cached results. Set to false to bypass cache and get fresh data. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / full_render
        Added value: +{
        +  "description": "Forces a full browser execution pass on every request regardless of page type. Use when auto_render hasn't produced the content you expected, or when you need guaranteed JavaScript execution. Slower than auto_render — prefer auto_render for most cases.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / load_more_clicks
        Added value: +{
        +  "description": "Number of times to click the load_more_selector (1–10). Defaults to 3.",
        +  "maximum": 10,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / load_more_item_selector
        Added value: +{
        +  "description": "CSS selector to watch for new items when using load_more_selector.",
        +  "type": "string"
        +}
      • addedInput schema / properties / load_more_scroll
        Added value: +{
        +  "description": "Scroll between load_more clicks. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / load_more_selector
        Added value: +{
        +  "description": "CSS selector for a 'load more' button to click before extraction. Forces full_render.",
        +  "type": "string"
        +}
      • addedInput schema / properties / load_more_wait
        Added value: +{
        +  "description": "Milliseconds to wait after each load_more click (0–5000). Defaults to 1500.",
        +  "maximum": 5000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / max_cache_age
        Added value: +{
        +  "description": "Maximum cache age in milliseconds. Results older than this will be re-fetched. Defaults to 432000000 (5 days).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / max_retries
        Added value: +{
        +  "description": "Maximum number of retry attempts (1–4). Defaults to 4.",
        +  "maximum": 4,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / proxy_country
        Added value: +{
        +  "description": "Two-letter ISO country code for geo-targeted proxy exit node (e.g. 'US', 'GB').",
        +  "type": "string"
        +}
      • addedInput schema / properties / retry
        Added value: +{
        +  "description": "Automatically retry failed requests with escalating proxy tiers. Defaults to true on v3.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / retry_escalate
        Added value: +{
        +  "description": "Escalate proxy tier on each retry attempt. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / scroll_to_bottom
        Added value: +{
        +  "description": "Scroll to the bottom of the page before extraction. Useful for lazy-loaded content. Forces full_render.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / url / description
        Previous value: -"URL of the webpage to analyze meta tags from"New value: +"URL of the webpage to analyze."
      • addedInput schema / properties / use_ai
        Added value: +{
        +  "description": "Enhance the metadata response with AI-generated fields. Requires an AI-enabled plan.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / use_premium
        Added value: +{
        +  "description": "Route the request through a premium proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / use_proxy
        Added value: +{
        +  "description": "Route the request through a standard proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / use_superior
        Added value: +{
        +  "description": "Route the request through a superior-tier proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / wait_for_selector
        Added value: +{
        +  "description": "CSS selector to wait for before extracting data. Forces full_render.",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "htmlInferred": {
        +      "description": "HTML-inferred fallback values"
        +    },
        +    "hybridGraph": {
        +      "description": "Best-of merged metadata from all sources"
        +    },
        +    "openGraph": {
        +      "description": "Raw Open Graph tag values"
        +    },
        +    "requestInfo": {
        +      "description": "Request metadata (cache status, version, options echo)"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "url"
        +  ],
        +  "type": "object"
        +}
    • ChangedgetOgExtract28 fields changed
      • addedInput schema / properties / accept_lang
        Added value: +{
        +  "description": "Accept-Language header for the outbound request. Defaults to 'auto'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / ai_sanitize
        Added value: +{
        +  "description": "Scan the fetched content for prompt-injection attempts.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / ai_sanitize_mode
        Added value: +{
        +  "description": "'sanitize' cleans the content, 'warn' returns a safety report, 'block' returns HTTP 422.",
        +  "enum": [
        +    "sanitize",
        +    "warn",
        +    "block"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / auto_proxy
        Added value: +{
        +  "description": "Automatically escalate to a proxy if the direct request fails. Defaults to true on v3.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / auto_render
        Added value: +{
        +  "description": "Automatically detect and switch to headless rendering for SPA pages. Defaults to true on v3.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / cache_ok
        Added value: +{
        +  "description": "Use cached results. Set to false to bypass cache. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / full_render
        Added value: +{
        +  "description": "Fully render the page with JavaScript before extracting. Useful for SPAs.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / html_elements / description
        Previous value: -"Array of HTML selectors to extract from the page"New value: +"List of HTML tag names to extract (e.g. ['h1', 'h2', 'a', 'img', 'p']). Defaults to ['title','h1','h2','h3','h4','h5','p'] when neither html_elements nor selectors is provided."
      • addedInput schema / properties / load_more_clicks
        Added value: +{
        +  "description": "Number of times to click the load_more_selector (1–10). Defaults to 3.",
        +  "maximum": 10,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / load_more_item_selector
        Added value: +{
        +  "description": "CSS selector to watch for new items when using load_more_selector.",
        +  "type": "string"
        +}
      • addedInput schema / properties / load_more_scroll
        Added value: +{
        +  "description": "Scroll between load_more clicks. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / load_more_selector
        Added value: +{
        +  "description": "CSS selector for a 'load more' button to click before extracting.",
        +  "type": "string"
        +}
      • addedInput schema / properties / load_more_wait
        Added value: +{
        +  "description": "Milliseconds to wait after each load_more click (0–5000). Defaults to 1500.",
        +  "maximum": 5000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / max_cache_age
        Added value: +{
        +  "description": "Maximum cache age in milliseconds. Defaults to 432000000 (5 days).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / max_retries
        Added value: +{
        +  "description": "Maximum number of retry attempts (1–4). Defaults to 4.",
        +  "maximum": 4,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / proxy_country
        Added value: +{
        +  "description": "Two-letter ISO country code for geo-targeted proxy exit node.",
        +  "type": "string"
        +}
      • addedInput schema / properties / retry
        Added value: +{
        +  "description": "Automatically retry failed requests. Defaults to true on v3.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / retry_escalate
        Added value: +{
        +  "description": "Escalate proxy tier on each retry attempt. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / scroll_to_bottom
        Added value: +{
        +  "description": "Scroll to the bottom of the page before extracting. Useful for lazy-loaded content.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / selectors
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "CSS selector map for structured extraction. Keys are output labels; values are CSS selectors. Example: { \"article_title\": \"article h1\", \"price\": \".price-box .price\", \"description\": \"#product-description p\" }. When provided, returns a structured `data` object keyed by label instead of a raw element list. Can be combined with html_elements.",
        +  "type": "object"
        +}
      • removedInput schema / properties / site
        Removed value: -{
        -  "description": "Site to request (full URL)",
        -  "format": "uri",
        -  "type": "string"
        -}
      • addedInput schema / properties / url
        Added value: +{
        +  "description": "URL of the webpage to extract content from.",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedInput schema / properties / use_premium
        Added value: +{
        +  "description": "Route the request through a premium proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / use_proxy
        Added value: +{
        +  "description": "Route the request through a standard proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / use_superior
        Added value: +{
        +  "description": "Route the request through a superior-tier proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / wait_for_selector
        Added value: +{
        +  "description": "CSS selector to wait for before extracting.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "site",
        -  "html_elements"
        -]New value: +[
        +  "url"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "concatenatedText": {
        +      "description": "All matched element text joined into one string. Present in both html_elements and selectors modes.",
        +      "type": "string"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "description": "Structured object keyed by your selector labels. Only present when the selectors param was used.",
        +      "type": "object"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "url"
        +  ],
        +  "type": "object"
        +}
    • AddedgetOgMarkdown
    • ChangedgetOgQuery22 fields changed
      • addedInput schema / properties / accept_lang
        Added value: +{
        +  "description": "Accept-Language header for the outbound request. Defaults to 'auto'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / ai_sanitize
        Added value: +{
        +  "description": "Scan the fetched content for prompt-injection attempts.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / ai_sanitize_mode
        Added value: +{
        +  "description": "'sanitize' cleans the content, 'warn' returns a safety report, 'block' returns HTTP 422 when risk_score >= 0.7.",
        +  "enum": [
        +    "sanitize",
        +    "warn",
        +    "block"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / auto_render
        Added value: +{
        +  "description": "Automatically detect and switch to headless rendering for SPA pages.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / cache_ok
        Added value: +{
        +  "description": "Use cached page results. Set to false to bypass cache. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / full_render
        Added value: +{
        +  "description": "Fully render the page with JavaScript before querying.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / max_cache_age
        Added value: +{
        +  "description": "Maximum cache age in milliseconds. Defaults to 432000000 (5 days).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / max_retries
        Added value: +{
        +  "description": "Maximum number of retry attempts (1–4). Defaults to 4.",
        +  "maximum": 4,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / modelSize
        Added value: +{
        +  "description": "AI model size. 'small' uses 100 credits; 'large' uses 200 credits. Defaults to 'small'.",
        +  "enum": [
        +    "small",
        +    "large"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / proxy_country
        Added value: +{
        +  "description": "Two-letter ISO country code for geo-targeted proxy exit node.",
        +  "type": "string"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Query to ask about the site"New value: +"Natural-language question to answer about the page content."
      • addedInput schema / properties / query / minLength
        Added value: +1
      • changedInput schema / properties / responseStructure / description
        Previous value: -"Optional JSON for response structure"New value: +"Optional JSON schema describing the shape of the desired response. When provided, the model returns a structured JSON answer."
      • addedInput schema / properties / retry
        Added value: +{
        +  "description": "Automatically retry failed requests.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / site
        Removed value: -{
        -  "description": "Site to request (full URL)",
        -  "format": "uri",
        -  "type": "string"
        -}
      • addedInput schema / properties / url
        Added value: +{
        +  "description": "URL of the webpage to query.",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedInput schema / properties / use_premium
        Added value: +{
        +  "description": "Route the request through a premium proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / use_proxy
        Added value: +{
        +  "description": "Route the request through a standard proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / use_superior
        Added value: +{
        +  "description": "Route the request through a superior-tier proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / wait_for_selector
        Added value: +{
        +  "description": "CSS selector to wait for before querying.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "site",
        -  "query"
        -]New value: +[
        +  "url",
        +  "query"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "question": {
        +      "type": "string"
        +    },
        +    "result": {
        +      "description": "AI-generated answer. May be a string or structured object."
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "url",
        +    "question"
        +  ],
        +  "type": "object"
        +}
    • ChangedgetOgScrapeData24 fields changed
      • addedInput schema / properties / accept_lang
        Added value: +{
        +  "description": "Accept-Language header for the outbound request. Use 'auto' to mirror the caller's language. Defaults to 'auto'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / ai_sanitize
        Added value: +{
        +  "description": "Scan the fetched content for prompt-injection attempts before returning it.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / ai_sanitize_mode
        Added value: +{
        +  "description": "'sanitize' cleans the content, 'warn' returns it with a safety report, 'block' returns HTTP 422 when risk_score >= 0.7.",
        +  "enum": [
        +    "sanitize",
        +    "warn",
        +    "block"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / auto_proxy
        Added value: +{
        +  "description": "Automatically escalate to a proxy if the direct request fails. Defaults to true on v3.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / auto_render
        Added value: +{
        +  "description": "Automatically detects JS-heavy / SPA pages and re-fetches with browser rendering when needed. Enabled by default on v3 — leave unset unless you want to disable it. For guaranteed JS execution on every request use full_render: true instead.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / cache_ok
        Added value: +{
        +  "description": "Use cached results. Set to false to bypass cache and get fresh data. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / full_render
        Added value: +{
        +  "description": "Forces a full browser execution pass on every request regardless of page type. Use when auto_render hasn't produced the content you expected, or when you need guaranteed JavaScript execution. Slower than auto_render — prefer auto_render for most cases.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / load_more_clicks
        Added value: +{
        +  "description": "Number of times to click the load_more_selector (1–10). Defaults to 3.",
        +  "maximum": 10,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / load_more_item_selector
        Added value: +{
        +  "description": "CSS selector to watch for new items when using load_more_selector.",
        +  "type": "string"
        +}
      • addedInput schema / properties / load_more_scroll
        Added value: +{
        +  "description": "Scroll between load_more clicks. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / load_more_selector
        Added value: +{
        +  "description": "CSS selector for a 'load more' button to click before scraping.",
        +  "type": "string"
        +}
      • addedInput schema / properties / load_more_wait
        Added value: +{
        +  "description": "Milliseconds to wait after each load_more click (0–5000). Defaults to 1500.",
        +  "maximum": 5000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / max_cache_age
        Added value: +{
        +  "description": "Maximum cache age in milliseconds. Results older than this will be re-fetched. Defaults to 432000000 (5 days).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / max_retries
        Added value: +{
        +  "description": "Maximum number of retry attempts (1–4). Defaults to 4.",
        +  "maximum": 4,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / proxy_country
        Added value: +{
        +  "description": "Two-letter ISO country code for geo-targeted proxy exit node (e.g. 'US', 'GB').",
        +  "type": "string"
        +}
      • addedInput schema / properties / retry
        Added value: +{
        +  "description": "Automatically retry failed requests with escalating proxy tiers. Defaults to true on v3.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / retry_escalate
        Added value: +{
        +  "description": "Escalate proxy tier on each retry attempt. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / scroll_to_bottom
        Added value: +{
        +  "description": "Scroll to the bottom of the page before scraping. Useful for lazy-loaded content.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / url / description
        Previous value: -"URL of the webpage to scrape data from"New value: +"URL of the webpage to scrape."
      • addedInput schema / properties / use_premium
        Added value: +{
        +  "description": "Route the request through a premium proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / use_proxy
        Added value: +{
        +  "description": "Route the request through a standard proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / use_superior
        Added value: +{
        +  "description": "Route the request through a superior-tier proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / wait_for_selector
        Added value: +{
        +  "description": "CSS selector to wait for before scraping. Forces full_render.",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "html": {
        +      "description": "Full raw HTML of the scraped page",
        +      "type": "string"
        +    },
        +    "length": {
        +      "description": "Character count of the HTML",
        +      "type": "number"
        +    },
        +    "requestInfo": {
        +      "description": "Request metadata (cache status, version, options echo)"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "url",
        +    "html",
        +    "length"
        +  ],
        +  "type": "object"
        +}
    • ChangedgetOgScreenshot25 fields changed
      • addedInput schema / properties / accept_lang
        Added value: +{
        +  "description": "Accept-Language header for the outbound request. Defaults to 'auto'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / auto_proxy
        Added value: +{
        +  "description": "Automatically escalate to a proxy if the direct request fails. Defaults to true on v3.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / block_cookie_banner
        Added value: +{
        +  "description": "Attempt to dismiss cookie consent banners before capturing. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / cache_ok
        Added value: +{
        +  "description": "Use cached results. Set to false to bypass cache. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / capture_delay
        Added value: +{
        +  "description": "Milliseconds to wait after page load before capturing (0–10 000). Defaults to 0.",
        +  "maximum": 10000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / dark_mode
        Added value: +{
        +  "description": "Enable dark mode (prefers-color-scheme: dark). Defaults to false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / dimensions
        Added value: +{
        +  "description": "Viewport dimensions as WxH (e.g. '1280x800'). Defaults to '1366x768'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / exclude_selectors
        Added value: +{
        +  "description": "Comma-separated CSS selectors to hide (set visibility: hidden) before capturing.",
        +  "type": "string"
        +}
      • addedInput schema / properties / format
        Added value: +{
        +  "description": "Image format. Defaults to 'jpg'.",
        +  "enum": [
        +    "jpg",
        +    "png",
        +    "webp"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / full_page
        Added value: +{
        +  "description": "Capture the full scrollable page height. Defaults to false (viewport only).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / full_render
        Added value: +{
        +  "description": "Fully render the page with JavaScript before capturing. Defaults to true for screenshots.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / hideSelectors
        Added value: +{
        +  "description": "Whether to apply the exclude_selectors hiding. Defaults to true when exclude_selectors is set.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / max_cache_age
        Added value: +{
        +  "description": "Maximum cache age in milliseconds. Defaults to 432000000 (5 days).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / max_retries
        Added value: +{
        +  "description": "Maximum number of retry attempts (1–4). Defaults to 4.",
        +  "maximum": 4,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / navigationTimeout
        Added value: +{
        +  "description": "Navigation timeout in milliseconds (1 000–60 000). Defaults to 30 000.",
        +  "maximum": 60000,
        +  "minimum": 1000,
        +  "type": "integer"
        +}
      • addedInput schema / properties / proxy_country
        Added value: +{
        +  "description": "Two-letter ISO country code for geo-targeted proxy exit node (e.g. 'US', 'GB').",
        +  "type": "string"
        +}
      • addedInput schema / properties / quality
        Added value: +{
        +  "description": "Image compression quality 1–100. Only applies to jpg/webp. Defaults to 80.",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / retry
        Added value: +{
        +  "description": "Automatically retry failed requests. Defaults to true on v3.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / selector
        Added value: +{
        +  "description": "CSS selector — crop the screenshot to just this element.",
        +  "type": "string"
        +}
      • changedInput schema / properties / url / description
        Previous value: -"URL of the webpage to screenshot"New value: +"URL of the webpage to screenshot."
      • addedInput schema / properties / use_premium
        Added value: +{
        +  "description": "Route the request through a premium proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / use_proxy
        Added value: +{
        +  "description": "Route the request through a standard proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / use_superior
        Added value: +{
        +  "description": "Route the request through a superior-tier proxy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / wait_for_selector
        Added value: +{
        +  "description": "CSS selector to wait for before capturing.",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "dimensions": {
        +      "type": "string"
        +    },
        +    "format": {
        +      "type": "string"
        +    },
        +    "fullPage": {
        +      "type": "boolean"
        +    },
        +    "screenshotUrl": {
        +      "description": "Hosted URL of the screenshot image",
        +      "type": "string"
        +    },
        +    "url": {
        +      "description": "Source URL that was screenshotted",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "url",
        +    "screenshotUrl"
        +  ],
        +  "type": "object"
        +}
    • AddedgetSiteAuditReport
    • AddedgetSiteAuditStatus
    • ChangedinspectImageSession1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "assetCount": {
        +      "type": "number"
        +    },
        +    "assets": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "assetId": {
        +            "type": "string"
        +          },
        +          "kind": {
        +            "type": "string"
        +          },
        +          "prompt": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "assetId",
        +          "prompt",
        +          "kind",
        +          "status"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "sessionId": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "sessionId",
        +    "name",
        +    "status",
        +    "assets"
        +  ],
        +  "type": "object"
        +}
    • ChangediterateImage1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "assetId": {
        +      "type": "string"
        +    },
        +    "format": {
        +      "type": "string"
        +    },
        +    "height": {
        +      "type": "number"
        +    },
        +    "parentAssetId": {
        +      "type": "string"
        +    },
        +    "sessionId": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    },
        +    "width": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "sessionId",
        +    "assetId",
        +    "parentAssetId",
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • AddedpreviewPageAudit
    • AddedstartSiteAudit
  3. 9 tool updatesv1.3.5
    • First observedexportImageAsset
    • First observedgenerateImage
    • First observedgetOgData
    • First observedgetOgExtract
    • First observedgetOgQuery
    • First observedgetOgScrapeData
    • First observedgetOgScreenshot
    • First observedinspectImageSession
    • First observediterateImage

TDQS

A3.9/5.0

Scored across 28 tools

Disambiguation3/5

The OpenGraph.io tools are mostly distinct, but there is notable overlap between getOgData, getOgMarkdown, getOgScrapeData, getOgExtract, getOgScreenshot, and getOgQuery—all fetch content from a URL in different formats. The descriptions include a 'Pick the right tool' section that helps, but the boundaries between getOgData and getLinkPreview (both check social previews) and between getOgExtract and getOgScrapeData (both can extract HTML elements) could cause misselection. The site audit tools are clearly separated by lifecycle stage.

Naming Consistency3/5

The naming is a mix of conventions: getOg* tools use a consistent getOg prefix, site audit tools use get/start/list/set/delete/email + noun, but there are also exportFixItemsCsv, exportImageAsset, generateImage, inspectImageSession, saveFixItems, and discoverSiteUrls which don't follow a single pattern. The verb-noun structure is mostly present, but the prefixes are inconsistent (getOg vs getSite vs list vs export vs generate).

Tool Count3/5

28 tools is on the heavy side for a single MCP server. The server covers two distinct domains—URL content extraction (6 getOg* tools) and site audits (10+ tools)—plus image generation (3 tools) and fix items (3 tools). While each tool has a purpose, the count feels bloated, and some tools like getOgData and getLinkPreview could potentially be consolidated.

Completeness4/5

The URL extraction surface is complete (metadata, markdown, raw HTML, targeted extraction, screenshot, query), and the site audit lifecycle is well covered (discover, start, status, report, list, changes, delete, schedule, preview). Minor gaps exist: there's no tool to update or delete a website, no way to manage alert recipients, and the image generation tools lack a delete/cleanup function. Overall, the core workflows are well covered.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers