google_search
Search Google and get ad-free structured results with filters for site, filetype, date, exact phrase, and more; optionally fetch page content as markdown.
Instructions
Search Google. Ads stripped; results are {rank, title, url, host, snippet, date}.
Use the structured arguments rather than typing operators into query -- they
assemble the correct syntax for you:
site='arxiv.org' restrict to one domain filetype='pdf' only PDFs exact='model context protocol' quoted phrase, must appear verbatim exclude=['tutorial'] drop results containing a term after='2026-01-01' published after a date (before= for the other bound) freshness='week' hour | day | week | month | year verbatim=True no synonyms or stemming; the words as typed strict_dates=True apply before/after as Tools > Custom range instead of as query operators (index date rather than document date) country='de', lang='de' region and language bias personalized=False the neutral view, no account history applied
vertical selects which Google tab to read:
web the default SERP, including rich blocks
web_only the "Web" tab -- plain links, no rich blocks. Cleanest for research;
measured 17 external anchors against 56 on the default SERP.
news news, with dates
videos video results
short_videos the shorts feed
books Google Books (results are google-hosted by nature)
images the image grid; single page, title comes from alt text
date is populated where Google shows one ("2 days ago", "28 Jul 2026") and is null
otherwise. total_matches is Google's own estimate for the whole query, not the
number returned.
with_content=True also READS the top content_top_n results and attaches each as
markdown on result.content, saving a fetch round trip per link. It goes through the
same logged-in browser, so it reads JS-rendered pages and soft paywalls that a plain
HTTP fetch cannot. Costs a real page load each -- budget a few seconds per result, and
raise content_chars (default 2000) only when you actually need the whole article.
A page that could not be read sets content: null and content_error.
pages is 10 results each, max 5, and each page is a separate round trip -- ask for
depth only when you actually need it. Ignored for images.
On failure the result carries a kind field: auth_expired (sign in), schema_drift
(the extractor is stale, do not retry), rate_limited (back off). An empty result set
is NOT an error -- it returns count=0 with no kind, and means Google matched nothing.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ||
| site | No | ||
| after | No | ||
| exact | No | ||
| pages | No | ||
| query | Yes | ||
| before | No | ||
| country | No | ||
| exclude | No | ||
| filetype | No | ||
| verbatim | No | ||
| vertical | No | web | |
| freshness | No | ||
| personalized | No | ||
| strict_dates | No | ||
| with_content | No | ||
| content_chars | No | ||
| content_top_n | No |