Skip to main content
Glama

Research the web

research
Read-only

Search the web, read several sources, and return ranked passages relevant to a query, with provenance receipts and per-source failures reported.

Instructions

Search the web and return ranked passages drawn from several sources.

One call does what search + repeated read_url would: finds pages, reads them through the stealth browser, and returns the passages most relevant to query — each attributed to its source, with that source's provenance receipt and any stripped injection payloads. A source that fails is reported in sources rather than failing the whole call.

Prefer read_url when you already have the URL, and search when you only want links. This reads max_sources pages, rate limited per domain, so it is the slowest of the three and the one to avoid for a single known page.

Input Schema

NameRequiredDescriptionDefault
aimNoWhat the evidence must show, in at most 200 characters: the authority, artifact and version sought. Echoed in the receipt; it does not change the search or the ranking.
queryYesThe question to research. Passages are ranked against it.
followNoRead up to 8 of the `candidates` an earlier call offered instead of searching: each entry is a candidate's `token` and a `why` (at most 160 characters) saying what it should settle. Pass `query` and the domain filters again; nothing is remembered between calls. Tokens expire after 30 minutes or when the server restarts.
max_tokensNoToken budget for the returned passages. Omit it, or pass a value below 1, to use the server's GROUNDHOG_MAX_TOKENS (20000 by default).
max_sourcesNoHow many pages to read. Values outside 1-10 are clamped rather than rejected. Each source is a full page fetch, so this is the main cost and latency control.
exclude_domainsNoNever read pages on these domains (at most 50).
include_domainsNoRead only pages on these domains or their subdomains (at most 8), e.g. a standards body or the vendor's docs. Several pages from one domain may be read.
published_afterNoYYYY-MM-DD. Leave out pages dated before this day. A page with no date is kept and counted in the receipt's `unknown_dates`.

Output Schema

NameRequiredDescriptionDefault
notesYes
queryYes
backendYes
receiptYes
sourcesYes
followedYes
passagesYes
truncatedYes
candidatesYes
omitted_safetyYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.22.0
    • changedOutput schema / $defs / Threat / properties / type / enum
      Previous value: -[
      -  "hidden_css",
      -  "hidden_attribute",
      -  "hidden_template",
      -  "report_truncated",
      -  "final_url_suppressed",
      -  "detection_degraded",
      -  "strip_incomplete",
      -  "zero_width",
      -  "bidi",
      -  "tag"
      -]New value: +[
      +  "hidden_css",
      +  "hidden_attribute",
      +  "hidden_template",
      +  "hidden_pdf",
      +  "report_truncated",
      +  "final_url_suppressed",
      +  "detection_degraded",
      +  "strip_incomplete",
      +  "zero_width",
      +  "bidi",
      +  "tag"
      +]
  2. Changed32 schema fields changedv0.20.1
    • addedInput schema / $defs
      Added value: +{
      +  "Pick": {
      +    "properties": {
      +      "token": {
      +        "title": "Token",
      +        "type": "string"
      +      },
      +      "why": {
      +        "title": "Why",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "token",
      +      "why"
      +    ],
      +    "title": "Pick",
      +    "type": "object"
      +  }
      +}
    • addedInput schema / properties / follow
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "$ref": "#/$defs/Pick"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Read up to 8 of the `candidates` an earlier call offered instead of searching: each entry is a candidate's `token` and a `why` (at most 160 characters) saying what it should settle. Pass `query` and the domain filters again; nothing is remembered between calls. Tokens expire after 30 minutes or when the server restarts.",
      +  "title": "Follow"
      +}
    • changedInput schema / properties / max_tokens / description
      Previous value: -"Token budget for the returned passages. Omit to use the server's GROUNDHOG_MAX_TOKENS (20000 by default). Must be positive."New value: +"Token budget for the returned passages. Omit it, or pass a value below 1, to use the server's GROUNDHOG_MAX_TOKENS (20000 by default)."
    • addedOutput schema / $defs / Card
      Added value: +{
      +  "properties": {
      +    "depth": {
      +      "title": "Depth",
      +      "type": "integer"
      +    },
      +    "domain": {
      +      "title": "Domain",
      +      "type": "string"
      +    },
      +    "flags": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "title": "Flags",
      +      "type": "array"
      +    },
      +    "kind": {
      +      "const": "link",
      +      "title": "Kind",
      +      "type": "string"
      +    },
      +    "label": {
      +      "title": "Label",
      +      "type": "string"
      +    },
      +    "parent_passage_id": {
      +      "title": "Parent Passage Id",
      +      "type": "string"
      +    },
      +    "parent_source_url": {
      +      "title": "Parent Source Url",
      +      "type": "string"
      +    },
      +    "relation": {
      +      "title": "Relation",
      +      "type": "string"
      +    },
      +    "token": {
      +      "title": "Token",
      +      "type": "string"
      +    },
      +    "url": {
      +      "title": "Url",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "token",
      +    "url",
      +    "domain",
      +    "kind",
      +    "label",
      +    "parent_source_url",
      +    "parent_passage_id",
      +    "depth",
      +    "relation",
      +    "flags"
      +  ],
      +  "title": "Card",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / Followed
      Added value: +{
      +  "properties": {
      +    "outcome": {
      +      "enum": [
      +        "read",
      +        "not_content",
      +        "failed",
      +        "filtered",
      +        "duplicate",
      +        "same_domain_limit",
      +        "invalid_token",
      +        "expired"
      +      ],
      +      "title": "Outcome",
      +      "type": "string"
      +    },
      +    "url": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "title": "Url"
      +    },
      +    "why": {
      +      "title": "Why",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "url",
      +    "why",
      +    "outcome"
      +  ],
      +  "title": "Followed",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / OmittedSafety
      Added value: +{
      +  "properties": {
      +    "notices": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "title": "Notices",
      +      "type": "array"
      +    },
      +    "sources": {
      +      "title": "Sources",
      +      "type": "integer"
      +    },
      +    "threat_total": {
      +      "title": "Threat Total",
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "sources",
      +    "threat_total",
      +    "notices"
      +  ],
      +  "title": "OmittedSafety",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / Receipt / properties / candidates_omitted
      Added value: +{
      +  "title": "Candidates Omitted",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / Receipt / properties / exclude_domains_count
      Added value: +{
      +  "title": "Exclude Domains Count",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / Receipt / properties / executed_query / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / $defs / Receipt / properties / executed_query / type
      Removed value: -"string"
    • addedOutput schema / $defs / Receipt / properties / include_domains_count
      Added value: +{
      +  "title": "Include Domains Count",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / Receipt / properties / link_variants_dropped
      Added value: +{
      +  "title": "Link Variants Dropped",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / Receipt / properties / links_examined
      Added value: +{
      +  "title": "Links Examined",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / Receipt / properties / links_over_limit
      Added value: +{
      +  "title": "Links Over Limit",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / Receipt / properties / links_straddled
      Added value: +{
      +  "title": "Links Straddled",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / Receipt / properties / metadata_compacted
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "title": "Metadata Compacted",
      +  "type": "array"
      +}
    • addedOutput schema / $defs / Receipt / properties / passages_omitted
      Added value: +{
      +  "title": "Passages Omitted",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / Receipt / properties / sources_omitted
      Added value: +{
      +  "title": "Sources Omitted",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / Receipt / properties / threat_excerpts_omitted
      Added value: +{
      +  "title": "Threat Excerpts Omitted",
      +  "type": "integer"
      +}
    • changedOutput schema / $defs / Receipt / required
      Previous value: -[
      -  "executed_query",
      -  "aim",
      -  "include_domains",
      -  "exclude_domains",
      -  "published_after",
      -  "hits",
      -  "hits_by_domain",
      -  "hits_excluded",
      -  "hits_outside_domains",
      -  "hits_before_date",
      -  "hits_same_domain",
      -  "hits_unread",
      -  "failed",
      -  "not_content",
      -  "filtered",
      -  "usable",
      -  "outside_domains",
      -  "unknown_dates",
      -  "omitted",
      -  "set_aside",
      -  "clamped"
      -]New value: +[
      +  "executed_query",
      +  "aim",
      +  "include_domains",
      +  "exclude_domains",
      +  "published_after",
      +  "hits",
      +  "hits_by_domain",
      +  "hits_excluded",
      +  "hits_outside_domains",
      +  "hits_before_date",
      +  "hits_same_domain",
      +  "hits_unread",
      +  "failed",
      +  "not_content",
      +  "filtered",
      +  "usable",
      +  "outside_domains",
      +  "unknown_dates",
      +  "omitted",
      +  "set_aside",
      +  "clamped",
      +  "candidates_omitted",
      +  "links_examined",
      +  "links_over_limit",
      +  "links_straddled",
      +  "link_variants_dropped",
      +  "include_domains_count",
      +  "exclude_domains_count",
      +  "passages_omitted",
      +  "threat_excerpts_omitted",
      +  "sources_omitted",
      +  "metadata_compacted"
      +]
    • addedOutput schema / $defs / Source / properties / depth
      Added value: +{
      +  "title": "Depth",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / Source / properties / discovered_via
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/Via"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / $defs / Source / properties / page_status / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "ok",
      -      "challenge",
      -      "blocked",
      -      "rate_limited",
      -      "not_found",
      -      "server_error",
      -      "unsupported_content",
      -      "empty",
      -      "unknown"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "ok",
      +      "challenge",
      +      "blocked",
      +      "rate_limited",
      +      "not_found",
      +      "server_error",
      +      "unsupported_content",
      +      "empty",
      +      "too_large",
      +      "unknown"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / $defs / Source / properties / threat_counts
      Added value: +{
      +  "additionalProperties": {
      +    "type": "integer"
      +  },
      +  "title": "Threat Counts",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / Source / properties / threat_total
      Added value: +{
      +  "title": "Threat Total",
      +  "type": "integer"
      +}
    • changedOutput schema / $defs / Source / required
      Previous value: -[
      -  "url",
      -  "title",
      -  "status",
      -  "page_status",
      -  "threats",
      -  "provenance",
      -  "error",
      -  "filtered"
      -]New value: +[
      +  "url",
      +  "title",
      +  "status",
      +  "page_status",
      +  "threats",
      +  "provenance",
      +  "error",
      +  "filtered",
      +  "depth",
      +  "discovered_via",
      +  "threat_total",
      +  "threat_counts"
      +]
    • addedOutput schema / $defs / Via
      Added value: +{
      +  "properties": {
      +    "candidate": {
      +      "title": "Candidate",
      +      "type": "string"
      +    },
      +    "label": {
      +      "title": "Label",
      +      "type": "string"
      +    },
      +    "parent_passage_id": {
      +      "title": "Parent Passage Id",
      +      "type": "string"
      +    },
      +    "parent_source_url": {
      +      "title": "Parent Source Url",
      +      "type": "string"
      +    },
      +    "why": {
      +      "title": "Why",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "parent_source_url",
      +    "parent_passage_id",
      +    "label",
      +    "why",
      +    "candidate"
      +  ],
      +  "title": "Via",
      +  "type": "object"
      +}
    • addedOutput schema / properties / candidates
      Added value: +{
      +  "items": {
      +    "$ref": "#/$defs/Card"
      +  },
      +  "title": "Candidates",
      +  "type": "array"
      +}
    • addedOutput schema / properties / followed
      Added value: +{
      +  "items": {
      +    "$ref": "#/$defs/Followed"
      +  },
      +  "title": "Followed",
      +  "type": "array"
      +}
    • addedOutput schema / properties / notes
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "title": "Notes",
      +  "type": "array"
      +}
    • addedOutput schema / properties / omitted_safety
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/OmittedSafety"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "query",
      -  "backend",
      -  "passages",
      -  "sources",
      -  "truncated",
      -  "receipt"
      -]New value: +[
      +  "query",
      +  "backend",
      +  "passages",
      +  "sources",
      +  "candidates",
      +  "followed",
      +  "truncated",
      +  "notes",
      +  "omitted_safety",
      +  "receipt"
      +]
  3. Changed1 schema field changedv0.19.1
    • changedOutput schema / $defs / Source / properties / page_status / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "ok",
      -      "challenge",
      -      "blocked",
      -      "rate_limited",
      -      "not_found",
      -      "server_error",
      -      "unsupported_content",
      -      "unknown"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "ok",
      +      "challenge",
      +      "blocked",
      +      "rate_limited",
      +      "not_found",
      +      "server_error",
      +      "unsupported_content",
      +      "empty",
      +      "unknown"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  4. Changed15 schema fields changedv0.18.0
    • addedInput schema / properties / aim
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "What the evidence must show, in at most 200 characters: the authority, artifact and version sought. Echoed in the receipt; it does not change the search or the ranking.",
      +  "title": "Aim"
      +}
    • addedInput schema / properties / exclude_domains
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Never read pages on these domains (at most 50).",
      +  "title": "Exclude Domains"
      +}
    • addedInput schema / properties / include_domains
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Read only pages on these domains or their subdomains (at most 8), e.g. a standards body or the vendor's docs. Several pages from one domain may be read.",
      +  "title": "Include Domains"
      +}
    • addedInput schema / properties / published_after
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "YYYY-MM-DD. Leave out pages dated before this day. A page with no date is kept and counted in the receipt's `unknown_dates`.",
      +  "title": "Published After"
      +}
    • addedOutput schema / $defs / Passage / properties / clamped
      Added value: +{
      +  "title": "Clamped",
      +  "type": "boolean"
      +}
    • addedOutput schema / $defs / Passage / properties / end
      Added value: +{
      +  "title": "End",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / Passage / properties / fence
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Fence"
      +}
    • addedOutput schema / $defs / Passage / properties / id
      Added value: +{
      +  "title": "Id",
      +  "type": "string"
      +}
    • addedOutput schema / $defs / Passage / properties / start
      Added value: +{
      +  "title": "Start",
      +  "type": "integer"
      +}
    • changedOutput schema / $defs / Passage / required
      Previous value: -[
      -  "text",
      -  "source_url",
      -  "heading",
      -  "score"
      -]New value: +[
      +  "id",
      +  "text",
      +  "source_url",
      +  "heading",
      +  "score",
      +  "start",
      +  "end",
      +  "clamped",
      +  "fence"
      +]
    • addedOutput schema / $defs / Receipt
      Added value: +{
      +  "properties": {
      +    "aim": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "title": "Aim"
      +    },
      +    "clamped": {
      +      "title": "Clamped",
      +      "type": "boolean"
      +    },
      +    "exclude_domains": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "title": "Exclude Domains",
      +      "type": "array"
      +    },
      +    "executed_query": {
      +      "title": "Executed Query",
      +      "type": "string"
      +    },
      +    "failed": {
      +      "title": "Failed",
      +      "type": "integer"
      +    },
      +    "filtered": {
      +      "title": "Filtered",
      +      "type": "integer"
      +    },
      +    "hits": {
      +      "title": "Hits",
      +      "type": "integer"
      +    },
      +    "hits_before_date": {
      +      "title": "Hits Before Date",
      +      "type": "integer"
      +    },
      +    "hits_by_domain": {
      +      "additionalProperties": {
      +        "type": "integer"
      +      },
      +      "title": "Hits By Domain",
      +      "type": "object"
      +    },
      +    "hits_excluded": {
      +      "title": "Hits Excluded",
      +      "type": "integer"
      +    },
      +    "hits_outside_domains": {
      +      "title": "Hits Outside Domains",
      +      "type": "integer"
      +    },
      +    "hits_same_domain": {
      +      "title": "Hits Same Domain",
      +      "type": "integer"
      +    },
      +    "hits_unread": {
      +      "title": "Hits Unread",
      +      "type": "integer"
      +    },
      +    "include_domains": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "title": "Include Domains",
      +      "type": "array"
      +    },
      +    "not_content": {
      +      "title": "Not Content",
      +      "type": "integer"
      +    },
      +    "omitted": {
      +      "title": "Omitted",
      +      "type": "integer"
      +    },
      +    "outside_domains": {
      +      "title": "Outside Domains",
      +      "type": "integer"
      +    },
      +    "published_after": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "title": "Published After"
      +    },
      +    "set_aside": {
      +      "title": "Set Aside",
      +      "type": "integer"
      +    },
      +    "unknown_dates": {
      +      "anyOf": [
      +        {
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "title": "Unknown Dates"
      +    },
      +    "usable": {
      +      "title": "Usable",
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "executed_query",
      +    "aim",
      +    "include_domains",
      +    "exclude_domains",
      +    "published_after",
      +    "hits",
      +    "hits_by_domain",
      +    "hits_excluded",
      +    "hits_outside_domains",
      +    "hits_before_date",
      +    "hits_same_domain",
      +    "hits_unread",
      +    "failed",
      +    "not_content",
      +    "filtered",
      +    "usable",
      +    "outside_domains",
      +    "unknown_dates",
      +    "omitted",
      +    "set_aside",
      +    "clamped"
      +  ],
      +  "title": "Receipt",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / Source / properties / filtered
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "excluded_domain",
      +        "outside_domains",
      +        "published_before",
      +        "duplicate"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Filtered"
      +}
    • changedOutput schema / $defs / Source / required
      Previous value: -[
      -  "url",
      -  "title",
      -  "status",
      -  "page_status",
      -  "threats",
      -  "provenance",
      -  "error"
      -]New value: +[
      +  "url",
      +  "title",
      +  "status",
      +  "page_status",
      +  "threats",
      +  "provenance",
      +  "error",
      +  "filtered"
      +]
    • addedOutput schema / properties / receipt
      Added value: +{
      +  "$ref": "#/$defs/Receipt"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "query",
      -  "backend",
      -  "passages",
      -  "sources",
      -  "truncated"
      -]New value: +[
      +  "query",
      +  "backend",
      +  "passages",
      +  "sources",
      +  "truncated",
      +  "receipt"
      +]
  5. Changed1 schema field changedv0.15.0
    • addedOutput schema / $defs / Threat / properties / seen
      Added value: +{
      +  "title": "Seen",
      +  "type": "integer"
      +}
  6. Changed1 schema field changedv0.13.0
    • changedOutput schema / $defs / Threat / properties / type / enum
      Previous value: -[
      -  "hidden_css",
      -  "report_truncated",
      -  "final_url_suppressed",
      -  "detection_degraded",
      -  "strip_incomplete",
      -  "zero_width",
      -  "bidi",
      -  "tag"
      -]New value: +[
      +  "hidden_css",
      +  "hidden_attribute",
      +  "hidden_template",
      +  "report_truncated",
      +  "final_url_suppressed",
      +  "detection_degraded",
      +  "strip_incomplete",
      +  "zero_width",
      +  "bidi",
      +  "tag"
      +]
  7. Changed2 schema fields changedv0.10.0
    • addedOutput schema / $defs / Source / properties / page_status
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "ok",
      +        "challenge",
      +        "blocked",
      +        "rate_limited",
      +        "not_found",
      +        "server_error",
      +        "unsupported_content",
      +        "unknown"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "title": "Page Status"
      +}
    • changedOutput schema / $defs / Source / required
      Previous value: -[
      -  "url",
      -  "title",
      -  "status",
      -  "threats",
      -  "provenance",
      -  "error"
      -]New value: +[
      +  "url",
      +  "title",
      +  "status",
      +  "page_status",
      +  "threats",
      +  "provenance",
      +  "error"
      +]
  8. Changed3 schema fields changedv1.0.0
    • addedInput schema / properties / max_sources / description
      Added value: +"How many pages to read. Values outside 1-10 are clamped rather than rejected. Each source is a full page fetch, so this is the main cost and latency control."
    • addedInput schema / properties / max_tokens / description
      Added value: +"Token budget for the returned passages. Omit to use the server's GROUNDHOG_MAX_TOKENS (20000 by default). Must be positive."
    • addedInput schema / properties / query / description
      Added value: +"The question to research. Passages are ranked against it."
  9. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only cover readOnly and openWorld, yet the description adds substantial context beyond them: pages read through a stealth browser, per-source failures reported in `sources` instead of failing the whole call, provenance receipts, stripped injection payloads, per-domain rate limiting, and follow-token expiry (30 minutes / server restart). That is unusually rich behavioral disclosure for a read-only tool.

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

Conciseness5/5

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

Three short paragraphs, front-loaded with the effect, then the mechanics, then the disambiguation. Every sentence carries information — the closest to filler is the sibling comparison, and that is load-bearing for tool selection.

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

Completeness5/5

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

Output schema exists, so return values need not be described, and the description still covers partial-failure semantics and provenance. For an 8-parameter open-world tool, nothing an agent needs to invoke it correctly — cost, latency, failure mode, token lifetime — is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds real semantics the schema doesn't: max_sources framed as the main cost and latency control, follow described as re-reading prior candidates with nothing remembered between calls, and the interaction between query and follow. Only the domain filters and budget parameters get no enhancement beyond the schema's own text.

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

Purpose5/5

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

Opens with a specific verb and resource plus the return shape: "Search the web and return ranked passages drawn from several sources." It then explicitly defines itself against both siblings (search, read_url) and distinguishes the composite behavior, so an agent can place it without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit routing rules: prefer `read_url` when you already have the URL, `search` when you only want links, and avoid this one for a single known page. Also states the cost condition (slowest of the three, reads max_sources pages, rate limited per domain), which is exactly the tradeoff an agent needs to choose.

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

Deploy Server

Other Tools