Skip to content
Effloow
← Back to article
EFFLOOW LAB LAB-RUN

Webmcp Browser Agent Open Standard Poc 2026

Evidence notes document the bounded local or source-based checks behind an Effloow article. They are not product endorsements, legal advice, or benchmark claims.

Date: 2026-05-29 Track: sandbox-poc Slug: webmcp-browser-agent-open-standard-poc-2026

Goal

Verify the developer-facing shape of WebMCP with a small local sandbox before writing the article. The goal was not to claim native Chrome origin-trial execution. The goal was to confirm that a page-level tool can be described with a structured schema, registered through a WebMCP-like interface, and called deterministically.

Environment

  • OS: macOS
  • Shell: zsh
  • Working directory: /Users/jangwook/Documents/workspace/www.effloow.com
  • Node.js: v25.9.0
  • npm: 11.12.1
  • Date used for article metadata: 2026-05-29

Source Verification

Sources checked before the sandbox:

  • Google Developers Blog, "All the news from the Google I/O 2026 Developer keynote"
  • Chrome for Developers, "15 updates from Google I/O 2026"
  • webmachinelearning/webmcp GitHub repository
  • GoogleChromeLabs/webmcp-tools GitHub repository
  • Puppeteer WebMCP guide
  • WebMCP demo/library site
  • arXiv:2508.09171

Important source constraints:

  • Google describes WebMCP as a proposed open web standard.
  • Google says the experimental origin trial starts in Chrome 149.
  • Puppeteer documentation says WebMCP requires Chrome 149+ and browser flags.
  • This local machine did not run a native WebMCP browser origin-trial session.

Commands And Outputs

Check Node.js

node --version

Output:

v25.9.0

Check npm

npm --version

Output:

11.12.1

Inspect the WebMCP demo package

npm view @jason.today/webmcp version description license repository --json

Output:

{
  "version": "0.1.13",
  "description": "WebSocket-based Model Context Protocol implementation",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jasonjmcghee/webmcp.git"
  }
}

Inspect latest Puppeteer package metadata

npm view puppeteer version --json

Output:

"25.1.0"

Check local Puppeteer availability

node -e "try{require.resolve('puppeteer'); console.log('puppeteer-installed')}catch(e){console.log('puppeteer-not-installed')}"

Output:

puppeteer-not-installed

Run a minimal WebMCP-like registration mock

node <<'NODE'
const registered = [];
const modelContext = {
  registerTool(definition, handler) {
    if (!definition || typeof definition.name !== 'string') throw new Error('tool name required');
    if (!definition.inputSchema || definition.inputSchema.type !== 'object') throw new Error('object input schema required');
    registered.push({ definition, handler });
  }
};
modelContext.registerTool({
  name: 'calculate_refund_window',
  description: 'Return the deadline and eligibility label for a purchase date.',
  inputSchema: {
    type: 'object',
    properties: {
      purchaseDate: { type: 'string', pattern: '^\\d{4}-\\d{2}-\\d{2}$' },
      returnDays: { type: 'integer', minimum: 1, maximum: 90 }
    },
    required: ['purchaseDate', 'returnDays']
  }
}, ({ purchaseDate, returnDays }) => {
  const start = new Date(`${purchaseDate}T00:00:00Z`);
  const deadline = new Date(start.getTime() + returnDays * 86400000);
  return { deadline: deadline.toISOString().slice(0, 10), label: returnDays <= 30 ? 'standard' : 'extended' };
});
const call = registered[0].handler({ purchaseDate: '2026-05-29', returnDays: 14 });
console.log(JSON.stringify({ registeredTools: registered.map(t => ({ name: t.definition.name, required: t.definition.inputSchema.required })), call }, null, 2));
NODE

Output:

{
  "registeredTools": [
    {
      "name": "calculate_refund_window",
      "required": [
        "purchaseDate",
        "returnDays"
      ]
    }
  ],
  "call": {
    "deadline": "2026-06-12",
    "label": "standard"
  }
}

What Worked

  • A schema-backed tool descriptor can be represented in a compact page-level JavaScript object.
  • The handler can return deterministic structured output without DOM scraping.
  • The local mock clearly demonstrates the contract shape: name, description, input schema, required fields, handler, and structured result.
  • Package inspection found a public WebMCP demo package (@jason.today/webmcp) and a current Puppeteer package version.

What Failed Or Was Not Attempted

  • Native Chrome WebMCP execution was not attempted because the official origin trial is Chrome 149 and local Puppeteer was not installed.
  • No browser flags were enabled.
  • No MCP client was connected to the demo package.
  • No production website or authenticated session was tested.

Limitations

  • This PoC validates the developer contract shape, not browser-native interoperability.
  • The local mock does not prove Gemini in Chrome support.
  • The mock does not validate user-consent UX, origin isolation, extension behavior, or browser permission prompts.
  • The article should describe WebMCP as early, experimental, and suitable for exploration, not as a production baseline.

Read the article

This note supports the public article and records what was actually checked.

Open article →