{
 "kind": "feature",
 "id": "feature:web-pages",
 "url": "https://headlesson.com/features/web-pages",
 "title": "Reading a web page or driving a browser: which recorded MCP server for which page",
 "summary": "For assistants asked to read a web page or act in a browser, this feature separates a fetch server from two browser servers and lists what headlesson observed in their lesson tests, separately from cautions taken from their documentation. The recorded lesson runs used https://example.com on macOS on 2026-10-11, and the two browser records also include a supplementary test on a local fixture page; none covered logins, clicks, forms, console or network inspection, traces, JavaScript-heavy pages or real sites.",
 "published": "2026-10-13",
 "updated": "2026-10-13",
 "body": "# Read a page, or drive a browser\n\n- To read one public page as text: app:mcp-server-fetch, a reference MCP server with a single fetch tool that converts the HTML of a URL to Markdown. Its lesson passed both steps with 2026.10.10 on 2026-10-11, fetching https://example.com through uvx.\n- To look at a page the way a browser renders it, or to click and fill forms: app:playwright-mcp, which works from accessibility snapshots of the page. Its lesson passed 4 steps with 0.0.83 on 2026-10-11: navigate to https://example.com, take a snapshot, close, in a fresh isolated headless browser; a supplementary test opened a local fixture page. Clicking and filling forms were not tested.\n- To use Chrome's debugging and performance tools (console, network, traces): app:chrome-devtools-mcp, which drives Google Chrome. Its lesson passed 4 steps with 1.10.1 on 2026-10-11: open https://example.com, list pages, take a snapshot, close; a supplementary test opened a local fixture page. Console, network and trace tools were not tested.\n- Editorial advice, not tested: start with app:mcp-server-fetch for a static public page, and move to app:playwright-mcp or app:chrome-devtools-mcp when the page needs a browser to render it or a login; the three were separate lesson runs at the same example URL, not a controlled head-to-head comparison.\n\n# Observed in the tests\n\n- app:mcp-server-fetch: the Markdown for https://example.com held only the body paragraph after the line \"Contents of https://example.com/:\"; the page title and link were missing. Check whether something you need was dropped, not only that text came back.\n- app:playwright-mcp and app:chrome-devtools-mcp: both ran with a fresh isolated headless browser on macOS with Node 24.19.0 and Chrome 154; for app:chrome-devtools-mcp the test turned off its usage statistics with flags.\n\n# Cautions from the documentation\n\n- app:mcp-server-fetch: output is cut at max_length (5000 characters by default), so read further with start_index; for requests the model starts it obeys the site's robots.txt and sends its own user-agent; it refuses private and loopback addresses by default, and its README notes this does not cover DNS rebinding; installing Node.js switches it to a different HTML simplifier, so output can differ between machines.\n- app:playwright-mcp: it is not a security boundary, and a persistent profile can keep login state, so use an isolated profile unless the person wants their logins used.\n- app:chrome-devtools-mcp: usage statistics are on by default; only Google Chrome and Chrome for Testing are officially supported; its CLI has unrestricted file system access unless a workspace restriction is set. Browser contents are visible to the connected MCP client. headlesson's own reading of the configuration, not tested: connecting to the person's running Chrome (--autoConnect) needs them to approve a dialog.\n\n# A safe sequence\n\nWith app:mcp-server-fetch, app:playwright-mcp or app:chrome-devtools-mcp: confirm the exact URL with the person; read before acting (fetch the page, or navigate and take a snapshot); use a fresh isolated browser profile unless the person asks for theirs; show any form submission, purchase or account change and get approval before doing it; check that the text you rely on was not truncated or dropped. Each lesson (headlesson_get with sections [\"lesson\",\"gotchas\"]) gives the exact configuration and versions.\n",
 "refs": [
  {
   "id": "app:mcp-server-fetch",
   "name": "Fetch MCP server (mcp-server-fetch)",
   "source": {
    "source": "https://github.com/modelcontextprotocol/servers/blob/main/src/fetch/README.md",
    "checked": "2026-10-11",
    "certainty": "primary",
    "by": "official"
   }
  },
  {
   "id": "app:playwright-mcp",
   "name": "Playwright MCP",
   "source": {
    "source": "https://github.com/microsoft/playwright-mcp/blob/main/README.md",
    "checked": "2026-10-09",
    "certainty": "primary",
    "by": "official"
   }
  },
  {
   "id": "app:chrome-devtools-mcp",
   "name": "Chrome DevTools MCP",
   "source": {
    "source": "https://github.com/ChromeDevTools/chrome-devtools-mcp/blob/main/README.md",
    "checked": "2026-10-09",
    "certainty": "primary",
    "by": "official"
   }
  }
 ],
 "article_source": {
  "source": "headlesson editorial judgement",
  "checked": "2026-10-13",
  "certainty": "inferred",
  "by": "editorial"
 },
 "note": "Editorial article by the headlesson operator, written from the catalog records it cites. Test results in it are the operator's own observations, not vendor claims. Each cited record keeps its own source; the article's editorial source does not stand in for them.",
 "mcp_get": "headlesson_get id=\"feature:web-pages\"",
 "page_updated": "2026-10-13"
}
