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.
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.
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 verbssolidnumber.com marketing site — read-only navigation verbs an in-browser agent can call without an account.
view_pricing · view_features · book_demo · start_signupdashboard (reads)
10 verbsTenant operator dashboard. Read-only inspection (contacts, calls, calendar, KB). Auth + RLS-scoped.
list_contacts · view_calendar · search_kbdashboard (writes)
5 verbsTenant operator dashboard write verbs. Each goes through the consent ladder + idempotency-key gate.
create_contact · send_message · book_appointmenttenant-site (reads)
3 verbsTenant’s own customer-facing site. Read verbs (browse products, view pricing, read services).
list_products · list_services · view_pricingtenant-site (writes)
5 verbsTenant’s customer-facing site. Write verbs (request quote, schedule, contact, buy). Consent + UCP-mediated for monetary actions.
request_quote · schedule_visit · submit_contactManifest & Execute
The same WebMCP verbs are introspectable as a server-side manifest — useful for crawlers, agent training pipelines, and solid graph.
curl https://api.solidnumber.com/webmcp/manifest?surface=publicReturns 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.
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.
# 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:
onceSingle-call grant. Re-prompts next time.
sessionGranted for the current browser session. Cleared on tab close.
permanentPersisted grant. Revocable from settings.
denyNegative 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:MCPToolandsolid:Verbare 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.pyis 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.