Opengraph io MCP
This server is an MCP bridge to OpenGraph.io plus extended capabilities: it lets AI agents fetch web metadata, scrape content, generate images, and run site audits, all through standard MCP tools.
Fetch Open Graph metadata, HTML-inferred tags, and hybrid social preview data for any URL
Scrape raw HTML, extract specific elements via CSS selectors or HTML tags, and convert pages to clean Markdown
Capture full-page or viewport screenshots with options for dark mode, custom dimensions, and element targeting
Ask natural-language questions about a page's content (uses 100–200 credits per request)
Generate professional images: illustrations, diagrams (Mermaid/D2/Vega), icons, social cards, and QR codes with brand styling and preset formats
Iterate on generated images, inspect generation sessions, and export assets as base64 or to disk locally
Discover all URLs on a domain via sitemap/crawl, then start async multi-page site audits for SEO/social metadata quality
Poll audit status, retrieve full reports with scores and AI-generated summaries, and preview single-URL audits instantly
Check how a URL will render as link previews on Facebook, Twitter/X, LinkedIn, and Google
Manage site audits: list fix items, save/delete/export fixes, email reports
Monitor recurring audits: list websites, audits, changes, and manage monitoring schedules
Use guided workflows (named prompts) for analyzing webpages, extracting structured data, running audits, and creating branded diagrams or asset sets
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-mcpRelated MCP server: @hauntapi/mcp-server
Quick Install
CLI Installer (Recommended)
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_IDSupported 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:
Option 1 — OAuth 2.1 (recommended for hosted deployments)
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.jsonWindows:
%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/mcpCursor
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-idAPI 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 |
| Fetch Open Graph metadata, HTML-inferred tags, and hybrid social preview data. Supports | |
Get OG Scrape Data |
| Scrape raw HTML with full v3 rendering options including scroll-to-bottom, load-more clicks, and AI sanitization. | |
Get OG Screenshot |
| Capture a screenshot. Supports | |
Get OG Query |
| Ask a natural-language question about a page's content. Uses v1.1 (100–200 credits/request) until billing path is updated for v3. | |
Get OG Extract |
| Extract specific HTML elements (h1, p, a, img, etc.) by tag name. Stays on v1.1 — no v3 GET route exists for this endpoint. | |
Get OG Markdown |
| Convert any URL's HTML to clean Markdown. Strips nav/ads by default ( |
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.
Site Audit & Link Preview Tools
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 |
Get Site Audit Status | Poll an in-progress audit ( |
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 |
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. |
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 |
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 imagesdiagram- Technical diagrams from Mermaid, D2, or Vega syntaxicon- App icons and logossocial-card- OG images optimized for social sharingqr-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-thumbnailStandard:
wide,square,portraitIcons:
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 |
| Fetches a page's metadata and readable content in parallel, then summarizes or answers a specific question about it. |
| Extracts named fields (title, price, SKU, etc.) from a page using CSS selectors — ideal for ecommerce, job listings, and articles. |
| Converts a URL to clean readable text/Markdown, stripping boilerplate — ready to read or pass to another model. |
| 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. |
| Guided workflow for creating diagrams (flowchart, sequence, architecture, ER, state) that match your brand identity. |
| Best practices for iterating on a previously generated image to reach the desired result. |
| Generates a visually consistent set of icons, social cards, diagrams, or illustrations. |
| Quickly generates a single icon with sensible defaults. |
How it works
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:
AI client makes a tool call to one of the available MCP functions
og-mcp server receives the request and formats it for the OpenGraph.io API
OpenGraph.io processes the request and returns data
og-mcp transforms the response into a format suitable for the AI client
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
Clone this repository
Install dependencies:
npm installBuild the TypeScript code:
npm run buildStart 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/mcpWhen 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_hereThis 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_IDTransport Options
Stdio Transport (Recommended)
For command-line usage and npm global installation, the server can be run with stdio transport:
npm run start:stdioYou can pass the OpenGraph API key directly via command-line argument:
npm run start:stdio -- --app-id YOUR_APP_IDWhen installed globally:
opengraph-io-mcp --app-id YOUR_APP_IDThis 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 startTroubleshooting
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 toolsdeleteFixItemADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auditId | Yes | Audit ID. | |
| fixItemId | Yes | Fix item ID from listFixItems. |
Output Schema
| Name | Required | Description |
|---|---|---|
| auditId | Yes | |
| deleted | Yes | |
| fixItemId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
deleteSiteAuditADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auditId | Yes | The audit to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| auditId | Yes | |
| deleted | Yes | |
| alreadyGone | Yes |
TDQS
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.
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.
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.
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.
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.
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.
discoverSiteUrlsARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The domain to crawl (e.g. https://example.com). Include the protocol. |
Output Schema
| Name | Required | Description |
|---|---|---|
| urls | Yes | All discovered URLs — pass a subset to startSiteAudit as the urls array |
| domain | Yes | |
| totalFound | Yes | Total URLs found across crawl and sitemap |
| remainingQuota | No | Pages remaining in your monthly audit quota |
| siteContextText | No | Homepage text captured during discovery — pass this to startSiteAudit to enrich AI analysis |
TDQS
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.
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.
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.
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.
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.
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.
emailSiteAuditReportADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auditId | Yes | The completed audit to send. |
Output Schema
| Name | Required | Description |
|---|---|---|
| auditId | Yes | |
| filenames | Yes | |
| recipient | Yes |
TDQS
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.
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.
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.
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.
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.
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.
exportFixItemsCsvARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| auditId | Yes | Audit ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| csv | Yes | |
| auditId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
exportImageAssetADestructiveIdempotent
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")
| Name | Required | Description | Default |
|---|---|---|---|
| assetId | Yes | The asset UUID to export | |
| sessionId | Yes | The session UUID containing the asset | |
| destinationPath | No | Optional absolute path to save the image to disk. Only works when the server is running locally (stdio transport). |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | No | |
| size | No | |
| error | No | |
| format | No | |
| success | Yes |
TDQS
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.
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.
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.
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.
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.
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:
diagramCode + diagramFormat (RECOMMENDED FOR AGENTS) - Full control, bypasses AI styling
Natural language in prompt - AI generates diagram code for you
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
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | The type of image to create | illustration |
| model | No | Model: 'gpt-image-1.5', 'gemini-flash', 'gemini-pro' | |
| cropX1 | No | Manual crop: top-left X | |
| cropX2 | No | Manual crop: bottom-right X | |
| cropY1 | No | Manual crop: top-left Y | |
| cropY2 | No | Manual crop: bottom-right Y | |
| labels | No | Labels for templates/diagrams | |
| prompt | No | For 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. | |
| quality | No | Quality setting | |
| autoCrop | No | Auto-crop transparent edges | |
| template | No | Template name for template-based graphics | |
| aspectRatio | No | Preset aspect ratio (e.g., 'og-image' for 1200x630) | |
| brandColors | No | Brand colors as hex codes (e.g., ['#0033A0', '#FF8C00']) | |
| diagramCode | No | Pre-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. | |
| outputStyle | No | Polish level: 'draft' (fast), 'standard' (AI-enhanced), 'premium' (full AI polish) | |
| stylePreset | No | Preset style with brand colors | |
| transparent | No | Request transparent background | |
| cornerRadius | No | Corner radius for rounded corners | |
| diagramFormat | No | Format of the diagramCode. Required when diagramCode is provided. Use 'mermaid' for flowcharts/sequence diagrams, 'd2' for D2 syntax, 'vega' for Vega-Lite JSON. | |
| diagramSyntax | No | Preferred diagram syntax | |
| projectContext | No | Description of the project this image is for | |
| autoCropPadding | No | Padding for auto-crop (default: 20) | |
| diagramTemplate | No | Pre-built diagram template | |
| referenceAssetId | No | Asset UUID to use as style reference | |
| stylePreferences | No | Style preferences: 'modern', 'minimalist', 'corporate', etc. | |
| layoutPreservation | No | How strictly to preserve layout during premium polish |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| width | No | |
| format | No | |
| height | No | |
| status | Yes | |
| assetId | Yes | |
| sessionId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
getConnectionContextARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| entitlements | Yes | |
| organizationId | Yes | |
| organizationName | Yes |
TDQS
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.
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.
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.
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.
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.
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.
getLinkPreviewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The full URL to preview (e.g. https://example.com/pricing). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| score | Yes | Quality score 0–100 |
| issues | No | Issues found — fix these to improve scores and previews |
| platforms | Yes | What each platform will display when this URL is shared |
| scoreLabel | Yes | Score tier: Well Optimized / Good / Room for Improvement / Needs Attention / Poor |
TDQS
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.
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.
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.
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.
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.
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.
getMonitoringScheduleARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| websiteId | Yes | Website ID from listWebsites. |
Output Schema
| Name | Required | Description |
|---|---|---|
| schedule | No | |
| websiteId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
getOgDataARead-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)
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL of the webpage to analyze. | |
| retry | No | Automatically retry failed requests with escalating proxy tiers. Defaults to true on v3. | |
| use_ai | No | Enhance the metadata response with AI-generated fields. Requires an AI-enabled plan. | |
| cache_ok | No | Use cached results. Set to false to bypass cache and get fresh data. Defaults to true. | |
| use_proxy | No | Route the request through a standard proxy. | |
| auto_proxy | No | Automatically escalate to a proxy if the direct request fails. Defaults to true on v3. | |
| accept_lang | No | Accept-Language header for the outbound request. Use 'auto' to mirror the caller's language. Defaults to 'auto'. | |
| ai_sanitize | No | Scan the fetched content for prompt-injection attempts before returning it. | |
| auto_render | No | 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. | |
| full_render | No | 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. | |
| max_retries | No | Maximum number of retry attempts (1–4). Defaults to 4. | |
| use_premium | No | Route the request through a premium proxy. | |
| use_superior | No | Route the request through a superior-tier proxy. | |
| max_cache_age | No | Maximum cache age in milliseconds. Results older than this will be re-fetched. Defaults to 432000000 (5 days). | |
| proxy_country | No | Two-letter ISO country code for geo-targeted proxy exit node (e.g. 'US', 'GB'). | |
| load_more_wait | No | Milliseconds to wait after each load_more click (0–5000). Defaults to 1500. | |
| retry_escalate | No | Escalate proxy tier on each retry attempt. Defaults to true. | |
| ai_sanitize_mode | No | 'sanitize' cleans the content, 'warn' returns it with a safety report, 'block' returns HTTP 422 when risk_score >= 0.7. | |
| load_more_clicks | No | Number of times to click the load_more_selector (1–10). Defaults to 3. | |
| load_more_scroll | No | Scroll between load_more clicks. Defaults to true. | |
| scroll_to_bottom | No | Scroll to the bottom of the page before extraction. Useful for lazy-loaded content. Forces full_render. | |
| wait_for_selector | No | CSS selector to wait for before extracting data. Forces full_render. | |
| load_more_selector | No | CSS selector for a 'load more' button to click before extraction. Forces full_render. | |
| load_more_item_selector | No | CSS selector to watch for new items when using load_more_selector. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| openGraph | No | Raw Open Graph tag values |
| hybridGraph | No | Best-of merged metadata from all sources |
| requestInfo | No | Request metadata (cache status, version, options echo) |
| htmlInferred | No | HTML-inferred fallback values |
TDQS
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.
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.
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.
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.
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.
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.
getOgExtractARead-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_elementsonly →{ concatenatedText }selectorsonly →{ 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)
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL of the webpage to extract content from. | |
| retry | No | Automatically retry failed requests. Defaults to true on v3. | |
| cache_ok | No | Use cached results. Set to false to bypass cache. Defaults to true. | |
| selectors | No | 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. | |
| use_proxy | No | Route the request through a standard proxy. | |
| auto_proxy | No | Automatically escalate to a proxy if the direct request fails. Defaults to true on v3. | |
| accept_lang | No | Accept-Language header for the outbound request. Defaults to 'auto'. | |
| ai_sanitize | No | Scan the fetched content for prompt-injection attempts. | |
| auto_render | No | Automatically detect and switch to headless rendering for SPA pages. Defaults to true on v3. | |
| full_render | No | Fully render the page with JavaScript before extracting. Useful for SPAs. | |
| max_retries | No | Maximum number of retry attempts (1–4). Defaults to 4. | |
| use_premium | No | Route the request through a premium proxy. | |
| use_superior | No | Route the request through a superior-tier proxy. | |
| html_elements | No | 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. | |
| max_cache_age | No | Maximum cache age in milliseconds. Defaults to 432000000 (5 days). | |
| proxy_country | No | Two-letter ISO country code for geo-targeted proxy exit node. | |
| load_more_wait | No | Milliseconds to wait after each load_more click (0–5000). Defaults to 1500. | |
| retry_escalate | No | Escalate proxy tier on each retry attempt. Defaults to true. | |
| ai_sanitize_mode | No | 'sanitize' cleans the content, 'warn' returns a safety report, 'block' returns HTTP 422. | |
| load_more_clicks | No | Number of times to click the load_more_selector (1–10). Defaults to 3. | |
| load_more_scroll | No | Scroll between load_more clicks. Defaults to true. | |
| scroll_to_bottom | No | Scroll to the bottom of the page before extracting. Useful for lazy-loaded content. | |
| wait_for_selector | No | CSS selector to wait for before extracting. | |
| load_more_selector | No | CSS selector for a 'load more' button to click before extracting. | |
| load_more_item_selector | No | CSS selector to watch for new items when using load_more_selector. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| data | No | Structured object keyed by your selector labels. Only present when the selectors param was used. |
| concatenatedText | No | All matched element text joined into one string. Present in both html_elements and selectors modes. |
TDQS
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.
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.
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.
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.
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.
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.
getOgMarkdownARead-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)
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL of the webpage to convert to Markdown. | |
| query | No | Natural-language question. Returns only the most relevant chunks, ranked (BM25), instead of the whole page. Requires chunking (enabled automatically when set). | |
| retry | No | Automatically retry failed requests. | |
| cache_ok | No | Use cached results. Set to false to bypass cache. Defaults to true. | |
| chunking | No | Split the Markdown into chunks. Implied by `query`. | |
| max_chars | No | 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. | |
| use_proxy | No | Route the request through a standard proxy. | |
| auto_proxy | No | Automatically escalate to a proxy if the direct request fails. | |
| chunk_size | No | Target characters per chunk (200–20000). Defaults to 2000. | |
| max_chunks | No | Maximum chunks to return (1–2000). Defaults to 500. | |
| accept_lang | No | Accept-Language header for the outbound request. Defaults to 'auto'. | |
| ai_sanitize | No | Scan the fetched content for prompt-injection attempts and return a safety report. | |
| full_render | No | Force full browser rendering before conversion. Rendering is applied automatically for pages detected as JavaScript-heavy; set this when that detection is insufficient. | |
| max_retries | No | Maximum number of retry attempts (1–4). Defaults to 4. | |
| query_top_k | No | How many ranked chunks to return when `query` is set. Defaults to 5. | |
| use_premium | No | Route the request through a premium proxy. | |
| exclude_tags | No | CSS selectors to remove before conversion. Supports wildcard/regex patterns. Example: ['nav', 'footer', '.sidebar', '.ad*']. | |
| include_tags | No | CSS selectors — keep only elements matching these selectors. Example: ['article', 'main', '.content'] to target the main content area only. | |
| use_superior | No | Route the request through a superior-tier proxy. | |
| chunk_overlap | No | Characters of overlap between consecutive chunks, for context. Max half of chunk_size. | |
| heading_aware | No | Split on heading boundaries where possible, so sections stay intact. Defaults to true. | |
| include_links | No | Include every hyperlink with its text and rel attributes. | |
| max_cache_age | No | Maximum cache age in milliseconds. Defaults to 432000000 (5 days). | |
| proxy_country | No | Two-letter ISO country code for geo-targeted proxy exit node. | |
| include_chunks | No | Set false to get chunk counts in `usage` without the chunk bodies. | |
| include_images | No | Include every image with its src and alt text. | |
| load_more_wait | No | Milliseconds to wait after each load_more click (0–5000). Defaults to 1500. | |
| retry_escalate | No | Escalate proxy tier on each retry attempt. Defaults to true. | |
| ai_sanitize_mode | No | 'sanitize' cleans the content, 'warn' reports without changing it, 'block' returns HTTP 422. Only takes effect when ai_sanitize is true. | |
| include_headings | No | Include the heading outline, plus table/code-block detection flags. | |
| include_markdown | No | Set false to omit the prose body — useful when you only want structure or chunks. | |
| include_metadata | No | Include page metadata (title, description, language, canonical URL). Defaults to true. | |
| load_more_clicks | No | Number of times to click the load_more_selector (1–10). Defaults to 3. | |
| load_more_scroll | No | Scroll between load_more clicks. Defaults to true. | |
| scroll_to_bottom | No | Scroll to the bottom of the page before conversion. Forces full_render. | |
| only_main_content | No | Heuristically 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_selector | No | CSS selector to wait for before converting. Forces full_render. | |
| load_more_selector | No | CSS selector for a 'load more' button to click before conversion. | |
| heading_aware_level | No | Deepest heading level treated as a split boundary (1–6). Defaults to 2. | |
| load_more_item_selector | No | CSS selector for the repeating item, used to detect when clicking stopped adding content. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| debug | No | Whether rendering, a proxy, or retries were used |
| links | No | |
| usage | No | Character/token counts and truncation status |
| chunks | No | Chunk objects, ranked by relevance when `query` is set |
| images | No | |
| length | Yes | Character count of the returned Markdown |
| headings | No | |
| markdown | Yes | Full Markdown content of the page |
| metadata | No | Title, description, language, canonical and final URL |
| ai_safety | No | Prompt-injection report; present when ai_sanitize is true |
| request_id | No | |
| onlyMainContent | No |
TDQS
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.
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.
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.
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.
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.
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.
getOgQueryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL of the webpage to query. | |
| query | Yes | Natural-language question to answer about the page content. | |
| retry | No | Automatically retry failed requests. | |
| cache_ok | No | Use cached page results. Set to false to bypass cache. Defaults to true. | |
| modelSize | No | AI model size. 'small' uses 100 credits; 'large' uses 200 credits. Defaults to 'small'. | |
| use_proxy | No | Route the request through a standard proxy. | |
| accept_lang | No | Accept-Language header for the outbound request. Defaults to 'auto'. | |
| ai_sanitize | No | Scan the fetched content for prompt-injection attempts. | |
| auto_render | No | Automatically detect and switch to headless rendering for SPA pages. | |
| full_render | No | Fully render the page with JavaScript before querying. | |
| max_retries | No | Maximum number of retry attempts (1–4). Defaults to 4. | |
| use_premium | No | Route the request through a premium proxy. | |
| use_superior | No | Route the request through a superior-tier proxy. | |
| max_cache_age | No | Maximum cache age in milliseconds. Defaults to 432000000 (5 days). | |
| proxy_country | No | Two-letter ISO country code for geo-targeted proxy exit node. | |
| ai_sanitize_mode | No | 'sanitize' cleans the content, 'warn' returns a safety report, 'block' returns HTTP 422 when risk_score >= 0.7. | |
| responseStructure | No | Optional JSON schema describing the shape of the desired response. When provided, the model returns a structured JSON answer. | |
| wait_for_selector | No | CSS selector to wait for before querying. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| result | No | AI-generated answer. May be a string or structured object. |
| question | Yes |
TDQS
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.
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.
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.
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.
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.
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.
getOgScrapeDataARead-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)
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL of the webpage to scrape. | |
| retry | No | Automatically retry failed requests with escalating proxy tiers. Defaults to true on v3. | |
| cache_ok | No | Use cached results. Set to false to bypass cache and get fresh data. Defaults to true. | |
| use_proxy | No | Route the request through a standard proxy. | |
| auto_proxy | No | Automatically escalate to a proxy if the direct request fails. Defaults to true on v3. | |
| accept_lang | No | Accept-Language header for the outbound request. Use 'auto' to mirror the caller's language. Defaults to 'auto'. | |
| ai_sanitize | No | Scan the fetched content for prompt-injection attempts before returning it. | |
| auto_render | No | 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. | |
| full_render | No | 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. | |
| max_retries | No | Maximum number of retry attempts (1–4). Defaults to 4. | |
| use_premium | No | Route the request through a premium proxy. | |
| use_superior | No | Route the request through a superior-tier proxy. | |
| max_cache_age | No | Maximum cache age in milliseconds. Results older than this will be re-fetched. Defaults to 432000000 (5 days). | |
| proxy_country | No | Two-letter ISO country code for geo-targeted proxy exit node (e.g. 'US', 'GB'). | |
| load_more_wait | No | Milliseconds to wait after each load_more click (0–5000). Defaults to 1500. | |
| retry_escalate | No | Escalate proxy tier on each retry attempt. Defaults to true. | |
| ai_sanitize_mode | No | 'sanitize' cleans the content, 'warn' returns it with a safety report, 'block' returns HTTP 422 when risk_score >= 0.7. | |
| load_more_clicks | No | Number of times to click the load_more_selector (1–10). Defaults to 3. | |
| load_more_scroll | No | Scroll between load_more clicks. Defaults to true. | |
| scroll_to_bottom | No | Scroll to the bottom of the page before scraping. Useful for lazy-loaded content. | |
| wait_for_selector | No | CSS selector to wait for before scraping. Forces full_render. | |
| load_more_selector | No | CSS selector for a 'load more' button to click before scraping. | |
| load_more_item_selector | No | CSS selector to watch for new items when using load_more_selector. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| html | Yes | Full raw HTML of the scraped page |
| length | Yes | Character count of the HTML |
| requestInfo | No | Request metadata (cache status, version, options echo) |
TDQS
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.
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.
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.
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.
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.
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.
getOgScreenshotARead-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)
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL of the webpage to screenshot. | |
| retry | No | Automatically retry failed requests. Defaults to true on v3. | |
| format | No | Image format. Defaults to 'jpg'. | |
| quality | No | Image compression quality 1–100. Only applies to jpg/webp. Defaults to 80. | |
| cache_ok | No | Use cached results. Set to false to bypass cache. Defaults to true. | |
| selector | No | CSS selector — crop the screenshot to just this element. | |
| dark_mode | No | Enable dark mode (prefers-color-scheme: dark). Defaults to false. | |
| full_page | No | Capture the full scrollable page height. Defaults to false (viewport only). | |
| use_proxy | No | Route the request through a standard proxy. | |
| auto_proxy | No | Automatically escalate to a proxy if the direct request fails. Defaults to true on v3. | |
| dimensions | No | Viewport dimensions as WxH (e.g. '1280x800'). Defaults to '1366x768'. | |
| accept_lang | No | Accept-Language header for the outbound request. Defaults to 'auto'. | |
| full_render | No | Fully render the page with JavaScript before capturing. Defaults to true for screenshots. | |
| max_retries | No | Maximum number of retry attempts (1–4). Defaults to 4. | |
| use_premium | No | Route the request through a premium proxy. | |
| use_superior | No | Route the request through a superior-tier proxy. | |
| capture_delay | No | Milliseconds to wait after page load before capturing (0–10 000). Defaults to 0. | |
| hideSelectors | No | Whether to apply the exclude_selectors hiding. Defaults to true when exclude_selectors is set. | |
| max_cache_age | No | Maximum cache age in milliseconds. Defaults to 432000000 (5 days). | |
| proxy_country | No | Two-letter ISO country code for geo-targeted proxy exit node (e.g. 'US', 'GB'). | |
| exclude_selectors | No | Comma-separated CSS selectors to hide (set visibility: hidden) before capturing. | |
| navigationTimeout | No | Navigation timeout in milliseconds (1 000–60 000). Defaults to 30 000. | |
| wait_for_selector | No | CSS selector to wait for before capturing. | |
| block_cookie_banner | No | Attempt to dismiss cookie consent banners before capturing. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Source URL that was screenshotted |
| format | No | |
| fullPage | No | |
| dimensions | No | |
| screenshotUrl | Yes | Hosted URL of the screenshot image |
TDQS
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.
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.
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.
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.
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.
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.
getSiteAuditChangesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| auditId | Yes | ID of a completed audit (from startSiteAudit or listSiteAudits). | |
| baseline | No | Audit ID to compare against. Defaults to the audit's recorded baseline. |
Output Schema
| Name | Required | Description |
|---|---|---|
| diff | No | |
| auditId | Yes | |
| degraded | No | |
| priorities | No |
TDQS
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.
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.
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.
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.
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.
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.
getSiteAuditReportARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| auditId | Yes | The audit ID returned by startSiteAudit. The audit must be in COMPLETE status. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pages | No | Per-page scores, checks, issues, and social previews |
| score | No | Overall site score 0–100 |
| domain | Yes | |
| status | Yes | |
| auditId | Yes | |
| summary | No | |
| completedAt | No | |
| pagesAudited | No | |
| aiSiteOverview | No | AI-generated overview: siteSummary, reportHighlights, issueRollup |
TDQS
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.
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.
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.
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.
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.
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.
getSiteAuditStatusARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| auditId | Yes | The audit ID returned by startSiteAudit. |
Output Schema
| Name | Required | Description |
|---|---|---|
| score | No | |
| domain | Yes | |
| status | Yes | |
| auditId | Yes | |
| completedAt | No | |
| totalIssues | No | |
| errorMessage | No | |
| pagesAudited | No | |
| pagesFetched | No | |
| criticalIssues | No | |
| pagesRequested | Yes |
TDQS
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.
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.
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.
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.
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.
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.
inspectImageSessionARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | The session UUID to inspect |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| assets | Yes | |
| status | Yes | |
| sessionId | Yes | |
| assetCount | No |
TDQS
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.
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.
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.
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.
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.
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:
Include the original Mermaid/D2/Vega source in your prompt to preserve structure
Be explicit about visual issues (e.g., "the left edge is clipped")
| Name | Required | Description | Default |
|---|---|---|---|
| cropX1 | No | Crop: X coordinate of the top-left corner in pixels | |
| cropX2 | No | Crop: X coordinate of the bottom-right corner in pixels | |
| cropY1 | No | Crop: Y coordinate of the top-left corner in pixels | |
| cropY2 | No | Crop: Y coordinate of the bottom-right corner in pixels | |
| prompt | Yes | Detailed instruction for the iteration. Be specific about what to change. Examples: 'Change the primary color to #0033A0', 'Add a subtle drop shadow' | |
| assetId | Yes | The asset UUID of the image to iterate on | |
| sessionId | Yes | The session UUID containing the image to iterate on |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| width | No | |
| format | No | |
| height | No | |
| status | Yes | |
| assetId | Yes | |
| sessionId | Yes | |
| parentAssetId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
listFixItemsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| auditId | Yes | Audit ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| auditId | Yes | |
| fixItems | Yes |
TDQS
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.
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.
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.
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.
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.
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.
listSiteAuditsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Filter by domain substring. | |
| to | No | Only audits created on or before this ISO date. | |
| from | No | Only audits created on or after this ISO date. | |
| sort | No | Server-supported sort key, e.g. '-createdAt'. | |
| limit | No | How many audits to return (1–100). Defaults to the server's page size. | |
| offset | No | Rows to skip, for paging. | |
| status | No | Only return audits in these states. | |
| websiteId | No | Only audits for this monitored website — use it to build a single site's history. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | No | |
| total | Yes | |
| audits | Yes | |
| offset | No |
TDQS
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.
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.
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.
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.
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.
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.
listWebsitesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Filter by domain substring. | |
| sort | No | Server-supported sort key. | |
| limit | No | ||
| health | No | Filter by health status. | |
| offset | No | ||
| websiteId | No | Return this one website in detail instead of the list. | |
| monitoring | No | Filter by monitoring state — whether a recurring schedule is configured. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| website | No | |
| websites | No |
TDQS
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.
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.
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.
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.
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.
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.
previewPageAuditARead-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)
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The full URL of the page to audit (e.g. https://example.com/product). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| score | Yes | Quality score 0–100 |
| checks | No | Individual check results keyed by check name |
| issues | No | Issues found on the page with severity and guidance |
| summary | No | |
| previews | No | Social card mock previews: facebook, twitter, linkedin, google |
| scoreLabel | Yes | Human-readable score tier |
TDQS
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.
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.
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.
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.
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.
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.
saveFixItemsADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Items to save for this page. | |
| auditId | Yes | Audit ID. | |
| pageUrl | Yes | The page these items apply to, as audited. |
Output Schema
| Name | Required | Description |
|---|---|---|
| saved | Yes | |
| result | No | |
| auditId | Yes | |
| pageUrl | Yes |
TDQS
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.
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.
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.
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.
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.
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.
setMonitoringScheduleADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| paused | No | Pause without deleting — the configuration is kept and can be resumed. | |
| enabled | No | false removes the schedule and stops recurring audits. Defaults to true. | |
| runHour | No | Hour of day to run (0–23). Anchoring needs runHour and timezone together. | |
| timezone | No | IANA zone, e.g. 'America/New_York'. Runs stay at the same wall-clock time across DST. | |
| dayOfWeek | No | Day for a weekly schedule — 0 is Sunday. | |
| frequency | No | How often the audit runs. Required when enabling. | |
| runMinute | No | Minute of the hour. | |
| websiteId | Yes | Website ID from listWebsites. | |
| dayOfMonth | No | Day for a monthly schedule (1–28, so the day exists in every month). | |
| pageScopeMode | No | Which pages each run covers. | |
| includeNewPages | No | Audit pages discovered after the schedule was created. Increases quota use over time. | |
| notificationMode | No | When alert email is sent for this schedule. | |
| autoAdvanceBaseline | No | Move the comparison baseline forward after each run, so changes are measured against the previous run rather than a fixed point. |
Output Schema
| Name | Required | Description |
|---|---|---|
| enabled | Yes | |
| schedule | No | |
| websiteId | Yes |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | Specific URLs to audit. Pass the user-selected subset from **discoverSiteUrls**. When omitted, the audit crawls the domain internally. | |
| domain | Yes | The domain to audit. Include the protocol (e.g. https://example.com). | |
| pagesRequested | No | Number 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. | |
| siteContextText | No | Homepage text from **discoverSiteUrls** structured output (`siteContextText`). Including this enriches the AI-generated overview and top-priority analysis. |
Output Schema
| Name | Required | Description |
|---|---|---|
| domain | Yes | |
| status | Yes | Initial status — always QUEUED on creation |
| auditId | Yes | ID to pass to getSiteAuditStatus and getSiteAuditReport |
| pagesRequested | Yes |
TDQS
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.
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.
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.
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.
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.
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.
13 tool updates
v2.1.0- Added
deleteFixItem - Added
deleteSiteAudit - Added
emailSiteAuditReport - Added
exportFixItemsCsv - Added
getConnectionContext - Added
getMonitoringSchedule - Changed
getOgMarkdown31 fields changed- changed
Input schema / properties / ai_sanitize / descriptionPrevious value: -"Scan the fetched content for prompt-injection attempts."New value: +"Scan the fetched content for prompt-injection attempts and return a safety report." - changed
Input schema / properties / ai_sanitize_mode / descriptionPrevious 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." - added
Input schema / properties / chunk_overlapAdded value: +{ + "description": "Characters of overlap between consecutive chunks, for context. Max half of chunk_size.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / chunk_sizeAdded value: +{ + "description": "Target characters per chunk (200–20000). Defaults to 2000.", + "maximum": 20000, + "minimum": 200, + "type": "integer" +} - added
Input schema / properties / chunkingAdded value: +{ + "description": "Split the Markdown into chunks. Implied by `query`.", + "type": "boolean" +} - changed
Input schema / properties / full_render / descriptionPrevious 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." - added
Input schema / properties / heading_awareAdded value: +{ + "description": "Split on heading boundaries where possible, so sections stay intact. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / heading_aware_levelAdded value: +{ + "description": "Deepest heading level treated as a split boundary (1–6). Defaults to 2.", + "maximum": 6, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / include_chunksAdded value: +{ + "description": "Set false to get chunk counts in `usage` without the chunk bodies.", + "type": "boolean" +} - added
Input schema / properties / include_headingsAdded value: +{ + "description": "Include the heading outline, plus table/code-block detection flags.", + "type": "boolean" +} - added
Input schema / properties / include_imagesAdded value: +{ + "description": "Include every image with its src and alt text.", + "type": "boolean" +} - added
Input schema / properties / include_linksAdded value: +{ + "description": "Include every hyperlink with its text and rel attributes.", + "type": "boolean" +} - added
Input schema / properties / include_markdownAdded value: +{ + "description": "Set false to omit the prose body — useful when you only want structure or chunks.", + "type": "boolean" +} - added
Input schema / properties / include_metadataAdded value: +{ + "description": "Include page metadata (title, description, language, canonical URL). Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / load_more_item_selectorAdded value: +{ + "description": "CSS selector for the repeating item, used to detect when clicking stopped adding content.", + "type": "string" +} - added
Input schema / properties / load_more_scrollAdded value: +{ + "description": "Scroll between load_more clicks. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / max_charsAdded 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" +} - added
Input schema / properties / max_chunksAdded value: +{ + "description": "Maximum chunks to return (1–2000). Defaults to 500.", + "maximum": 2000, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / queryAdded 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" +} - added
Input schema / properties / query_top_kAdded value: +{ + "description": "How many ranked chunks to return when `query` is set. Defaults to 5.", + "maximum": 25, + "minimum": 1, + "type": "integer" +} - added
Output schema / properties / ai_safetyAdded value: +{ + "description": "Prompt-injection report; present when ai_sanitize is true" +} - added
Output schema / properties / chunksAdded value: +{ + "description": "Chunk objects, ranked by relevance when `query` is set" +} - added
Output schema / properties / debugAdded value: +{ + "description": "Whether rendering, a proxy, or retries were used" +} - added
Output schema / properties / headingsAdded value: +{} - added
Output schema / properties / imagesAdded value: +{} - changed
Output schema / properties / length / descriptionPrevious value: -"Character count of the Markdown content"New value: +"Character count of the returned Markdown" - added
Output schema / properties / linksAdded value: +{} - added
Output schema / properties / metadataAdded value: +{ + "description": "Title, description, language, canonical and final URL" +} - removed
Output schema / properties / requestInfoRemoved value: -{} - added
Output schema / properties / request_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / usageAdded value: +{ + "description": "Character/token counts and truncation status" +}
- Added
getSiteAuditChanges - Added
listFixItems - Added
listSiteAudits - Added
listWebsites - Added
saveFixItems - Added
setMonitoringSchedule
16 tool updates
v1.3.6- Added
discoverSiteUrls - Changed
exportImageAsset1 field changed- changed
Output 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" +}
- Changed
generateImage1 field changed- changed
Output 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" +}
- Added
getLinkPreview - Changed
getOgData25 fields changed- added
Input schema / properties / accept_langAdded value: +{ + "description": "Accept-Language header for the outbound request. Use 'auto' to mirror the caller's language. Defaults to 'auto'.", + "type": "string" +} - added
Input schema / properties / ai_sanitizeAdded value: +{ + "description": "Scan the fetched content for prompt-injection attempts before returning it.", + "type": "boolean" +} - added
Input schema / properties / ai_sanitize_modeAdded 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" +} - added
Input schema / properties / auto_proxyAdded value: +{ + "description": "Automatically escalate to a proxy if the direct request fails. Defaults to true on v3.", + "type": "boolean" +} - added
Input schema / properties / auto_renderAdded 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" +} - added
Input schema / properties / cache_okAdded value: +{ + "description": "Use cached results. Set to false to bypass cache and get fresh data. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / full_renderAdded 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" +} - added
Input schema / properties / load_more_clicksAdded value: +{ + "description": "Number of times to click the load_more_selector (1–10). Defaults to 3.", + "maximum": 10, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / load_more_item_selectorAdded value: +{ + "description": "CSS selector to watch for new items when using load_more_selector.", + "type": "string" +} - added
Input schema / properties / load_more_scrollAdded value: +{ + "description": "Scroll between load_more clicks. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / load_more_selectorAdded value: +{ + "description": "CSS selector for a 'load more' button to click before extraction. Forces full_render.", + "type": "string" +} - added
Input schema / properties / load_more_waitAdded value: +{ + "description": "Milliseconds to wait after each load_more click (0–5000). Defaults to 1500.", + "maximum": 5000, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / max_cache_ageAdded value: +{ + "description": "Maximum cache age in milliseconds. Results older than this will be re-fetched. Defaults to 432000000 (5 days).", + "type": "integer" +} - added
Input schema / properties / max_retriesAdded value: +{ + "description": "Maximum number of retry attempts (1–4). Defaults to 4.", + "maximum": 4, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / proxy_countryAdded value: +{ + "description": "Two-letter ISO country code for geo-targeted proxy exit node (e.g. 'US', 'GB').", + "type": "string" +} - added
Input schema / properties / retryAdded value: +{ + "description": "Automatically retry failed requests with escalating proxy tiers. Defaults to true on v3.", + "type": "boolean" +} - added
Input schema / properties / retry_escalateAdded value: +{ + "description": "Escalate proxy tier on each retry attempt. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / scroll_to_bottomAdded value: +{ + "description": "Scroll to the bottom of the page before extraction. Useful for lazy-loaded content. Forces full_render.", + "type": "boolean" +} - changed
Input schema / properties / url / descriptionPrevious value: -"URL of the webpage to analyze meta tags from"New value: +"URL of the webpage to analyze." - added
Input schema / properties / use_aiAdded value: +{ + "description": "Enhance the metadata response with AI-generated fields. Requires an AI-enabled plan.", + "type": "boolean" +} - added
Input schema / properties / use_premiumAdded value: +{ + "description": "Route the request through a premium proxy.", + "type": "boolean" +} - added
Input schema / properties / use_proxyAdded value: +{ + "description": "Route the request through a standard proxy.", + "type": "boolean" +} - added
Input schema / properties / use_superiorAdded value: +{ + "description": "Route the request through a superior-tier proxy.", + "type": "boolean" +} - added
Input schema / properties / wait_for_selectorAdded value: +{ + "description": "CSS selector to wait for before extracting data. Forces full_render.", + "type": "string" +} - changed
Output 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" +}
- Changed
getOgExtract28 fields changed- added
Input schema / properties / accept_langAdded value: +{ + "description": "Accept-Language header for the outbound request. Defaults to 'auto'.", + "type": "string" +} - added
Input schema / properties / ai_sanitizeAdded value: +{ + "description": "Scan the fetched content for prompt-injection attempts.", + "type": "boolean" +} - added
Input schema / properties / ai_sanitize_modeAdded value: +{ + "description": "'sanitize' cleans the content, 'warn' returns a safety report, 'block' returns HTTP 422.", + "enum": [ + "sanitize", + "warn", + "block" + ], + "type": "string" +} - added
Input schema / properties / auto_proxyAdded value: +{ + "description": "Automatically escalate to a proxy if the direct request fails. Defaults to true on v3.", + "type": "boolean" +} - added
Input schema / properties / auto_renderAdded value: +{ + "description": "Automatically detect and switch to headless rendering for SPA pages. Defaults to true on v3.", + "type": "boolean" +} - added
Input schema / properties / cache_okAdded value: +{ + "description": "Use cached results. Set to false to bypass cache. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / full_renderAdded value: +{ + "description": "Fully render the page with JavaScript before extracting. Useful for SPAs.", + "type": "boolean" +} - changed
Input schema / properties / html_elements / descriptionPrevious 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." - added
Input schema / properties / load_more_clicksAdded value: +{ + "description": "Number of times to click the load_more_selector (1–10). Defaults to 3.", + "maximum": 10, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / load_more_item_selectorAdded value: +{ + "description": "CSS selector to watch for new items when using load_more_selector.", + "type": "string" +} - added
Input schema / properties / load_more_scrollAdded value: +{ + "description": "Scroll between load_more clicks. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / load_more_selectorAdded value: +{ + "description": "CSS selector for a 'load more' button to click before extracting.", + "type": "string" +} - added
Input schema / properties / load_more_waitAdded value: +{ + "description": "Milliseconds to wait after each load_more click (0–5000). Defaults to 1500.", + "maximum": 5000, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / max_cache_ageAdded value: +{ + "description": "Maximum cache age in milliseconds. Defaults to 432000000 (5 days).", + "type": "integer" +} - added
Input schema / properties / max_retriesAdded value: +{ + "description": "Maximum number of retry attempts (1–4). Defaults to 4.", + "maximum": 4, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / proxy_countryAdded value: +{ + "description": "Two-letter ISO country code for geo-targeted proxy exit node.", + "type": "string" +} - added
Input schema / properties / retryAdded value: +{ + "description": "Automatically retry failed requests. Defaults to true on v3.", + "type": "boolean" +} - added
Input schema / properties / retry_escalateAdded value: +{ + "description": "Escalate proxy tier on each retry attempt. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / scroll_to_bottomAdded value: +{ + "description": "Scroll to the bottom of the page before extracting. Useful for lazy-loaded content.", + "type": "boolean" +} - added
Input schema / properties / selectorsAdded 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" +} - removed
Input schema / properties / siteRemoved value: -{ - "description": "Site to request (full URL)", - "format": "uri", - "type": "string" -} - added
Input schema / properties / urlAdded value: +{ + "description": "URL of the webpage to extract content from.", + "format": "uri", + "type": "string" +} - added
Input schema / properties / use_premiumAdded value: +{ + "description": "Route the request through a premium proxy.", + "type": "boolean" +} - added
Input schema / properties / use_proxyAdded value: +{ + "description": "Route the request through a standard proxy.", + "type": "boolean" +} - added
Input schema / properties / use_superiorAdded value: +{ + "description": "Route the request through a superior-tier proxy.", + "type": "boolean" +} - added
Input schema / properties / wait_for_selectorAdded value: +{ + "description": "CSS selector to wait for before extracting.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "site", - "html_elements" -]New value: +[ + "url" +] - changed
Output 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" +}
- Added
getOgMarkdown - Changed
getOgQuery22 fields changed- added
Input schema / properties / accept_langAdded value: +{ + "description": "Accept-Language header for the outbound request. Defaults to 'auto'.", + "type": "string" +} - added
Input schema / properties / ai_sanitizeAdded value: +{ + "description": "Scan the fetched content for prompt-injection attempts.", + "type": "boolean" +} - added
Input schema / properties / ai_sanitize_modeAdded 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" +} - added
Input schema / properties / auto_renderAdded value: +{ + "description": "Automatically detect and switch to headless rendering for SPA pages.", + "type": "boolean" +} - added
Input schema / properties / cache_okAdded value: +{ + "description": "Use cached page results. Set to false to bypass cache. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / full_renderAdded value: +{ + "description": "Fully render the page with JavaScript before querying.", + "type": "boolean" +} - added
Input schema / properties / max_cache_ageAdded value: +{ + "description": "Maximum cache age in milliseconds. Defaults to 432000000 (5 days).", + "type": "integer" +} - added
Input schema / properties / max_retriesAdded value: +{ + "description": "Maximum number of retry attempts (1–4). Defaults to 4.", + "maximum": 4, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / modelSizeAdded value: +{ + "description": "AI model size. 'small' uses 100 credits; 'large' uses 200 credits. Defaults to 'small'.", + "enum": [ + "small", + "large" + ], + "type": "string" +} - added
Input schema / properties / proxy_countryAdded value: +{ + "description": "Two-letter ISO country code for geo-targeted proxy exit node.", + "type": "string" +} - changed
Input schema / properties / query / descriptionPrevious value: -"Query to ask about the site"New value: +"Natural-language question to answer about the page content." - added
Input schema / properties / query / minLengthAdded value: +1 - changed
Input schema / properties / responseStructure / descriptionPrevious 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." - added
Input schema / properties / retryAdded value: +{ + "description": "Automatically retry failed requests.", + "type": "boolean" +} - removed
Input schema / properties / siteRemoved value: -{ - "description": "Site to request (full URL)", - "format": "uri", - "type": "string" -} - added
Input schema / properties / urlAdded value: +{ + "description": "URL of the webpage to query.", + "format": "uri", + "type": "string" +} - added
Input schema / properties / use_premiumAdded value: +{ + "description": "Route the request through a premium proxy.", + "type": "boolean" +} - added
Input schema / properties / use_proxyAdded value: +{ + "description": "Route the request through a standard proxy.", + "type": "boolean" +} - added
Input schema / properties / use_superiorAdded value: +{ + "description": "Route the request through a superior-tier proxy.", + "type": "boolean" +} - added
Input schema / properties / wait_for_selectorAdded value: +{ + "description": "CSS selector to wait for before querying.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "site", - "query" -]New value: +[ + "url", + "query" +] - changed
Output 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" +}
- Changed
getOgScrapeData24 fields changed- added
Input schema / properties / accept_langAdded value: +{ + "description": "Accept-Language header for the outbound request. Use 'auto' to mirror the caller's language. Defaults to 'auto'.", + "type": "string" +} - added
Input schema / properties / ai_sanitizeAdded value: +{ + "description": "Scan the fetched content for prompt-injection attempts before returning it.", + "type": "boolean" +} - added
Input schema / properties / ai_sanitize_modeAdded 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" +} - added
Input schema / properties / auto_proxyAdded value: +{ + "description": "Automatically escalate to a proxy if the direct request fails. Defaults to true on v3.", + "type": "boolean" +} - added
Input schema / properties / auto_renderAdded 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" +} - added
Input schema / properties / cache_okAdded value: +{ + "description": "Use cached results. Set to false to bypass cache and get fresh data. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / full_renderAdded 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" +} - added
Input schema / properties / load_more_clicksAdded value: +{ + "description": "Number of times to click the load_more_selector (1–10). Defaults to 3.", + "maximum": 10, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / load_more_item_selectorAdded value: +{ + "description": "CSS selector to watch for new items when using load_more_selector.", + "type": "string" +} - added
Input schema / properties / load_more_scrollAdded value: +{ + "description": "Scroll between load_more clicks. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / load_more_selectorAdded value: +{ + "description": "CSS selector for a 'load more' button to click before scraping.", + "type": "string" +} - added
Input schema / properties / load_more_waitAdded value: +{ + "description": "Milliseconds to wait after each load_more click (0–5000). Defaults to 1500.", + "maximum": 5000, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / max_cache_ageAdded value: +{ + "description": "Maximum cache age in milliseconds. Results older than this will be re-fetched. Defaults to 432000000 (5 days).", + "type": "integer" +} - added
Input schema / properties / max_retriesAdded value: +{ + "description": "Maximum number of retry attempts (1–4). Defaults to 4.", + "maximum": 4, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / proxy_countryAdded value: +{ + "description": "Two-letter ISO country code for geo-targeted proxy exit node (e.g. 'US', 'GB').", + "type": "string" +} - added
Input schema / properties / retryAdded value: +{ + "description": "Automatically retry failed requests with escalating proxy tiers. Defaults to true on v3.", + "type": "boolean" +} - added
Input schema / properties / retry_escalateAdded value: +{ + "description": "Escalate proxy tier on each retry attempt. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / scroll_to_bottomAdded value: +{ + "description": "Scroll to the bottom of the page before scraping. Useful for lazy-loaded content.", + "type": "boolean" +} - changed
Input schema / properties / url / descriptionPrevious value: -"URL of the webpage to scrape data from"New value: +"URL of the webpage to scrape." - added
Input schema / properties / use_premiumAdded value: +{ + "description": "Route the request through a premium proxy.", + "type": "boolean" +} - added
Input schema / properties / use_proxyAdded value: +{ + "description": "Route the request through a standard proxy.", + "type": "boolean" +} - added
Input schema / properties / use_superiorAdded value: +{ + "description": "Route the request through a superior-tier proxy.", + "type": "boolean" +} - added
Input schema / properties / wait_for_selectorAdded value: +{ + "description": "CSS selector to wait for before scraping. Forces full_render.", + "type": "string" +} - changed
Output 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" +}
- Changed
getOgScreenshot25 fields changed- added
Input schema / properties / accept_langAdded value: +{ + "description": "Accept-Language header for the outbound request. Defaults to 'auto'.", + "type": "string" +} - added
Input schema / properties / auto_proxyAdded value: +{ + "description": "Automatically escalate to a proxy if the direct request fails. Defaults to true on v3.", + "type": "boolean" +} - added
Input schema / properties / block_cookie_bannerAdded value: +{ + "description": "Attempt to dismiss cookie consent banners before capturing. Defaults to false.", + "type": "boolean" +} - added
Input schema / properties / cache_okAdded value: +{ + "description": "Use cached results. Set to false to bypass cache. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / capture_delayAdded value: +{ + "description": "Milliseconds to wait after page load before capturing (0–10 000). Defaults to 0.", + "maximum": 10000, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / dark_modeAdded value: +{ + "description": "Enable dark mode (prefers-color-scheme: dark). Defaults to false.", + "type": "boolean" +} - added
Input schema / properties / dimensionsAdded value: +{ + "description": "Viewport dimensions as WxH (e.g. '1280x800'). Defaults to '1366x768'.", + "type": "string" +} - added
Input schema / properties / exclude_selectorsAdded value: +{ + "description": "Comma-separated CSS selectors to hide (set visibility: hidden) before capturing.", + "type": "string" +} - added
Input schema / properties / formatAdded value: +{ + "description": "Image format. Defaults to 'jpg'.", + "enum": [ + "jpg", + "png", + "webp" + ], + "type": "string" +} - added
Input schema / properties / full_pageAdded value: +{ + "description": "Capture the full scrollable page height. Defaults to false (viewport only).", + "type": "boolean" +} - added
Input schema / properties / full_renderAdded value: +{ + "description": "Fully render the page with JavaScript before capturing. Defaults to true for screenshots.", + "type": "boolean" +} - added
Input schema / properties / hideSelectorsAdded value: +{ + "description": "Whether to apply the exclude_selectors hiding. Defaults to true when exclude_selectors is set.", + "type": "boolean" +} - added
Input schema / properties / max_cache_ageAdded value: +{ + "description": "Maximum cache age in milliseconds. Defaults to 432000000 (5 days).", + "type": "integer" +} - added
Input schema / properties / max_retriesAdded value: +{ + "description": "Maximum number of retry attempts (1–4). Defaults to 4.", + "maximum": 4, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / navigationTimeoutAdded value: +{ + "description": "Navigation timeout in milliseconds (1 000–60 000). Defaults to 30 000.", + "maximum": 60000, + "minimum": 1000, + "type": "integer" +} - added
Input schema / properties / proxy_countryAdded value: +{ + "description": "Two-letter ISO country code for geo-targeted proxy exit node (e.g. 'US', 'GB').", + "type": "string" +} - added
Input schema / properties / qualityAdded value: +{ + "description": "Image compression quality 1–100. Only applies to jpg/webp. Defaults to 80.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / retryAdded value: +{ + "description": "Automatically retry failed requests. Defaults to true on v3.", + "type": "boolean" +} - added
Input schema / properties / selectorAdded value: +{ + "description": "CSS selector — crop the screenshot to just this element.", + "type": "string" +} - changed
Input schema / properties / url / descriptionPrevious value: -"URL of the webpage to screenshot"New value: +"URL of the webpage to screenshot." - added
Input schema / properties / use_premiumAdded value: +{ + "description": "Route the request through a premium proxy.", + "type": "boolean" +} - added
Input schema / properties / use_proxyAdded value: +{ + "description": "Route the request through a standard proxy.", + "type": "boolean" +} - added
Input schema / properties / use_superiorAdded value: +{ + "description": "Route the request through a superior-tier proxy.", + "type": "boolean" +} - added
Input schema / properties / wait_for_selectorAdded value: +{ + "description": "CSS selector to wait for before capturing.", + "type": "string" +} - changed
Output 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" +}
- Added
getSiteAuditReport - Added
getSiteAuditStatus - Changed
inspectImageSession1 field changed- changed
Output 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" +}
- Changed
iterateImage1 field changed- changed
Output 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" +}
- Added
previewPageAudit - Added
startSiteAudit
9 tool updates
v1.3.5- First observed
exportImageAsset - First observed
generateImage - First observed
getOgData - First observed
getOgExtract - First observed
getOgQuery - First observed
getOgScrapeData - First observed
getOgScreenshot - First observed
inspectImageSession - First observed
iterateImage
TDQS
Scored across 28 tools
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.
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).
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.
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
Related MCP Connectors
One MCP server for 180+ live web-data APIs returning clean JSON from sites that block scrapers.
Official SerpApi MCP server for Google, Bing, and other search engines.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
- IndicesOAuthio.indices
Official Indices MCP server. Turn any website into a reliable API.
Related MCP Servers
- AlicenseAqualityDmaintenanceA powerful MCP server for fetching and transforming web content into various formats (HTML, JSON, Markdown, Plain Text) with ease.44,875 npm42MIT
- AlicenseAqualityBmaintenanceWeb extraction MCP server for AI agents. Extract structured data from any URL with built-in Cloudflare bypass, JavaScript rendering, and intelligent parsing. Returns clean markdown or JSON.5794 npm2MIT
- AlicenseAqualityDmaintenanceMCP server for ScreenshotFreeAPI – capture website screenshots, render HTML/PDF, and fetch app store listing screenshots from any MCP-compatible AI client.74 npmMIT
- FlicenseAqualityDmaintenanceMCP server for Cloudflare Browser Rendering Crawl API. Fetches and crawls web pages, returning clean Markdown optimized for LLM consumption.3-