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 thedescription is the only thing the model reads about your
integration when deciding what to call. Write it in two parts:
- What it does — one sentence.
- When to use it — literally “Use when the user asks …”, with the phrasings people actually say.
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:- 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:
Network
Declare an egress allowlist and keep it minimal:Acting vs reading
The most important tool-design rule:Next: Result cards
Make every result worth glancing at.

