Skip to main content
The manifest is the root of an integration: one JSON file, voiceos.integration.json, validated on install and on every reload. Validation errors are flat path: message strings; anything not listed here is rejected or ignored.

The smallest valid manifest

Everything else on this page is optional or a variation of these eight fields:

Top level

publisher

runtime

One of three shapes:

auth

  • apiKey fields default to required: true; values are collected via setup fields, stored encrypted, and injected as process.env.<key>. Never persisted in plaintext, never shown to the agent.
  • oauth2 is in the contract today; the VoiceOS-brokered login flow ships with the managed broker. pkce defaults to true.

permissions

All opt-in, all shown to the user at install time:

preferences

tools[]

Cross-field validation

These fire even when every field parses:
  1. A tool with execution.mode: "background" requires the background permission.
  2. A select preference must declare non-empty options.
  3. An auth field and a preference cannot share a name — they share one config namespace and one env var.
  4. Every {{binding}} in a tool’s confirmation must name a property of that tool’s inputSchema.
  5. A confirmation view may contain at most one widget block, and a widget view may not also contain button/actions blocks.
  6. canvas blocks are rejected in schemaVersion: 1 (reserved for a future sandboxed renderer), and would additionally require a network permission.
  7. role: "custom" buttons/actions are rejected (reserved for a future server round-trip).

Validating

or in code: validateManifest(json) / validateView(view) from @voiceos/integration-sdk — both return { ok: true, value } | { ok: false, errors: string[] }.