Skip to main content
Tools are the whole interface between the agent and your code. Each one is declared in the manifest and implemented in your MCP server under the same name. VoiceOS namespaces them per integration, so your send_message never collides with anyone else’s.

Descriptions are routing rules

Every enabled integration’s tools are offered to the agent on every turn, and the description is the only thing the model reads about your integration when deciding what to call. Write it in two parts:
  1. What it does — one sentence.
  2. When to use it — literally “Use when the user asks …”, with the phrasings people actually say.
A vague description doesn’t make your tool a fallback. It makes it invisible.
name must be snake_case starting with a letter. Keep title short — it’s what users see in the UI.

Input schemas

inputSchema is standard JSON Schema (draft 2020-12).
  • Describe every property. Descriptions steer the model’s argument-filling the same way the tool description steers routing.
  • Mark true requirements in required.
  • Validate again in your handler. Treat arguments as user input.
  • For acting tools, the user can edit any bound argument on the confirmation card before it reaches you.

Handlers

Your server is a standard MCP server. Handlers receive the validated arguments and return an MCP result:
Three conventions:
  • Return data and a card. The model reads the JSON; the user sees the glance card. A result the user can’t see isn’t finished — and a card the model can’t read from isn’t either.
  • Configuration arrives as environment variables named after your setup fields. There is no context object.
  • Throw on failure. Never fabricate data or claim success. A tool error ends the agent’s attempt and your message is what the model explains to the user, so make it actionable: "ELEVENLABS_API_KEY was rejected (401). Check the key in Configure."

Sync vs background

Background tools declare both the mode and the permission:
Declaring the mode without the permission is a validation error.

Network

Declare an egress allowlist and keep it minimal:
Permissions are shown to the user at install time — a short list reads as trustworthy, a long one reads as a liability.

Acting vs reading

The most important tool-design rule:

Next: Result cards

Make every result worth glancing at.