web_read
Read a PUBLIC web page, escalating until it yields — and always saying which path was used.
Escalation: ① plain HTTP fetch (free) → on 403/timeout/empty shell
② hosted scraper (serper, ~2 credits — basic anti-bot, but NO guaranteed
JS rendering: a client-rendered page comes back 200 with a near-empty
body, and ② will report it as read) →
③ ONLY IF browser=true: a disposable hosted Chrome session
(real fingerprint, patience — costs a browser session). Without
browser=true the answer stops at ② and tells you what to do.
Returns {content, title, final_url, hote, chemin, tentatives, cout, truncated} — chemin = which path actually produced the content
(http | serper | browser), tentatives = every path tried and
why it moved on, cout = what the read cost (serper credits, browser
session). A skipped path (no serper key, Browserbase not configured)
is REPORTED, never silent.
⚠️ final_url is the OBSERVED landing URL, or null when the path
used cannot report one (the hosted scraper follows redirects silently).
hote = {demande, servi, conforme} says whether the page actually
served belongs to the domain you asked for: conforme is true
(same site), false (a redirect took you elsewhere — the content is
that OTHER site's) or null (unknowable on this path). Anything but
true also sets avertissement. Never assume the body came from the
host you requested — read hote.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"url": "<url>"
},
"name": "web_read"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | absolute public URL (http/https). Internal/private addresses are refused by design, and so is a page under the project's `excluded_url_prefixes` (requested or landed on by redirect). | |
| _org | No | Org (id) de CET APPEL. `oto_list_orgs()`. | |
| _group | No | Équipe (id) de CET APPEL, sous son org parente. | |
| _run_id | No | OBLIGATOIRE à chaque appel dès `run_start` ou `data_claim_next` : sans lui, l'écriture sur une ligne réservée est refusée. Hérité seulement si le serveur tient un run actif — n'y compte pas. | |
| as_html | No | True = raw HTML/DOM instead of readable text (①/③ only — ② returns markdown). | |
| browser | No | opt-in for the costly last resort (real Chrome session). | |
| _project | No | Projet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`. | |
| _instance | No | Instance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`. | |
| max_chars | No | cap on returned content (truncation is flagged). |