> ## Documentation Index
> Fetch the complete documentation index at: https://docs.metabind.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Governance

> Schema validation, component allowlists, audit logging, and versioning — the production safety net

AI-generated UI is only safe in production if every render is constrained. Metabind's governance model is the platform feature that says: *the AI cannot inject anything you didn't approve, on any surface, ever.* Four mechanisms compose to make that true.

Metabind's MCP server implements the open Model Context Protocol per [SEP-1724](https://github.com/modelcontextprotocol/specification/blob/main/SEP/draft/SEP-1724.md), and Interactive Tools follow [SEP-1865 (MCP Apps: Interactive User Interfaces for MCP)](https://github.com/modelcontextprotocol/specification/blob/main/SEP/draft/SEP-1865.md) so the constraints described here travel with the protocol — any compliant host enforces them the same way.

## 1. Schema validation on every render

Every Interactive Tool has an input schema, derived from the component's `properties` declaration. When the AI calls the tool, the platform validates the AI's response against the schema before any rendering happens.

If the AI returns malformed data — a missing required field, a wrong type, an out-of-range number — the request is rejected and the renderer is never invoked. The error returns to the AI with specific schema-violation details, so the AI can correct its response on retry.

Validation is not opt-in. Every tool call goes through it.

## 2. Component allowlists

A layout component declares which view components the AI is allowed to compose inside each slot. The allowlist is part of the component's BindJS property definitions — the slot property's `allowedComponents` array — and is enforced server-side. Even if the AI references a component name not on the list, that component never reaches the renderer.

```ts theme={null}
properties: {
  components: {
    type: "array",
    title: "Body",
    allowedComponents: ["ProductImage", "ProductTitle", "ProductPrice", "ProductDescription"]
  }
}
```

A layout component is required as the root of every Interactive Tool, and its child components can themselves be layouts with their own allowed-components — so allowlists can nest. The full JSON schema for the layout (root + children + their nested allowlists) is what the LLM sees.

This is the core mechanism that keeps AI-generated UI shaped like the project's design system. The AI can compose what the layout permits and nothing else.

## 3. Sandboxed Data Tool execution

Data Tools run in V8 sandboxes — isolated JavaScript runtimes — not in the MCP server process. The sandbox enforces:

* **Secrets are injected via `env.secrets`** at runtime, never embedded in the component's code or visible in the package bundle.
* **Outbound HTTP is restricted to allowed domains** declared on the Data Tool. A handler cannot reach an arbitrary URL.
* **Execution time and memory are capped** (60 seconds, 128 MB by default). Runaway handlers terminate cleanly.
* **No filesystem access, no environment variables, no cross-tenant exposure.**

A Data Tool's surface area is bounded by the platform; there is no way for a handler to escape these limits.

## 4. Versioning and rollback

Every published Type is pinned to a specific package version. Editing a published Type puts it in `modified` status — the production endpoint continues to serve the last published version while the draft endpoint shows the working copy.

When you publish, the package version increments. Reverting is a metadata flip: change the project's published package back to a previous version and production switches instantly. No redeploy, no rebuild, no waiting.

This means a bad publish never strands your users. You see the issue in audit logs, you roll back, production is whole again.

## Audit and observability

Every tool invocation is logged with timestamp, input, output, and caller. Failed validations and rejected renders are tracked alongside successful ones, so a governance review can see what the AI tried to do, not just what got through. Each call carries an explicit error taxonomy — `configuration`, `runtime`, or `tool` — so failures separate cleanly when triaging.

Analytics roll usage up per tool: call count, success and failure counts, latency averages and p95s. The audit trail is a platform feature — not an analytics product you bolt on.

For depth on operational tooling — log retention, export, alerting — see [Operations](/guides/operations/audit-logs).

## Why this matters

The MCP ecosystem at scale has not solved governance yet. Most production MCP servers fail compliance checks; large engineering teams routinely build custom MCP gateways from scratch — centralized auth, rate limiting, policy enforcement — to get what Metabind ships as platform features.

For an enterprise team, the governance model is the difference between *prototype* and *deployable*. For a developer team, it's the difference between writing infrastructure to constrain the AI and writing tools.

## What governance does not cover

Governance constrains *what the AI can render*. It does not constrain *what the AI can say in text* or *what the LLM provider's safety filters do*. Those are concerns for the LLM provider and the host application, not the rendering platform.

Governance also does not enforce business correctness — a Data Tool that returns the wrong price returns the wrong price. Schema validation catches malformed responses, not factually wrong ones. Tool design and the AI's own reasoning carry that responsibility.

## Where governance lives in MCP App Studio

Governance settings appear in two places in the UI:

* **Component editor → property → `allowedComponents`** declares which components can be composed in each slot of a layout. Authored in BindJS as part of the property definition. See [Component allowlists](/guides/building/allowed-components).
* **Data Tool → Allowed Domains and Secrets** scopes outbound HTTP and credentials per Data Tool. See [Data Tools](/guides/building/data-tools).

## What to read next

<CardGroup cols={2}>
  <Card title="Tools and Types" icon="wrench" href="/guides/concepts/types">
    What the governance model is governing.
  </Card>

  <Card title="Components and Packages" icon="cube" href="/guides/concepts/components">
    How allowlists and packages combine for safe rendering.
  </Card>

  <Card title="Audit logs and tool-call reporting" icon="clipboard-list" href="/guides/operations/audit-logs">
    The operational view of governance in production.
  </Card>

  <Card title="Schema validation in depth" icon="shield-check" href="/guides/operations/schema-validation">
    How schema validation runs and what it catches.
  </Card>
</CardGroup>
