Tools

wigolo exposes ten tools. They're the same tools everywhere — MCP (stdio or HTTP), REST, SDKs, and the one-shot CLI — with identical parameter names on the wire.

Cache first. Every fetched, crawled, or searched page lands in the local knowledge cache. The cache tool answers from disk instantly and free — check it before going to the network, and expect repeat questions in a session to get cheaper as the cache warms.

Common knobs shared by most tools: max_tokens_out (token-budget cap on total output, cl100k-base counting), include_full_markdown (multi-result tools return evidence excerpts by default; set true for full bodies), citation_format (numbered inline [N] markers, json for a citations[] array, or anthropic_tags), and force_refresh (skip all caches, go to the network).


Multi-engine web search: query variants dispatched in parallel across direct engine adapters, fused with reciprocal-rank fusion, reranked by the on-device ML reranker, and enriched with extracted page content. Returns scored evidence with citations rather than bare links.

ParamTypeNotes
querystring | string[]Array form runs variants in parallel, dedupes, reranks together.
max_resultsnumberDefault 5, max 20.
max_fetchesnumberCap content enrichment to the top N results.
categoryenumgeneral, news, code, docs, papers, images.
include_domains / exclude_domainsstring[]Domain allow/deny lists.
time_rangeenumday/week/month/year — precision filter; undated pages pass through.
from_date / to_datestringStrict ISO date bounds (pair with a date-aware category).
exact_matchbooleanQuoted-phrase semantics; non-matching results dropped.
country / languagestringAdvisory geographic/language hints.
search_depthenumultra-fast (cache-only, ≤300ms), fast (engines only, ≤1s), balanced (default, full pipeline), deep (max enrichment).
modeenumcache, default, stealth (full browser for JS-heavy result pages).
formatenumanswer / stream_answer request LLM synthesis (falls back to evidence when no LLM).
agent_contextobject{ text, recent_urls, intent } — ranks toward your task, drops already-seen URLs.
include_favicon / include_imagesbooleanPer-result favicon URL / aggregated images[].

Notable response fields:

  • results[]title, url, snippet, relevance_score, and per-result:
    • evidence_score — explainable breakdown: final plus components (base_rrf, context_cosine, domain_quality, lexical_alignment, recency_boost, engine_consensus, rare_terms) and a one-line explanation.
    • freshness_signalpublished_date, inferred flag, confidence.
  • evidence[] + citations[] — quotable excerpts with citation_id and source_span (exact character range in the source), so an agent can cite verbatim.
  • query_understanding — classifier view: intent, entities, date_hint, language, is_brand_collision_prone, considered rewrites, compound_terms.
  • engines_used, engine_telemetry[] (name, latency_ms, result_count, outcome, dedup_kept), engine_warnings, engine_pool — degraded engines are reported, not hidden.
  • total_time_ms, response_time_ms, search_time_ms, fetch_time_ms.
  • On the hybrid backend, a merged response carries fallback_signal naming why the fallback fired.
{ "query": ["rust async traits", "rust trait async fn stabilization"],
  "category": "docs", "include_domains": ["doc.rust-lang.org", "blog.rust-lang.org"],
  "max_results": 5 }

fetch

Fetch one URL as clean markdown. Smart tiered routing: plain HTTP first, escalating to the browser engine on real signals (SPA shells, anti-bot challenges) rather than domain guesses. Handles JS-rendered pages, PDFs, and authenticated sessions.

ParamTypeNotes
urlstringRequired.
render_jsenumauto (default), always, never.
section / section_indexstring / numberReturn only the section under a heading.
max_content_charsnumberSmart truncation at a paragraph boundary with a marker (preferred over max_chars hard slice).
use_authbooleanUse your stored browser session (see configuration).
actionsarraySequential browser actions before extraction: click, type, wait, wait_for, scroll, screenshot. Forces browser rendering.
screenshotbooleanCapture a screenshot.
headersobjectExtra request headers.
modeenumcache (HTTP-only, stale ok), default, stealth (full browser render).

Response: markdown, title, page metadata, cache status, and content-change info against the cached copy. A challenge that doesn't clear is labeled blocked_by_challenge — an honest failure, never junk content (see troubleshooting).

{ "url": "https://nextjs.org/docs/app/building-your-application/caching",
  "section": "Data Cache", "max_content_chars": 4000 }

crawl

Multi-page crawl into the local cache: BFS/DFS link-following, sitemap-driven, or map for URL discovery without content. Respects robots.txt by default, rate-limits per domain, dedupes anchor fragments, and revalidates with ETags. Crawled pages power later cache and find_similar calls.

ParamTypeNotes
urlstringSeed URL. Required.
strategyenumbfs (default behavior), dfs, sitemap, map (URLs only — fast).
max_depthnumberDefault 2.
max_pagesnumberDefault 20.
include_patterns / exclude_patternsstring[]URL regex allow/deny.
extract_linksbooleanReturn the graph of links between pages.
use_authbooleanCrawl with your stored session.

Response: pages[] with per-page markdown and metadata (map returns urls[] instead), totals, and skipped/error accounting. Budgets are sized for research-grade volumes — this is a docs-indexing tool, not a bulk harvester.

{ "url": "https://docs.astro.build", "strategy": "sitemap",
  "include_patterns": ["/en/guides/"], "max_pages": 40 }

cache

Query the persistent local knowledge cache — every page wigolo has already seen. Instant and free; check it before any network call.

ParamTypeNotes
querystringFull-text search over cached content.
modeenumfts (default, keyword BM25) or hybrid (adds semantic vector search, fused by reciprocal-rank fusion).
url_patternstringGlob filter, e.g. "*example.com*".
sincestringISO date floor.
statsbooleanTotals: URL count, size, date range.
clearbooleanDelete matching entries (requires at least one filter).
check_changesbooleanRe-fetch matching URLs and report changed/unchanged with diff summaries.
limitnumberDefault 20.
{ "query": "connection pool exhaustion", "mode": "hybrid", "limit": 10 }

extract

Structured data out of any page (or raw HTML you pass in) — no LLM required for any mode.

ModeWhat you get
structuredEverything at once: tables, definition lists, key-value pairs, JSON-LD, microdata, chart hints.
schemaYou provide a JSON Schema; field names are matched against the page via CSS classes, ARIA labels, microdata, and JSON-LD. With an LLM configured, LLM-sourced fields are verified against the source — hallucinated values come back as null, never invented.
tablesAll tables as structured rows.
metadataTitle, description, OpenGraph/meta, canonical, dates.
selectorCSS-selector extraction (css_selector required; multiple for all matches).
brandLogo, favicon, colors, fonts, social links — with provenance; favicons never promoted to logo_url.

Also: named_schema (Article, Recipe, Product, CodeSnippet, Paper, EventListing) for strict heuristic-only extraction into a known shape, and html to extract from markup you already have.

{ "url": "https://www.postgresql.org/support/versioning/", "mode": "tables" }

find_similar

Hybrid semantic discovery: given a URL or a concept, fuses the local embedding index, keyword search, and live web search with 3-way reciprocal-rank fusion. Works best after a crawl has warmed the cache.

ParamTypeNotes
url or conceptstringSeed page, or a topic description when you have no URL.
modeenumauto (default), cache, web-expansion, crawl-rank (1-hop crawl from the seed, embed, cosine-rank).
max_resultsnumberDefault 10, max 50.
include_cache / include_webbooleanToggle the two sides (both default true).
thresholdnumberHard post-filter on the raw match_signals.fused_score — an empty result is correct when nothing qualifies.
include_ranking_debugbooleanPer-result ranking_debug (fts5_rank, embedding_rank, web_rank, rrf_score) to audit ranking disagreement.

When local signals are weak the response carries a cold_start note telling you what to crawl first — surface it rather than treating thin results as final.

{ "url": "https://12factor.net/config", "max_results": 8 }

research

Multi-step research: decomposes your question into sub-queries, searches them in parallel, validates and cross-references sources, and returns a structured brief. Works keyless; a configured LLM (including a local one via WIGOLO_LOCAL_LLM=auto) upgrades synthesis quality.

ParamTypeNotes
questionstringRequired.
depthenumquick (~15s), standard (~40s, default), comprehensive (~80s).
max_sourcesnumberOverride the depth default (max 50).
include_domains / exclude_domainsstring[]Scope the search space.
schemaobjectOptional JSON Schema — structure the report around these fields.
streambooleanProgress notifications per phase (MCP transport only).

The brief response object: topics, highlights, key_findings with index-aligned key_finding_sources (per-claim provenance), and sectionsoverview.cross_references (claims corroborated by multiple sources), comparison (when the question is comparative), and gaps (what the sources did not cover — read this before trusting completeness).

{ "question": "How do Deno and Bun differ in Node.js compatibility?", "depth": "standard" }

agent

Autonomous data gathering: plans queries and URLs from a natural-language prompt, executes fetches in parallel within a time budget, optionally extracts structured fields per page, and synthesizes. Every step is logged.

ParamTypeNotes
promptstringWhat to gather. Required.
urlsstring[]Seed URLs to include.
schemaobjectJSON Schema — extract matching structured data from each page.
max_pagesnumberDefault 10, max 100.
max_time_msnumberDefault 60000.
streambooleanPer-step progress notifications (MCP transport only).

Response: result (structured data in schema mode, synthesized text otherwise), sources (what was fetched, with per-source status), steps (the full plan/execute/synthesize log), and an explicit warning when the schema couldn't be honored or fetches failed — partial results are labeled, not disguised.

{ "prompt": "Current LTS support windows for Node.js releases",
  "schema": { "type": "object", "properties": { "version": {"type":"string"}, "lts_until": {"type":"string"} } },
  "max_pages": 6 }

diff

Compare two versions of content: a live URL against its cached copy (populate the cache with fetch/crawl first), two URLs, two markdown blobs, or a cached content_hash against anything.

ParamTypeNotes
oldobjectOne of { url, markdown, content_hash }.
newobjectOne of { url, markdown }.
outputenumunified (git-style patch, default), hunks (structured per-section), summary (counts only: added_lines, removed_lines, modified_lines, total_changed_chars).
granularityenumline (default), word (token-level — tighter for intra-line edits), section (walks H1/H2/H3 boundaries).
{ "old": { "url": "https://nodejs.org/en/about/previous-releases" },
  "new": { "url": "https://nodejs.org/en/about/previous-releases" },
  "output": "summary" }

watch

Register change-watch jobs on one or many URLs. Execution is lazy: jobs are checked while a wigolo serve daemon or an MCP session is active — a one-shot CLI call can register but not schedule.

ParamTypeNotes
actionenumcreate, list, check, pause, resume, delete. Required.
url / urlsstring / string[]Single or batch create (mutually exclusive).
interval_secondsnumberRequired on create; minimum 60.
selectorstringScope the diff to a CSS-selected subtree.
notificationstringinline (default — reported on the next check) or a webhook URL. Webhook targets are SSRF-guarded: private and loopback addresses are refused.
job_idstringRequired for check/pause/resume/delete.
{ "action": "create", "url": "https://go.dev/doc/devel/release",
  "interval_seconds": 3600, "notification": "inline" }

← Docs index · Next: CLI

Edit this page on GitHub