Report for
en.wikipedia.org
https://en.wikipedia.org/wiki/Web_browservisit site ↗
- Find
friction
- Understand
clear
- Act
friction
- Survival
- 85
- Can an agent read and act at all?
- Superpower
- 0
- WebMCP tools exposed
- If WebMCP added
- 87
- Headline with WebMCP at full marks
Do this first
ranked by severity × category weight
- Form semanticshigh
Unlabelled form controls
Associate every control with a <label> or aria-label.
Show the fix
Labels are the primary signal for what a field wants.
<label for="search">Search Wikipedia</label> <input id="search" name="search" type="search">
- Form semanticshigh
Controls outside a <form>
Wrap controls in a <form> with an explicit submit control.
Show the fix
Agents submit forms via standard HTML — not div onclick handlers.
<form action="/submit" method="post"> …fields… <button type="submit">Submit</button> </form>
- WebMCP capabilityhigh
No WebMCP tools — this is the biggest single upgrade available
Declare your "Search" form as a tool
Show the fix
The declarative attributes are the cheapest path: the browser synthesizes the JSON Schema from the controls you already have.
Reference ↗<form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button" toolname="searchform" tooldescription="Search"> <input id="searchInput" name="search" type="search" toolparamdescription="Search Wikipedia"> <!-- …your existing labels and submit button stay as they are… --> </form>
Category breakdown
- 60
Agent discovery
3 of 5 discovery signals present.
weight 18% · confidence high
- 90
Machine-readable structure
The page describes itself well to machines.
weight 18% · confidence high
- 100
Access & renderability
Agents can read this page without a browser.
weight 18% · confidence high
- 76
Form semantics
Forms are labelled and typed — an agent can fill them.
weight 16% · confidence high
- 99
Actionability
Actions are real links, buttons and forms.
weight 15% · confidence high
- 0
WebMCP capabilitysuperpower
No WebMCP tools — the single biggest upgrade available here.
weight 15% · confidence medium
Find
frictionCan an agent locate this page and its entry points?
Agent discovery
60/1003 of 5 discovery signals present.
lowNo llms.txtAn optional Markdown file that tells LLM-based agents what the site is and where the important pages are. Cheap to add; adoption by agents is still emerging.▶
Evidence
- llms.txt · https://en.wikipedia.org/llms.txt not found
Fix
Add /llms.txt (Markdown).
Five minutes of work; some agents and Lighthouse's agentic audit already look for it.
# en.wikipedia.org > One-paragraph description of what this site is for and who it serves. ## Key pages - [Home](https://en.wikipedia.org/): what visitors can do here - [Docs](https://en.wikipedia.org/docs): how to use the product
lowNo MCP discovery filesNothing under /.well-known tells an agent whether this site exposes an MCP server. Only relevant if you run one — but if you do, this is how agents find it.▶
Evidence
- well-known · https://en.wikipedia.org/.well-known/oauth-protected-resource, mcp.json, mcp/server-card.json not found
Fix
If you host an MCP server, publish /.well-known/oauth-protected-resource.
Required by the MCP authorization spec; clients use it to locate your authorization server.
{
"resource": "https://en.wikipedia.org/mcp",
"authorization_servers": ["https://auth.en.wikipedia.org"],
"scopes_supported": ["read"],
"bearer_methods_supported": ["header"]
}3 things already working
- ✓robots.txt present and permits agents — Crawlers and user agents are allowed to read this page.
- ✓Sitemap available — Declared in robots.txt: https://en.wikipedia.org/w/rest.php/site/v1/sitemap/0
- ✓Feed advertised — An RSS/Atom feed is declared, giving agents a structured view of new content.
Understand
clearCan it tell what the page is without guessing?
Machine-readable structure
90/100The page describes itself well to machines.
lowMissing meta descriptionTitle and description are the first summary an agent reads when deciding whether this page is relevant.▶
Evidence
- raw-html · title: "Web browser - Wikipedia"; description: none
Fix
Add a specific <title> and meta description.
Cheap, universal, and used by every agent and crawler.
<title>What this page is — en.wikipedia.org</title> <meta name="description" content="One sentence saying what a visitor (or agent) can do here.">
3 things already working
- ✓Structured data: Article — 1 valid JSON-LD block. Agents can read entities and their properties directly.
- ✓Semantic landmarks present — main, nav, header/footer
- ✓Clean heading outline — One h1, 12 headings, no skipped levels.
Access & renderability
100/100Agents can read this page without a browser.
3 things already working
- ✓Response headers allow agent access — No noindex/noai directives or bot-management headers detected.
- ✓No CAPTCHA markup detected — No reCAPTCHA, hCaptcha, or Turnstile widgets found in the raw HTML.
- ✓Content is readable without JavaScript — Primary content appears in the raw HTML; no JS-dependence heuristics fired.
Act
frictionCan it complete the task — book, buy, submit?
Form semantics
76/100Forms are labelled and typed — an agent can fill them.
mediumPlaceholder used as the only label1 control relies on placeholder text alone — agents and screen readers cannot see it once the field has a value.▶
Evidence
- raw-html · form#vector-sticky-search-form > div > div > input @ form#vector-sticky-search-form > div > div > input
Fix
Add a visible <label> for each field.
What helps screen readers helps agents.
<label for="search">Search Wikipedia</label> <input id="search" name="search" type="search">
highUnlabelled form controls1 control has no accessible name — an agent cannot tell what to enter.▶
Evidence
- raw-html · form#vector-sticky-search-form > div > div > input @ form#vector-sticky-search-form > div > div > input
Fix
Associate every control with a <label> or aria-label.
Labels are the primary signal for what a field wants.
<label for="search">Search Wikipedia</label> <input id="search" name="search" type="search">
mediumControls missing a name attribute8 controls lack name — without a name the value cannot be submitted or described in a tool schema.▶
Evidence
- raw-html · input#vector-main-menu-dropdown-checkbox @ input#vector-main-menu-dropdown-checkbox
- raw-html · input#vector-appearance-dropdown-checkbox @ input#vector-appearance-dropdown-checkbox
- raw-html · input#vector-user-links-dropdown-checkbox @ input#vector-user-links-dropdown-checkbox
Fix
Add a name attribute to every control.
Agents need stable field keys for submission and tool schemas.
<label for="vector-main-menu-dropdown-checkbox">Main menu</label> <input id="vector-main-menu-dropdown-checkbox" name="vector-main-menu-dropdown-checkbox" type="checkbox">
highControls outside a <form>inputs outside a <form> cannot be submitted by an agent without executing scripts▶
Evidence
- raw-html · input#vector-main-menu-dropdown-checkbox @ input#vector-main-menu-dropdown-checkbox
- raw-html · input#vector-appearance-dropdown-checkbox @ input#vector-appearance-dropdown-checkbox
- raw-html · input#vector-user-links-dropdown-checkbox @ input#vector-user-links-dropdown-checkbox
Fix
Wrap controls in a <form> with an explicit submit control.
Agents submit forms via standard HTML — not div onclick handlers.
<form action="/submit" method="post"> …fields… <button type="submit">Submit</button> </form>
mediumMissing submit affordance8 controls are not inside a form with a submit button — an agent cannot send the values.▶
Evidence
- raw-html · input#vector-main-menu-dropdown-checkbox @ input#vector-main-menu-dropdown-checkbox
- raw-html · input#vector-appearance-dropdown-checkbox @ input#vector-appearance-dropdown-checkbox
- raw-html · input#vector-user-links-dropdown-checkbox @ input#vector-user-links-dropdown-checkbox
Fix
Add a submit button inside the owning form.
Agents need a standard submit control to complete form actions.
<form action="/submit" method="post"> <label for="vector-main-menu-dropdown-checkbox">Main menu</label> <input id="vector-main-menu-dropdown-checkbox" name="vector-main-menu-dropdown-checkbox" type="checkbox"> <button type="submit">Submit</button> </form>
Actionability
99/100Actions are real links, buttons and forms.
medium9 links have no destinationThese anchors do not expose a usable navigation target.▶
Evidence
- raw-html · li#toc-mw-content-text > a
<a href="#" class="vector-toc-link"> <div class="vector-toc-text">(Top)</div> </a>
- raw-html · a#ca-talk-sticky-header
<a href="#" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only" id="ca-talk-sticky-heade…
- raw-html · a#ca-subject-sticky-header
<a href="#" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only" id="ca-subject-sticky-he…
- raw-html · a#ca-history-sticky-header
<a href="#" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only" id="ca-history-sticky-he…
- raw-html · a#ca-watchstar-sticky-header
<a href="#" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only mw-watchlink" id="ca-watc…
Fix
Replace the non-native control with the matching native HTML element.
Native controls are keyboard-operable, appear in the accessibility tree, and are what agents (and WebMCP) can target.
<!-- Use a button for an in-page action --> <button type="button">Open cart</button> <!-- Or give navigation a real destination --> <a href="/cart">View cart</a>
1 thing already working
- ✓Primary action 'Search' is a real <form> — The page's primary action is directly invokable from its raw HTML.
WebMCP capability
0/100No WebMCP tools — the single biggest upgrade available here.
highNo WebMCP tools — this is the biggest single upgrade availableWebMCP lets a page hand an agent a named, typed tool instead of a form it has to reverse-engineer. Browsers in the Chrome/Edge origin trial and agent clients such as ChatGPT Desktop already call these tools. The "+N" on this report is what declaring one is worth to your score. Note that we only read the served HTML: a tool registered from a JavaScript bundle would be invisible to us.▶
Evidence
- raw-html · Form available to declare as a tool: form#searchform @ form#searchform
Fix
Declare your "Search" form as a tool
The declarative attributes are the cheapest path: the browser synthesizes the JSON Schema from the controls you already have.
<form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button" toolname="searchform" tooldescription="Search"> <input id="searchInput" name="search" type="search" toolparamdescription="Search Wikipedia"> <!-- …your existing labels and submit button stay as they are… --> </form>
infoSame tool, imperative APIIf the form is rendered by JavaScript or the tool needs to do more than submit, register it imperatively. execute() resolves to a plain JSON-serializable value; the browser stringifies it.▶
Evidence
- raw-html · Form available to declare as a tool: form#searchform @ form#searchform
Fix
Register the tool with document.modelContext.registerTool.
WebMCP is not on by default in any shipping browser yet, so include the polyfill: <script src="https://unpkg.com/@mcp-b/webmcp-polyfill@5.1.0/dist/index.iife.js" integrity="sha384-ZLqD1afbu2b2LJVDDqBf95wR/DGWh5FT1bx6E2S+4uMPdMOc8QGIIfw2gBWLKIB2" crossorigin="anonymous"></script>
// Until Chrome ships WebMCP by default, include the polyfill:
// <script src="https://unpkg.com/@mcp-b/webmcp-polyfill@5.1.0/dist/index.iife.js" integrity="sha384-ZLqD1afbu2b2LJVDDqBf95wR/DGWh5FT1bx6E2S+4uMPdMOc8QGIIfw2gBWLKIB2" crossorigin="anonymous"><\/script>
// Generated from the form at https://en.wikipedia.org/wiki/Web_browser
document.modelContext.registerTool({
name: "searchform",
description: "Search",
inputSchema: {
"type": "object",
"properties": {
"search": {
"type": "string",
"description": "Search Wikipedia"
}
}
},
async execute(input) {
const form = document.forms[0]; // 0: the "searchform" form
if (!(form instanceof HTMLFormElement)) throw new Error("searchform: form not found on this page");
for (const [key, value] of Object.entries(input)) {
const field = form.elements.namedItem(key);
if (field instanceof HTMLInputElement && field.type === "checkbox") {
field.checked = Boolean(value);
} else if (
field instanceof HTMLInputElement ||
field instanceof HTMLTextAreaElement ||
field instanceof HTMLSelectElement ||
field instanceof RadioNodeList
) {
field.value = String(value);
}
}
form.requestSubmit();
return "Submitted searchform"; // plain JSON-serializable value — not an MCP { content } envelope
},
});Fetched Wed, 14 Oct 2026 19:25:59 GMT in 0.9s · HTTP 200 · 9 discovery files checked · rendered DOM: skipped
Rendered-DOM checks are not run in v1; JavaScript dependence is estimated from the raw HTML.