Developer & Platform Reference
Complete documentation for all 66 native WebMCP browser agent tools registered on document.modelContext: state inspection, relational ERD schemas, Concepts architectural drafting guides, multi-layer canvas, and spatial orchestration.
Relational ERD & SQL Exporter
Drop table nodes, configure column types, toggle PK/FK badges, and link foreign keys. Instant DDL generation for PostgreSQL, MySQL, and SQLite in platform and via WebMCP export_sql_ddl().
Concepts Precision & Drafting Tools
Architectural straight-edge ruler guides, compass arc guides, Copic marker palettes, vector stroke slicing, Chaikin curve smoothing, multi-layer canvas stacks, and 60fps presentation laser pointers.
WebMCP Autonomous Pairing
Zero-token DOM protocol exposing 66 typed tools on document.modelContext. AI agents in ChatGPT and Chrome inspect visual hierarchies, cluster ideas, and execute spatial edits in sub-15ms latency.
Testing WebMCP in Your Browser
Two official ways to test live WebMCP agents on Boardify right now.
ChatGPT In-App Browser
ChatGPT Pro / Plus in-app browser supports WebMCP out of the box. Simply share your Boardify link or ask ChatGPT to open https://boardify.live/canvas.
Google Chrome Flag
Open chrome://flags/#enable-webmcp-testing in Chrome, toggle to Enabled, and relaunch your browser.
WebMCP Protocol Architecture & RPC Lifecycle
How browser-native LLM agents discover, invoke, and orchestrate tools on the live canvas.
1. Discovery Handshake
When an agent loads Boardify, it inspects document.modelContext.tools. All 66 tool definitions, JSON schemas, descriptions, and parameter constraints are registered synchronously.
2. Direct DOM RPC Dispatch
Calls execute in-memory with sub-15ms response times. Zero screenshot uploads, zero OCR hallucinations, and zero token waste. Full support for batch spatial mutations and undo/redo stacks.
3. Structured Context Memory
Every action updates the canvas spatial topology graph. Agents can query inspect_visual_hierarchy to retrieve bounding boxes, cluster densities, and orphan node alerts.
WebMCP v1.2 Standard · Registered on window.modelContextInteractive Tool Explorer & Schema Spec
Browse, search, and test all 66 registered WebMCP tools available to LLM agents.
get_canvas_state
Read the full whiteboard canvas: all notes, signs, tech logos, headings, checklists, stamps, and directed connection wires. Call this first to inspect and understand the active board context.
Input JSON Schema
{
"type": "object",
"properties": {}
}Interactive Test Runner (JSON Payload)
{
"success": true,
"total_notes": 8,
"total_links": 6,
"element_breakdown": { "default": 4, "erd-table": 2, "logo": 2 },
"notes": [...],
"links": [...]
}Production Database Security & Firestore Rules
Production-grade, owner-scoped authorization rules adhering to Google Firebase security guidelines.
Boardify utilizes authenticated, tenant-isolated Firestore rules. Boards are read-restricted to their creator (ownerId) or explicit members, unless explicitly marked public. Never use open allow read, write: if true; rules in production deployments.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function isAuthenticated() {
return request.auth != null;
}
function isOwner(data) {
return isAuthenticated() && (data.ownerId == request.auth.uid || data.userId == request.auth.uid);
}
function isMember(data) {
return isAuthenticated() && ('members' in data && request.auth.uid in data.members);
}
function isPublic(data) {
return data.isPublic == true || data.visibility == 'public';
}
// Canvas Whiteboards
match /boards/{boardId} {
allow read: if resource == null || isPublic(resource.data) || isOwner(resource.data) || isMember(resource.data);
allow create: if isAuthenticated() && (
request.resource.data.ownerId == request.auth.uid ||
request.resource.data.userId == request.auth.uid
);
allow update: if isOwner(resource.data) || isMember(resource.data);
allow delete: if isOwner(resource.data);
}
// User Profile Data
match /users/{userId} {
allow read: if isAuthenticated();
allow write: if isAuthenticated() && request.auth.uid == userId;
}
}
}