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.

82 verbs live across 5 surfaces (31 curated + agent-attraction verbs). 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.
Phase 13 · LIVE 2026-05-15First SaaS to ship across every tenant subdomain

Born WebMCP-aware

WebMCP is a W3C draft (Microsoft + Google authors). Solid# is the first SaaS platform to ship it across every surface its tenants run — dashboard, customer portal, developer area, every tenant CMS page, AND solidnumber.com itself. The match-pattern integration means tenants are born WebMCP-aware: no opt-in step, no plug-in install. Every Solid# generator (Stitch, Nest, Blueprint, Alex CMS AI, page_writer) attaches verbs to interactive blocks at page-creation time. The agent reaches the user's browser and the tools are already there.

82
verbs live · 31 curated + agent-attraction verbs (auto-bridged)
5
surfaces · dashboard, portal, developer, tenant-site, public
Per-tenant
every subdomain mounts its own scoped catalog
Same vocab
as stdio MCP + UCP — three transports, one JSON-LD registry

Why this is a moat

  • No SDK required for tenants. Solid#'s page generators emit the tools at render time. A tenant who never edits a line of code still ships verbs to in-browser agents.
  • Match-pattern moat. When an agent (Claude.ai web, Chrome agent mode, Gemini in-page) visits any Solid# tenant, the verbs are already registered via navigator.modelContext. Other SaaS platforms need a per-page integration sprint. Solid# tenants get it for free.
  • Same JSON-LD verb vocabulary as the 4 sibling transports. CLI / MCP stdio / WebMCP / UCP all project from UNIFIED_VERB_REGISTRY. Add a verb once → it lights up everywhere. Backend parity test enforces it.
  • Per-company registration. Each tenant subdomain mounts <WebMcpTenantSiteProvider companyId={tenantId}/>. Solid#'s marketing verbs are gated to the root domain only. Per-tenant audit trails are preserved because write-verb IRIs resolve under /co/{company_id}/.

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 82 verbs across 5 surfaces (31 curated + agent-attraction verbs).
SolidNumber — AI That Answers Calls, Books Jobs & Runs Your Business