Skip to main content
Back to docs
WebMCP — In-Browser Model Context Protocol

WebMCP

Every page on Solid# registers its own verbs with the browser’s in-page agent runtime via navigator.modelContext. No extension, no stdio bridge, no API key. The agent is already in the user’s browser — we hand it the tools.

31 verbs live across 5 surfaces. Match-pattern integration: tools are emitted by the same generators that render the page. Same JSON-LD vocab as stdio MCP and UCP — one registry, three transports.

How It Works

On every Solid# page, a small client provider feature-detects navigator.modelContext and registers the verbs allowed for that page. If the browser doesn’t support WebMCP, the provider no-ops cleanly. If it does, the agent sees the tools instantly.

Feature-detect WebMCP in any page
if (navigator.modelContext) {
  await navigator.modelContext.registerTool({
    name: "view_pricing",
    description: "Navigate to Solid#'s pricing page.",
    inputSchema: { type: "object", properties: {}, additionalProperties: false },
    annotations: { readOnly: true, destructive: false, idempotent: true },
    execute: async () => {
      window.location.assign("/pricing");
      return { navigated: true, path: "/pricing" };
    },
  });
}

You don’t register tools by hand on Solid# pages — our generators do it. But this is the wire-level contract we sit on top of.

Five Surfaces, One Vocabulary

Each Solid# surface has its own catalog of verbs. They’re all backed by the same JSON-LD registry on the backend, so external agents that speak stdio MCP, UCP, or in-browser WebMCP see consistent metadata.

public

8 verbs

solidnumber.com marketing site — read-only navigation verbs an in-browser agent can call without an account.

view_pricing · view_features · book_demo · start_signup

dashboard (reads)

10 verbs

Tenant operator dashboard. Read-only inspection (contacts, calls, calendar, KB). Auth + RLS-scoped.

list_contacts · view_calendar · search_kb

dashboard (writes)

5 verbs

Tenant operator dashboard write verbs. Each goes through the consent ladder + idempotency-key gate.

create_contact · send_message · book_appointment

tenant-site (reads)

3 verbs

Tenant’s own customer-facing site. Read verbs (browse products, view pricing, read services).

list_products · list_services · view_pricing

tenant-site (writes)

5 verbs

Tenant’s customer-facing site. Write verbs (request quote, schedule, contact, buy). Consent + UCP-mediated for monetary actions.

request_quote · schedule_visit · submit_contact

Manifest & Execute

The same WebMCP verbs are introspectable as a server-side manifest — useful for crawlers, agent training pipelines, and solid graph.

Public-surface manifest
curl https://api.solidnumber.com/webmcp/manifest?surface=public

Returns the JSON-LD verb catalog. Each entry has a resolvable IRI under https://api.solidnumber.com/webmcp/tools/{name} — the platform-canonical identifier shared by stdio MCP and UCP.

Server-side execute (dashboard surface, auth required)
curl -X POST https://api.solidnumber.com/webmcp/execute \
  -H 'Authorization: Bearer <api-key>' \
  -H 'Idempotency-Key: <opaque b64url>' \
  -H 'Content-Type: application/json' \
  -d '{"tool": "create_contact", "input": {"name": "Ada", "email": "ada@example.com"}}'

The in-browser path is the primary one; the server-side execute exists so a non-browser agent can call the same verb without re-implementing the schema.

CLI

The Solid# CLI (@solidnumber/cli v2.7.0+) ships first-class WebMCP commands. Every command supports --json for agent consumption.

Browse the manifest
# List verbs on a surface
solid webmcp manifest --surface public
solid webmcp manifest --surface dashboard --json

# Inspect one verb (input schema, annotations, IRI)
solid webmcp verb view_pricing

# Execute a verb (idempotency-key auto-generated)
solid webmcp execute create_contact --input '{"name":"Ada","email":"ada@example.com"}'

Consent Ladder

Public-surface (marketing) verbs are read-only and don’t prompt. Every other surface inherits the same 4-rung consent ladder used by UCP and the tenant API:

once

Single-call grant. Re-prompts next time.

session

Granted for the current browser session. Cleared on tab close.

permanent

Persisted grant. Revocable from settings.

deny

Negative grant. Suppresses future prompts.

Revocation is immediate. Every grant + revocation writes an append-only audit event. Retention follows the subscription tier (starter 30d → enterprise 365d).

Match-Pattern Integration

WebMCP is not a side-system on Solid#. It’s a transport on top of the same JSON-LD vocabulary that powers our other agent surfaces:

  • Vocab. solid:MCPTool and solid:Verb are first-class types in our Schema.org-extended JSON-LD.
  • Generators. Site/page/block generators auto-attach verbs at write time via the intent detector — not as a post-process.
  • Renderer. The page renderer emits the matching<script type="application/ld+json"> and registers the verbs client-side in the same render pass.
  • One registry, three transports. services/webmcp/tool_registry.py is the source of truth for stdio MCP, UCP capabilities, and WebMCP in-browser verbs.

Browser Support

WebMCP is a W3C draft (w3c/webmcp). As of 2026-05, it ships behind a flag in Chrome Canary and is being prototyped in agent browsers (Arc, Comet, Dia, etc.).

Solid# pages feature-detect navigator.modelContext. When it’s absent, the registration is a no-op — the page renders normally for human visitors and stdio-MCP / UCP transports continue to work without it.

We ship WebMCP today because the cost of having it is near-zero and the upside (the first agent to land on a Solid# page can act immediately) is large.

Related

WebMCP is a W3C draft. Spec: github.com/w3c/webmcp. Solid# implements 31 verbs across 5 surfaces.
SolidNumber — AI That Answers Calls, Books Jobs & Runs Your Business