Website Screenshot & PDF API
Server Details
Full-page screenshots/PDFs, cookie walls removed; blocked or failed pages never charged.
- Status
- Healthy
- Uptime
- 60.7% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- catalyst-labs-dev/catalyst-labs-mcp
- GitHub Stars
- 0
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 5 tools
Most tools target distinct resources/actions: start an actor run, inspect a run, abort a run, read dataset items, or read a key-value record. The actor-running tool overlaps somewhat with get-actor-run because it can also return run details or a runId to poll, but the descriptions clarify when to use each.
Four tools follow a clear verb_noun kebab-case pattern (abort-actor-run, get-actor-run, get-dataset-items, get-key-value-store-record). The core actor-invocation tool breaks this pattern entirely with a vendor/actor name (catalyst-labs--website-screenshot-pdf-api) and double hyphen, making the set mixed but still readable.
Five tools is well within a reasonable range and each has a clear role: start capture, inspect status, abort, read dataset results, and read key-value records. The set is compact and focused on the actor-run lifecycle.
The surface covers the core lifecycle for running a screenshot/PDF capture, checking status, aborting, and retrieving results. Minor gaps exist around metadata/listing operations (e.g. dataset metadata, key-value store key listing), but core workflows are supported.
Available Tools
5 toolsabort-actor-runAbort Actor runADestructiveIdempotentInspect
Abort an Actor run that is currently starting or running. For runs with status SUCCEEDED, FAILED, ABORTING, ABORTED, or TIMED-OUT, this call has no effect. The results will include the updated run details after the abort request.
USAGE:
Use when you need to stop a run that is taking too long or misconfigured.
USAGE EXAMPLES:
user_input: Abort run y2h7sK3Wc
user_input: Gracefully abort run y2h7sK3Wc
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | The ID of the Actor run to abort. | |
| gracefully | No | If true, the Actor run will abort gracefully with a 30-second timeout. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the no-effect-on-terminal-states rule, which is exactly what makes the idempotent hint meaningful, plus the fact that updated run details come back. It omits auth/permission requirements and any rate-limit 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?
Front-loaded with the core action and the state constraint, and every prose sentence earns its place. The 'USAGE EXAMPLES' block of raw user_input lines is mostly decorative and pads the definition slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be spelled out, and the description still notes that updated run details are returned. For a two-parameter mutation with full annotation coverage, only auth requirements are unaddressed, which is a minor 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?
Schema description coverage is 100%, so both parameters and the 30-second graceful-abort timeout are already documented in the schema. The description only gestures at 'gracefully' via an example, adding no syntax or semantic meaning beyond the schema. 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?
Specific verb (Abort) plus resource (Actor run) and a state qualifier ('currently starting or running'), which immediately distinguishes it from siblings like call-actor and get-actor-run. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('stop a run that is taking too long or misconfigured') and an explicit no-op condition (terminal statuses such as SUCCEEDED, FAILED, ABORTED, TIMED-OUT). It does not name an alternative tool or describe prerequisites, so it falls 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.
catalyst-labs--website-screenshot-pdf-apicatalyst-labs/website-screenshot-pdf-apiADestructiveInspect
This tool calls the Actor "catalyst-labs/website-screenshot-pdf-api" and retrieves its output results. Actor description: Starts a screenshot/PDF capture of public URLs (cookie banners removed) and waits up to waitSecs (max 45s). Returns file links, or a runId to poll with get-actor-run, then get-dataset-items. Use those for runs already started. $0.01/run + $0.008/screenshot, $0.012/PDF; failures free.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | **REQUIRED** Web pages to capture. Each URL gives one file per format. https:// is added if missing; duplicates are removed and invalid entries are reported for free. Example: ["https://apify.com", "example.com/pricing"] Memory: keep the default 4096 MB or more. Below 4 GB heavy pages load 2-3x slower and large batches can time out (a 28-URL test at 2 GB timed out at 900 s; at 4 GB it finished in 446 s). Example values: ["https://apify.com","https://en.wikipedia.org/wiki/Web_scraping"] | |
| width | No | Custom viewport width in CSS pixels; overrides the preset width. Example: 1366 | |
| device | No | Viewport preset: "desktop" (1440x900), "desktop-hd" (1920x1080), "laptop" (1280x800), "tablet" (820x1180 @2x) or "mobile" (iPhone 390x844 @3x, mobile user agent). Default: "desktop". Example: "mobile" Example values: "desktop" | desktop |
| height | No | Custom viewport height in CSS pixels; overrides the preset. With fullPage false this is the image height. Example: 768 | |
| cookies | No | Cookies set before loading, for logged-in or region-specific pages. Each needs name and value; domain defaults to the URL host. Example: [{"name": "session", "value": "abc123", "domain": ".example.com"}] | |
| delayMs | No | Extra wait in milliseconds after loading and before capturing, for animations or late widgets. Max 60000. Default: 0. Example: 2000 | |
| formats | No | Output formats per URL: "png", "jpeg", "webp" (screenshots) and/or "pdf". Each format is a separate file and charge. Default: ["png"]. Example: ["webp", "pdf"] Example values: ["png"] | |
| headers | No | Extra HTTP headers sent with every request (Host, Content-Length and similar are ignored). Example: {"Accept-Language": "de-DE", "Authorization": "Bearer abc"} Example values: {} | |
| quality | No | JPEG/WebP quality, 1-100. Ignored for PNG and PDF. Default: 80. Example: 60 for smaller files. Example values: 80 | |
| blockAds | No | Block common ad and tracking hosts. Faster, cleaner captures. Default: true. Example values: true | |
| darkMode | No | Emulate the dark color scheme (prefers-color-scheme: dark). Only changes sites that support dark mode. Default: false. | |
| fastMode | No | Trade completeness for speed. Skips the slow scroll that loads lazy images and scroll animations, and takes one full-page shot (up to 16,000 device px) instead of stitched tiles, so very long pages are cut off and below-the-fold images may be missing. Cookie walls, popups and sticky headers are still handled. Same price. Example: true | |
| fullPage | No | Capture the whole scrollable page (true) or only the first screen/viewport (false). Default: true. Example: false for a quick above-the-fold thumbnail. Example values: true | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| customCss | No | CSS injected before capturing. Example: "body { font-size: 18px } .banner { display: none }" | |
| maxHeight | No | Longest page part to capture, in CSS pixels. Leave empty for the default: the whole page up to 36,000 device pixels (36,000 px on desktop, 18,000 on tablet, 12,000 on mobile), which covers almost every real page, including very long news front pages and Wikipedia lists. Longer pages are cut here and flagged with truncatedAtMaxHeight: true. Max 50,000 (PNG/JPEG are also limited to 60,000 device pixels, WebP to 16,383). Example: 8000 for smaller, faster files. | |
| pdfFormat | No | PDF paper size: "A4" (default), "Letter", "Legal", "A3" or "Tabloid". Example: "Letter" Example values: "A4" | A4 |
| pdfMargin | No | PDF page margin on all sides, in CSS units. Default: "10mm". Example: "0" or "0.5in" Example values: "10mm" | 10mm |
| waitUntil | No | When the page counts as loaded: "domcontentloaded" (fastest), "load" (default, waits up to 15 s for images) or "networkidle" (slowest, for heavy single-page apps). Example: "networkidle" Example values: "load" | load |
| hidePopups | No | Hide newsletter popups, full-screen overlays and chat widgets (Intercom, Drift, HubSpot, Zendesk and others). Default: true. Example values: true | |
| maxRetries | No | Retries for temporary errors (timeouts, network, crashes, blank pages). DNS, HTTP and selector errors are not retried. Default: 1. Example: 2 Example values: 1 | |
| referrer_id | No | Referral code from another user's receipt (ref_...). They earn 10% of this run's price as credit. | |
| pdfLandscape | No | Landscape PDF pages. Default: false. | |
| pdfMediaType | No | CSS media for PDFs: "screen" (looks like the website, default) or "print" (uses the site's print stylesheet, often cleaner for articles). Example: "print" Example values: "screen" | screen |
| hideSelectors | No | CSS selectors of elements to hide before capturing. Example: [".ad-slot", "#promo-bar"] | |
| pdfSinglePage | No | Make the PDF one long page with the full page height and no page breaks, like a full-page screenshot in vector form. Default: false. | |
| buyerPublicKey | No | Base64 Ed25519 public key (SPKI). Lets you sign a useful/not useful verdict on this run's receipt. Verdicts are recorded but never earn credit or discounts. | |
| fileNamePrefix | No | Prefix for file keys in the key-value store. Example: "release-42" gives keys like "release-42-0000-example.com.png" | |
| maxConcurrency | No | How many pages to load in parallel. Leave empty for automatic: 1 below 2 GB memory, 2 at 2–4 GB, then 1 per 2 GB (4 at 8 GB, max 8). New pages also wait while memory is above 70% or CPU is saturated, and only one very tall page per vCPU is laid out at a time. | |
| scrollToBottom | No | Scroll through the page in steps (with short pauses) so lazy images, scroll-triggered sections and content loaded on scroll appear; keeps going while the page grows (bounded), then returns to the top. Default: true. Example: false for faster captures of short pages. Example values: true | |
| stickyElements | No | How to handle sticky/fixed headers in full-page captures: "static" (show once at the top, default), "hide" (remove them) or "keep" (leave as the browser draws them; may repeat). Example: "hide" Example values: "static" | static |
| captureSelector | No | Capture only this element instead of the page (screenshots only). Fails as SELECTOR_NOT_FOUND (not charged) if missing. Example: "article", "#pricing-table" | |
| pageTimeoutSecs | No | Time limit in seconds for one URL (load, scroll and capture). Leave empty for 120 s, or up to 240 s automatically on runs with less than 4 GB memory (less than 1 vCPU). Very tall pages automatically get extra time (up to +120 s) once their height is known. | |
| waitForSelector | No | Wait until this CSS selector is visible before capturing (up to navigationTimeoutSecs). Use it for apps that render data late. Fails as SELECTOR_NOT_FOUND (not charged) if it never appears. Example: "#main-chart" | |
| freezeAnimations | No | Put CSS animations, transitions and scroll-reveal effects (fade-ins, slide-ins, animated cards) in their final state, so the screenshot shows the finished page instead of half-faded or empty sections. Default: true. Example: false to capture the page exactly mid-animation. Example values: true | |
| captureErrorPages | No | Capture and charge pages that return HTTP 4xx/5xx (for example to document a 404). Default: false, so error pages fail as HTTP_ERROR and are not charged. | |
| deviceScaleFactor | No | Pixel density (1-3). 2 or 3 gives retina-sharp images but larger files. Default: from the preset (desktop 1, mobile 3). Example: 2 | |
| pdfPrintBackground | No | Include background colors and images in PDFs. Default: true. Example values: true | |
| perHostConcurrency | No | Max parallel pages on the same website, to stay polite and avoid rate limits. Default: 2. Example values: 2 | |
| proxyConfiguration | No | Proxy for all requests. Not needed for most sites; for sites that block data centers use Apify residential proxy. Example: {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} Example values: {"useApifyProxy":false} | |
| captureBlockedPages | No | Capture and charge bot-check/challenge pages (Cloudflare, DataDome...) instead of failing as BLOCKED. Default: false, so blocked pages are not charged. | |
| dismissCookieBanners | No | Click "Accept" on cookie/consent banners (about 20 platforms such as OneTrust, Didomi, Sourcepoint, Cookiebot and Usercentrics, plus accept buttons in 18 languages) and hide what is left. Default: true. Example: false to capture the banner itself. Example values: true | |
| navigationTimeoutSecs | No | Seconds to wait for the page to start loading and for waitForSelector. Default: 45. Example: 90 for slow sites. Example values: 45 | |
| retryBlockedWithProxy | No | When a site answers with a bot check and you did not set your own proxy, retry that URL once through Apify Proxy (datacenter) with a fresh, regular browser. Blocked pages are never charged, whether or not the retry works. Default: true. Example: false to fail fast on blocked sites. Example values: true |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the wait cap (max 45s), that the response may be file links or a runId for polling, and the pricing structure including free failures. It does not explain the destructiveHint or permission/authorization context, but the annotations already carry the 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 short, front-loaded, and every sentence adds operational value: purpose, return/polling behavior, alternative tools, and cost. There is no redundant 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?
Given the complex 44-parameter schema, existing output schema, and annotations, the description is complete enough for an agent to understand what the tool does, how long it waits, what it returns, and when to use the polling siblings instead.
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 all 44 parameters are already documented in the input schema. The tool description only highlights waitSecs and cookie-banner removal, which is useful but does not add much beyond the schema's own detailed parameter 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 states a specific action and resource: it calls the catalyst-labs/website-screenshot-pdf-api Actor and starts a screenshot/PDF capture of public URLs. It also distinguishes itself from related siblings by directing already-started runs to get-actor-run and get-dataset-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?
It clearly indicates this tool starts a new capture and that get-actor-run/get-dataset-items should be used for runs already started. The public-URL scope is stated, but there is no explicit exclusion for private pages or other capture cases beyond the poller alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-actor-runGet Actor runARead-onlyIdempotentInspect
Get detailed information about a specific Actor run.
Returns run result: status, storages (datasets/keyValueStores alias map), stats, summary, nextStep.
summary describes the past (e.g. "SUCCEEDED in 22s. 47 items; 3 fields available.").
nextStep prescribes one primary follow-up action with identifiers interpolated (e.g. "Use get-dataset-items with datasetId=...").
waitSecs (0–45, default 30) waits up to that many seconds for terminal status before returning.
USAGE:
Use to check the status of a run started by any Actor-running tool.
Pass waitSecs > 0 to block until terminal (or until the cap elapses).
USAGE EXAMPLES:
user_input: Show details of run y2h7sK3Wc
user_input: Wait for run y2h7sK3Wc to finish
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | The ID of the Actor run. | |
| waitSecs | No | Maximum seconds to wait for the run to reach a terminal state (SUCCEEDED, FAILED, ABORTED, TIMED-OUT). 0 returns immediately with the current status. Cap: 45. Default: 30. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, but the description adds real behavioral context beyond them: the summary vs. nextStep semantics, and that waitSecs blocks for up to 45s (default 30) before returning the current state. This is substantive added value, though it doesn't cover error/failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then segmented into Returns/USAGE/EXAMPLES blocks. Every line carries information, though the two usage examples are somewhat redundant with the USAGE prose, adding minor length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the description need only orient the agent, which it does fully: purpose, when to use, wait semantics, and concrete invocation examples. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by framing waitSecs as a blocking/wait mechanism with its cap and default, and by describing what runId's run produces. Slight above-baseline value over the schema text.
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 ('Get detailed information about a specific Actor run') and enumerates the returned result fields (status, storages, stats, summary, nextStep). It does not explicitly distinguish itself from siblings like call-actor or abort-actor-run, so it falls just short of the 5 benchmark.
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 USAGE block names the condition ('check the status of a run started by any Actor-running tool') and explains when to pass waitSecs > 0 to block until terminal. It gives clear context but stops short of explicit exclusions or naming the sibling to use for other run operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-dataset-itemsGet dataset itemsARead-onlyIdempotentInspect
Get items (rows) from a dataset — the output/results produced by an Actor run. Returns the rows themselves, not dataset metadata, counts, or a schema. When the user provides a datasetId and asks to retrieve results, output, data, or rows, call this tool directly. Default limit is 20. Use clean=true to skip empty items and hidden fields.
USAGE:
Use when you need to read data from a dataset (all items or only selected fields).
USAGE EXAMPLES:
user_input: Retrieve results from dataset abc123
user_input: Get only metadata.url and title from dataset username~my-dataset
| Name | Required | Description | Default |
|---|---|---|---|
| desc | No | If true, results are returned in reverse order (newest to oldest). | |
| omit | No | Comma-separated list of fields to exclude from results. | |
| clean | No | If true, returns only non-empty items and skips hidden fields (starting with #). Shortcut for skipHidden=true and skipEmpty=true. | |
| limit | No | Maximum number of items to return. Default is 20. | |
| fields | No | Comma-separated list of fields to include in results. Fields in output are sorted as specified. Use dot notation for nested objects (e.g. "metadata.url"); the server auto-flattens parent prefixes. | |
| offset | No | Number of items to skip at the start. Default is 0. | |
| flatten | No | Comma-separated list of fields to flatten (e.g. flatten="metadata" turns {"metadata":{"url":"x"}} into {"metadata.url":"x"}). Normally derived automatically from dot-notation in `fields`; specify only as a diagnostic override. | |
| datasetId | Yes | Dataset ID, name (resolved against your own datasets), or full name as username~name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | Dataset items |
| limit | Yes | Limit used for pagination |
| offset | Yes | Offset used for pagination |
| summary | Yes | Summary of the result |
| nextStep | Yes | One follow-up action with tool name |
| datasetId | Yes | Dataset ID |
| itemCount | Yes | Number of items returned |
| totalItemCount | Yes | Total items in dataset |
| apifyConsoleUrl | No | Personalized Apify Console link to the dataset; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the description adds value by disclosing the default limit of 20, what clean=true does, and that results are the raw rows. Return-shape details are largely deferred to the existing output schema, which is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the anti-scope sentence, followed by short usage notes and examples. Slightly redundant in repeating the limit default and the clean flag across sections, but nothing wasteful enough to hurt.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with full schema coverage and an output schema, the description supplies the purpose, trigger, and key defaults an agent needs. Pagination interaction (offset/limit) and flatten behavior are left to the schema, which is reasonable given the output schema exists.
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 all eight parameters in depth. The description only restates the default limit and clean=true semantics, adding little beyond the structured fields; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get items (rows) from a dataset') and immediately delimits scope by saying it returns rows themselves, not metadata, counts, or schema. An agent can distinguish the intent without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger ('When the user provides a datasetId and asks to retrieve results, output, data, or rows, call this tool directly') plus a usage section and two concrete examples. It lacks explicit when-not guidance relative to any alternative, but the sibling list contains no competing dataset-read tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-key-value-store-recordGet key-value store recordARead-onlyIdempotentInspect
Get the value stored under a specific key in a key-value store — a single record, not a listing of all keys. Requires the exact key name. The response preserves the original Content-Encoding; most clients handle decompression automatically.
USAGE:
Use when you need to retrieve a specific record (JSON, text, or binary) from a store.
USAGE EXAMPLES:
user_input: Get record INPUT from store abc123
user_input: Get record data.json from store username~my-store
| Name | Required | Description | Default |
|---|---|---|---|
| recordKey | Yes | Key of the record to retrieve. | |
| keyValueStoreId | Yes | Key-value store ID, name (resolved against your own key-value stores), or full name as username~name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | Record key |
| value | Yes | The stored value (JSON, text, or binary) |
| summary | Yes | Summary of the result |
| contentType | No | MIME type of the stored value |
| keyValueStoreId | Yes | Key-value store ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered elsewhere. The description earns credit for adding behavioral context beyond that: the 'requires the exact key name' precondition and the note that the response preserves the original Content-Encoding, which most clients decompress automatically — a real return-value trait callers would otherwise trip over.
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 key facts — scope, exact-key requirement, encoding caveat — are front-loaded in three tight sentences. The subsequent USAGE and USAGE EXAMPLES blocks are somewhat redundant with the first paragraph, costing a little efficiency.
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?
A two-parameter read tool whose annotations, 100% schema coverage, and output schema already cover safety, inputs, and return shape. The description closes the remaining gap with the Content-Encoding behavior, which is exactly the non-obvious detail an agent needs.
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%, including the keyValueStoreId resolution rules (name vs. username~name) and minLength constraints in the schema itself. The description only reinforces that the key must be exact, adding little semantics beyond what the schema already documents, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the value stored under a specific key in a key-value store') and preemptively scopes it against a listing tool: 'a single record, not a listing of all keys.' An agent can immediately tell this is a point lookup, not an enumeration.
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 says when to use it ('when you need to retrieve a specific record (JSON, text, or binary)') and includes two concrete usage examples showing the store identifier formats. However, it never states when NOT to use it or names an alternative/sibling for enumeration, so the guidance is implied rather than comparative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Related MCP Connectors
Bulk website screenshots and PDFs with cookie banners removed; also a real-time HTTP API (Standby).
Screenshot any web page, or read it as clean Markdown, with consent banners, ads and popups removed.
Website screenshots for AI agents: real Chrome, ad/cookie/chat blocking, bot-wall detection.
Full-page, first-screen, mobile or element screenshots of any URL as PNG, JPEG or PDF.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI agents to capture clean web screenshots and extract main article content from any web page, with automatic removal of cookie banners, ads, and boilerplate.2MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to capture web pages as PNG screenshots or PDF documents, with customizable dimensions and formats, using x402 micropayments on Base Mainnet.19 npmMIT
- AlicenseNot gradedqualityCmaintenanceCaptures full-page screenshots and PDFs from any URL using Chromium rendering, with pay-per-call via x402 micropayments.MIT
- AlicenseAqualityAmaintenanceEnables web scraping, structured data extraction, and screenshot capture with automatic anti-bot bypass, supporting JavaScript rendering, proxy rotation, and tiered pricing.264,062 npm2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.