Skip to main content
Glama
maccydee

cute-web-scraper

cute-web-scraper

Claude에 웹 스크래핑 기능을 제공하는 MCP 서버. 무료, 로컬 실행, API 키 불필요, 클라우드 계정 불필요.

CI Python 3.10+ License: MIT MCP Tests

평범한 영어로 요청하세요. 페이지를 가져오고, 필요하면 JavaScript를 렌더링하고, 차단을 우회한 뒤, 깔끔한 마크다운이나 쿼리 가능한 테이블로 돌려줍니다 — 셀렉터도, 글루 코드도 필요 없습니다.

왜 이걸 써야 하나

  • 들어갑니다. 4단계로 강화되는 계층 — 일반 HTTP, 브라우저 TLS 지문, 실제 브라우저, 그다음 스텔스 브라우저. ASOS, eBay, Booking.com, Trustpilot 모두 프록시 없이 일반 가정용 연결에서 실제 데이터를 반환합니다.

  • 컨텍스트를 낭비하지 않습니다. 기사에서 내비게이션, 쿠키 배너, 푸터를 제거합니다: BBC 뉴스 페이지가 20,513자에서 3,198자로 줄어듭니다. 대용량 결과는 SQL로 쿼리하는 SQLite 테이블에 저장되므로 채팅에 붙여넣을 필요가 없습니다.

  • 실패에 대해 정직합니다. 테스트한 사이트 중 5곳이 성공 상태 코드 아래에서 거부를 응답했습니다 — HTTP 200 아래의 인터스티셜, 202 아래의 봇 검사 — 그리고 한 곳은 403 아래에서 실제 콘텐츠를 제공했습니다. 차단 감지는 상태 코드가 아닌 페이지 본문을 기준으로 판단하므로, 스텁을 데이터로 보고받는 일이 없습니다.

  • 단일 페이지가 아닌 전체 사이트. 사이트맵 탐색, 병렬 페칭, 제품·연락처·Shopify 카탈로그·장소·PDF·변경 추적을 다루는 24개 도구.

설치

pipx install git+https://github.com/maccydee/cute-web-scraper

Chromium은 js_render를 처음 사용할 때 자동으로 다운로드됩니다(일회성 약 130MB).

Related MCP server: mcp-server-scraper

Claude Code에 연결

claude mcp add cute-web-scraper -- cute-web-scraper

그런 다음 그냥 요청하세요:

Scrape every product from https://example-shop.com and give me a CSV of name and price.

도구

페칭 및 탐색

도구

기능

search_web

웹을 검색하고 순위가 매겨진 결과를 얻기 — URL이 아닌 질문이 있을 때의 진입점

fetch_page

하나의 URL을 깔끔한 마크다운으로, 제목·상태·링크 수 포함

inspect_network

페이지가 만드는 API 호출과 해당 JSON을 보고 — 데이터 소스를 직접 읽기

fetch_pages

여러 URL을 병렬로 가져오고, 결과와 URL별 오류를 반환

crawl_site

사이트맵을 통해 사이트의 페이지를 발견하고, 실패 시 링크 추적으로 대체

analyze_website

플랫폼 감지, 사이트맵 찾기, JS 필요 여부 보고

추출

도구

기능

extract_by_selector

CSS 셀렉터를 통한 임의 필드 — 모든 목록을 테이블로 변환

extract_products

JSON-LD, OpenGraph 또는 마이크로데이터에서 구조화된 제품 데이터(이름, 가격, 통화, 재고 여부, 브랜드, sku, 평점)

extract_emails

URL 목록 전체에서 이메일 주소를 주변 컨텍스트와 함께 추출

extract_phones

URL 목록 전체에서 전화번호를 주변 컨텍스트와 함께 추출

extract_links

모든 하이퍼링크를 절대 URL로 변환

extract_social_links

8개 플랫폼의 소셜 프로필

extract_shopify_store

전체 Shopify 카탈로그, 변형(variant)당 한 행

list_shopify_collections

Shopify 스토어의 컬렉션과 각 제품 수

장소 및 지역 업체

도구

기능

find_places

이름 또는 설명으로 검색 — 이름, 주소, 좌표, 전화, 웹사이트, 영업시간

find_places_nearby

특정 장소 반경 내 특정 카테고리의 모든 업체

변경 추적

도구

기능

track_changes

페이지를 가져와 마지막 확인과 비교 — 새로움, 동일함 또는 변경됨

list_tracked

감시 중인 페이지와 각각의 마지막 확인 시각

untrack

페이지 감시 중단

결과 테이블

도구

기능

list_tables

저장된 결과 테이블과 행 수, 열 정보

get_table

한 테이블의 열, 행 수 및 샘플

query_table

저장된 테이블에 대한 읽기 전용 SQL — 필터, 집계, 그룹, 정렬, 선택적으로 결과를 새 테이블로 저장

export_table

테이블을 디스크에 CSV 또는 JSON으로 저장

drop_table

저장된 테이블 삭제

일반적인 실행은 이들을 조합합니다: analyze_website → crawl_site → fetch_pages → query_table.

임의 필드 추출

extract_by_selector는 고정 추출기가 다루지 못하는 모든 것을 처리합니다:

Get the title, price and link from every product on these 40 pages,
save it as `catalogue`, then show me anything under £50.

fields는 열 이름을 CSS 셀렉터에 매핑합니다. row_selector는 각 일치 항목을 행으로 만듭니다 — 이것이 목록을 테이블로 바꾸는 핵심입니다. @attr 접미사는 텍스트 대신 속성을 읽으며, href와 src는 절대 URL로 변환됩니다:

{"name": "h3 a@title", "price": ".price_color", "link": "h3 a@href"}

페이지 조작

fetch_page는 페이지를 읽기 전에 실행되는 actions를 받습니다 — 쿠키 게이트, "더 보기" 버튼, 무한 스크롤, 검색 폼:

[{"action": "click", "selector": "#accept-cookies"},
 {"action": "scroll_to_bottom", "max_rounds": 10}]

사용 가능한 액션: click, type, press, wait, wait_for, scroll, scroll_to_bottom, click_until_gone. 각 액션은 수행한 작업을 보고하므로, 조용히 아무것도 일치하지 않은 단계도 추측에 맡기지 않고 확인할 수 있습니다.

페이지 대신 API 읽기

사이트를 파싱하기 어려울 때 inspect_network는 페이지를 렌더링하고 페이지가 만든 요청을 보고합니다. JavaScript 페이지는 거의 항상 직접 가져올 수 있는 엔드포인트에서 데이터를 로드합니다 — 마크업을 파싱하는 것보다 저렴하고, 셀렉터를 깨뜨리는 리디자인에도 견딥니다:

Inspect the network on this listing page, then fetch whatever JSON endpoint it uses.

변경 감시

Check https://example.com/pricing for changes.

track_changes는 스냅샷을 저장하고 통합 diff와 함께 new, same 또는 changed를 보고합니다. 스케줄러 없이 모니터링하는 셈입니다 — 원할 때마다 확인하고 차이만 보면 됩니다.

슬래시 명령

서버에는 4개의 준비된 워크플로우가 포함되어 있으며, Claude Code에서 슬래시 명령으로 나타납니다: scrape_site, scrape_shopify_store, find_contacts, compare_prices.

대규모 스크래핑 작업

행을 반환하는 모든 도구는 save_as를 받습니다. 데이터를 대화에 넣는 대신 결과 테이블을 작성하고 요약을 돌려줍니다:

Extract the whole catalogue from deathwishcoffee.com into a table called `catalogue`,
then tell me the price range and how many variants are out of stock.

Claude는 extract_shopify_store(save_as="catalogue")를 호출하고 행 수와 열 목록을 받은 다음, query_table로 답변합니다:

SELECT COUNT(*) AS variants, MIN(price) AS cheapest,
       MAX(price) AS dearest, SUM(available) AS in_stock
FROM catalogue

테이블은 100,000행을 담을 수 있으며 그중 어떤 것도 대화에 들어가지 않습니다. query_table은 엄격히 읽기 전용입니다 — 읽기 전용 SQLite 핸들로 실행되며 SELECT가 아닌 것은 모두 거부하므로, 쿼리가 저장된 데이터를 수정하거나 삭제할 수 없습니다.

테이블은 ~/.cute-web-scraper/results.db의 SQLite 파일에 저장됩니다(SCRAPER_DB_PATH로 위치 변경 가능).

데이터 정리

query_table도 save_as를 받으며, 결과를 새 테이블로 저장합니다. SQL이 일반적인 정리 작업을 이미 표현하므로 별도의 편집 도구 세트는 없습니다:

SELECT DISTINCT * FROM leads                                  -- deduplicate
SELECT street || ', ' || city AS address FROM leads           -- merge columns
SELECT name, phone FROM leads WHERE phone IS NOT NULL         -- drop columns and rows
SELECT vendor AS brand FROM catalogue                         -- rename

원본 테이블은 의도적으로 자신의 이름을 대상으로 하지 않는 한 그대로 유지되며, 그렇게 할 때 응답에 replaced_existing_table이 표시됩니다 — 따라서 제자리 필터가 조용히 행을 잃는 일은 없습니다.

장소 및 지역 업체

find_places는 단일 장소를 조회하고, find_places_nearby는 반경 내 특정 카테고리의 모든 항목을 반환합니다 — 이것이 지역 리드 생성 사례입니다:

Find every dentist within 4km of Bath, save it as `leads`,
then tell me how many have a website but no phone number.

카테고리는 친숙한 이름(cafe, dentist, hotel, solicitor, gym, hairdresser, …) 또는 amenity=dentist 같은 원시 OpenStreetMap 태그를 허용합니다.

데이터 소스에 대한 참고. 이것은 OpenStreetMap이지 Google Maps가 아닙니다. Google이 당연한 목표였지만 작동하지 않습니다: 자동화된 브라우저는 쿠키 동의 인터스티셜을 만나고, 그걸 넘어가면 장소 패널이 없는 저하된 지도 셸만 얻습니다. 스텔스 계층도 도움이 되지 않는데, 이는 봇 감지가 아닌 동의 벽(consent wall)이기 때문입니다 — 스텔스가 해결하는 문제와는 다른 문제입니다.

OpenStreetMap은 문서화된 공개 엔드포인트를 통해 키 없이 동일한 필드(이름, 주소, 좌표, 전화, 웹사이트, 영업시간, 카테고리)를 제공합니다. 유일하게 대응하는 것이 없는 것은 별점 평점과 리뷰 수인데, 이는 Google의 독점 데이터입니다.

두 엔드포인트 모두 자원봉사로 운영됩니다. Nominatim의 초당 1회 요청 정책은 SCRAPER_DELAY_MS와 무관하게 내부적으로 강제되며, Overpass 쿼리는 여러 공개 미러를 통해 전달되는데, 메인 인스턴스가 부하 시 정기적으로 504를 반환하기 때문입니다.

도구 출력도 SCRAPER_MAX_INLINE_CHARS(기본 25,000)로 제한됩니다. 이를 초과하면 결과가 잘리고 save_as를 가리키는 메모가 함께 표시됩니다 — 따라서 단일 호출이 실수로 컨텍스트를 가득 채울 수 없습니다.

예시 프롬프트

Export the whole catalogue from deathwishcoffee.com and tell me the price range.

Find all email addresses on https://company.com and its contact pages.

What platform is https://myblog.com on? Does it need JavaScript to scrape?

Scrape these 200 product pages into a table, then show me everything under £50 that's in stock.

Extract the social media links from these 10 agency sites: [urls...]

구성

모든 것이 환경 변수이며, 기본값은 설정 없이도 작동합니다.

변수

기본값

의미

SCRAPER_DELAY_MS

1000

동일 도메인에 대한 요청 사이의 기본 지연 시간

SCRAPER_MAX_CONCURRENT

5

최대 병렬 요청 수

SCRAPER_CACHE_TTL_S

300

가져온 페이지가 재사용 가능한 상태로 유지되는 시간

SCRAPER_CACHE_MAX_ENTRIES

500

최근 사용 기준 제거 전까지 캐시되는 페이지 수

SCRAPER_AUTH_TOKEN

설정 안 됨

HTTP 모드용 Bearer 토큰

SCRAPER_CHROME_USER_DATA_DIR

설정 안 됨

로그인된 세션을 상속할 Chrome 프로필

SCRAPER_IMPERSONATE

1

차단된 요청을 브라우저 TLS 지문으로 재시도

SCRAPER_STEALTH

1

가장 어려운 차단을 위한 최후의 수단 스텔스 브라우저

SCRAPER_DB_PATH

~/.cute-web-scraper/results.db

결과 테이블이 저장되는 위치

SCRAPER_MAX_INLINE_CHARS

25000

단일 도구가 인라인으로 반환하는 최대 크기

긴 URL 목록을 하나의 테이블로 배치하려면 첫 호출 이후의 모든 호출에서 mode: "append"가 필요합니다. 그렇지 않으면 각 배치가 이전 배치를 대체합니다. 희소하게 반환되는 렌더링 페이지에는 wait_ms를 지정하거나, 더 나은 방법으로 CSS 선택자와 함께 wait_for를 지정할 수 있습니다.

동작 방식

전체 페이지가 아닌 본문 콘텐츠. 기사 형태의 페이지는 trafilatura를 통해 처리되며, 본문을 분리하고 주변 요소를 제거합니다. 독립적인 2,008페이지 벤치마크에서 Readability의 0.674 대비 0.791 F1 점수를 기록했기 때문에 선택되었습니다. 이는 모든 페이지에 적용되는 것이 아니라 페이지별로 적용됩니다. 동일한 벤치마크에서 제품 그리드와 컬렉션에서는 추출기가 20~30포인트 차이를 보이는데, 여기서 "본문 콘텐츠"는 기사가 아니므로 목록 페이지는 전체 문서를 유지합니다. 어디서든 강제로 적용하려면 main_content: false를 전달하세요.

거부될 때만 단계적으로 상승하는 4단계. 일반 HTTP 클라이언트가 대부분의 페이지를 처리합니다. 사이트가 거부하면 요청이 실제 브라우저 TLS 지문(Chrome, 그다음 Safari)으로 재시도됩니다. 일부 사이트는 TLS 핸드셰이크 자체를 지문으로 사용하며 어떤 헤더 변경으로도 통과할 수 없기 때문입니다. js_render: true는 단일 페이지 앱을 위해 Chromium에서 렌더링합니다. 최후의 수단으로, JavaScript가 필요하고 일반 자동화를 거부하는 사이트를 위해 스텔스 패치된 브라우저가 처리합니다.

각 단계는 서로 다른 실패를 해결하며, 어떤 단계도 다른 단계의 상위 집합이 아닙니다. TLS 단계는 JavaScript를 실행할 수 없고, Playwright는 탐지 가능한 자동화 브라우저입니다. 모든 결과는 어떤 단계가 처리했는지 보고합니다. SCRAPER_IMPERSONATE=0 또는 SCRAPER_STEALTH=0을 설정하면 마지막 두 단계를 끄고 차단이 그대로 유지되도록 할 수 있습니다.

마지막 두 단계는 예의가 아니라 회피입니다. 사이트가 의도적으로 배포한 봇 탐지를 통과하기 위해 존재합니다. 이들은 정상적으로 페이지를 제공한 사이트에서는 절대 실행되지 않고, 거부된 후에만 실행됩니다.

적응형 백오프. 동일 도메인에 대한 요청은 SCRAPER_DELAY_MS 간격으로 시작 시점 기준으로 측정되므로, 지연 시간이 느린 응답에 추가되는 것이 아니라 요청 속도를 제한합니다. 도메인이 429, 403, Cloudflare 챌린지 등으로 반발하면 해당 도메인의 지연 시간이 최대 60초까지 두 배로 증가하고, 요청이 다시 성공하면 감소합니다. 도메인은 독립적으로 추적되므로 두 사이트를 동시에 스크래핑해도 추가 비용이 들지 않습니다.

robots.txt는 강제되지 않습니다. 사이트맵을 찾는 데만 읽히며, Disallow 규칙은 참조되지 않고 이를 변경할 설정도 없습니다. 적응형 도메인별 지연 시간이 이 도구의 예의 메커니즘입니다.

짧은 캐시. 가져온 페이지는 5분 동안 재사용되므로 동일한 URL에 대해 fetch_pages를 실행한 후 extract_emails를 실행해도 모든 것을 두 번 가져오지 않습니다.

HTTP 모드

기본값은 stdio이며, 위의 claude mcp add가 사용하는 방식입니다. 대신 지속적인 공유 인스턴스를 실행하려면:

SCRAPER_AUTH_TOKEN=$(openssl rand -hex 16) cute-web-scraper --http --port 8080
claude mcp add --transport http cute-web-scraper http://127.0.0.1:8080/mcp

127.0.0.1에 바인딩되며 /mcp와 /health 엔드포인트를 노출합니다. 루프백을 넘어 어디든 바인딩하려면 SCRAPER_AUTH_TOKEN이 필요하며, 서버는 토큰 없이 네트워크에 공개 스크래퍼를 조용히 게시하는 대신 시작을 거부합니다.

제한 사항

  • 프록시 순환과 CAPTCHA 해결이 없습니다. 4단계를 모두 통과하지 못한 사이트는 추측하지 않고 차단된 것으로 보고됩니다.

  • LinkedIn 및 유사 사이트는 로그인된 Chrome 프로필을 가리키는 SCRAPER_CHROME_USER_DATA_DIR이 필요할 수 있습니다.

  • SCRAPER_DELAY_MS=0은 예의 지연을 제거하지만, 사이트가 반발하면 백오프는 여전히 작동합니다.

  • 전화번호 추출은 의도적으로 보수적입니다. 국가 코드 또는 국번 접두사가 필요하므로 일부 기본 로컬 형식을 놓치지만, 연도와 주문 번호를 반환하지는 않습니다.

개발

uv sync --extra dev
uv run pytest -v
uv run pytest -m integration -v -s
uv run ruff check src/ tests/ && uv run mypy src/cute_web_scraper/

단위 테스트는 밀폐되어 있으며 네트워크에 접촉하지 않습니다. 통합 테스트는 실제 사이트에 접속하며 기본 실행에서 제외됩니다.

라이선스

MIT — LICENSE 참조.

Available Tools

24 tools
analyze_websiteA

Inspect a website before scraping it: detects the platform (Shopify, WordPress, Wix, ...), locates its sitemap, estimates how many pages it has, and reports whether JavaScript rendering is needed.

NameRequiredDescriptionDefault
urlYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It explicitly lists the actions the tool performs (detects, locates, estimates, reports) and implies a read-only inspection. While it doesn't mention potential side effects or network behavior, the 'inspect' framing is sufficiently transparent for this tool.

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

Conciseness5/5

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

The description is a single, well-structured sentence that front-loads the core purpose ('Inspect a website before scraping it') and then lists concrete outcomes. It is concise, with no filler or redundant content.

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

Completeness4/5

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

The tool is simple (one parameter) and there is an output schema, so the description doesn't need to detail return values. It covers the main behaviors and differentiates from siblings. However, it doesn't mention error handling or behavior for unresponsive sites, which could be relevant but is not critical given the output schema likely covers return structures.

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

Parameters3/5

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

Schema description coverage is 0% and the description does not explicitly explain the 'url' parameter format. It implicitly associates 'website' with the URL, but it does not provide details like expected scheme (http/https) or whether the URL must be a full absolute URL. With only one parameter, this isn't a major gap, but the description adds minimal parameter-specific value.

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

Purpose5/5

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

The description clearly states the tool's function with a specific verb ('Inspect'), a resource ('a website'), and detailed capabilities (detect platform, locate sitemap, estimate pages, report JS rendering). It distinguishes itself from sibling tools like fetch_page or crawl_site by focusing on pre-scraping analysis.

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

Usage Guidelines4/5

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

The phrase 'before scraping it' gives clear contextual guidance on when to use this tool, implying it should precede scraping operations. However, it does not explicitly name alternatives or provide exclusion criteria, so it falls short of a full 5.

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

crawl_siteA

Discover the pages on a website. Prefers the site's sitemap (following sitemap indexes and robots.txt), and falls back to following links. Returns JSON with urls, count, source and truncated. Run this before fetch_pages to scrape a whole site.

NameRequiredDescriptionDefault
urlYes
limitNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It does well by sharing the sitemap preference, sitemap index/robots.txt handling, fallback to link-following, and the exact JSON return fields including 'truncated.' It doesn't mention rate limits or site impact, but it covers the key behavioral aspects.

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

Conciseness5/5

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

Three sentences with the main purpose front-loaded. Every sentence adds value: purpose, crawl strategy, return payload, and usage recommendation. No filler or redundancy.

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

Completeness4/5

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

The description gives a solid overview for a moderately complex crawler: discovery method, fallback behavior, and return fields. Since an output schema exists, return-value details are less critical. Minor gaps like limit semantics and edge cases (e.g., no sitemap) keep it from a 5.

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

Parameters2/5

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

Schema description coverage is 0% and the description does not explain the 'url' or 'limit' parameters at all. The schema only provides titles and defaults, so the tool description fails to compensate for the missing parameter documentation.

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

Purpose5/5

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

The description opens with a clear, specific verb and resource: 'Discover the pages on a website.' It also distinguishes the tool from siblings by explicitly stating it should be run before fetch_pages to scrape a whole site, making its role in the workflow obvious.

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

Usage Guidelines4/5

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

Provides clear usage context: run this before fetch_pages to scrape a whole site. It also explains the sitemap-first strategy and fallback behavior. It doesn't explicitly state when not to use it or name all alternative tools, so it stops 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.

drop_tableA

Delete a saved result table. This permanently removes the stored rows; the scraped pages themselves are unaffected.

NameRequiredDescriptionDefault
nameYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries full behavioral disclosure. It reveals that the operation permanently removes stored rows and clarifies that scraped pages are unaffected, which are key side effects. It does not mention return behavior or potential errors, but for a delete operation this level of transparency is solid.

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

Conciseness5/5

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

The description is two concise sentences, front-loaded with the primary action and followed by a clarifying side-effect statement. Every word earns its place, no fluff or redundancy.

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

Completeness5/5

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

This is a simple tool with one parameter and an output schema, so the description need not explain return values. It covers the core action, permanence, and non-effect on scraped pages, which is sufficient for an agent to use it correctly. The only gap is parameter description, but that is accounted for in parameter semantics.

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

Parameters2/5

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

Schema coverage is 0%, meaning the parameter 'name' has no description in the schema. The description does not explicitly describe the parameter; it only implies via 'Delete a saved result table' that 'name' identifies the table. This is minimal compensation for a low-coverage schema. A more explicit statement like 'name: the name of the table to delete' would be expected.

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

Purpose5/5

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

The description clearly states the tool's action: 'Delete a saved result table' with a specific verb (delete) and resource (result table). It also clarifies that it permanently removes rows but leaves scraped pages unaffected, which distinguishes it from other table-related tools like get_table, export_table, and query_table. This is a precise and unambiguous purpose statement.

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

Usage Guidelines4/5

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

The description provides clear context: it deletes a saved table and is permanent, implying use when a table is no longer needed. It does not explicitly mention alternatives or when not to use it, but the action is self-evident and the permanence note adds caution. Lacks explicit sibling differentiation but is adequate for an agent to decide.

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

export_tableA

Export a result table to a file on disk as CSV or JSON, and return its path. Use this to hand data to a spreadsheet or another tool.

NameRequiredDescriptionDefault
fmtNocsv
nameYes
dest_dirNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral disclosure burden. It does state the core behaviors: writes a file in CSV or JSON and returns its path. However, it does not disclose side effects such as whether existing files are overwritten, how dest_dir is resolved, or any permission or error behavior.

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

Conciseness5/5

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

Two sentences, front-loaded with the action, no filler. Every word adds value, and the purpose statement is immediately clear.

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

Completeness3/5

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

The tool is simple, and an output schema exists, so return values are covered. However, the description omits parameter details and alternative usage guidance, leaving some context gaps for an agent deciding how to invoke it correctly.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, but it only hints at fmt via "CSV or JSON". The required parameter `name` is ambiguous (table name vs. output filename), and `dest_dir` is entirely unexplained. The description does not add enough meaning beyond the raw schema.

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

Purpose5/5

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

The description uses a specific verb and resource: "Export a result table to a file on disk as CSV or JSON, and return its path." It clearly distinguishes this from sibling table tools like get_table or query_table, which return data rather than write it to disk.

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

Usage Guidelines4/5

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

The phrase "Use this to hand data to a spreadsheet or another tool" provides clear usage context. It does not explicitly name alternatives or say when not to use it, but the intended use case is clearly communicated.

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

extract_by_selectorA

Extract arbitrary fields from pages using CSS selectors — the general case the fixed extractors do not cover. fields maps output column names to selectors, e.g. {"name": "h1", "price": ".price"}. Set row_selector when a page holds a list: each match becomes a row and the field selectors resolve inside it, which turns a listing into a table. Suffix a selector with @attr to read an attribute instead of text — "a@href" gives the link, resolved to an absolute URL. Pass save_as to store the rows; add mode='append' when batching.

NameRequiredDescriptionDefault
modeNoreplace
urlsYes
fieldsYes
save_asNo
js_renderNo
row_selectorNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It explains key behaviors: resolving relative URLs to absolute, row_selector producing table rows, and save_as storing rows. However, it does not disclose potential side effects like whether it performs writes (e.g., saving to DB) or the exact behavior of js_render, leaving some ambiguity for a tool that could be both read and write.

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

Conciseness4/5

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

The description is dense but well-structured, offering essential details in three sentences with a clear logical flow: purpose, field mapping, row selection, attribute extraction, and storage. It uses inline code for parameters and a compact JSON example, earning its length without fluff. Slightly long but justified by the need to explain complex features.

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

Completeness4/5

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

The tool is complex (6 params, nested fields, output schema) and the description covers most usage aspects: selectors, attributes, row-based extraction, and save behavior. It omits details on js_render and exact return structure, but with an output schema present, that is acceptable. Overall, it provides sufficient guidance for effective use in a scraping workflow.

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

Parameters4/5

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

Schema coverage is 0%, so the description must explain all parameters. It covers fields with an example, row_selector semantics, the @attr suffix, and save_as/mode usage. It does not explicitly describe urls (obvious) or js_render, but the core semantics are well-addressed, exceeding the baseline given the schema's lack of descriptions.

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

Purpose5/5

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

The description clearly states it extracts arbitrary fields from pages using CSS selectors, positioning it as the general-purpose alternative to fixed extractors. It explicitly names the key parameters (fields, row_selector, save_as) and even provides a JSON example, making the tool's purpose unmistakable.

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

Usage Guidelines5/5

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

It explicitly says this is 'the general case the fixed extractors do not cover', directly contrasting with sibling tools like extract_products and extract_links. It also gives concrete usage patterns: using row_selector for listings, attribute suffix for hrefs, and append mode for batching, which instructs when and how to apply the tool.

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

extract_emailsA

Scan a list of URLs for email addresses. Returns JSON with results ({url, value, context}) and errors. Pass save_as='<table_name>' to store results instead of returning them inline.

NameRequiredDescriptionDefault
modeNoreplace
urlsYes
save_asNo
js_renderNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations providing behavioral context, the description carries the full burden. It discloses that results can be returned inline or saved to a table via save_as, and that errors are included. However, it omits potential side effects like network usage, rate limits, or the meaning of mode/js_render, which limits full transparency.

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

Conciseness5/5

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

The description is two sentences, extremely concise, and well-structured: it states the purpose, then the output format, then the save option. No extraneous information is present, and the structure is logical.

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

Completeness2/5

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

While the tool's core function is clear, the description fails to provide sufficient context for optional parameters (mode, js_render) and does not elaborate on the output structure (e.g., what 'context' contains). Given the tool's moderate complexity, more detail is needed for full completeness.

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

Parameters2/5

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

Schema coverage is 0%, so the description must explain parameters. It only clarifies save_as (storing vs returning) and implicitly urls (list of URLs). It leaves mode (what does 'replace' mean?) and js_render (when and why) unexplained, which is a significant gap given no parameter descriptions exist.

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

Purpose5/5

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

The description clearly states the tool scans a list of URLs for email addresses, which is a specific verb-resource combination. It distinguishes itself from sibling tools like extract_phones and extract_social_links by focusing on emails, making the purpose unambiguous.

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

Usage Guidelines4/5

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

The description clearly indicates when to use the tool (to extract emails from URLs) and mentions the save_as option for storing results instead of returning them. However, it does not explicitly contrast with alternatives, though the purpose is clear enough.

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

extract_phonesA

Scan a list of URLs for phone numbers. Returns JSON with results ({url, value, context}) and errors. Pass save_as='<table_name>' to store results instead of returning them inline.

NameRequiredDescriptionDefault
modeNoreplace
urlsYes
save_asNo
js_renderNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description must carry the transparency burden. It discloses the return shape (results with url/value/context, errors) and the storage side effect of save_as, but it does not explain the meaning or impact of mode or js_render, nor any fetching/scraping implications.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose, and avoids redundancy. Every sentence adds meaningful information about behavior or output.

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

Completeness3/5

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

The description covers the primary workflow, output schema expectations, and the save_as option, but it omits important parameter semantics and edge-case guidance. Given the 4-parameter schema and no annotations, this is adequate but not fully complete.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It explains save_as and implicitly urls, but mode and js_render are left entirely to their schema titles and defaults, which is insufficient for correct invocation.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Scan a list of URLs for phone numbers.' It clearly distinguishes this from sibling tools like extract_emails, extract_links, and fetch_page by naming the exact extraction target and input type.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool: when you have a list of URLs and need phone numbers. It also explains the inline vs. save_as behavior, though it does not explicitly name alternatives or exclusions.

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

extract_productsA

Extract structured product data (name, price, currency, availability, brand, sku, image, rating, review_count) from a list of product URLs. Reads the page's own JSON-LD, OpenGraph or microdata rather than guessing at selectors, so it works across most storefronts without configuration. Pass save_as='<table_name>' to store the rows for querying.

NameRequiredDescriptionDefault
urlsYes
save_asNo
js_renderNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the burden. It discloses the method (reads JSON-LD/OpenGraph/microdata) and that it stores rows via save_as, which implies a side effect of saving data. However, it does not mention potential issues like rate limits, errors, or the effect of js_render, leaving gaps in behavioral disclosure.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose, and includes no fluff. Every clause adds value—specifying fields, method, compatibility, and save_as usage. It is concise and well-structured.

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

Completeness4/5

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

Given the tool's moderate complexity and presence of an output schema, the description covers the main behavior, method, and parameter for saving. However, it leaves out js_render entirely and does not mention any limits or edge cases, making it slightly incomplete. The output schema reduces the need to describe return values, but the missing parameter is a notable gap.

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

Parameters3/5

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

The description explains urls (list of product URLs) and save_as (stores rows for querying) but completely omits js_render. With schema coverage at 0%, this is insufficient. It adds some meaning beyond the schema but does not fully compensate for the unmentioned parameter, so a score of 3 is appropriate.

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

Purpose5/5

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

The description clearly specifies the action (extract structured product data) and the resource (list of product URLs), listing specific fields like name, price, currency, etc. It also distinguishes itself from siblings like extract_by_selector by explicitly noting it uses JSON-LD/OpenGraph/microdata instead of selector guessing, making the purpose unambiguous.

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

Usage Guidelines4/5

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

It states the tool 'works across most storefronts without configuration' and implies it is for structured product data, which helps decide when to use it. However, it does not explicitly state when not to use it or mention alternatives like extract_by_selector, though it contrasts with selector-based guessing. This provides context but lacks explicit exclusions.

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

extract_shopify_storeA

Extract a Shopify store's catalogue as one row per product variant — price, sku, options, availability, vendor, image and product URL. Reads the store's public products.json, so it needs no rendering and no selectors. Pass save_as='<table_name>' to store the rows (recommended: catalogues are large). max_products caps how many products are pulled.

NameRequiredDescriptionDefault
save_asNo
store_urlYes
max_productsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries full responsibility. It discloses the mechanism (reads products.json), the output structure (row per variant with listed fields), and behavior of parameters (save_as for storage, max_products for capping). It does not mention potential failure modes like missing products.json, but provides enough behavioral context for an agent to understand the tool's operation.

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

Conciseness5/5

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

The description is two sentences: the first succinctly states the purpose and output format, the second explains the mechanism and key parameters. Every word earns its place, with no redundant or vague phrasing. It is front-loaded with the core action and concludes with practical guidance.

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

Completeness4/5

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

The description covers the essential aspects: what it does, how it works, key parameters, and a storage recommendation. An output schema exists, so return values need not be detailed. It lacks explicit error-handling or limitations (e.g., stores without products.json), but for a Shopify-specific extractor, it provides sufficient context for typical usage.

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

Parameters5/5

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

Schema coverage is 0%, so the description must explain all parameters. It does so effectively: store_url is implied as the store being extracted, save_as is explained as the table name for storage, and max_products is described as capping the number of products. All three parameters are given meaningful context beyond their names.

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

Purpose5/5

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

The description clearly states the tool extracts a Shopify store's catalogue as one row per product variant, listing specific fields (price, sku, options, etc.). It distinguishes itself from siblings by mentioning it reads the public products.json and requires no rendering or selectors, which differentiates it from selector-based extraction tools like extract_by_selector and generic extract_products.

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

Usage Guidelines4/5

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

The description explains that it reads the store's public products.json, implying it works when that file is available. It also recommends using save_as for large catalogues, providing a practical usage tip. However, it does not explicitly state when not to use it or mention alternatives, though the context of Shopify-specific extraction is clear.

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

fetch_pageA

Fetch one web page and return its content as clean markdown with metadata. Set js_render=true for pages that need JavaScript to render (SPAs, infinite-scroll listings, most modern storefronts). If a rendered page still comes back sparse, give it longer with wait_ms, or wait for a specific element with wait_for (a CSS selector) — that is more reliable than a fixed delay. Article-shaped pages have their navigation, cookie banners and footers stripped automatically; set main_content=false to keep the whole page. PDFs are extracted to text.

actions drives the page before reading it (implies js_render). Each is {action, selector, ...}: click, type (text), press (key), wait (ms), wait_for, scroll (times), scroll_to_bottom (max_rounds) for infinite scroll, and click_until_gone (max_clicks) for a 'load more' button. Use it for cookie gates, paginated listings and search forms.

NameRequiredDescriptionDefault
urlYes
actionsNo
wait_msNo
wait_forNo
js_renderNo
main_contentNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and delivers: automatic stripping of navigation/cookie banners/footers for articles, PDF extraction to text, actions implying js_render, and detailed behavior of each action type. This is thorough and goes beyond what annotations would typically provide.

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

Conciseness5/5

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

Every sentence earns its place. The description is front-loaded with the core purpose, then systematically covers parameters and actions. It is dense but not bloated, with a clean two-paragraph structure that separates basic usage from advanced 'actions' behavior.

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

Completeness5/5

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

Given the tool's complexity (6 parameters, an actions array, multiple rendering modes), the description is remarkably complete. It covers all parameters, explains the actions schema, and provides practical example use cases. The output schema exists, so return values don't need explanation.

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

Parameters5/5

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

The input schema has zero description coverage (only titles), so the tool description must compensate. It explains all parameters except the obvious 'url' — js_render, wait_ms, wait_for, main_content get clear usage context, and actions receives an entire paragraph with a complete list of action types and examples.

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

Purpose5/5

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

The description opens with a specific verb 'Fetch' and clearly identifies the resource ('one web page') and the result ('clean markdown with metadata'). It distinguishes itself from sibling tools like fetch_pages (plural) and crawl_site by focusing on single-page retrieval with rendering options.

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

Usage Guidelines4/5

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

The description provides extensive guidance on when to use each parameter: js_render for SPAs/infinite-scroll, wait_for over fixed delays, main_content to control stripping, and actions for cookie gates/paginated listings. It lacks explicit mention of when not to use this tool vs alternatives, so it's not a 5.

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

fetch_pagesA

Fetch many web pages in parallel. Returns JSON with results and errors. Set js_render=true for JavaScript-heavy pages. For more than about 20 URLs, pass save_as='<table_name>' to write the pages into a result table and get back a summary instead of the full text — then use query_table to interrogate it without filling the conversation. When feeding a long URL list through in batches, pass mode='append' on every call after the first, or each batch replaces the last.

NameRequiredDescriptionDefault
modeNoreplace
urlsYes
save_asNo
wait_msNo
wait_forNo
js_renderNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses parallel fetching, return format (JSON with results and errors), optional JavaScript rendering, saving to a table, and the replace/append mode behavior. This covers the main behavioral traits. However, it does not mention potential side effects like whether saving to an existing table overwrites it (though mode explains this), nor rate limits or other constraints. Slightly more detail on error handling or table interactions would elevate it to 5.

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

Conciseness4/5

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

The description is a single paragraph but flows logically: core purpose, then key option, then batching guidance. It is not overly verbose for the complexity involved, though it could be broken into bullet points for clarity. Every sentence adds value, but the length might be slightly long. Still, it is well-structured and efficient.

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

Completeness4/5

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

The description covers the major use cases: parallel fetch, JS-heavy pages, large URL batches via save_as, and batch replacement behavior. It also mentions the return format and follow-up with query_table. Given the tool's complexity (6 parameters, batching, parallel execution), it is complete enough for an agent to use effectively. The presence of an output schema (though not shown) and the description's hints at results/errors provide sufficient context.

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

Parameters3/5

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

Schema coverage is 0%, so the description is the sole source of parameter meaning. It explains js_render (for heavy JS), save_as (to write to a table), and mode (append vs replace). However, wait_ms and wait_for are not mentioned, and urls is self-explanatory. Since important parameters like batching are well explained but others are omitted, this is adequate but not comprehensive. A 3 reflects that it partially compensates for the missing schema descriptions.

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

Purpose5/5

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

The description clearly states 'Fetch many web pages in parallel', specifying the action (fetch), resource (web pages), and the batch nature (many, parallel). This distinctly differentiates it from the sibling 'fetch_page' tool, which likely handles single pages. The verb 'fetch' is specific and the scope (many pages) is unambiguous.

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

Usage Guidelines5/5

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

The description provides rich usage guidance: when to set js_render for JavaScript-heavy pages, when to use save_as for >20 URLs to avoid filling the conversation, and the exact pattern for batching with mode='append'. It also references the complementary query_table tool for further interrogation. While it doesn't explicitly say 'use fetch_page for single pages', the name and context imply that, and the instructions cover the key scenarios for this tool.

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

find_placesA

Search for places and local businesses by name or description — 'the British Museum', 'cafes in Shoreditch'. Returns name, address, coordinates, phone, website, opening hours and category. Data comes from OpenStreetMap, so there are no star ratings or review counts; for those you would need a paid Google Places key. Pass save_as='<table_name>' to store the results.

NameRequiredDescriptionDefault
limitNo
queryYes
save_asNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It discloses the data source (OpenStreetMap), the absence of ratings, and the optional save_as behavior. It doesn't mention any side effects of saving (e.g., creating a table), but the save_as parameter hint is present. Overall, good disclosure for a search tool.

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

Conciseness4/5

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

Description is one long sentence but conveys all key points without fluff. It's front-loaded with purpose then examples. Could be split into clearer sentences, but effective. No wasted words.

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

Completeness5/5

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

Given the presence of an output schema (which presumably details return structure), the description covers essential usage and limitations well. It tells the agent what to expect (fields), warns about a key limitation, and hints at saving results. For a search tool with 3 params, this is complete enough.

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

Parameters3/5

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

Schema has 3 params with 0% description coverage EchoParam, so description must compensate. It explains 'query' via examples alludes to it and explicitly documents 'save_as'. But 'limit' is not mentioned at all. So partial coverage.

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

Purpose5/5

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

Clear verb+resource: 'Search for places and local businesses by name or description'. Includes concrete examples and lists return fields. Distinguishes from find_places_nearby (implicitly, by not focusing on proximity) and search_web.

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

Usage Guidelines4/5

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

States the query pattern and explicitly warns about data source limitation (no ratings/reviews) and suggests paid Google Places for that need. Doesn't explicitly say when not to use compared to siblings like find_places_nearby, but the limitation note serves as a guide.

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

find_places_nearbyA

Find every business of a category within a radius of a place — 'dentists near Bath', 'cafes within 2km of Shoreditch'. This is the tool for local lead generation: it returns name, address, phone, website and opening hours for each. category accepts friendly names (cafe, dentist, hotel, solicitor, gym, hairdresser, ...) or a raw OpenStreetMap tag like 'amenity=dentist'. Data is OpenStreetMap, so there are no star ratings. Pass save_as='<table_name>' to store the results.

NameRequiredDescriptionDefault
nearYes
limitNo
save_asNo
categoryYes
radius_mNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses data source (OpenStreetMap), the absence of star ratings, returned fields, and the save_as storage side effect. It could mention rate limits or data availability, but it is reasonably transparent.

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

Conciseness5/5

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

Every sentence earns its place: purpose, examples, category syntax, data caveat, and save_as behavior. It is dense but not bloated, with no wasted words.

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

Completeness4/5

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

For a 5-parameter list-style tool with an output schema available, the description covers purpose, parameter semantics, output fields, and side effects. Minor gaps like limit semantics and explicit radius units are addressed by schema defaults and parameter naming.

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

Parameters4/5

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

Schema description coverage is 0%, so the description compensates by explaining category (friendly names vs. OSM tags), near (place names), radius, and save_as. Limit is not addressed, but the description adds substantial semantic value beyond the bare schema.

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

Purpose5/5

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

Clearly states it finds every business of a given category within a radius of a place, with concrete examples and expected return fields. The phrase 'This is the tool for local lead generation' helps distinguish it from the sibling find_places.

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

Usage Guidelines4/5

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

Gives explicit use-case context ('dentists near Bath', 'cafes within 2km of Shoreditch', local lead generation). It does not explicitly name when-not-to-use or alternatives, but the context is clear enough to guide tool selection.

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

get_tableA

Inspect one result table: its columns, row count, and a small sample of rows.

NameRequiredDescriptionDefault
nameYes
sampleNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It transparently states the tool's read-only inspection nature and enumerates the returned information (columns, row count, sample rows). It does not discuss error cases or prerequisites, but for a simple inspection tool this is adequate.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler or repetition. Every word contributes to explaining the tool's purpose and output.

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

Completeness4/5

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

The tool is simple, has an output schema, and the description covers the core behavior and return contents. It does not explain prerequisites or edge cases, but the presence of an output schema and the low complexity make the description sufficiently complete.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate for parameter meaning. It indirectly maps to the parameters: 'one result table' implies the `name` parameter, and 'a small sample of rows' implies `sample`. However, it does not explicitly name or explain either parameter, leaving some ambiguity.

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

Purpose5/5

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

The description uses a specific verb ('Inspect') and resource ('one result table') and clearly enumerates what is returned: columns, row count, and a sample of rows. This distinguishes it from siblings like list_tables (listing all tables) and query_table (running queries).

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

Usage Guidelines4/5

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

The phrase 'Inspect one result table' clearly conveys when to use this tool: when you need details about a single table rather than listing or querying tables. It does not explicitly name alternatives or exclusions, but the context is clear enough for an agent to differentiate it from sibling tools.

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

inspect_networkA

Render a page and report the API calls it makes, with their JSON responses. A JavaScript site usually loads its data from an endpoint you can read directly — cleaner and far cheaper than parsing rendered markup, and it survives redesigns that break selectors. Use this when a page is hard to scrape, then fetch the endpoint it reveals. Set include_types to widen beyond JSON.

NameRequiredDescriptionDefault
urlYes
save_asNo
wait_msNo
wait_forNo
include_typesNojson
max_body_charsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses that the tool renders a page and inspects network calls, and mentions that include_types controls content type. However, it does not explain broader details such as whether this triggers side effects, how many requests are captured, how responses are truncated, or what the output structure contains.

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

Conciseness5/5

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

The description is two sentences and front-loaded with the core purpose before expanding on when and why to use this tool. Every sentence earns its place, including the rationale about cleanliness, cost, and resilience to redesigns.

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

Completeness2/5

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

The description provides a strong strategic context but lacks enough operational detail to fully guide an agent invoking this tool. Although the output schema reduces some need to describe return values, the six parameters are mostly undocumented, and there are no annotations to fill the gap. Important context like save_as behavior, wait_for semantics, and max_body_chars limits is absent.

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

Parameters2/5

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

The input schema has zero description coverage, so the description must compensate. It only explains one parameter, include_types ('widen beyond JSON'), and says nothing about the semantics or typical values of url, save_as, wait_ms, wait_for, or max_body_chars. The value added beyond schema is minimal.

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

Purpose5/5

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

The description clearly states the tool's function: 'Render a page and report the API calls it makes, with their JSON responses.' It uses a specific verb and resource combination and distinguishes itself from sibling tools like fetch_page and extract_by_selector by focusing on discovering network endpoints rather than fetching or parsing pages directly.

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

Usage Guidelines4/5

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

The description explicitly recommends using this tool 'when a page is hard to scrape' and suggests the follow-up action 'fetch the endpoint it reveals.' It contrasts the approach with parsing rendered markup, noting it is 'cleaner and far cheaper,' but it does not explicitly name alternative sibling tools for contrast.

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

list_shopify_collectionsA

List a Shopify store's collections with their product counts. Use this to pick which collections to extract before calling extract_shopify_store.

NameRequiredDescriptionDefault
store_urlYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of disclosure. It states the tool lists collections with counts but does not mention any side effects, authentication requirements, network behavior, or data format details. For a simple read operation, this is acceptable but minimal; it does not contradict annotations (none exist) and provides some context about output (product counts).

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

Conciseness5/5

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

The description is two sentences, both purposeful: the first states what the tool does, the second gives usage guidance. There is zero wasteful text, and the structure is appropriately front-loaded with the core functionality.

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

Completeness3/5

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

The tool is simple (1 param, output schema exists) and the description covers basic purpose and usage. However, it does not explain the store_url parameter or any behavioral details like pagination or output shape, relying entirely on the output schema (not shown here). Given the tool's simplicity, this is adequate but not exceptional, missing some context that could help the agent use it correctly.

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

Parameters1/5

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

The schema has 0% description coverage for the single parameter store_url, and the description does not explain it at all. The tool description only mentions 'a Shopify store's collections' but does not clarify the format, scheme, or required structure of store_url. Since the schema provides no guidance and the description adds no parameter-specific meaning, this is a significant gap.

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

Purpose5/5

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

The description clearly states the tool lists a Shopify store's collections and includes product counts, which is specific and distinct from the sibling extract_shopify_store tool. It names the resource (collections) and the action (list) without ambiguity.

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

Usage Guidelines5/5

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

The description explicitly tells when to use this tool: 'Use this to pick which collections to extract before calling extract_shopify_store.' It gives a clear use case and directly references the alternative/extraction tool, leaving no doubt about its purpose in the workflow.

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

list_tablesA

List saved result tables with their row counts and columns. Result tables are produced by any tool called with save_as.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral disclosure burden. It states the provenance of tables (produced via save_as) and what the output includes (row counts and columns), implying a read-only listing operation with no side effects.

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

Conciseness5/5

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

Two short sentences pack the essential information: what is listed, what is included, and where tables come from. No filler or redundancy.

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

Completeness5/5

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

Given that the tool has no parameters and an output schema exists for return values, the description fully covers the necessary context: what the tool does, what its output summarizes, and how result tables originate. No critical information is missing.

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

Parameters4/5

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

The tool has zero parameters, so schema coverage is complete and there are no parameter meanings to clarify. The baseline of 4 applies because the description has no parameter burden to fulfill.

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

Purpose5/5

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

The description uses a specific verb ('List') and names the exact resource ('saved result tables'), plus states the returned information (row counts and columns). It clearly distinguishes this tool from siblings like get_table, query_table, and drop_table.

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

Usage Guidelines4/5

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

The description explains that result tables are produced by any tool called with save_as, giving clear context for when saved tables exist and when this listing tool is relevant. It does not explicitly name alternatives or exclusions, but for a zero-parameter list operation this is sufficient.

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

list_trackedA

List the pages being tracked for changes, with when each was last seen.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description must stand alone. It says 'List the pages being tracked' which implies a read-only operation, but it doesn't explicitly state that it doesn't modify data or mention any side effects. For a simple list operation, this is acceptable but minimal.

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

Conciseness5/5

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

The description is a single sentence, front-loaded with the action and resource, and includes relevant details like 'with when each was last seen'. No unnecessary words.

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

Completeness4/5

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

Given that it's a simple list operation with no parameters and an output schema provided, the description is sufficient. It clearly states what it returns (pages and last-seen times). It doesn't mention any limitations or relationships to other tools, but for a straightforward list, this is adequate.

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

Parameters4/5

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

There are no parameters, so the description doesn't need to explain any. It correctly reflects that no input is required.

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

Purpose5/5

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

The description uses a specific verb (

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

Usage Guidelines4/5

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

The description clearly states the purpose (listing tracked pages) but does not explicitly mention when to use it over alternatives or any preconditions. It's clear enough that this is the tool to check currently tracked pages, but lacks explicit exclusion guidance.

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

query_tableA

Run a read-only SQL SELECT against saved result tables. This is how you analyse a large scrape without pulling it into the conversation: filter, aggregate, group and sort a table of any size and get back only the rows you asked for. Only SELECT is permitted — the query can never modify saved data. Example: SELECT vendor, COUNT(*) AS n, AVG(price) AS avg_price FROM catalogue GROUP BY vendor ORDER BY n DESC.

Pass save_as='<table_name>' to persist the query's result as a new table. That is how you clean data here: SELECT DISTINCT deduplicates, aliases rename columns, a || ', ' || b AS c merges them, and WHERE drops unwanted rows — all in one step, with the original left untouched unless you deliberately target its name.

NameRequiredDescriptionDefault
sqlYes
save_asNo
max_rowsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and does an excellent job: it declares read-only behavior, states that only SELECT is permitted, clarifies the query can never modify saved data, and explains that original data remains untouched unless the save_as name deliberately targets the original table.

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

Conciseness4/5

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

The description is well-structured: the main purpose and safety context come first, followed by a realistic example and a practical save_as workflow. It is slightly longer than necessary due to some restatement of safety guarantees, but every key concept contributes meaningfully.

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

Completeness3/5

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

The description is strong for primary behavior and saving results, but it leaves out the max_rows semantic, which is important for agents deciding whether they will receive all matching rows or only a capped page. Given an output schema exists, return values are not needed, but the parameter gap prevents this from being fully complete.

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

Parameters3/5

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

The description gives strong, concrete meaning to sql and save_as through an example and workflow explanation. However, schema description coverage is 0% and max_rows is never mentioned, so the 200-row default limit and its impact on returned output are left undocumented.

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

Purpose5/5

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

The description uses a specific action, 'Run a read-only SQL SELECT', and names the exact resource, 'saved result tables'. It distinguishes itself from extraction and export siblings by focusing on in-place analysis with filters, aggregation, and grouping, and it explicitly says it is how you analyse a large scrape.

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

Usage Guidelines4/5

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

It clearly states when to use it: when you need to analyse a large scrape without pulling all data into the conversation. It also gives a clear workflow for saving cleaned results with save_as. However, it does not explicitly name alternative tools like get_table or list_tables for cases where this tool is not the right fit.

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

search_webA

Search the web and get back ranked results with titles, URLs and snippets — the way in when you have a question rather than a URL. Feed the urls straight into fetch_pages or extract_by_selector. No API key and no quota.

NameRequiredDescriptionDefault
limitNo
queryYes
save_asNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It discloses the output shape (ranked results with titles, URLs, snippets) and access characteristics (no API key, no quota), which is helpful. However, it does not explain the behavior of the save_as parameter, limit handling, or any potential side effects such as saving results locally.

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

Conciseness5/5

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

The description is two sentences with no filler. It front-loads the core action and result format, then adds workflow guidance and access constraints, making every sentence earn its place.

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

Completeness3/5

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

The tool is simple with only one required parameter and an output schema, so the description covers the main usage scenario well. However, the unexplained save_as parameter and lack of any annotation leave a gap in understanding the full side effects and input semantics, making it not fully complete.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for parameter meaning, but it does not explain limit or save_as explicitly. The query parameter is loosely implied by 'a question', but the other two parameters rely entirely on their names and defaults for inference. This leaves meaningful ambiguity, especially for save_as.

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

Purpose5/5

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

The description clearly states the tool performs web searches and returns ranked results with titles, URLs, and snippets. It explicitly positions the tool as the entry point for question-based lookups rather than URL-based processing, which distinguishes it from sibling tools like fetch_pages and extract_by_selector.

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

Usage Guidelines4/5

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

The description gives strong usage context: use it when you have a question rather than a URL, and then feed resulting URLs into fetch_pages or extract_by_selector. It does not enumerate alternative search tools or explicitly state when not to use it, but the guidance is clear and actionable.

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

track_changesA

Fetch a page and report what changed since the last time it was checked. Returns status 'new', 'same' or 'changed', with a unified diff and line counts when it changed. This is monitoring without a scheduler: check a price, a job board or a policy page whenever you want and see only the difference.

NameRequiredDescriptionDefault
urlYes
js_renderNo
context_linesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations available, the description carries the behavioral transparency burden and does a good job: it discloses the stateful 'since the last time it was checked' behavior, the possible status values, unified diff output, line counts, and that this is not scheduled. It could add more detail about storage or rate limits, but it is still substantially transparent.

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

Conciseness5/5

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

The description is two sentences long, front-loads the core action, and every sentence adds value. It avoids repetition and boilerplate while still giving examples and return behavior.

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

Completeness4/5

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

The description is fairly complete for a moderately stateful tool: it explains what the tool does, what it returns, and when to use it. The main gap is parameter semantics, but since an output schema exists and the core lifecycle is described, the overall context is sufficient for most monitoring use cases.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not explain js_render or context_lines at all. The URL parameter is implied by 'Fetch a page', but the boolean rendering flag and diff context setting are left unexplained, so an agent cannot confidently tune those parameters.

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

Purpose5/5

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

The description states a specific action ('Fetch a page and report what changed since the last time it was checked') and clearly differentiates from sibling tools by emphasizing comparison, diff output, and monitoring statuses. Concrete use cases like price, job board, and policy page make the purpose immediately understandable.

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

Usage Guidelines4/5

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

It says this is 'monitoring without a scheduler' and gives examples of when to use it, which provides clear usage context. However, it does not explicitly contrast with sibling tools such as fetch_page or search_web, nor does it mention exclusions or when not to use it.

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

untrackC

Stop tracking a page and forget its stored snapshot.

NameRequiredDescriptionDefault
urlYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions that the stored snapshot is forgotten, which is useful, but it does not disclose whether this is destructive (irreversible), whether it affects other tracked data, or any side effects. The description is minimal and leaves the agent guessing about the consequences.

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

Conciseness4/5

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

The description is a single, concise sentence that is front-loaded with the main action. It is efficient and to the point, though it could be slightly more informative without becoming verbose.

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

Completeness2/5

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

Given the tool's simplicity (one parameter, no annotations, no output schema details), the description is somewhat adequate but lacks important context. It does not explain the effect on the snapshot, whether the action is reversible, or any related tools. The description is too sparse to fully guide an agent, especially without annotations.

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

Parameters2/5

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

The schema has 0% description coverage, and the description does not explain the 'url' parameter beyond its name. The description implies the URL identifies the page to untrack, but it does not clarify format, validation, or behavior for invalid URLs. The description adds minimal value over the schema.

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

Purpose4/5

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

The description clearly states the action (stop tracking) and the resource (a page), and it adds the detail about forgetting the stored snapshot, which distinguishes it from simply pausing or disabling tracking. It is specific enough to differentiate from sibling tools like track_changes and list_tracked.

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

Usage Guidelines2/5

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

The description does not provide any guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or conditions. It implies usage (when you want to stop tracking a page) but lacks explicit context or exclusions.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 22 tool updatesv0.1.1
    • Addeddrop_table
    • Addedexport_table
    • Addedextract_by_selector
    • Changedextract_emails2 fields changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "replace",
        +  "title": "Mode",
        +  "type": "string"
        +}
      • addedInput schema / properties / save_as
        Added value: +{
        +  "default": "",
        +  "title": "Save As",
        +  "type": "string"
        +}
    • Changedextract_links2 fields changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "replace",
        +  "title": "Mode",
        +  "type": "string"
        +}
      • addedInput schema / properties / save_as
        Added value: +{
        +  "default": "",
        +  "title": "Save As",
        +  "type": "string"
        +}
    • Changedextract_phones2 fields changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "replace",
        +  "title": "Mode",
        +  "type": "string"
        +}
      • addedInput schema / properties / save_as
        Added value: +{
        +  "default": "",
        +  "title": "Save As",
        +  "type": "string"
        +}
    • Addedextract_products
    • Addedextract_shopify_store
    • Changedextract_social_links2 fields changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "replace",
        +  "title": "Mode",
        +  "type": "string"
        +}
      • addedInput schema / properties / save_as
        Added value: +{
        +  "default": "",
        +  "title": "Save As",
        +  "type": "string"
        +}
    • Changedfetch_page4 fields changed
      • addedInput schema / properties / actions
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Actions"
        +}
      • addedInput schema / properties / main_content
        Added value: +{
        +  "default": true,
        +  "title": "Main Content",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / wait_for
        Added value: +{
        +  "default": "",
        +  "title": "Wait For",
        +  "type": "string"
        +}
      • addedInput schema / properties / wait_ms
        Added value: +{
        +  "default": 0,
        +  "title": "Wait Ms",
        +  "type": "integer"
        +}
    • Changedfetch_pages4 fields changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "replace",
        +  "title": "Mode",
        +  "type": "string"
        +}
      • addedInput schema / properties / save_as
        Added value: +{
        +  "default": "",
        +  "title": "Save As",
        +  "type": "string"
        +}
      • addedInput schema / properties / wait_for
        Added value: +{
        +  "default": "",
        +  "title": "Wait For",
        +  "type": "string"
        +}
      • addedInput schema / properties / wait_ms
        Added value: +{
        +  "default": 0,
        +  "title": "Wait Ms",
        +  "type": "integer"
        +}
    • Addedfind_places
    • Addedfind_places_nearby
    • Addedget_table
    • Addedinspect_network
    • Addedlist_shopify_collections
    • Addedlist_tables
    • Addedlist_tracked
    • Addedquery_table
    • Addedsearch_web
    • Addedtrack_changes
    • Addeduntrack
  2. 8 tool updatesv0.1.0
    • First observedanalyze_website
    • First observedcrawl_site
    • First observedextract_emails
    • First observedextract_links
    • First observedextract_phones
    • First observedextract_social_links
    • First observedfetch_page
    • First observedfetch_pages

TDQS

A3.8/5.0

Scored across 24 tools

Disambiguation4/5

Most tools have clearly distinct purposes: fetching, extracting, searching, tracking, and table operations are well separated. Minor overlap exists between extract_products and extract_shopify_store, and between fetch_page and fetch_pages, but the descriptions clarify their scope enough to avoid serious misselection.

Naming Consistency5/5

Tool names follow a consistent snake_case verb_noun pattern: extract_*, fetch_*, list_*, find_*, query_table, export_table, drop_table. Even 'untrack' aligns with the tracking tools, making the set predictable and easy to navigate.

Tool Count4/5

24 tools is on the high end, but the count is justified by the server's broad scope: discovery, fetching, extraction, monitoring, local business search, and result-table management. It feels comprehensive rather than redundant, though it approaches the upper limit.

Completeness5/5

The tool set covers the full scraping lifecycle: discover sites, fetch pages, extract structured data, inspect network calls, track changes, store results, query them, and export them. There are no obvious dead ends or missing core operations for a web-scraping server.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    An MCP server for web content extraction that converts HTML pages into clean, LLM-optimized Markdown using Mozilla's Readability. It supports batch processing, intelligent multi-page crawling, and configurable caching while respecting robots.txt standards.
    15 npm
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Open-source web scraper and extraction MCP server with JavaScript rendering, markdown output, PDF/DOCX parsing, structured errors, and validated extraction contract diagnostics for agents.
    2
    AGPL 3.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Remote MCP server for web scraping with anti-bot evasion. Provides stealth HTTP fetching, headless browser with Cloudflare bypass, CSS selectors, YouTube transcripts, and Markdown conversion.
    1
    MIT