WebMCP tool authoring
Small businesses already run real portals for appointments, work orders and customer records. What they don't have is an engineer to turn those portals into agent tools, and often cannot justify building a separate agent API. ToolMint watches a trusted operator perform the task one time, then compiles that demonstration into an owner-approved, typed and verified WebMCP capability.
One script tag. No new workflow API or MCP server. No hand-written tool handler. No ToolMint-specific data-* annotations.
ToolMint hosts the SDK and the control plane; the owner adds one script tag, which reads its own configuration from its URL.
Paste this once
<script type="module" src="https://toolmint-8hcl.onrender.com/sdk/toolmint-sdk.js ?siteId=northstar-auto &surfaceId=customer-portal"></script>
›Add directly to the page, or through an approved
script-management setup
›apiBase defaults to wherever the SDK was served from
›can be served cross-origin when the site origin is
explicitly allowed
Then record, either way
The SDK renders a small ToolMint launcher for signed-in operators. Click Record a capability and the recorder loads straight into the page. Nothing to install — a judge, or a shop owner, can author a tool from a URL.
Prefer a browser-level authoring surface? The extension uses the same recorder and the same backend, on a ToolMint-configured page.
›Same recorder, same compiler, same release
›Non-author users receive the runtime tools but no recorder UI
During the demonstration, ToolMint records relevant field changes, activated controls, same-origin network evidence, status messages, and meaningful before-and-after page state. The owner reviews the inferred inputs and policy before anything is published.
The owner does this once
›relevant field changes
›activated controls, one of them a lookup
›same-origin network evidence
›two status messages — lookup, then reschedule
›meaningful before-and-after page state
Agent-facing contract excerpt
{ "name": "reschedule_appointment", "description": "Reschedule an existing appointment to a new date and time.", "inputSchema": { "type": "object", "properties": { "appointment_id": { "type": "string", "title": "Appointment ID" }, "new_date": { "type": "string", "format": "date", "title": "New date" }, "new_time": { "type": "string", "title": "New time" } }, "required": ["appointment_id", "new_date", "new_time"], "additionalProperties": false }, "annotations": { "readOnlyHint": false } }
This is the part an agent reads. The approved release also carries the replay recipe, the success proofs, the failure conditions, the owner's policy and the provenance of the recording.
Simplified native registration
await document.modelContext.registerTool({ ...release.contract, execute: async (input, options = {}) => execute(input, { signal: options.signal }) }, { signal });
Registration happens once the authenticated page session and the capability catalog have loaded — not simply on every page load. Revoking a release aborts its signal.
What happens in between
The operator does the job once, in the live site, signed in as themselves. The recorder watches the fields they touch, the controls they activate, the status message, and which parts of the page actually changed.
Real workflows include fumbling. ToolMint compiles through the final successful boundary. Earlier successful steps become checkpoints; failed attempts are excluded from replay and preserved as known failure conditions.
checkpointfinal appointment rescheduled
Each non-sensitive candidate field becomes a typed parameter, a fixed value, or nothing at all. Proof templates are extracted from observed status text, with recorded values swapped back out for parameters.
used by proofnew_time input
used by proofproof "Appointment {{appointment_id}} rescheduled to {{new_date|date_long}} at {{new_time|time_short}}."
The owner decides what an agent may set, what stays fixed, and whether the tool needs confirmation. The server validates those decisions against the recorded candidates and recompiles the release from the original evidence.
The site's own confirmation flow stays authoritative. Choosepage
for an explicit ToolMint gate.
The release is versioned and stored against one site and surface. The SDK loads only its configured surface catalog, and the backend requires the matching application role. Open tabs pick up catalog changes within seconds.
ToolMint validates typed input first. When the recording contains a lookup, it runs that resolver and verifies the requested record before executing any later mutation step. Not every generated capability has a resolver phase.
In this recorded workflow an unknown appointment ID fails at resolve — before
the confirmation step, before a single field is written. The page is untouched and
the agent gets back a structured NOT_FOUND carrying the recorded page
recovery guidance.
Use the customer portal to teach and consume customer-facing tools. Use the owner portal to author private shop workflows. Each surface receives a different catalog.
The invocation path never contacts ToolMint. The backend is a design-time control plane for authentication, compilation, storage and revocation. Execution stays inside the site's own JavaScript and the user's existing authenticated session.
A tool returns success only after the page's persistent state matches an owner-approved proof, re-rendered against the actual invocation arguments. A capability that cannot prove anything changed cannot be published at all.
Releases are scoped by both siteId and surfaceId. In the demo,
one business runs two isolated portals: the owner records private shop capabilities,
and a customer's agent receives only the customer-facing ones.
The model may improve names and descriptions and recommend field or observed-network roles. It cannot invent locators, actions, values or proof evidence. The server validates every recommendation and recompiles the release deterministically from the recording.