This is what actually happens when you call the Reg Z threshold calculator through WebMCP, the draft W3C API that lets a web page offer tools to AI agents. It does not work on the first try, and that is the point: this page is a complete session, every command, every error the browser throws, what each one means, and the cryptographic receipt at the end. Nothing cleaned up, because the debugging is the useful part.
No prior experience with browser DevTools is assumed. Start with the working path below. The later sections preserve the original debugging record, including its two failures, so that a reader can identify and recover from the same problems. Every command is safe to paste repeatedly because it runs inside its own temporary scope.
Use this section if you want to see WebMCP working before reading the debugging history. It takes about three minutes and uses only public, synthetic regulatory data.
Close Chrome completely. Press Win+R, paste the command below into the Run box, and press Enter.
"C:\Program Files\Google\Chrome\Application\chrome.exe" --enable-features=WebMCPhttps://ainumbers.co/chaingraph/art-220-reg-z-threshold-lookup.htmlIn the page form, select QM Points and Fees, select 2026, and click Lookup Thresholds.
Press F12, choose the Console tab, click the prompt, and paste the complete block below. If Chrome first displays a warning about pasting, type allow pasting, press Enter, and paste the block again.
(async () => {
const webMcp = document.modelContext ?? navigator.modelContext;
if (!webMcp) throw new Error("WebMCP is unavailable. Restart Chrome with --enable-features=WebMCP.");
const tools = await webMcp.getTools();
console.log("WebMCP surface:", document.modelContext ? "document.modelContext" : "navigator.modelContext");
console.table(tools.map(({ name, description }) => ({ name, description })));
})();WebMCP surface: document.modelContext (or the older fallback) and shows a table with art-220-reg-z-threshold-lookup-compute.Paste this block into the same Console and press Enter. It sends two explicit inputs: the applicable regulatory table and the relevant year. It then formats the agent's structured answer as a readable table.
(async () => {
const webMcp = document.modelContext ?? navigator.modelContext;
if (!webMcp) throw new Error("WebMCP is unavailable.");
const tools = await webMcp.getTools();
const regZTool = tools.find(tool => tool.name === "art-220-reg-z-threshold-lookup-compute");
if (!regZTool) throw new Error("The Reg Z tool was not registered. Reload the page and try again.");
const response = JSON.parse(await webMcp.executeTool(
regZTool,
JSON.stringify({ tableType: "qm_points_fees", tableYear: 2026 })
));
const d = response.output_payload.data;
console.clear();
console.log("✓ WebMCP agent call succeeded");
console.table([{
tool: regZTool.name, table: "QM Points and Fees", year: 2026,
"Tier 1 minimum": `$${d.tier_1_min.toLocaleString()}`,
"Tier 1 percentage": `${d.tier_1_pct}%`,
"Tier 2 fixed": `$${d.tier_2_fixed.toLocaleString()}`,
"Tier 3 minimum": `$${d.tier_3_min.toLocaleString()}`,
"Tier 5 percentage": `${d.tier_5_pct}%`, source: d.fr_citation
}]);
})();✓ WebMCP agent call succeeded, followed by one row containing the tool name, 2026, the threshold values, and FR 2025-22773, effective 2026-01-01.Return to the calculator results. The agent call updates the same page view. Find Execution Hash (SHA-256), then click Verify Hash.
WebMCP is new, so Chrome keeps it behind a feature switch. This has to be done once, from a fully closed Chrome.
Close all open Chrome windows first. A window merely closing is not the same as Chrome fully quitting; the next step forces the issue.
Press Win+R to open the Run box, then paste this and press Enter:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --enable-features=WebMCPhttps://ainumbers.co/chaingraph/art-220-reg-z-threshold-lookup.htmlPaste the address into a new tab and press Enter. It is an ordinary page with two dropdowns; nothing about it looks different yet.
Everything from here on happens in the browser's built-in developer console.
With the calculator page in front, press F12.
Click the Console tab at the top of the DevTools panel, then click once inside the empty area below the tab. A blinking text cursor appears; this is where every command below gets pasted.
The very first paste into a fresh console does nothing except produce this yellow warning instead:
This is a one-time, real protection: it is aimed at a common scam where someone is talked into pasting code they cannot read. Type the words below at the console prompt and press Enter. Chrome remembers this permanently for this profile.
allow pastingPaste this into the console and press Enter:
(async () => {
const tools = await navigator.modelContext.getTools();
console.log(tools.length, tools[0].name);
})();navigator.modelContext did not exist, meaning the feature switch never took effect. The cause is sneaky: Chrome keeps background processes running even after every window is closed, so a flagged launch can silently open inside the old, unflagged instance instead of starting fresh.
Open a Command Prompt or PowerShell window and run:
taskkill /IM chrome.exe /F--enable-features=WebMCP) and reopen the calculator page.Back in the console (repeat step 2's "allow pasting" if this is a new profile), paste:
"modelContext" in navigatortrue.(async () => {
const tools = await navigator.modelContext.getTools();
console.log(tools.length, tools[0].name);
})();(async () => {
const mc = document.modelContext ?? navigator.modelContext;
const t = await mc.getTools();
console.log(t);
})();[], an empty list, on both surfaces.This page registered its tool on navigator.modelContext, which was correct when the integration shipped and passed its test harness. Newer Chrome moved the API to document.modelContext and turned the old path into a deprecated alias whose registrations quietly go nowhere. The page worked on the browser it was tested on and broke on the browser most visitors are now running. Draft APIs do this: a test that passed last month is not a test that passes today.
Before changing anything on the site, confirm the mechanism directly in the console:
document.modelContext.registerTool({
name: "probe-tool",
description: "probe",
inputSchema: { type: "object", properties: {} },
async execute() { return "ok"; }
});
console.log((await document.modelContext.getTools()).map(t => t.name));['probe-tool'].One line of output, and the diagnosis is confirmed: registration through document.modelContext lands; registration through the deprecated alias does not.
With the mechanism proven, the real calculator tool gets registered the new way (the page itself now does this at load) and called exactly as an agent would:
(async () => {
const webMcp = document.modelContext ?? navigator.modelContext;
const tools = await webMcp.getTools();
const tool = tools.find(t => t.name === "art-220-reg-z-threshold-lookup-compute");
if (!tool) throw new Error("Reg Z tool not registered; reload the page and try again.");
const result = JSON.parse(await webMcp.executeTool(
tool,
JSON.stringify({ tableType: "qm_points_fees", tableYear: 2026 })
));
console.log(result);
})();"Failed to parse input arguments.". The block above uses JSON.stringify(...) and can be pasted repeatedly without a duplicate-variable error.Two things happen at once. The Console receives a structured answer with pp (the input parameters) and output_payload (the returned regulatory data). The page itself renders the human view of the same result, because the tool drives the same function as the submit button. The hash is displayed on the page, not as a field in this particular Console response. The returned regulatory data is:
| fr_citation | FR 2025-22773, effective 2026-01-01 |
| tier_1_min | $137,958 |
| tier_1_pct | 3% |
| tier_2_fixed | $4,139 |
| tier_3_min | $27,592 |
| tier_3_pct | 5% |
| tier_4_fixed | $1,380 |
| tier_5_pct | 8% |
And beneath it, the execution hash:
sha256:43d43e1b5ac519566dd345496b655fe80a2f815428ab17703c092c15f490c8b6
The session found a live defect: the page registered its tool only on the deprecated surface, so current Chrome visitors got no tool at all. The fix is the pattern this site now ships:
Everything above is reproducible in about two minutes: launch Chrome with the flag (step 1), open the calculator, and paste the snippet from step 6. The registration is already done for you by the page. Compare the tier values with the form's output and check the hash.
The pattern here, one page serving humans through a form and agents through a tool with a shared receipt, is how every agent-callable calculator on this site works. WebMCP is a draft W3C specification; API names on this page reflect current Chrome behavior and may change again. Values shown are the pinned 2026 Reg Z table (FR 2025-22773); always verify at consumerfinance.gov before production compliance use.