web-access
Server Details
The most accurate web access API. Stop getting blocked.
- Status
- Healthy
- Uptime
- 29.8% over 69 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- usestring/string-ai-mcp
- GitHub Stars
- 4
- Server Listing
- String AI Web Access MCP Server
TDQS
Scored across 4 tools
The four tools mostly have distinct purposes: search for queries, fetch for reading URLs, request for sending bodies, and sitemap for crawling. Fetch and request could be confused since both hit a URL, but the descriptions explicitly separate reading via GET from submitting via POST/PUT/PATCH.
All tool names use the same predictable `web_access_<action>` pattern: fetch, request, search, sitemap. The convention is consistent across the entire set.
Four tools is well-scoped for a web access server: query, read, submit, and crawl. Each tool earns its place without redundant surface area.
The set covers the core web-access lifecycle: search, fetch, non-GET requests, and asynchronous crawling. There is a minor gap around other HTTP methods such as DELETE, and no dedicated structured extraction tool beyond fetch formats, but core workflows are covered.
Available Tools
4 toolsweb_access_fetchFetch a web pageADestructiveInspect
Fetch a caller-specified HTTP(S) URL and get clean, LLM-ready Markdown back.
Primary use (the common case): pass only a url. The page is fetched with a normal GET and returned as Markdown — no other parameters are needed.
{ "url": "https://example.com/article" }Best for: any URL, especially sites that block automated traffic or render their content client-side (news, docs, blogs, web apps). Not for: searching the web when you don't have a URL — use web_access_search instead.
Optional parameters (omit unless you need them):
format—markdown(default),raw(the destination's verbatim body), orjson(a{ statusCode, headers, data }envelope with the destination's status and headers).executeJS— set true to render JavaScript for SPAs when the content comes back empty.actions— drive a real browser (click, scroll, type, wait) before capturing the page. See below.
To send a direct POST, PUT or PATCH (with a body), use web_access_request — this tool's direct HTTP path only issues GETs. Plenty of those calls are reads: a GraphQL query, a search backend that takes a body, a JSON API that refuses GET.
headers— forward custom request headers; not combinable withexecuteJSoractions, which run in a browser.countryCode— ISO 3166-1 alpha-2 (e.g. "US") to route through a proxy in that country.solveCaptcha— defaults true; set false to fail fast instead of spending effort solving a challenge.
Returns: Markdown by default; the verbatim body or a JSON envelope when format is set accordingly.
actions — driving the page instead of just loading it
An actions sequence runs in a real browser session and returns the page as it stands after the last step. Use it when the content you need does not exist in the document until something happens to the page: a click past a consent gate, a search form submitted, a "load more" button, a tab or accordion opened, or rows that only render once scrolled into view.
Actions can modify destination data or submit a form, so clients should treat any call to this tool as potentially destructive.
Escalate in this order — each step takes longer than the last, and steps 2 and 3 bill at the browser rate:
Plain
url— always try this first.executeJS: true— the page renders client-side but needs no interaction.actions— the content requires interaction. Takes tens of seconds and holds a browser session.
If the data is still absent after all three, it is likely never in the HTML at all — look for the JSON API the page itself calls and fetch that endpoint directly, which is faster and returns exact values.
Steps (max 50 per request; at most one screenshot):
{"type": "wait", "selector": ".price", "timeout": 20000}— wait until the selector appears, then continue immediately. Prefer this over a fixed pause.{"type": "wait", "milliseconds": 3000}— fixed pause. Max 30000ms, as istimeoutabove.{"type": "click", "selector": "#accept", "all": false}—all: trueclicks every match.{"type": "write", "text": "..."}— types into the focused element; click it first.{"type": "press", "key": "Enter"}{"type": "scroll", "direction": "down", "amount": 1000, "selector": "..."}—selectorscrolls that element instead of the page.{"type": "hover", "selector": "..."}{"type": "selectOption", "selector": "select#size", "value": "L"}—valuemay be an array.{"type": "navigate", "url": "https://..."}— go to another page mid-session, keeping cookies and state.{"type": "screenshot", "full_page": true, "quality": 80}
The session opens on url before your first step, so never begin with a navigate to that same URL.
Examples
Dismiss a cookie banner, then read the page:
{ "url": "https://example.com/pricing", "actions": [
{ "type": "click", "selector": "#accept-cookies" },
{ "type": "wait", "selector": "main .plan", "timeout": 15000 }
] }Run a search the site offers no URL for:
{ "url": "https://example.com", "actions": [
{ "type": "click", "selector": "input[name=q]" },
{ "type": "write", "text": "standing desk" },
{ "type": "press", "key": "Enter" },
{ "type": "wait", "selector": ".results .item", "timeout": 20000 }
] }Fill in rows that render only as they scroll into view:
{ "url": "https://example.com/listings", "actions": [
{ "type": "wait", "selector": ".card", "timeout": 20000 },
{ "type": "scroll", "direction": "down" },
{ "type": "wait", "milliseconds": 1500 },
{ "type": "scroll", "direction": "down" },
{ "type": "wait", "milliseconds": 1500 }
] }Returns with actions: a JSON object — data (the final page, Markdown by default), finalUrl, statusCode, and screenshot when the sequence took one. If a step fails, the call still succeeds and returns error plus failedActionIndex, a 0-based index into your actions array, with data holding the page as it stood at that point — read it to see what the page actually showed, then fix that step's selector.
Not combinable with headers or format: "raw"; a browser session is always a GET.
Requests must comply with destination policy, robots directives, rate limits, and access controls. Challenge handling is subject to the caller's String account and organization policy.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The full URL of the webpage to fetch. Must be a valid HTTP/HTTPS URL. | |
| format | No | Output format: 'markdown' for clean LLM-optimized text (recommended), 'raw' for the destination's verbatim body, 'json' for a { statusCode, headers, data } envelope. | |
| actions | No | Browser actions to run in order before the page is captured, for content that only appears after interaction. Max 50, at most one screenshot. Not combinable with headers, format 'raw' or solveCaptcha false. | |
| headers | No | Custom request headers to forward (max 50). Not combinable with executeJS or actions. | |
| executeJS | No | Enable JavaScript rendering for SPAs and dynamic content. Set to true if content appears empty or incomplete. | |
| countryCode | No | ISO 3166-1 alpha-2 country code for geolocated proxy routing, e.g. 'US'. | |
| solveCaptcha | No | Whether to attempt captcha solving. Defaults to true server-side; set false to fail fast on challenges. |
Output Schema
| Name | Required | Description |
|---|---|---|
| body | Yes | |
| error | No | Set when a browser action step failed. The call still succeeds, and body holds the page as it stood when the step failed. |
| headers | Yes | |
| finalUrl | No | |
| screenshot | No | |
| statusCode | Yes | |
| failedActionIndex | No | 0-based index into the request's actions array identifying the step that failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: browser-rate billing, session duration (tens of seconds), max 50 actions / one screenshot, 30000ms caps, failure semantics (call still succeeds, returns error + failedActionIndex with partial data), incompatibility matrix (headers, format raw, solveCaptcha false), and that action sequences can mutate destination state — consistent with destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary use and well-structured with bold headers, inline JSON examples and bullet lists proportional to a 7-parameter nested tool. It loses a point for some redundancy — `format` and the action-return shape are described twice (optional parameters block and Returns block).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, open-world, nested-schema tool, nothing essential is missing: invocation shape, escalation strategy, per-action contract, failure handling, and the policy/robots caveat are all covered. An output schema exists, yet the action-mode return shape is still explained where it matters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds substantial meaning on top: when to pick each format, when executeJS is warranted vs. actions, per-action semantics with examples, and the non-combinability rules between headers, executeJS and actions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Fetch a caller-specified HTTP(S) URL") and names the output ("clean, LLM-ready Markdown"). It also explicitly disambiguates against siblings: web_access_search for searching without a URL, web_access_request for POST/PUT/PATCH bodies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the common case (pass only url), a "Best for" and a "Not for" section, and a three-step escalation ladder (plain url → executeJS → actions) with cost/latency guidance. It even tells the agent what to do if all three fail (find the underlying JSON API).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_access_requestSend a web requestADestructiveInspect
Send a POST, PUT or PATCH request to any URL, through String's Web Access API. It works like web_access_fetch, but for calls that submit data rather than read a page — a JSON API that only accepts POST, a GraphQL endpoint, a search backend that takes a body.
Use web_access_fetch instead whenever you only need to read a page. This tool sends a body to the destination rather than reading it, so use it only for a request the user actually asked for.
Usage Example:
{
"url": "https://api.example.com/search",
"method": "POST",
"body": { "q": "widgets" }
}Returns: The destination's response, in the requested format.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The full URL to send the request to. Must be a valid HTTP/HTTPS URL. | |
| body | No | Request body. A string is sent as-is; an object is JSON-stringified. | |
| format | No | Output format: 'markdown' for clean LLM-optimized text, 'raw' for the destination's verbatim body, 'json' for a { statusCode, headers, data } envelope (default). | |
| method | Yes | HTTP method: POST, PUT or PATCH. GET is not accepted here — use web_access_fetch to read a page. | |
| headers | No | Custom request headers to forward (max 50). | |
| countryCode | No | ISO 3166-1 alpha-2 country code for geolocated proxy routing, e.g. 'US'. | |
| solveCaptcha | No | Whether to attempt captcha solving. Defaults to true server-side; set false to fail fast on challenges. |
Output Schema
| Name | Required | Description |
|---|---|---|
| body | Yes | |
| error | No | Set when a browser action step failed. The call still succeeds, and body holds the page as it stood when the step failed. |
| headers | Yes | |
| finalUrl | No | |
| screenshot | No | |
| statusCode | Yes | |
| failedActionIndex | No | 0-based index into the request's actions array identifying the step that failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true, so the safety profile is covered. The description adds the reason it is a write ('sends a body to the destination rather than reading it') and a caution about only acting on user-requested calls, which gives useful context beyond the flags. It does not discuss auth requirements or rate limits, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and the alternative-tool routing are front-loaded in the first two sentences, with example and return note following. Every block earns its place and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not required, and the description still sketches the response shape. Combined with full param coverage and annotations, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, and the parameters are fully self-documenting. The description adds a concrete usage example showing how url, method and a JSON body combine, which is modestly useful gloss on top of the schema rather than a restatement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Send a POST, PUT or PATCH request to any URL'), names the API it routes through, and explicitly contrasts itself with the sibling web_access_fetch. An agent can distinguish it from web_access_search and web_access_sitemap immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not rule ('Use web_access_fetch instead whenever you only need to read a page') and a gating condition ('use it only for a request the user actually asked for'). The alternative and the condition that selects it are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_access_searchSearch the webARead-onlyInspect
Search the public web for a caller-specified query and get ranked organic results back, plus whatever Google rendered around them: knowledge panel, AI overview, People also ask, local pack, videos, discussions. Google's images, videos, shopping, books, places and forums tabs are searched with searchType.
Primary use: pass a query string. There is no engine or domain-filter parameter; any other key is rejected before the call.
{ "query": "site:arxiv.org retrieval augmented generation" }Optional targeting fields: country — ISO 3166-1 alpha-2 code the search runs from, e.g. GB (default US); language — results language tag such as en or pt-br.
{ "query": "plumbers", "country": "GB", "language": "en" }To search from a place, send location, a place name such as London or Austin,Texas,United States (1 to 200 characters), or coordinates, { latitude, longitude, radius } with radius in meters (default 5000). The search is sent from that place's country; if both are sent, coordinates win. A name that cannot be placed fails, so send coordinates instead. On the results page the place biases results toward it. The effect is strongest for queries like plumbers near me, and it is not exact city targeting: a bare query such as coffee shops may still return results from a wider area.
{ "query": "plumbers near me", "location": "Austin,Texas,United States" }Optional request field: searchCount — how many organic results you want, an integer from 1 to 300 (above 300 is rejected). Google is paged, up to 36 pages, until that many are in hand; each page is billed as one search. Many queries run out before 300: Google often has 100-200 results for a query, and you get what it has, with paging.complete: true and paging.stoppedBy: "end_of_results". Omit it for one page, about 10 results, and the response then carries no paging. Not with format: "raw", which returns one page per call.
{ "query": "construction consulting firms Ohio", "searchCount": 30 }Optional Google field: searchType — the Google tab to search: "web" (the default, the ordinary results page), "images", "videos", "shopping", "books", "places" or "forums". There is no news tab. Each page fetched is billed as one search, as on the web.
videos,books,forumsanswerresults, paged like the web; each video carriesvideo(channel,platform,duration) and each bookbook(authors,published).imagesanswersimages, about 100 a page, each withtitle,url(the page it is on),source,imageUrl(the file),imageWidth,imageHeightandthumbnail. It has 3 pages;searchCountup to 300 collects across them, usually about 270 images.shoppinganswersproducts, the one page of about 55 product cards:title,productId,priceandoriginalPriceas shown,merchantandmoreMerchants,delivery,returns,rating,reviews. A card has nourl. Google does not page this tab, sopagemust be 1.placesanswersplaces, 20 businesses a page, paged like the web up to page 15.resultsis empty for images, shopping and places.dateRange,sortByandverbatimapply to web, videos and forums only;format: "raw"andaiOverviewto web only.
{ "query": "eames lounge chair", "searchType": "images", "searchCount": 150 }Optional Google filters: safeSearch — true removes explicit results; includeOmittedResults — true includes the results Google hides as very similar to ones shown; autocorrect — false searches the query exactly as typed instead of Google's correction; restrictCountry — a two-letter code — keeps only pages from that country (unlike country, which sets where the search runs from); verbatim — true matches the words exactly, without synonyms. None combines with aiMode.
{ "query": "climate policy", "restrictCountry": "FR", "safeSearch": true }Optional Google fields: page, dateRange and sortBy apply to Google results only; none of them combines with aiMode.
page— the results page to start from, an integer from 1 to 30 (default 1), where page N is the page Google shows as N. WithoutsearchCountthe response is that one page; with it,searchCountresults are collected starting from that page.pageandsearchCounttogether stay within the first 300 results: (page - 1) × 10 + (searchCount, or 10 without it) must be at most 300. A page past Google's last result returns no results withzeroResults: true. Pages hold 8-10 results, so separatepagecalls can repeat or skip a result; for one list without repeats, send one call withsearchCount.dateRange— limit results to a publication window: one of"hour","day","week","month"or"year"for the past hour through the past year, or{ "from": "2024-01-01", "to": "2024-06-30" }for a custom range of ISO dates (YYYY-MM-DD), inclusive. Either end is optional but at least one is required, andfrommust not be afterto.sortBy—"relevance"(the default) or"date"for the newest results first.
{ "query": "heat pump grants", "page": 2, "dateRange": "month", "sortBy": "date" }Optional Google field: format — "structured" (the default, recommended) for the parsed results above as JSON, or "raw" for the Google results page as HTML, one page per call. The response is then html, htmlBytes and htmlTruncated in place of results and the surfaces. This tool sends at most 60,000 bytes of markup per call and sets htmlTruncated: true when it cuts the page; for the whole page, call the HTTP API's POST /v1/search with format: "raw". Raw supports page only, not searchCount: a raw call with searchCount is rejected (the API answers 400), so ask for page N with page and send one call per page, each billed as one search. dateRange and sortBy work with raw. Not combinable with aiMode.
{ "query": "heat pump grants", "format": "raw" }Optional request field: aiMode: true — ask Google AI Mode instead of the results page. The response is aiMode, one generated answer with the pages it cites and any products, places and videos it shows, and results is empty. Billed as one search. It cannot be combined with searchCount. If an AI Mode answer isn't available for the query, the call fails instead of returning a results page; retry, or search without it.
{ "query": "how does a heat pump work", "aiMode": true }With aiMode, location or coordinates sets the place the answer is given for; the answer stays in language. Without either, a question that depends on where you are, such as today's weather, may be answered without a location.
{ "query": "best bakeries nearby", "aiMode": true, "coordinates": { "latitude": 48.8566, "longitude": 2.3522 } }Optional request field: aiOverview: true — fill the AI Overview Google streams in after the results page loads. It makes a second, sequential fetch and adds latency: about 64% of results pages carry a streamed overview, and filling it adds about 2.8 s at p50 and 5.6 s at p90. A request with aiOverview: true costs 2x a normal search. Off by default: without it, an overview already present in the page is still returned, and a streamed one comes back as declined: true. Not combinable with aiMode.
{ "query": "best cushioned marathon shoes", "aiOverview": true }Best for: a request that names no URL, or one that needs sources found before anything is read. Not for: a URL you already have — use web_access_fetch instead.
Query operators: quoted phrases and site: pass through to the search engine, so site:example.com pricing keeps results on that host. Other operators are untested — do not rely on them.
Returns: results, the ranked web documents, each with position (its place in this response, from 1), rank (its absolute Google rank, so page 3 starts at 21; Google only), title, url (the link to fetch; absent when Google hid the destination, and the result is still returned), snippet, displayUrl (Google's displayed URL line, empty when Google shows none, as on Reddit and YouTube results), displayText (the source line Google shows under the title, verbatim: a URL, engagement counts such as 20+ comments · 3 months ago, or other text), source when Google names the site (such as Reddit · r/buildapc), and timestamp when the engine dates it; and zeroResults, true when the engine itself reported no match (broaden the query; retrying will not help). Every other field is a surface Google rendered around the documents, present only when the page carried it, never merged into results, and only Google returns them:
entity— the knowledge panel for the one business or person the query named:title,subtitle,descriptionwith itsdescriptionSource,rating,reviews,website, labelledattributes(address, phone, hours…), socialprofiles, andunreadmodule ids the read skipped. Often the whole answer for a query naming a single business, withresultsempty.places— local-pack business listings:name,category,rating,reviews,address,phone,hours,url,mapsUrl. Also often answers a business query withresultsempty, so readentityandplacesbefore treating an emptyresultsas no answer. WithsearchType: "places"it is the whole answer.products— only withsearchType: "shopping", the product cards described above.overviews— Google's AI overviews. The first entry with notopicis the query's own summary; entries with atopicandquestionare the "Things to know" tabs; an entry withdeclined: trueis a frame Google rendered and did not fill, which includes an overview Google streams in whenaiOverviewwas not set. Each carriestext(paragraphs and-list items on their own lines) andsources, the cited pages as{ title, url }— fetch those to verify a claim.peopleAlsoAsk—{ question }entries; answers are not on the page.relatedSearches— query strings Google suggests.answers— one single-purpose widget underlocalTime,currency,unitConversion,weather,translation,sportsorflights.spelling—{ kind, query, asked }:substitutedmeans the results are for the correctedquery,suggestedmeans they are for the query as typed.ads(sponsored, withadvertiser),videosandshortVideos(platform,channel,date,duration),discussions(site,forum,comments,age,excerpt),images(source; withsearchType: "images"the whole answer, with the image file too),sitelinks(resultPositionof the result they sit under). Every entry haspositionandtitle, andurlwhen its destination is known.aiMode— only withaiMode: true: Google's AI Mode answer.textis plain text (one block per line, list items as-, table rows with cells joined by|);markdownis the same answer as Markdown, with headings, lists, tables and code;blocksis its structure in reading order, each{ type }ofparagraph,heading(text,level),list(ordered,items),table(header,rows, one cell per column) orcode(text,language).sourcesare the cited pages as{ title, url, snippet, source }:snippetis the passage quoted,sourcethe site's name, andurlis absent when a citation could not be resolved. When the answer shows them,products(title,priceandoldPriceas displayed,merchantandmoreSellers,rating,reviews,thumbnail,productId,url),places(name,category,rating,reviews,priceLevel,status,address,description,url) andvideos(title,url,channel,duration,thumbnail). Every field buttextandsourcesis absent when empty. Fetch the sources to verify a claim.paging—{ pages, complete, stoppedBy }, only whensearchCountwas sent.pagesis how many results pages answered, each billed as one search.stoppedByis why paging stopped:search_count(the count was reached),end_of_results(Google had no more),page_cap(the 36-page depth limit; Google may have more),page_failed(a later page could not be fetched) ordeadline(the time budget ran out).completeis false only forpage_failedanddeadline, andresultsthen holds what was collected. Surfaces describe the first page only; positions run on across pages.
A snippet is not the page, and an overview is not a source. To read a result, call web_access_fetch on its url before answering from it.
Requests must comply with destination policy, rate limits, and access controls.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Google only: the results page to start from, an integer from 1 to 30 (default 1), where page N is the page Google shows as N. Without searchCount the response is that one page; with it, searchCount results are collected starting from that page. page and searchCount together stay within the first 300 results: (page-1)*10 + (searchCount, or 10) must be at most 300. A page past the last result returns zeroResults true. Pages hold 8-10 results, so separate page calls can repeat or skip a result; use one call with searchCount for a list without repeats. Not combinable with aiMode. | |
| query | Yes | The search query. Be specific and descriptive for best results. | |
| aiMode | No | Answer from Google AI Mode instead of the results page: the response carries aiMode (the answer as text, Markdown and structured blocks, its cited sources, and any products, places and videos it shows) and no results. Billed as one search; not combinable with searchCount. | |
| format | No | Google only: 'structured' (the default) for parsed results, or 'raw' for html: the Google results page as HTML, one page per call. The tool sends at most 60,000 bytes of markup per call and sets htmlTruncated when it cuts the page. Raw supports page only: searchCount is rejected with raw, so send one call per page. dateRange and sortBy work with raw. Web only; not combinable with aiMode. | |
| sortBy | No | Google only: 'relevance' (the default) or 'date' for the newest results first. Not combinable with aiMode. | |
| country | No | ISO 3166-1 alpha-2 country code the search runs from, e.g. 'GB'. Defaults to US. | |
| language | No | Results language tag: two letters, optionally a two-letter region, e.g. 'en' or 'pt-br'. | |
| location | No | A place name such as 'London' or 'Austin,Texas,United States', 1 to 200 characters; the search is sent from its country. Google results are biased toward the place, most strongly for 'near me' queries, and may still cover a wider area; with aiMode the answer is given for that place. A name that cannot be placed is rejected, so send coordinates instead. coordinates win when both are sent. | |
| verbatim | No | Google only: true matches the query's words exactly, without synonyms or stemming. Web, videos and forums only; not combinable with aiMode. | |
| dateRange | No | Google only: limit results to a publication window. One of 'hour', 'day', 'week', 'month' or 'year' for the past hour through the past year, or {from, to} for a custom range of ISO dates (YYYY-MM-DD), inclusive; either end is optional but at least one is required, and from must not be after to. Not combinable with aiMode. | |
| aiOverview | No | Fill the AI Overview Google streams in after the results page loads. A second, sequential fetch: about 64% of pages carry one, and filling it adds about 2.8 s at p50 and 5.6 s at p90. Costs 2x a normal search. Off by default; an overview already on the page is returned without it. Not combinable with aiMode. | |
| safeSearch | No | Google only: true removes explicit results (SafeSearch). Not combinable with aiMode. | |
| searchType | No | Google only: the tab to search. 'web' (the default) is the results page; 'videos', 'books' and 'forums' answer results; 'images' answers images (3 pages of about 100); 'shopping' answers products (one page of about 55, so page must be 1); 'places' answers places (20 a page). No news tab. Not combinable with aiMode. | |
| autocorrect | No | Google only: false searches the query exactly as typed rather than Google's corrected spelling. On by default. Not combinable with aiMode. | |
| coordinates | No | A point to search from, sent from the country it lies in. Google results are biased toward it, most strongly for 'near me' queries; with aiMode the answer is given for it. Wins over location when both are sent. | |
| searchCount | No | Organic results wanted, an integer from 1 to 300; above 300 is rejected. Google is paged, up to 36 pages, until that many are in hand or it has no more, and each page is billed as one search. Omit for one page (about 10 results). Not with format raw, which returns one page per call; use page there. | |
| restrictCountry | No | Google only: keep only results from pages in this country, a two-letter ISO code such as 'FR'. Unlike country, it does not change where the search runs from. Not combinable with aiMode. | |
| includeOmittedResults | No | Google only: true includes the results Google omits as very similar to ones already shown. Not combinable with aiMode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ads | No | Sponsored results, kept apart from results. |
| html | No | Only with format raw: the Google results page as HTML, in place of results and the surfaces. Cut at a tag boundary when htmlTruncated is true. |
| aiMode | No | Google's AI Mode answer, only when aiMode was requested: text (plain), markdown, and blocks (paragraph, heading, list, table, code) in reading order; sources it cites, each with title, url (absent when the citation could not be resolved), snippet and source (the site's name); and products, places and videos when the answer shows them. Fields other than text and sources are absent when empty. |
| entity | No | The knowledge panel for the one business or person the query named. |
| images | No | Source pages of the Images block; with searchType images, the whole answer, each with imageUrl, imageWidth, imageHeight and thumbnail too. |
| paging | No | How a searchCount request was filled: pages that answered (each billed as one search); stoppedBy, why paging stopped (search_count, end_of_results, page_cap, page_failed or deadline); and complete, false only for page_failed and deadline, when results holds what was collected. Absent unless searchCount was sent. |
| places | No | Business listings from a local pack. |
| videos | No | Entries of the Videos block. |
| answers | No | Single-purpose widgets: local time, currency, unit conversion, weather, translation, sports, flights. |
| results | Yes | Ranked web documents, in engine order. Empty when the page carried no documents, and on a format raw search, which answers html instead. |
| products | No | Only with searchType shopping: the product cards, each with title, productId, price, originalPrice, merchant, moreMerchants, delivery, returns, rating and reviews; no url. |
| spelling | No | Google's correction of the query: substituted when results are for the corrected query, suggested when they are for the query as typed. |
| htmlBytes | No | Only with format raw: UTF-8 bytes of the whole page the API returned. |
| overviews | No | Google's AI overviews: the query's own first (no topic), then the Things to know tabs (topic and question); declined marks a frame Google did not fill. Each has text and the cited sources. |
| sitelinks | No | Sub-pages listed under a navigational result. |
| discussions | No | Threads from Discussions and forums. |
| shortVideos | No | Entries of the Short videos block. |
| zeroResults | Yes | True when the engine itself reported that nothing matched the query; broaden it rather than retry. |
| htmlTruncated | No | Only with format raw: true when html stops short of the page because the tool sends at most 60,000 bytes of markup per call. The HTTP API's format raw returns the whole page. |
| peopleAlsoAsk | No | Questions from the People also ask block; answers are not on the page. |
| relatedSearches | No | Query strings from the Related searches block. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, openWorld, non-destructive, non-idempotent), so the description carries real weight: billing semantics (each page billed as one search, aiOverview at 2x cost), latency figures (2.8s p50 / 5.6s p90), truncation behavior (60,000 bytes, htmlTruncated), hard failure modes (aiMode unavailable fails rather than falling back), and paging stop reasons ('page_failed', 'deadline', 'page_cap'). No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a very long description, but it is front-loaded and strongly segmented with bold headers ('Primary use', 'Optional targeting fields', 'Best for', 'Not for', 'Returns') and inline JSON examples, so an agent can skim to the relevant block. The 'Returns' section restates much of what the existing output schema already carries, which is the main source of excess length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter tool spanning seven search tabs and many optional result surfaces, the description covers query construction (which operators pass through), targeting, filtering, paging/billing, cost, failure behavior, and the crucial caveat that snippets and AI overviews are not sources to answer from. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so a baseline of 3 is warranted since the schema itself documents all 18 parameters. The description still adds value beyond the schema by spelling out cross-parameter interactions and precedence — coordinates win over location, (page-1)*10 + searchCount must stay within 300, searchCount is rejected with format raw — plus worked JSON examples for the common combinations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Search the public web for a caller-specified query and get ranked organic results back', and enumerates the surfaces returned. It explicitly distinguishes itself from the sibling it is most likely to be confused with: 'Not for: a URL you already have — use web_access_fetch instead.' An agent can route between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'Best for' and 'Not for' sections naming web_access_fetch as the alternative, and layers per-parameter when-to-use rules on top (when to send searchCount vs page, when location/coordinates apply, which filters are mutually exclusive with aiMode). Coverage of when and when-not is unusually complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_access_sitemapMap a site's URLsADestructiveInspect
Manage an asynchronous crawl of authorized public pages on one website. Starting from one URL, the crawler follows same-domain links breadth-first and can also seed from the site's /sitemap.xml. Requests must comply with destination policy, robots directives, rate limits, and access controls.
Use this tool to discover pages for site audits, authorized retrieval worklists, or coverage checks before fetching individual pages. Not for: reading one page's content (use web_access_fetch) or open-ended web queries (use web_access_search).
This single tool drives the whole job lifecycle through action:
1. submit — quote a crawl (nothing is crawled or billed yet). Requires url. Optional: maxPages (1–10000, default 10), maxDepth (1–100, default 2), pathPrefix (only crawl URLs whose path starts with this, e.g. "/docs"), budgetUsd (spend ceiling; the crawl stops with status token_cap_exceeded if it would exceed it), useSitemap (also seed the site's root /sitemap.xml — one extra billed page, but finds pages links miss). A maxPages or maxDepth outside its range, 0 included, is rejected rather than replaced by the default — omit the field to get the default. Returns jobId, estimatedPages, and estimatedCostUsd with status awaiting_approval.
{ "action": "submit", "url": "https://example.com", "maxPages": 200, "maxDepth": 3 }2. approve — start the quoted crawl (requires jobId). This is the billing-consent step: pages are billed as they are fetched, capped by the quote/budget. Before approving a non-trivial estimatedCostUsd, confirm the spend with your user. Fails with status 402 if the account balance cannot cover the quote; a 409 partial_state error means an earlier approve was interrupted — just call approve again.
3. status — poll progress (requires jobId). Statuses: awaiting_approval → running → terminal completed | failed | canceled | token_cap_exceeded (budget hit before maxPages; collected results are still readable). While running it returns pending and processed counts; a partial_state status means an interrupted approve — call approve again to repair it. Status never includes the URL list — page that with results. Poll every few seconds for small crawls; give hundreds-of-pages crawls tens of seconds between polls.
4. results — page through discovered URLs (requires jobId). Optional limit (1–5000, default 1000) and offset (≥ 0); out-of-range values are rejected. total tells you when to stop paging. Each entry has url, statusCode (0 = discovered but not fetched), depth, parentUrl, isSitemap, sourceType, and an error when that page failed. discoveredUrls (links found on the page) is only present for ~1h after completion; afterwards results come from durable storage which omits it — everything else stays available.
5. cancel — stop a running or pending job (requires jobId). Already-terminal jobs return a 409 error. Pages already fetched stay billed and readable via results.
6. list — recent crawl jobs for the account. Optional limit (1–100, default 20) and offset (≥ 0); out-of-range values are rejected. Use it to find a jobId you lost or check for an equivalent recent crawl before paying for a new one.
Typical workflow: submit → check estimatedCostUsd → approve → poll status until terminal → results (paged). A 404 on any jobId action means the job doesn't exist or belongs to another account; a 403 on submit means the target domain is blocked for this account (contact support@usestring.ai).
Returns: the JSON envelope for the chosen action (quote, status, URL page, job list) alongside a one-line summary.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | submit only (required there): the full http(s) URL to start crawling from. The crawl stays on this URL's domain. | |
| jobId | No | The job id returned by submit. Required for approve, status, results, and cancel. | |
| limit | No | results/list only: page size. results 1-5000 (default 1000); list 1-100 (default 20). 0 or any value outside the range is rejected. | |
| action | Yes | Lifecycle action to perform: 'submit' (quote a new crawl), 'approve' (start a quoted crawl — billing consent), 'status' (poll progress), 'results' (page through discovered URLs), 'cancel' (stop a job), or 'list' (recent jobs). | |
| offset | No | results/list only: number of rows to skip for pagination (0 or more). | |
| maxDepth | No | submit only: maximum link depth from the start URL, 1-100 (server default 2 when omitted; 0 or any value outside the range is rejected). | |
| maxPages | No | submit only: maximum pages to fetch, 1-10000 (server default 10 when omitted; 0 or any value outside the range is rejected). Each fetched page is billed. | |
| budgetUsd | No | submit only: spend ceiling in USD (min 0.0001). The crawl finalizes as token_cap_exceeded when it would exceed this; omit to let the approved quote be the cap. | |
| pathPrefix | No | submit only: restrict the crawl to URLs whose path starts with this prefix, e.g. '/docs'. | |
| useSitemap | No | submit only: also seed the crawl from the site's root /sitemap.xml (one extra billed page; finds pages that internal links miss). |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | |
| urls | No | |
| jobId | No | |
| total | No | |
| status | No | |
| pending | No | |
| processed | No | |
| finishedAt | No | |
| errorMessage | No | |
| estimatedPages | No | |
| pagesProcessed | No | |
| estimatedCostUsd | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations: billing-consent semantics of approve, per-page billing, 402/403/404/409 error meanings, the partial_state repair path, token_cap_exceeded budget behavior, the ~1h TTL on discoveredUrls, and the fact that canceled pages stay billed. The destructiveHint/openWorldHint annotations are generic; this text supplies the operational reality.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but front-loaded and rigorously structured: purpose, exclusions, then a numbered lifecycle with embedded examples. Every section maps to a distinct action, so little is wasted, though the trailing 'Returns:' sentence is largely redundant given the output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, six-action, billable, asynchronous tool with an output schema, this leaves nothing essential unstated: state machine, error codes, pagination termination, budget exhaustion, and result durability are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning: out-of-range maxPages/maxDepth are rejected rather than silently defaulted, useSitemap costs one extra billed page, and limit/offset bounds differ per action. Billing implications of maxPages and the budgetUsd cap relationship are not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Manage an asynchronous crawl of authorized public pages on one website') and immediately names what it is not for, routing the agent to web_access_fetch and web_access_search by name. An agent can distinguish this from all three siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists when to use it (site audits, retrieval worklists, coverage checks before fetching pages), when not (single-page reads, open-ended queries) with the correct alternative named. It even supplies the canonical workflow (submit → check estimate → approve → poll → results) and the decision rule for choosing between actions.
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.
4 tool updates
- Changed
web_access_fetch10 fields changed- changed
Input schema / properties / actions / descriptionPrevious value: -"Browser actions to run in order before the page is captured, for content that only appears after interaction. Max 50, at most one screenshot. Not combinable with method, body, headers, or format 'raw'."New value: +"Browser actions to run in order before the page is captured, for content that only appears after interaction. Max 50, at most one screenshot. Not combinable with headers, format 'raw' or solveCaptcha false." - removed
Input schema / properties / bodyRemoved value: -{ - "description": "Request body for POST/PUT/PATCH. A string is sent as-is; an object is JSON-stringified. Not allowed for GET." -} - changed
Input schema / properties / executeJS / descriptionPrevious value: -"Enable JavaScript rendering for SPAs and dynamic content. Set to true if content appears empty or incomplete. Cannot be combined with custom headers."New value: +"Enable JavaScript rendering for SPAs and dynamic content. Set to true if content appears empty or incomplete." - changed
Input schema / properties / format / descriptionPrevious value: -"Output format: 'markdown' for clean LLM-optimized text (recommended), 'raw' for the verbatim upstream body, 'json' for a { statusCode, headers, data } envelope."New value: +"Output format: 'markdown' for clean LLM-optimized text (recommended), 'raw' for the destination's verbatim body, 'json' for a { statusCode, headers, data } envelope." - changed
Input schema / properties / headers / descriptionPrevious value: -"Custom request headers to forward (max 50). Not supported when executeJS is enabled."New value: +"Custom request headers to forward (max 50). Not combinable with executeJS or actions." - removed
Input schema / properties / methodRemoved value: -{ - "description": "HTTP method for the request (GET/POST/PUT/PATCH), defaults to GET. Use POST/PUT/PATCH to send a body.", - "type": "string" -} - removed
Output schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / error / descriptionAdded value: +"Set when a browser action step failed. The call still succeeds, and body holds the page as it stood when the step failed." - added
Output schema / properties / failedActionIndex / descriptionAdded value: +"0-based index into the request's actions array identifying the step that failed." - removed
Output schema / properties / screenshot / additionalPropertiesRemoved value: -false
- Added
web_access_request - Changed
web_access_search47 fields changed- added
Input schema / properties / aiModeAdded value: +{ + "description": "Answer from Google AI Mode instead of the results page: the response carries aiMode (the answer as text, Markdown and structured blocks, its cited sources, and any products, places and videos it shows) and no results. Billed as one search; not combinable with searchCount.", + "type": "boolean" +} - added
Input schema / properties / aiOverviewAdded value: +{ + "description": "Fill the AI Overview Google streams in after the results page loads. A second, sequential fetch: about 64% of pages carry one, and filling it adds about 2.8 s at p50 and 5.6 s at p90. Costs 2x a normal search. Off by default; an overview already on the page is returned without it. Not combinable with aiMode.", + "type": "boolean" +} - added
Input schema / properties / autocorrectAdded value: +{ + "description": "Google only: false searches the query exactly as typed rather than Google's corrected spelling. On by default. Not combinable with aiMode.", + "type": "boolean" +} - added
Input schema / properties / coordinatesAdded value: +{ + "additionalProperties": false, + "description": "A point to search from, sent from the country it lies in. Google results are biased toward it, most strongly for 'near me' queries; with aiMode the answer is given for it. Wins over location when both are sent.", + "properties": { + "latitude": { + "description": "Latitude in decimal degrees, -90 to 90.", + "type": "number" + }, + "longitude": { + "description": "Longitude in decimal degrees, -180 to 180.", + "type": "number" + }, + "radius": { + "description": "How precise the point is, in meters: a whole number from 1 to 1000000. Omit for 5000.", + "type": "integer" + } + }, + "required": [ + "latitude", + "longitude" + ], + "type": [ + "null", + "object" + ] +} - added
Input schema / properties / countryAdded value: +{ + "description": "ISO 3166-1 alpha-2 country code the search runs from, e.g. 'GB'. Defaults to US.", + "type": "string" +} - added
Input schema / properties / dateRangeAdded value: +{ + "anyOf": [ + { + "enum": [ + "hour", + "day", + "week", + "month", + "year" + ], + "type": "string" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "from": { + "description": "First day of the range, inclusive, YYYY-MM-DD.", + "format": "date", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "to": { + "description": "Last day of the range, inclusive, YYYY-MM-DD.", + "format": "date", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "type": "object" + } + ], + "description": "Google only: limit results to a publication window. One of 'hour', 'day', 'week', 'month' or 'year' for the past hour through the past year, or {from, to} for a custom range of ISO dates (YYYY-MM-DD), inclusive; either end is optional but at least one is required, and from must not be after to. Not combinable with aiMode.", + "type": [ + "string", + "object" + ] +} - added
Input schema / properties / formatAdded value: +{ + "description": "Google only: 'structured' (the default) for parsed results, or 'raw' for html: the Google results page as HTML, one page per call. The tool sends at most 60,000 bytes of markup per call and sets htmlTruncated when it cuts the page. Raw supports page only: searchCount is rejected with raw, so send one call per page. dateRange and sortBy work with raw. Web only; not combinable with aiMode.", + "enum": [ + "structured", + "raw" + ], + "type": "string" +} - added
Input schema / properties / includeOmittedResultsAdded value: +{ + "description": "Google only: true includes the results Google omits as very similar to ones already shown. Not combinable with aiMode.", + "type": "boolean" +} - added
Input schema / properties / languageAdded value: +{ + "description": "Results language tag: two letters, optionally a two-letter region, e.g. 'en' or 'pt-br'.", + "type": "string" +} - added
Input schema / properties / locationAdded value: +{ + "description": "A place name such as 'London' or 'Austin,Texas,United States', 1 to 200 characters; the search is sent from its country. Google results are biased toward the place, most strongly for 'near me' queries, and may still cover a wider area; with aiMode the answer is given for that place. A name that cannot be placed is rejected, so send coordinates instead. coordinates win when both are sent.", + "type": "string" +} - added
Input schema / properties / pageAdded value: +{ + "description": "Google only: the results page to start from, an integer from 1 to 30 (default 1), where page N is the page Google shows as N. Without searchCount the response is that one page; with it, searchCount results are collected starting from that page. page and searchCount together stay within the first 300 results: (page-1)*10 + (searchCount, or 10) must be at most 300. A page past the last result returns zeroResults true. Pages hold 8-10 results, so separate page calls can repeat or skip a result; use one call with searchCount for a list without repeats. Not combinable with aiMode.", + "maximum": 30, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / restrictCountryAdded value: +{ + "description": "Google only: keep only results from pages in this country, a two-letter ISO code such as 'FR'. Unlike country, it does not change where the search runs from. Not combinable with aiMode.", + "pattern": "^[A-Za-z]{2}$", + "type": "string" +} - added
Input schema / properties / safeSearchAdded value: +{ + "description": "Google only: true removes explicit results (SafeSearch). Not combinable with aiMode.", + "type": "boolean" +} - added
Input schema / properties / searchCountAdded value: +{ + "description": "Organic results wanted, an integer from 1 to 300; above 300 is rejected. Google is paged, up to 36 pages, until that many are in hand or it has no more, and each page is billed as one search. Omit for one page (about 10 results). Not with format raw, which returns one page per call; use page there.", + "type": "integer" +} - added
Input schema / properties / searchTypeAdded value: +{ + "description": "Google only: the tab to search. 'web' (the default) is the results page; 'videos', 'books' and 'forums' answer results; 'images' answers images (3 pages of about 100); 'shopping' answers products (one page of about 55, so page must be 1); 'places' answers places (20 a page). No news tab. Not combinable with aiMode.", + "enum": [ + "web", + "images", + "videos", + "shopping", + "books", + "places", + "forums" + ], + "type": "string" +} - added
Input schema / properties / sortByAdded value: +{ + "description": "Google only: 'relevance' (the default) or 'date' for the newest results first. Not combinable with aiMode.", + "enum": [ + "relevance", + "date" + ], + "type": "string" +} - added
Input schema / properties / verbatimAdded value: +{ + "description": "Google only: true matches the query's words exactly, without synonyms or stemming. Web, videos and forums only; not combinable with aiMode.", + "type": "boolean" +} - removed
Output schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / adsAdded value: +{ + "description": "Sponsored results, kept apart from results.", + "items": { + "properties": { + "advertiser": { + "type": "string" + }, + "block": { + "type": "string" + }, + "displayUrl": { + "type": "string" + }, + "format": { + "type": "string" + }, + "position": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "position", + "format", + "block" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / aiModeAdded value: +{ + "description": "Google's AI Mode answer, only when aiMode was requested: text (plain), markdown, and blocks (paragraph, heading, list, table, code) in reading order; sources it cites, each with title, url (absent when the citation could not be resolved), snippet and source (the site's name); and products, places and videos when the answer shows them. Fields other than text and sources are absent when empty.", + "properties": { + "blocks": { + "items": { + "properties": { + "header": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "items": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "language": { + "type": "string" + }, + "level": { + "type": "integer" + }, + "ordered": { + "type": "boolean" + }, + "rows": { + "items": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "declined": { + "type": "boolean" + }, + "markdown": { + "type": "string" + }, + "places": { + "items": { + "properties": { + "address": { + "type": "string" + }, + "category": { + "type": "string" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "priceLevel": { + "type": "string" + }, + "rating": { + "type": "number" + }, + "reviews": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "products": { + "items": { + "properties": { + "merchant": { + "type": "string" + }, + "moreSellers": { + "type": "boolean" + }, + "oldPrice": { + "type": "string" + }, + "price": { + "type": "string" + }, + "productId": { + "type": "string" + }, + "rating": { + "type": "number" + }, + "reviews": { + "type": "integer" + }, + "thumbnail": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "question": { + "type": "string" + }, + "sources": { + "items": { + "properties": { + "snippet": { + "type": "string" + }, + "source": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": "string" + }, + "topic": { + "type": "string" + }, + "videos": { + "items": { + "properties": { + "channel": { + "type": "string" + }, + "duration": { + "type": "string" + }, + "thumbnail": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "text", + "sources" + ], + "type": [ + "null", + "object" + ] +} - added
Output schema / properties / answersAdded value: +{ + "description": "Single-purpose widgets: local time, currency, unit conversion, weather, translation, sports, flights.", + "properties": { + "currency": { + "properties": { + "amount": { + "type": "number" + }, + "asOf": { + "type": "string" + }, + "from": { + "type": "string" + }, + "fromId": { + "type": "string" + }, + "rate": { + "type": "number" + }, + "result": { + "type": "number" + }, + "source": { + "type": "string" + }, + "text": { + "type": "string" + }, + "to": { + "type": "string" + }, + "toId": { + "type": "string" + } + }, + "required": [ + "amount", + "from", + "result", + "to", + "text" + ], + "type": [ + "null", + "object" + ] + }, + "flights": { + "properties": { + "cabin": { + "type": "string" + }, + "departure": { + "type": "string" + }, + "destination": { + "type": "string" + }, + "options": { + "items": { + "properties": { + "airline": { + "type": "string" + }, + "duration": { + "type": "string" + }, + "price": { + "type": "string" + }, + "stops": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "airline" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "origin": { + "type": "string" + }, + "return": { + "type": "string" + }, + "title": { + "type": "string" + }, + "tripType": { + "type": "string" + } + }, + "required": [ + "options" + ], + "type": [ + "null", + "object" + ] + }, + "localTime": { + "properties": { + "date": { + "type": "string" + }, + "place": { + "type": "string" + }, + "time": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "required": [ + "time" + ], + "type": [ + "null", + "object" + ] + }, + "sports": { + "properties": { + "games": { + "items": { + "properties": { + "date": { + "type": "string" + }, + "note": { + "type": "string" + }, + "status": { + "type": "string" + }, + "teams": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "score": { + "type": "number" + } + }, + "required": [ + "name", + "score" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "teams" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "team": { + "type": "string" + } + }, + "required": [ + "team", + "games" + ], + "type": [ + "null", + "object" + ] + }, + "translation": { + "properties": { + "detected": { + "type": "boolean" + }, + "dictionary": { + "items": { + "properties": { + "meanings": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "partOfSpeech": { + "type": "string" + }, + "term": { + "type": "string" + } + }, + "required": [ + "term" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "source": { + "type": "string" + }, + "sourceLanguage": { + "type": "string" + }, + "sourceTransliteration": { + "type": "string" + }, + "targetLanguage": { + "type": "string" + }, + "translation": { + "type": "string" + }, + "transliteration": { + "type": "string" + } + }, + "required": [ + "sourceLanguage", + "detected", + "targetLanguage", + "source", + "translation" + ], + "type": [ + "null", + "object" + ] + }, + "unitConversion": { + "properties": { + "category": { + "type": "string" + }, + "formula": { + "type": "string" + }, + "from": { + "type": "string" + }, + "result": { + "type": "number" + }, + "to": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value", + "from", + "result", + "to" + ], + "type": [ + "null", + "object" + ] + }, + "weather": { + "properties": { + "condition": { + "type": "string" + }, + "forecast": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "day": { + "type": "string" + }, + "highC": { + "type": "number" + }, + "highF": { + "type": "number" + }, + "lowC": { + "type": "number" + }, + "lowF": { + "type": "number" + } + }, + "required": [ + "day", + "highF", + "highC", + "lowF", + "lowC" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "humidity": { + "type": "number" + }, + "location": { + "type": "string" + }, + "observed": { + "type": "string" + }, + "precipitation": { + "type": "number" + }, + "temperatureC": { + "type": "number" + }, + "temperatureF": { + "type": "number" + }, + "windKmh": { + "type": "string" + }, + "windMph": { + "type": "string" + } + }, + "required": [ + "temperatureF", + "temperatureC", + "precipitation", + "humidity", + "forecast" + ], + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] +} - added
Output schema / properties / discussionsAdded value: +{ + "description": "Threads from Discussions and forums.", + "items": { + "properties": { + "age": { + "type": "string" + }, + "comments": { + "type": "string" + }, + "excerpt": { + "type": "string" + }, + "forum": { + "type": "string" + }, + "position": { + "type": "integer" + }, + "site": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "position", + "title" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / entityAdded value: +{ + "description": "The knowledge panel for the one business or person the query named.", + "properties": { + "attributes": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "description": { + "type": "string" + }, + "descriptionSource": { + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "profiles": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "rating": { + "type": "number" + }, + "reviews": { + "type": "integer" + }, + "subtitle": { + "type": "string" + }, + "title": { + "type": "string" + }, + "unread": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "website": { + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "title", + "descriptionSource", + "website", + "attributes", + "profiles", + "unread" + ], + "type": [ + "null", + "object" + ] +} - added
Output schema / properties / htmlAdded value: +{ + "description": "Only with format raw: the Google results page as HTML, in place of results and the surfaces. Cut at a tag boundary when htmlTruncated is true.", + "type": "string" +} - added
Output schema / properties / htmlBytesAdded value: +{ + "description": "Only with format raw: UTF-8 bytes of the whole page the API returned.", + "type": [ + "null", + "integer" + ] +} - added
Output schema / properties / htmlTruncatedAdded value: +{ + "description": "Only with format raw: true when html stops short of the page because the tool sends at most 60,000 bytes of markup per call. The HTTP API's format raw returns the whole page.", + "type": [ + "null", + "boolean" + ] +} - added
Output schema / properties / imagesAdded value: +{ + "description": "Source pages of the Images block; with searchType images, the whole answer, each with imageUrl, imageWidth, imageHeight and thumbnail too.", + "items": { + "properties": { + "imageHeight": { + "type": "integer" + }, + "imageUrl": { + "type": "string" + }, + "imageWidth": { + "type": "integer" + }, + "position": { + "type": "integer" + }, + "source": { + "type": "string" + }, + "thumbnail": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "position", + "title" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / overviewsAdded value: +{ + "description": "Google's AI overviews: the query's own first (no topic), then the Things to know tabs (topic and question); declined marks a frame Google did not fill. Each has text and the cited sources.", + "items": { + "properties": { + "blocks": { + "items": { + "properties": { + "header": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "items": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "language": { + "type": "string" + }, + "level": { + "type": "integer" + }, + "ordered": { + "type": "boolean" + }, + "rows": { + "items": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "declined": { + "type": "boolean" + }, + "markdown": { + "type": "string" + }, + "places": { + "items": { + "properties": { + "address": { + "type": "string" + }, + "category": { + "type": "string" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "priceLevel": { + "type": "string" + }, + "rating": { + "type": "number" + }, + "reviews": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "products": { + "items": { + "properties": { + "merchant": { + "type": "string" + }, + "moreSellers": { + "type": "boolean" + }, + "oldPrice": { + "type": "string" + }, + "price": { + "type": "string" + }, + "productId": { + "type": "string" + }, + "rating": { + "type": "number" + }, + "reviews": { + "type": "integer" + }, + "thumbnail": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "question": { + "type": "string" + }, + "sources": { + "items": { + "properties": { + "snippet": { + "type": "string" + }, + "source": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": "string" + }, + "topic": { + "type": "string" + }, + "videos": { + "items": { + "properties": { + "channel": { + "type": "string" + }, + "duration": { + "type": "string" + }, + "thumbnail": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "text", + "sources" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / pagingAdded value: +{ + "description": "How a searchCount request was filled: pages that answered (each billed as one search); stoppedBy, why paging stopped (search_count, end_of_results, page_cap, page_failed or deadline); and complete, false only for page_failed and deadline, when results holds what was collected. Absent unless searchCount was sent.", + "properties": { + "complete": { + "type": "boolean" + }, + "pages": { + "type": "integer" + }, + "stoppedBy": { + "type": "string" + } + }, + "required": [ + "pages", + "complete" + ], + "type": [ + "null", + "object" + ] +} - added
Output schema / properties / peopleAlsoAskAdded value: +{ + "description": "Questions from the People also ask block; answers are not on the page.", + "items": { + "properties": { + "question": { + "type": "string" + } + }, + "required": [ + "question" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / placesAdded value: +{ + "description": "Business listings from a local pack.", + "items": { + "properties": { + "address": { + "type": "string" + }, + "category": { + "type": "string" + }, + "hours": { + "type": "string" + }, + "mapsUrl": { + "type": "string" + }, + "name": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "position": { + "type": "integer" + }, + "rating": { + "type": "number" + }, + "reviews": { + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "required": [ + "position", + "name" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / productsAdded value: +{ + "description": "Only with searchType shopping: the product cards, each with title, productId, price, originalPrice, merchant, moreMerchants, delivery, returns, rating and reviews; no url.", + "items": { + "properties": { + "delivery": { + "type": "string" + }, + "merchant": { + "type": "string" + }, + "moreMerchants": { + "type": "boolean" + }, + "originalPrice": { + "type": "string" + }, + "position": { + "type": "integer" + }, + "price": { + "type": "string" + }, + "productId": { + "type": "string" + }, + "rating": { + "type": "number" + }, + "returns": { + "type": "string" + }, + "reviews": { + "type": "integer" + }, + "title": { + "type": "string" + } + }, + "required": [ + "position", + "title" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / relatedSearchesAdded value: +{ + "description": "Query strings from the Related searches block.", + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / results / descriptionAdded value: +"Ranked web documents, in engine order. Empty when the page carried no documents, and on a format raw search, which answers html instead." - removed
Output schema / properties / results / items / additionalPropertiesRemoved value: -false - added
Output schema / properties / results / items / properties / bookAdded value: +{ + "properties": { + "authors": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "published": { + "type": "string" + } + }, + "type": [ + "null", + "object" + ] +} - added
Output schema / properties / results / items / properties / displayTextAdded value: +{ + "type": "string" +} - added
Output schema / properties / results / items / properties / rankAdded value: +{ + "type": "integer" +} - added
Output schema / properties / results / items / properties / sourceAdded value: +{ + "type": "string" +} - added
Output schema / properties / results / items / properties / videoAdded value: +{ + "properties": { + "channel": { + "type": "string" + }, + "duration": { + "type": "string" + }, + "platform": { + "type": "string" + } + }, + "type": [ + "null", + "object" + ] +} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "position", - "title", - "url", - "snippet", - "displayUrl" -]New value: +[ + "position", + "title", + "snippet", + "displayUrl" +] - added
Output schema / properties / shortVideosAdded value: +{ + "description": "Entries of the Short videos block.", + "items": { + "properties": { + "channel": { + "type": "string" + }, + "date": { + "type": "string" + }, + "duration": { + "type": "string" + }, + "platform": { + "type": "string" + }, + "position": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "position", + "title" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / sitelinksAdded value: +{ + "description": "Sub-pages listed under a navigational result.", + "items": { + "properties": { + "description": { + "type": "string" + }, + "position": { + "type": "integer" + }, + "resultPosition": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "position", + "resultPosition", + "title" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / spellingAdded value: +{ + "description": "Google's correction of the query: substituted when results are for the corrected query, suggested when they are for the query as typed.", + "properties": { + "asked": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "query": { + "type": "string" + } + }, + "required": [ + "kind", + "query" + ], + "type": [ + "null", + "object" + ] +} - added
Output schema / properties / videosAdded value: +{ + "description": "Entries of the Videos block.", + "items": { + "properties": { + "channel": { + "type": "string" + }, + "date": { + "type": "string" + }, + "duration": { + "type": "string" + }, + "platform": { + "type": "string" + }, + "position": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "position", + "title" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / zeroResultsAdded value: +{ + "description": "True when the engine itself reported that nothing matched the query; broaden it rather than retry.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "results" -]New value: +[ + "results", + "zeroResults" +]
- Changed
web_access_sitemap11 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"results/list only: page size. results default 1000 (max 5000); list default 20 (max 100)."New value: +"results/list only: page size. results 1-5000 (default 1000); list 1-100 (default 20). 0 or any value outside the range is rejected." - changed
Input schema / properties / limit / typePrevious value: -"integer"New value: +[ + "null", + "integer" +] - changed
Input schema / properties / maxDepth / descriptionPrevious value: -"submit only: maximum link depth from the start URL, 1-100 (server default 2)."New value: +"submit only: maximum link depth from the start URL, 1-100 (server default 2 when omitted; 0 or any value outside the range is rejected)." - changed
Input schema / properties / maxDepth / typePrevious value: -"integer"New value: +[ + "null", + "integer" +] - changed
Input schema / properties / maxPages / descriptionPrevious value: -"submit only: maximum pages to fetch, 1-10000 (server default 10). Each fetched page is billed."New value: +"submit only: maximum pages to fetch, 1-10000 (server default 10 when omitted; 0 or any value outside the range is rejected). Each fetched page is billed." - changed
Input schema / properties / maxPages / typePrevious value: -"integer"New value: +[ + "null", + "integer" +] - changed
Input schema / properties / offset / descriptionPrevious value: -"results/list only: number of rows to skip for pagination."New value: +"results/list only: number of rows to skip for pagination (0 or more)." - changed
Input schema / properties / offset / typePrevious value: -"integer"New value: +[ + "null", + "integer" +] - removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / jobs / items / additionalPropertiesRemoved value: -false - removed
Output schema / properties / urls / items / additionalPropertiesRemoved value: -false
1 tool update
- Changed
web_access_fetch5 fields changed- added
Input schema / properties / actionsAdded value: +{ + "description": "Browser actions to run in order before the page is captured, for content that only appears after interaction. Max 50, at most one screenshot. Not combinable with method, body, headers, or format 'raw'.", + "items": { + "additionalProperties": false, + "properties": { + "all": { + "description": "click: click every element matching the selector instead of the first.", + "type": [ + "null", + "boolean" + ] + }, + "amount": { + "description": "scroll: distance in pixels.", + "type": [ + "null", + "integer" + ] + }, + "direction": { + "description": "scroll: up, down, left, or right.", + "type": "string" + }, + "full_page": { + "description": "screenshot: capture the whole scrollable page rather than the viewport.", + "type": [ + "null", + "boolean" + ] + }, + "key": { + "description": "press: the key to press, e.g. 'Enter'.", + "type": "string" + }, + "milliseconds": { + "description": "wait: pause this many milliseconds (max 30000). Prefer waiting on a selector.", + "type": [ + "null", + "integer" + ] + }, + "quality": { + "description": "screenshot: JPEG quality, 1-100.", + "type": [ + "null", + "integer" + ] + }, + "selector": { + "description": "CSS selector. Required for click, hover and selectOption; on wait it waits for the element to appear; on scroll it scrolls that element instead of the page.", + "type": "string" + }, + "text": { + "description": "write: the text to type into the focused element.", + "type": "string" + }, + "timeout": { + "description": "wait with a selector: give up after this many milliseconds (max 30000).", + "type": [ + "null", + "integer" + ] + }, + "type": { + "description": "The action to run: wait, click, write, press, scroll, screenshot, navigate, hover, or selectOption.", + "type": "string" + }, + "url": { + "description": "navigate: the URL to go to, carrying the session's cookies and state.", + "type": "string" + }, + "value": { + "description": "selectOption: the option value to select, or an array of them for a multi-select." + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / errorAdded value: +{ + "type": "string" +} - added
Output schema / properties / failedActionIndexAdded value: +{ + "type": [ + "null", + "integer" + ] +} - added
Output schema / properties / finalUrlAdded value: +{ + "type": "string" +} - added
Output schema / properties / screenshotAdded value: +{ + "additionalProperties": false, + "properties": { + "base64": { + "type": "string" + }, + "format": { + "type": "string" + } + }, + "required": [ + "format", + "base64" + ], + "type": [ + "null", + "object" + ] +}
3 tool updates
- First observed
web_access_fetch - First observed
web_access_search - First observed
web_access_sitemap
Related MCP Connectors
Crawl, scrape, search the web, and automate browsers at scale with anti-bot bypass.
Cloudflare Solver: Scraping API designed to bypass Cloudflare protection.
Fetch, crawl, and browse protected pages with anti-bot handling - renders in a real browser and
Web search, browser automation, scraping, crawling and CAPTCHA solving for AI agents.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables fetching, crawling, and browsing anti-bot protected web pages with real browser rendering, returning clean JSON or markdown, and solving captchas.-
- AlicenseAqualityAmaintenanceEnables web scraping, structured data extraction, and screenshot capture with automatic anti-bot bypass, supporting JavaScript rendering, proxy rotation, and tiered pricing.26362 npm1MIT
- AlicenseBqualityDmaintenanceEnables LLMs and AI agents to access real-time web data, search websites, and navigate the web without getting blocked. Includes 5,000 free monthly requests and supports web scraping, browser automation, and bypassing geo-restrictions.6011,741 npm1MIT
- AlicenseAqualityAmaintenanceInteract with WebScraping.AI API for web data extraction and scraping961 npm45MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.