agentready
D

wikipedia.org

https://www.wikipedia.org/?smoke=1788200419070

No WebMCP API Scanned 1 hour ago Tier 1 1 page(s)

59.8
Score / 100

Readiness Report

This site exposes no WebMCP tools yet. Here is every surface that should become one.

This result is from an earlier scan. Re-scan to pick up any changes to the page — or to this scanner.
Actionable surfaces
20%
Annotatability
75%
Blockers
100%
Adjacent readiness
25%

Findings

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.

search_site Answer Needs labels first form#search-form LLM

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