π Web Mcp OpenClaw Plugin & Skill | ClawHub
Looking to integrate Web Mcp into your AI workflows? This free OpenClaw plugin from ClawHub helps you automate web & frontend development tasks instantly, without having to write custom tools from scratch.
What this skill does
WebMCP - Enable AI agents to interact with your web applications through structured tools. Implements the WebMCP standard for Next.js/React apps with tool registration, event bridge pattern, and contextual tool loading. Use when building AI-agent accessible web apps, adding MCP capabilities to existing projects, or creating tool-based interfaces for AI interactions.
Install
openclaw skills install @slemo54/web-mcpnpx clawhub@latest install web-mcpFull SKILL.md
Open original| name | version | description | user invocable |
|---|---|---|---|
| web-mcp | 1.0.0 | WebMCP - Enable AI agents to interact with your web applications through structured tools. Implements the WebMCP standard for Next.js/React apps with tool registration, event bridge pattern, and contextual tool loading. Use when building AI-agent accessible web apps, adding MCP capabilities to existing projects, or creating tool-based interfaces for AI interactions. | true |
SKILL.md content below is scrollable.
WebMCP
Enable AI agents to interact with your web applications through structured tools. WebMCP provides a clean, self-documenting interface between AI agents and your web app.
What is WebMCP?
WebMCP is a web standard that gives AI agents an explicit, structured contract for interacting with websites. Instead of screen-scraping or brittle DOM selectors, a WebMCP-enabled page exposes tools β each with:
- A name
- A JSON Schema describing inputs and outputs
- An executable function
- Optional annotations (read-only hints, etc.)
Quick Start
# Initialize WebMCP in your Next.js project
webmcp init
# Add a new tool
webmcp add-tool searchProducts
# Generate TypeScript types
webmcp generate-types
Core Concepts
1. Tool Definition
const searchTool = {
name: "searchProducts",
description: "Search for products by query",
inputSchema: {
type: "object",
properties: {
query: { type: "string", description: "Search query" }
},
required: ["query"]
},
outputSchema: { type: "string" },
execute: async (params) => {
// Implementation
},
annotations: {
readOnlyHint: "true"
}
};
2. Contextual Tool Loading
Tools are registered when components mount and unregistered when they unmount:
useEffect(() => {
registerSearchTools(); // Tools appear to agent
return () => {
unregisterSearchTools(); // Tools disappear
};
}, []);
3. Event Bridge Pattern
Tools communicate with React through CustomEvents:
Agent β execute() β dispatch CustomEvent β React updates β signal completion β Agent receives result
Architecture
βββββββββββββββββββββββββββββββββββββββββββ
β Browser (navigator.modelContext) β
β β
β βββββββββββββ registers/ ββββββ β
β β AI Agent ββββunregistersβββββweb β β
β β (Claude) β tools βmcpβ β
β β β β.tsβ β
β β callsββββββΌββββββββββββββββββΊβ β β
β βββββββββββββ ββββ¬ββ β
β β β
β CustomEventβ β
β dispatch β β
β βΌ β
β ββββββββββββββββββββββββββββββββββββ β
β β React Component Tree β β
β β β β
β β ββββββββββββ ββββββββββββ β β
β β β/products β β /cart β β β
β β βuseEffect:β βuseEffect:β β β
β β β register β β register β β β
β β β search β β cart β β β
β β β tools β β tools β β β
β β ββββββββββββ ββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββ
Installation
# In your Next.js project
npx webmcp init
# Or install globally
npm install -g @webmcp/cli
webmcp init
Usage
1. Initialize WebMCP
webmcp init
This creates:
lib/webmcp.ts- Core implementationhooks/useWebMCP.ts- React hookcomponents/WebMCPProvider.tsx- Provider component
2. Define Tools
// lib/webmcp.ts
export const searchProductsTool = {
name: "searchProducts",
description: "Search for products",
execute: async (params) => {
return dispatchAndWait("searchProducts", params, "Search completed");
},
inputSchema: {
type: "object",
properties: {
query: { type: "string" }
},
required: ["query"]
},
annotations: { readOnlyHint: "true" }
};
3. Register in Components
// app/products/page.tsx
"use client";
import { useEffect, useState } from "react";
import { registerProductTools, unregisterProductTools } from "@/lib/webmcp";
export default function ProductsPage() {
const [results, setResults] = useState([]);
const [completedRequestId, setCompletedRequestId] = useState(null);
// Signal completion after render
useEffect(() => {
if (completedRequestId) {
window.dispatchEvent(
new CustomEvent(`tool-completion-${completedRequestId}`)
);
setCompletedRequestId(null);
}
}, [completedRequestId]);
// Register tools + listen for events
useEffect(() => {
const handleSearch = (event: CustomEvent) => {
const { requestId, query } = event.detail;
// Perform search
setResults(searchProducts(query));
if (requestId) setCompletedRequestId(requestId);
};
window.addEventListener("searchProducts", handleSearch);
registerProductTools();
return () => {
window.removeEventListener("searchProducts", handleSearch);
unregisterProductTools();
};
}, []);
return <div>{/* Product UI */}</div>;
}
CLI Commands
| Command | Description |
|---|---|
webmcp init |
Initialize WebMCP in project |
webmcp add-tool <name> |
Add new tool definition |
webmcp generate-types |
Generate TypeScript types |
webmcp example <type> |
Create example project |
Tool Types
Read-Only Tools
{
name: "viewCart",
description: "View cart contents",
annotations: { readOnlyHint: "true" }
}
Mutating Tools
{
name: "addToCart",
description: "Add item to cart",
annotations: { readOnlyHint: "false" }
}
Tools with Parameters
{
name: "setFilters",
inputSchema: {
type: "object",
properties: {
category: { type: "string", enum: ["electronics", "clothing"] },
maxPrice: { type: "number" }
}
}
}
Examples
E-Commerce
webmcp example e-commerce
Features:
- Product search
- Cart management
- Checkout flow
- Order tracking
Dashboard
webmcp example dashboard
Features:
- Widget interactions
- Data filtering
- Export functionality
- Real-time updates
Blog
webmcp example blog
Features:
- Article search
- Comment posting
- Category filtering
- Related articles
Best Practices
1. Tool Naming
Use camelCase verbs that describe the action:
- β
searchProducts - β
addToCart - β
updateProfile - β
product_search - β
handleCart
2. Descriptions
Write clear, specific descriptions:
- β "Search for products by name or category"
- β "Search stuff"
3. Schema Completeness
Always include descriptions for parameters:
properties: {
query: {
type: "string",
description: "The search query to find products by name or category"
}
}
4. Contextual Loading
Register tools only when relevant:
// Product page
useEffect(() => {
registerProductTools();
return () => unregisterProductTools();
}, []);
// Cart page
useEffect(() => {
registerCartTools();
return () => unregisterCartTools();
}, []);
5. Error Handling
Always handle timeouts and errors:
async function execute(params) {
try {
return await dispatchAndWait("action", params, "Success", 5000);
} catch (error) {
return `Error: ${error.message}`;
}
}
Browser Support
WebMCP requires browsers that support:
- CustomEvent API
- navigator.modelContext (proposed standard)
For development, use the WebMCP polyfill:
import "@webmcp/polyfill";
Resources
Integration with Other Skills
- ai-labs-builder: Use WebMCP to make AI apps agent-accessible
- mcp-workflow: Combine with workflow automation
- gcc-context: Version control your tool definitions