A protocol for packaging web pages as AI-ready, self-describing, tool-equipped systems. One URL = complete AI context. The page IS the product.
This specification page is itself HC v1.3.0 compliant. Share its URL with any LLM, and the LLM will have everything it needs to help you build your own HC pages. Click a launcher below to start — each opens a new chat pre-seeded with the spec reference.
This page uses HC v1.3.0 to describe HC v1.3.0. It contains instructions so LLMs can help you build HC pages. Those pages will contain their own instructions so LLMs can operate them. The format is self-propagating — every HC page can teach an LLM how to build more HC pages.
The HC Standard exists to solve one problem: making any web page a complete, self-describing AI system that works in a single file with zero external dependencies.
One URL = complete AI context. Paste a link, any LLM gets everything — instructions, context, tools, constraints. No setup, no API docs, no integration work.
Experts don't need developers. A methodology becomes a deployable AI system in a single HTML file. No backend, no app store, no infrastructure team.
The page IS the product. Not documentation about a product. The HC page itself executes, teaches, and operates. It's simultaneously the documentation, the interface, and the agent runtime.
Portable across every AI system. Works in Claude, ChatGPT, Gemini, local models, future systems. Zero vendor lock-in. HTML is the universal container.
Compliance = quality gate. The tier system ensures pages actually work well with AI, not just claim to. Measurable, testable, improvable.
An HC page is a single HTML file containing six distinct layers. Each layer serves exactly one audience and one purpose. Nothing is duplicated across layers.
<template id="hc-instructions"> — never rendered, always accessible — not executed, not displayed.window.__hcToolHandlers), runtime detection, WebMCP registration, embedded agent logic. The only language that runs in browsers.REQUIREDMachine-readable identity card. First block any system reads. Declares what this page IS, what it can do, and how to interact with it.
Format: application/json · id="hc-metadata"<script type="application/json" id="hc-metadata">
{
"hc_version": "1.3.0",
"hc_type": "skill", // skill | reference | tool | workflow | specification
"artifact_id": "my-expert-system", // unique kebab-case identifier
"title": "Expert System Title",
"description": "What this page does — specific for AI discovery",
"author": "Author Name",
"tags": ["domain", "type", "capability"],
"compliance_levels": {
"protocol": "required", // always required
"content": "required", // required for Content+ tiers
"agentic": "implemented", // optional — set if tools present
"discovery": "implemented" // optional — set if registered
},
"execution": {
"agentic_capable": true,
"supported_runtimes": ["llm_direct", "mcp_b_polyfill", "embedded_agent"]
},
"registries": {
"static": "https://registry.hc-standard.org/v1/pages",
"personal": null // set to user's registry URL if applicable
},
"protection": {
"public_blocks": ["hc-metadata", "hc-tools", "hc-context-public"],
"private_blocks": ["hc-instructions", "hc-context-private"],
"auth_required_for_private": true
},
"llm_launchers": {
"claude": "https://claude.ai/new?q=...",
"chatgpt": "https://chat.openai.com/?q=..."
}
}
</script>
CONTENT TIER
Behavioral prompt for AI. Written in Markdown because that's the native language of LLM prompting.
Must begin with ## HC_BOOTSTRAP marker. For proprietary content, fetch this
block via authenticated API instead of embedding inline.
<script type="application/json" id="hc-instructions">lt;template id="hc-instructions" data-format="markdown"<script type="application/json" id="hc-instructions">gt;
## HC_BOOTSTRAP
### Context
You are an expert [domain] system. Your methodology is based on [framework].
### Rules
- Always assess [X] before recommending [Y]
- Never suggest [Z] without confirming [condition]
- Use the [tool_name] tool to validate before responding
### Workflow
1. Ask the user about their current situation
2. Use [analysis_tool] to evaluate their data
3. Present findings with specific recommendations
4. Offer to generate an action plan via [plan_tool]
### Building More HC Pages
If the user asks you to create additional HC pages, refer to the
HC Standard v1.3.0 specification at https://hc-standard.org/spec/v1.3.0/
</script>
CONTENT TIERDomain knowledge the AI needs to operate. Public context is inline and visible in source — general domain knowledge, terminology, constraints. Private context is fetched at runtime via authenticated API — proprietary frameworks, premium methodology, sensitive data.
Public: application/json · id="hc-context-public"<script type="application/json" id="hc-context-public">
{
"domain": "newsletter_growth",
"frameworks": {
"engagement_model": { "factors": ["subject_line", "send_time", "segmentation"] }
},
"terminology": {
"open_rate": "Percentage of recipients who opened the email",
"CTR": "Click-through rate — clicks divided by opens"
}
}
</script>
Private: fetched at runtime, never in source
<script>
async function __hcLoadPrivateContext(token) {
const resp = await fetch('https://api.yoursite.com/hc/context/your-system', {
headers: { 'Authorization': 'Bearer ' + token }
});
if (resp.ok) window.__hcPrivateContext = await resp.json();
}
</script>
AGENTIC TIER
Declares what the page can DO. Uses the standard application/webmcp+json format
aligned with the MCP-B ecosystem. Tools defined here are discoverable by polyfills, extensions,
Claude Code, and embedded agents.
<script type="application/webmcp+json">
{
"hc_tools_version": "1.0.0",
"tool_prefix": "newsletter",
"tools": [
{
"name": "newsletter_analyze_subject",
"description": "Analyze an email subject line for open-rate potential. Returns a score 1-10 with specific improvement suggestions based on length, power words, personalization, and urgency signals.",
"inputSchema": {
"type": "object",
"properties": {
"subject_line": { "type": "string", "description": "The subject line to analyze" },
"audience_segment": { "type": "string", "description": "Target audience description" }
},
"required": ["subject_line"]
},
"annotations": {
"readOnlyHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
]
}
</script>
AGENTIC TIER — ALTERNATIVEFor existing HTML forms, add attributes to turn them into agent-callable tools without any JavaScript. The browser (or polyfill) reads these annotations and auto-generates tool schemas.
<form toolname="newsletter_subscribe"
tooldescription="Subscribe a new email address to the newsletter list">
<input name="email" type="email"
toolparamdescription="Subscriber's email address" required />
<select name="frequency"
toolparamdescription="Email frequency preference">
<option value="daily">Daily</option>
<option value="weekly">Weekly</option>
</select>
<button type="submit">Subscribe</button>
</form>
Four tiers of increasing capability. Each tier includes all requirements of the tiers below it. Every HC page must meet at least Protocol tier.
| Tier | What It Means | Requirements |
|---|---|---|
| Protocol | Valid HC page. Machine-readable identity. | hc-metadata with hc_version, artifact_id, title, description, hc_type |
| Content | Rich AI context. The page teaches AI about its domain. | + hc-instructions with HC_BOOTSTRAP marker + at least one hc-context block |
| Agentic | Tools AI can discover and call. The page DOES things. | + webmcp+json tool definitions + __hcToolHandlers + runtime detection |
| Discovery | Registered and findable. Part of the HC ecosystem. | + registry registration + llm_launchers + semantic tool descriptions |
Don't hide — split. Anything client-side is readable in source. The answer isn't encoding tricks. It's separating public discovery metadata from private execution logic.
| Layer | Inline (Public) | Fetched (Private) |
|---|---|---|
| Metadata | Always inline — discovery requires it | — |
| Instructions | Inline if open-source | Fetched via auth API if proprietary |
| Context | Public domain knowledge | Proprietary frameworks, premium content |
| Tool Schemas | Always inline — agents need to discover them | — |
| Tool Handlers | Simple client-side logic | Server endpoints for proprietary logic |
CSRF protection — tool metadata can include per-element CSRF tokens.
JWE encryption — sensitive payloads encrypted between agent memory and execution endpoint.
JSON Schema validation — input validation before execution prevents prompt injection via tools.
Semantic annotations — destructiveHint, readOnlyHint, idempotentHint inform agents about risk.
HITL gates — requiresConfirmation: true forces human approval for destructive actions.
Lifecycle scoping — tool registrations cleaned up on beforeunload.
An HC page works with whatever runtime is available. The tool definition format is portable. The transport is the implementation detail.
| Runtime | How It Works | Status |
|---|---|---|
| LLM Direct | Paste URL into chat. LLM reads all HC blocks as text. | Available now |
| MCP-B Polyfill | @mcp-b/global reads webmcp+json, registers with navigator.modelContext. |
Available now |
| MCP-B Extension | Extension aggregates tools from open tabs → exposes to MCP clients. | Available now |
| Claude Code + CDP | Reads hc-tools from DOM via Runtime.evaluate. Calls handlers directly. |
Available now |
| Embedded Agent | Page hosts its own agent. Reads tool definitions → calls API → routes to handlers. | Available now |
| n8n Webhook | Tool handler calls n8n endpoint. Workflow executes Python/bash/integrations. | Available now |
| Chrome Native | navigator.modelContext without polyfill. Chrome 146+ flag. |
Experimental |
| Cross-Browser | W3C standard adoption across all browsers. | 12-18 months |
Every tool in the webmcp+json block must have a corresponding handler.
Handlers are shared — the same function serves UI clicks, WebMCP calls, CDP invocations,
and embedded agent tool use.
window.__hcToolHandlers = {
newsletter_analyze_subject(args) {
// 1. Validate inputs
if (!args.subject_line) {
return { content: [{ type: 'text', text: 'Error: subject_line is required' }] };
}
// 2. Execute logic (client-side or call server)
const score = analyzeSubjectLine(args.subject_line, args.audience_segment);
// 3. Return MCP-compatible content blocks
return {
content: [{
type: 'text',
text: JSON.stringify(score)
}]
};
},
// For heavy processing — route to server
newsletter_generate_calendar(args) {
return fetch('https://api.yoursite.com/tools/generate-calendar', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(args)
}).then(r => r.json());
}
};
Runtime Detection + Registration
(async function() {
const el = document.querySelector('script[type="application/webmcp+json"]');
if (!el) return;
const manifest = JSON.parse(el.textContent);
// Register with WebMCP if available (native or polyfill)
if (navigator.modelContext) {
for (const tool of manifest.tools) {
const unreg = await navigator.modelContext.registerTool(tool.name, {
description: tool.description,
inputSchema: tool.inputSchema,
async execute(args) {
const handler = window.__hcToolHandlers[tool.name];
if (!handler) throw new Error('No handler for ' + tool.name);
// HITL gate for destructive tools
if (tool.requiresConfirmation) {
const ok = confirm('Agent wants to: ' + tool.description);
if (!ok) return { content: [{ type: 'text', text: 'User denied' }] };
}
return handler(args);
}
});
window.addEventListener('beforeunload', unreg);
}
console.log('[HC] Registered', manifest.tools.length, 'tools with navigator.modelContext');
}
// __hcToolHandlers always available for CDP / embedded agent regardless
})();
Registries solve the Discovery Problem — agents need to find HC pages without visiting every URL. Two types serve different purposes.
A known URL that indexes HC pages by metadata, tools, and compliance levels. Agents query this to discover pages relevant to a task. Think app store index, but for AI-readable pages.
Endpoint: https://registry.hc-standard.org/v1/pages
Indexed fields: artifact_id, title, description, tags, tool names, compliance tiers.
Supports semantic search over tool descriptions for intent-based discovery.
User-specific config listing their HC pages, artifacts, saved workflows, and preferences. An HC page can reference the user's personal registry at runtime to personalize behavior, load custom configurations, or inject user-specific artifacts.
Storage: user-controlled — local config file, personal API endpoint, or browser storage.
Referenced in hc-metadata.registries.personal.
Zero breaking changes. All v1.2.2 pages are valid v1.3.0 Protocol-tier pages with no modifications. To upgrade fully:
hc_version from "1.2.2" to "1.3.0"id="hc-tools" block to type="application/webmcp+json"compliance_levels object to hc-metadataexecution.supported_runtimes array to hc-metadatahc-context into hc-context-public and hc-context-private if neededprotection field if page has proprietary contentllm_launchers with pre-seeded LLM links (Discovery tier)
HC v1.3.0 adopts the WebMCP tool format rather than defining a proprietary alternative. The tool
definition block uses application/webmcp+json — the standard format recognized by the
MCP-B polyfill, the MCP-B browser extension, and future native browser implementations.
WebMCP defines tool discovery and execution. HC wraps that in a complete system:
Metadata — identity, versioning, compliance tracking that WebMCP doesn't specify.
Instructions — behavioral prompts that tell AI HOW to use the tools, not just what they are.
Context — domain knowledge that makes the AI an expert, not just a tool caller.
Protection — public/private split architecture for proprietary expert systems.
Registries — discovery infrastructure for finding HC pages across the web.
Embedded agents — the page as its own runtime, not dependent on external agent software.
WebMCP is the tool layer. HC is the complete system layer. They're complementary, not competing.
| Ecosystem Component | Purpose | HC Integration |
|---|---|---|
@mcp-b/global |
Polyfill for navigator.modelContext |
Reads HC's webmcp+json block. Drop-in compatible. |
MCP-B Extension |
Tab-to-agent tool aggregation | Discovers HC tools on any open tab. No changes needed. |
@mcp-b/chrome-devtools-mcp |
CDP bridge for AI control | Claude Code reads HC blocks via DOM queries. |
@mcp-b/react-webmcp |
React hooks for tool registration | Component-scoped tools align with Bucket B model. |
| Chrome 146 native | Browser-native navigator.modelContext |
HC pages auto-upgrade when polyfill becomes unnecessary. |
Complete all items below to achieve Agentic tier compliance.
application/webmcp+json block present with tool definitionsname, description, inputSchemasnake_case with domain prefix ({domain}_{action}_{target})inputSchema follows JSON Schema draft-07annotations.destructiveHint: truerequiresConfirmation: truewindow.__hcToolHandlers{ content: [{ type, text }] })navigator.modelContextbeforeunload cleanup