Use search results to find pages, and take facts only from the pages. A snippet is an engine's summary of a page as it looked when it was crawled: it drops qualifiers, merges editions, and is often years old. Use this workflow whenever someone will rely on the answer.
Tool names below are the bare names on the search MCP server; your host may
show them with a prefix.
0. Fix today's date
Know today's date before judging anything as current. Take it from your system
context. Failing that, the retrieved … stamp on a fresh (uncached) search
result is the server's clock. "Latest", "this year" and "upcoming" are relative
to it. Do not infer the current year from search results or from memory.
1. Locate: search is for URLs only
search(query)finds candidate pages. Addfreshness="month"(or"day"/"week"/"year") when recency matters,include_domains=[...]once you know the official domain,category=for papers, filings, news, datasets.- Some facts have a registry, and the search asks it on its own when the
question names the thing plainly: a package ("latest fastapi version"), a
CVE id, two currencies ("100 usd to cny"), a place and a weather word, a
country and an indicator ("china gdp"), a city and a time word, a domain,
a coin, an iOS app. The record comes back as the first result with the
publisher's date, marked "Record sources", and can be cited as it is.
category=("software", "security", "weather", "finance.fx", "stats", "calendar", "reference") asks the same sources explicitly. - Pick the primary source: the organizer's, vendor's, regulator's or author's own page, the filing, the paper, the repository. Aggregators, listicles, reposts, forums and AI-written summaries are useful only for finding it.
- Never copy a date, amount, name, rule or number from a snippet or the
Lead:line into your answer. - Search in the language of the source. A Chinese query is routed to a Chinese
index automatically; to force more of them use
engines=["so360", "baidu"].
2. Read the source itself
| Need | Call |
|---|---|
| One page | fetch(url) |
| Several candidates | fetch_batch(urls) |
| Find and read in one round trip | research(question, depth=3, include_domains=[...]) |
| Long PDF or DOCX (rules, notices) | read_doc(source, start, length), next page at start + returned_chars |
| Dates, prices, event metadata as fields | extract_structured(url): JSON-LD startDate, price, datePublished, dateModified |
| One question across 2-5 pages | compare(question, urls) |
| A paper you are about to cite | paper_graph(paper) for retraction and correction notices |
Divisions, regions, fee tables, prize breakdowns and deadlines usually sit on a
sub-page or in a linked PDF (rules, FAQ, regulations, notices). If the landing page lacks
them, follow its links with fetch or read_doc before you go back to search.
If fetch returns a near-empty body, retry with render="browser".
3. Check that it is current
For every source you rely on, establish three things.
- When it was published or last updated. Look for
published <date>in afetchheader,datePublished/dateModifiedfromextract_structured, or a date in the body.no publication date foundmeans the page is undated. Say so, and do not assume it is recent. - When this copy was retrieved. Pages and searches are cached for up to 7
days, and
cached N days agoin the output means you are reading a stored copy. For anything that changes (deadlines, prices, availability, standings, versions, breaking news) pull it again withfetch(url, force_refresh=True), ormax_age_hours=0onsearchandresearch. - Which edition it describes. The year, season, version or round on the page must match the one asked about. Last year's page for an annual event is the most common wrong answer, because it is official and detailed and so looks right. If only an older edition is published, report it as that edition and say the current one is not announced.
freshness= is best-effort and keeps undated results, so a result that
survives freshness="month" may still be old. The search says how many results
it could date (dated: 3/10) and marks each one.
4. Corroborate
- A fact the user will act on needs one primary source, or two independent ones. Independent means different origin: two outlets reprinting one press release or wire story count as one source. Identical wording usually means a shared origin.
- Prefer primary over secondary, and the newer of two primary pages.
- When sources disagree, do not average and do not pick silently. Report both values, who says which, their dates, and which you treat as authoritative and why.
5. Read the warnings
dated <date>on a result means the date came from a feed or an API field.<date> (from snippet text)means it was lifted out of prose and may be a date the page mentions, which can differ from the page's own.undatedmeans the age is unknown. Treat it as possibly old.- "Undated results": most results carried no date although you asked for recency. Confirm dates on the pages themselves.
- "Gated engines", "Silent engines", "Rate-limited engines", "Benched engines",
rescued viaandrequested but contributed nothingall mean coverage was partial. An empty result does not show that nothing exists. Rephrase or change engines before concluding. - An engine that "answered with results that match only the first word of the query" had those results discarded. You need not act on it, but coverage was narrower.
- The kind shown on a result (
government,academic,news,paper,forum,code) describes the site. It says nothing about quality. - An engine error about a missing API key: ignore it and continue with the keyless engines. Never ask the user for a key.
6. Report
- Give each fact with source and date, e.g. "Registration closes 2026-10-15 (organizer page, updated 2026-09-02, retrieved today)" with the URL.
- Separate what you read on a primary page from what only secondary sources say.
- End with a "Could not verify" list: every requested detail you did not find on a page you actually read, and every unresolved conflict. Never fill a gap from a snippet, from memory, or by inference from an earlier edition.
- If nothing authoritative was reachable, say so. Do not fall back silently to snippet-based answers.
Cost
A normal verification is one search, one or two fetch calls on the primary
page, and one corroborating source. Use research(question, fetch=False) to
choose what to read, keep depth at 2-3, and use cache_search to find a page
you already read this session.