Skip to main content
Every scaffolded folder ships with its own test harness. The loop is short:

bun verify.ts

The verifier speaks real MCP over stdio to your server, exactly the way VoiceOS does — no mocks. It re-reads your manifest every run and checks that:
  • the manifest and preview fixture are schemaVersion: 1;
  • the MCP handshake succeeds;
  • the tools your server registers match the manifest exactly, both directions — a drifted name is the classic silent failure;
  • every tool has a model-facing description worth routing on;
  • every tool, called with its preview-fixture args, returns text and 1–3 glance blocks.
It exits non-zero on any failure, which makes it the feedback loop for AI coding agents too — AGENTS.md in your folder tells them to run it after every change.

Preview fixtures

voiceos.integration.preview.json holds safe sample inputs per tool:
They’re what verify.ts calls your tools with, and what the Integration Studio uses to preview cards.
Keep fixtures safe to execute. A fixture for an acting tool should point at a harmless target — it will really run.
In the Studio, fixtures self-heal: every real test-drive run overwrites them with what the tool actually returned.

Validating pieces in isolation

From the command line:
In tests, the SDK exports the same validators VoiceOS runs:
Errors come back as flat path: message strings — e.g. tools.0.name: tool name must be snake_case starting with a letter.

Testing in the app

1

Install from folder

Settings → Agent Mode → Integrations → Install from folder, then talk to the agent.
2

Reload after edits

Hit the integration’s Reload — it re-reads the manifest and restarts your server. Tools update on the next turn.
3

Read the logs

Your server’s stderr is the diagnostic channel. VoiceOS captures it and the integration’s log view shows it. console.error freely — but never log secrets.
4

Test-drive in the Studio

For anything opened in the Studio: real scoped agent turns against your draft. Click any tool row to stage its card, and fill Required fields to test key-gated paths.

What to test before sharing