wikipedia.org
https://www.wikipedia.org/?smoke=1788200419070
No WebMCP API Scanned 1 hour ago Tier 1 1 page(s)
Readiness Report
This site exposes no WebMCP tools yet. Here is every surface that should become one.
Findings
- Info No /llms.txt. Not required for WebMCP, but it is the cheapest agent-readiness signal you can ship.
Header snippet — structured data
Paste into your builder's header code slot (ClickFunnels: Show Code → Header Code). This is metadata, not behaviour: it does not register tools, it tells crawlers and agents what this page can do before they act. It is what the adjacent-readiness score measures.
<!-- agentready — structured data for https://www.wikipedia.org/?smoke=1788200419070
WHERE TO PASTE THIS: your builder's HEADER code slot.
ClickFunnels: Show Code > Header Code.
Unlike the footer snippet, this is metadata rather than behaviour: it does not wait for
anything to render, and it belongs in the document head.
It does NOT register WebMCP tools — the footer snippet does that. This is what a crawler or
an agent reads before it decides to act, and it is what the report's adjacent-readiness
pillar scores. -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"url": "https://www.wikipedia.org/?smoke=1788200419070",
"name": "WikipediaClose",
"potentialAction": {
"@type": "SearchAction",
"name": "search_site",
"description": "Calling this tool searches Wikipedia and returns matching page results based on the provided search terms and language.",
"target": {
"@type": "EntryPoint",
"urlTemplate": "https://www.wikipedia.org/?smoke=1788200419070{?search}",
"actionPlatform": [
"https://schema.org/DesktopWebPlatform",
"https://schema.org/MobileWebPlatform"
]
},
"query-input": "required name=search"
}
}
</script>
Suggested tools (1)
Each block is a paste-in patch. Declarative attributes only — no JavaScript; Chrome compiles the schema for you.
Calling this tool searches Wikipedia and returns matching page results based on the provided search terms and language.
Footer snippet (no markup access needed)
Paste into your builder's footer code slot (ClickFunnels: Show Code → Footer Code). Requires no access to the HTML. The header slot also works, but the footer registers immediately.
// agentready — registers search_site as a WebMCP tool at runtime.
// Page: https://www.wikipedia.org/?smoke=1788200419070
//
// WHERE TO PASTE THIS: your builder's FOOTER code slot (body, at the end of the page).
// ClickFunnels: Show Code > Footer Code.
// The header slot also works — the snippet waits for the API and the element — but the
// footer registers immediately instead of waiting for a poll, so prefer the footer.
// It needs no markup changes, which is the point: it works where you cannot edit the HTML.
(function () {
'use strict';
var CONFIG = {
"tool": {
"name": "search_site",
"description": "Calling this tool searches Wikipedia and returns matching page results based on the provided search terms and language.",
"inputSchema": {
"type": "object",
"properties": {
"search": {
"type": "string",
"description": "Search Wikipedia."
},
"language": {
"type": "string",
"description": "Language."
}
}
},
"destructive": false
},
"root": {
"mode": "byId",
"id": "search-form"
},
"surfaceLabel": "form#search-form",
"steps": null,
"fields": [
"search",
"language"
],
"unfillable": []
};
// The API moved from navigator.modelContext to document.modelContext; support both.
function modelContext() {
var mc = (typeof document !== 'undefined' && document.modelContext) ||
(typeof navigator !== 'undefined' && navigator.modelContext);
return (mc && typeof mc.registerTool === 'function') ? mc : null;
}
// Builders render late; wait rather than assume.
function waitFor(resolve, timeoutMs) {
return new Promise(function (done) {
var found = resolve();
if (found) return done(found);
var observer = new MutationObserver(function () {
var hit = resolve();
if (hit) { observer.disconnect(); clearTimeout(timer); done(hit); }
});
observer.observe(document.documentElement, { childList: true, subtree: true, attributes: true });
var timer = setTimeout(function () { observer.disconnect(); done(null); }, timeoutMs || 10000);
});
}
function findRoot() { return document.getElementById(CONFIG.root.id); }
function findField(root, name) {
var all = root.querySelectorAll('input, select, textarea');
for (var i = 0; i < all.length; i++) if (all[i].name === name) return all[i];
return null;
}
// Native setter + input/change events: frameworks ignore a plain .value assignment.
function setField(root, name, value) {
if (value === undefined || value === null || !root) return false;
var el = findField(root, name);
if (!el) return false;
var proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype
: el instanceof HTMLSelectElement ? HTMLSelectElement.prototype
: HTMLInputElement.prototype;
var setter = Object.getOwnPropertyDescriptor(proto, 'value');
if (setter && setter.set) setter.set.call(el, String(value)); else el.value = String(value);
el.dispatchEvent(new Event('input', { bubbles: true }));
el.dispatchEvent(new Event('change', { bubbles: true }));
return true;
}
function fail(message) { return { success: false, error: message }; }
function register(mc) {
mc.registerTool({
name: CONFIG.tool.name,
description: CONFIG.tool.description,
inputSchema: CONFIG.tool.inputSchema,
annotations: { readOnlyHint: false, destructiveHint: CONFIG.tool.destructive },
execute: async function (args) {
args = args || {};
var root = await waitFor(findRoot, 10000);
if (!root) {
return fail('The ' + CONFIG.surfaceLabel + ' surface was not on the page. ' +
'If it is inside a popup, open the popup first.');
}
for (var k = 0; k < CONFIG.fields.length; k++) setField(root, CONFIG.fields[k], args[CONFIG.fields[k]]);
var submit = root.querySelector('a[href*="submit"], button[type="submit"], input[type="submit"], a.elButton');
if (!submit) return fail('Filled the fields but found no submit control.');
submit.click();
return { success: true, submitted: true };
}
});
}
// Waits for both the WebMCP API and the element. The poll is there because the API appearing
// is not a DOM mutation, so an observer alone would never fire for it.
(function install() {
var done = false;
function attempt() {
if (done) return true;
var mc = modelContext();
if (!mc) return false;
var root = null;
try { root = findRoot(); } catch (e) { root = null; }
if (!root) return false;
done = true;
stop();
register(mc);
return true;
}
function stop() {
if (observer) observer.disconnect();
clearInterval(poll);
clearTimeout(giveUp);
}
if (attempt()) return;
var observer = typeof MutationObserver === 'function' ? new MutationObserver(attempt) : null;
if (observer && document.documentElement) {
observer.observe(document.documentElement, { childList: true, subtree: true, attributes: true });
}
var poll = setInterval(attempt, 250);
var giveUp = setTimeout(stop, 20000); // this page does not have the surface
})();
})();
Paste-in patch
<form id="search-form" action="https://www.wikipedia.org/search-redirect.php" toolname="search_site" tooldescription="Calling this tool searches Wikipedia and returns matching page results based on the provided search terms and language." > <input name="search" type="search" toolparamdescription="Search Wikipedia." /> <select name="language" toolparamdescription="Language."></select> <!-- ...your existing markup... --> </form>
Generated schema
{
"type": "object",
"properties": {
"search": {
"type": "string",
"description": "Search Wikipedia."
},
"language": {
"type": "string",
"description": "Language."
}
}
}
Raw data
The same report as JSON: /v1/scans/scan_9b2fa81567d3490c84cc4d50