Vapi MCP Server
OfficialVapi MCP Server exposes Vapi voice/phone assistant management, documentation lookup, and simulation testing through MCP tools.
Search current Vapi docs and look up Vapi OpenAPI schema definitions.
Create, list, retrieve, and update assistants with LLM, voice, transcriber, prompts, and tool IDs.
List/get calls and create outbound calls, including scheduled calls, assistant overrides, and dynamic prompt variables.
List and retrieve phone numbers.
Create, list, retrieve, and update custom tools: functions, API requests, call transfers, and SMS.
Search and load public Vapi skills and supporting files.
Create/list simulation personalities, scenarios, simulations, and suites; run simulations against assistants/squads; list/inspect simulation runs and run items.
Use local stdio (
npx -y @vapi-ai/mcp-server) or remote Streamable HTTP with Vapi credentials.
Allows the MCP server to be installed and run via NPX, making it easy to integrate Vapi's capabilities through the NPM package ecosystem.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Vapi MCP Servercall my appointment reminder assistant to schedule a follow-up for next week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Vapi MCP Server
Build AI voice assistants and phone agents with Vapi using the Model Context Protocol.
Setup
The MCP server requires a Vapi API key. Get one from the Vapi dashboard.
Local Server (stdio)
Configure any MCP client that supports local stdio servers to run:
npx -y @vapi-ai/mcp-serverSet VAPI_TOKEN in the server environment. MCP client configuration formats vary, but the server definition generally looks like this:
{
"mcpServers": {
"vapi": {
"command": "npx",
"args": ["-y", "@vapi-ai/mcp-server"],
"env": {
"VAPI_TOKEN": "<your_vapi_token>"
}
}
}
}Remote Server (Streamable HTTP)
Clients that support remote MCP servers can connect directly:
URL:
https://mcp.vapi.ai/mcpHeader:
Authorization: Bearer your_vapi_api_key_here
Client-Specific Examples
Claude Code
claude mcp add -e VAPI_TOKEN=your_vapi_token vapi -- npx -y @vapi-ai/mcp-serverClaude Desktop
Use the local server configuration above in the Claude Desktop configuration file. To connect to the hosted server through an stdio bridge instead:
{
"mcpServers": {
"vapi": {
"command": "npx",
"args": [
"mcp-remote",
"https://mcp.vapi.ai/mcp",
"--header",
"Authorization: Bearer ${VAPI_TOKEN}"
],
"env": {
"VAPI_TOKEN": "<your_vapi_token>"
}
}
}
}Optional Agent Skill
The skill directory contains reusable instructions for AI coding agents that support Agent Skills. Install it using your host's skill installation process.
For Claude Code:
mkdir -p ~/.claude/skills/vapi
curl -o ~/.claude/skills/vapi/SKILL.md https://raw.githubusercontent.com/VapiAI/mcp-server/main/skill/SKILL.mdRelated MCP server: Lark MCP Server
Example Usage
Create a Voice Assistant
Ask your MCP-enabled agent:
I want to build a voice assistant that can schedule appointmentsMake an Outbound Call
Call +1234567890 using my appointment reminder assistant with these details:
- Customer name: Sarah Johnson
- Appointment date: March 25th
- Appointment time: 2:30 PMSchedule a Future Call
Schedule a call with my support assistant for next Tuesday at 3:00 PM to +1555123456Using Variable Values in Assistant Prompts
The create_call action supports passing dynamic variables through assistantOverrides.variableValues. Use double curly braces in your assistant's prompts: {{variableName}}.
Example Prompt with Variables
Hello {{customerName}}, this is a reminder about your appointment on {{appointmentDate}} at {{appointmentTime}} with {{doctorName}}.Default Variables
These are automatically available (no need to pass):
{{now}}- Current date and time (UTC){{date}}- Current date (UTC){{time}}- Current time (UTC){{month}}- Current month (UTC){{day}}- Current day of month (UTC){{year}}- Current year (UTC){{customer.number}}- Customer's phone number
See Vapi documentation for advanced date/time formatting.
Remote MCP Server
Connect to Vapi's hosted MCP server from any MCP client:
Streamable HTTP (Recommended)
URL:
https://mcp.vapi.ai/mcpHeader:
Authorization: Bearer your_vapi_api_key_here
SSE (Deprecated)
URL:
https://mcp.vapi.ai/sseHeader:
Authorization: Bearer your_vapi_api_key_here
Available Tools
Documentation
Tool | Description |
| Query the Fern docs MCP for current documentation passages and source URLs |
ask_vapi_docs({"question":"How do assistant hooks work?","topK":8}) forwards to
searchDocs at https://docs.vapi.ai/_mcp/server. The result preserves Fern's
content, source links and error flag. This endpoint currently returns passages
for the calling agent to synthesize, rather than a generated answer. topK
defaults to 8 (maximum 20). Each request owns its MCP connection, supports caller
cancellation, times out after 30 seconds and closes the connection afterwards.
This tool needs outbound HTTPS to the Fern endpoint. It makes no Vapi API calls
and sends no Vapi credentials upstream. The server still requires VAPI_TOKEN
at startup. Discovery through tools/list makes no network requests; upstream
failures are returned as tool errors. No extra MCP connection is needed. Do not
include secrets or private customer data in docs questions.
Assistants
Tool | Description |
| List all assistants |
| Get assistant by ID |
| Create new assistant |
| Update assistant |
Calls
Tool | Description |
| List call history |
| Get call details |
| Start outbound call (immediate or scheduled) |
Phone Numbers
Tool | Description |
| List phone numbers |
| Get phone number details |
Tools (Function Calling)
Tool | Description |
| List custom tools |
| Get tool details |
| Create tool for API integration |
| Update tool |
Public Skills
Tool | Description |
| Search public Vapi skills by keywords; omit |
| Read a skill's |
For example, call search_skills({"query":"simulations"}), then
load_skill({"name":"simulations"}). The load result includes a files list;
read a supporting file with load_skill({"name":"simulations","path":"references/example.md"}),
using an exact path from that list. Loading returns instructions for the current
task; it does not install skills or run scripts.
Skills come directly from the public VapiAI/skills
repository, including experimental skills. Discovery uses its GitHub tree rather
than the proposed skills manifest. Each server caches a commit-pinned snapshot
for five minutes, so file reads within that snapshot use the same revision. Search
matches names, descriptions and instruction text; it returns at most limit
results (default 10, maximum 30) and the total match count. load_skill returns
one text file at a time, up to 512 KB, with its source URL and revision.
The skills tools need outbound HTTPS to public GitHub. They make no Vapi API
calls and send no Vapi credentials upstream. The server still requires
VAPI_TOKEN at startup. Discovery through tools/list makes no network requests;
upstream failures are returned as tool errors. No GitHub token is needed for this
public content. GitHub's unauthenticated API rate limits apply.
Simulations
Tool | Description |
| List simulated callers |
| Create a simulated caller with a tester assistant |
| List tester scripts and evaluations |
| Create a tester script and evaluations |
| List scenario/personality pairs |
| Pair a scenario with a personality |
| List groups of simulations |
| Group simulations into a suite |
| Run simulations or suites against an assistant or squad |
| List runs and filter by status or target |
| Get run status and item summaries |
| Get a full item including transcript and results |
The catalog contains 29 tools. Simulation lists default to 50 results.
get_simulation_run returns the first 100 item summaries, with API pagination
metadata in itemsMetadata and itemsTruncated: true when more items exist.
Legacy array responses are also supported. Use get_simulation_run_item for
the full details of a known item.
Development
# Install dependencies
npm install
# Build
npm run build
# Test with MCP inspector
npm run inspectorLocal Development Config
{
"mcpServers": {
"vapi-local": {
"command": "node",
"args": ["<path>/dist/index.js"],
"env": {
"VAPI_TOKEN": "<your_vapi_token>"
}
}
}
}Testing
# Safe default suite (build, mocked execution, contract, and stdio compatibility)
npm test
# Unit tests (mocked public tool execution and catalog contract)
npm run test:unit
# Documentation/tool-catalog consistency lint
npm run test:docs
# Full TypeScript check (production and test code)
npm run typecheck
# Build and run local stdio protocol compatibility tests (no Vapi API calls)
npm run test:stdio
# Pack, install, and launch the package from a clean temporary consumer
npm run test:package
# Live read-only API tests
export VAPI_TOKEN=your_token_here
npm run test:live:readonly
# Live mutating tests (creates and cleans up disposable assistants and tools)
export VAPI_TOKEN=your_test_org_token_here
npm run test:live:mutatingInput validation from OpenAPI
All 21 parameterized MCP tools use imported OpenAPI constraints through
Zod's experimental z.fromJSONSchema(), pinned to Zod 4.6.7. This covers
assistant names/LLMs/voices/transcribers, call schedules and customer numbers,
lookup/update IDs, function parameters, transfer destinations, HTTP methods,
timeouts and retry plans, plus all 12 simulation tools. The four original list
tools have local empty input schemas.
src/schemas/assistant-openapi.json is the compact projection for the original
tool surfaces (the filename is retained from the initial assistant cutover). It
records the public API spec source SHA-256 and
includes the recursive JSON-schema definitions needed for function parameters
and request bodies. Builds and installs use it without network access. Refresh
explicitly with npm run schemas:snapshot, or pass a saved spec with
npm run schemas:snapshot -- /path/spec.json.
src/schemas/simulation-openapi.json bundles the full simulation DTOs and their
referenced definitions from the same public spec. The same refresh command
updates both snapshots. Simulation validation includes names, folder paths,
UUIDs, instructions, evaluations, nested tester assistants and structured
outputs. Scenario/suite additionalFields are validated after merging, so they
cannot override an API constraint. Large nested assistant and structured-output
objects have compact advertised envelopes; their full API contracts are checked
at runtime. The shared summary projection omits long documentation and recursive
definitions from simulation discovery. The 25-tool catalog is about 28 KB.
No runtime schema fetch or
get_api_schema tool is required.
Simulation aliases remain local adapters: run_simulations takes exactly one
assistant/squad target and at least one simulation/suite ID, then builds the API
request. Integer iterations and integer page sizes of 1–100 are MCP policies;
API iteration bounds and parameter formats come from the snapshot. The item
lookup endpoint publishes plain strings for its IDs, so those are not assigned
UUID constraints from a different endpoint.
The shared normalizer also represents empty preset enums as always-failing
branches and preserves property names such as oneOf and default when walking
JSON Schema definitions.
When upgrading @vapi-ai/server-sdk, refresh and review the bundled schema in
the same PR, then run npm run typecheck, npm test, and npm run test:package.
Check changes against the SDK's request types and the MCP adapters below. The
public endpoint serves the current API spec, not a spec version tied to the SDK
release, so refreshing does not by itself guarantee compatibility. Keep the
reviewed schema bundled with the release; do not refresh it during installation
or startup.
The adapter documents published contract corrections: overlapping enum/string
oneOf alternatives become anyOf; duplicate enum values and JavaScript regex
delimiters are removed; the contradictory object/string-enum annotation on
BackoffPlan.type is corrected. Provider variants reject undeclared fields.
Spec defaults do not inject request fields; MCP defaults remain separate.
For the original compact assistant tools, variants requiring fields outside
the current interface remain excluded: custom
voice, Neuphonic voice, custom transcriber, Speechmatics transcriber, and custom
LLM. Adding their required fields needs an explicit interface extension.
MCP wrappers preserve field aliases and sparse updates. URL checks and string-valued header maps remain explicit transport rules because the spec only describes a string/object. API-request header maps and SMS metadata retain legacy MCP representations; they are explicit compatibility adapters, not claimed to be full API DTO validation. SMS metadata is not described in the published DTO. Response summaries also remain local: they are transformed MCP representations, not raw API DTOs.
Validation failures return isError: true, concise text and structured
validationError details: tool name, issue code, field path, message and allowed
choices where relevant. Errors select the supplied provider's union branch,
include at most 12 issues and 8 allowed choices per issue, and indicate
truncation. Submitted values and credential contents are not echoed. Agents
should correct the listed fields and retry; a validation failure never invokes
the API handler. Tests exercise this correction loop through a real MCP client.
tools/list advertises a compact input summary derived from the same validators:
field names, basic types, required fields, defaults, and short constraints. It
omits provider/model catalogs, lengthy API documentation, and recursive schema
definitions. The full OpenAPI-derived validator still runs before any API call;
the advertised summary is intentionally broader. Catalog tests cap the
original 13-tool list at 20 KB, the 12 simulation tools at 10 KB, and the complete
25-tool list at 30 KB to prevent unexpected agent-context growth.
npm test includes schema contract tests, independent Ajv parity cases, and
validation-feedback tests. The existing live compatibility
suites cover read-only resources and disposable assistants/custom tools.
References
Available Tools
29 toolsask_vapi_docsARead-only
Ask about current Vapi documentation through the Fern docs MCP. Returns relevant documentation passages and source URLs; use them to answer the question.
| Name | Required | Description | Default |
|---|---|---|---|
| topK | No | Maximum number of relevant documentation passages. | |
| question | Yes | A specific question about Vapi configuration, APIs, SDKs or troubleshooting. Send no API keys or private customer data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, openWorld, non-destructive), so the description's job is to add context, and it does: it discloses the return shape (passages plus source URLs) which no output schema documents, and the word 'current' signals live retrieval rather than cached data. It omits rate limits and how many passages come back by default, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the purpose and the retrieval source, with zero padding. The semicolon-joined second clause is slightly compressed but still readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only lookup with full schema coverage, the description supplies the essentials: retrieval source, return content, and an implicit instruction to ground answers in the passages. Nothing critical is missing apart from guidance on competing tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including topK bounds and a note forbidding API keys or private customer data, so the schema carries the parameter burden. The description adds no syntax, format or default guidance beyond that, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Ask about current Vapi documentation') and adds what comes back ('documentation passages and source URLs'). It is clearly distinguishable from the assistant/call/simulation siblings, though it never mentions the potentially overlapping get_api_schema tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage instruction is 'use them to answer the question,' which concerns consuming the results rather than when to select this tool. There is no statement of when-not to use it and no routing to alternatives such as get_api_schema for raw API schema lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_assistantC
Creates a new Vapi assistant
| Name | Required | Description | Default |
|---|---|---|---|
| llm | No | LLM configuration | |
| name | Yes | Name of the assistant | |
| voice | No | Voice configuration | |
| toolIds | No | IDs of tools to use with this assistant | |
| transcriber | No | Transcription configuration | |
| firstMessage | No | First message to say to the user | Hello, how can I help you today? |
| instructions | No | Instructions for the assistant | You are a helpful assistant. |
| firstMessageMode | No | This determines who speaks first, either assistant or user | assistant-speaks-first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure and supplies almost nothing. It doesn't say whether the assistant is immediately live, what defaults apply to llm/voice/transcriber when omitted, whether creation is reversible, or what identity/response is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single six-word sentence with zero filler, but it is so terse that there is no structure to front-load anything useful. It earns no penalty for bloat, only for lacking substance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a create tool with 8 parameters, nested objects, and a required field, yet the description explains none of the creation semantics, defaults, or outcomes. Only the schema's parameter descriptions keep it usable at all.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every one of the 8 parameters, including the nested llm/voice/transcriber objects and the firstMessageMode enum, is documented in the schema itself. The description adds no meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Creates a new Vapi assistant'), so an agent knows this is a create operation for assistant entities. It doesn't explicitly differentiate itself from update_assistant or list_assistants beyond the verb, but the verb+resource pairing is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to create versus update an existing assistant, no prerequisites, and no mention of what happens to unspecified configuration. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_callC
Creates a outbound call
| Name | Required | Description | Default |
|---|---|---|---|
| customer | No | Customer information | |
| assistantId | No | ID of the assistant to use for the call | |
| scheduledAt | No | ISO datetime string for when the call should be scheduled (e.g. "2025-03-25T22:39:27.771Z") | |
| phoneNumberId | No | ID of the phone number to use for the call | |
| assistantOverrides | No | Overrides for the assistant configuration |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it delivers almost nothing. Beyond the word "outbound" it says nothing about immediate versus scheduled dialing, required configuration for the call to succeed, side effects, cost, or what identifies the created call; for a mutating, real-world-dialing tool this is a substantial gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short sentence with no waste, but it is under-specified rather than concise, and it contains a grammatical error ("a outbound"). Nothing beyond the tool name is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has five parameters (nested objects, a datetime constraint), zero required fields, no annotations, and no output schema. With no guidance on which parameters matter, what the response contains, or how scheduling interacts with immediate calls, the definition is not complete enough for confident invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents customer.number, assistantId, scheduledAt, phoneNumberId, and assistantOverrides. The description adds no meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Creates a outbound call" names a specific verb (creates) and resource (call) and the direction (outbound), which distinguishes it from read-only siblings like list_calls and get_call. It does not, however, differentiate it from other creation tools (create_assistant, create_simulation) beyond the resource word.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives or conditions. An agent cannot tell from this text when to create a call directly versus scheduling one, nor what must be true (assistantId, phoneNumberId, number) before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_simulationB
Creates a simulation that pairs a scenario with a personality. Run it with run_simulations.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | This is an optional friendly name for the simulation. | |
| path | No | Optional folder path for organizing simulations. Supports up to 3 levels (e.g., "dept/feature/variant"). Maps to GitOps resource folder structure. | |
| scenarioId | Yes | This is the ID of the scenario to use for this simulation. | |
| personalityId | Yes | This is the ID of the personality to use for this simulation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden, and it discloses little beyond 'creates'. It does not say whether the new simulation's ID is returned, whether re-creating the same scenario/personality pair is allowed or errors as a duplicate, what permissions are needed, or whether the simulation is immediately runnable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and immediately followed by the next-step pointer. No filler or redundancy for a simple creation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter mutation with no annotations and no output schema, the description is only partially sufficient: it names the action and the intended follow-up, but omits return value/ID, duplicate handling, and prerequisite lookups. Adequate but with clear gaps an agent would want filled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters including name, path, and the two required UUIDs; baseline 3 applies. The pairing sentence adds a small conceptual gloss on why scenarioId and personalityId are both required, but no format or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Creates a simulation') and clarifies the domain meaning by defining a simulation as a scenario paired with a personality. It is clear on its own, though it does not explicitly differentiate itself from nearby siblings such as create_simulation_suite or create_simulation_personality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Run it with run_simulations' gives a useful lifecycle pointer to the follow-up tool, which is real guidance. However, there is no statement of when to use this versus create_simulation_suite, and no mention that scenarioId/personalityId must first come from list_simulation_scenarios/list_simulation_personalities.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_simulation_personalityC
Creates a simulation personality: the simulated caller that talks to the assistant under test
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | This is the name of the personality (e.g., "Confused Carl", "Rude Rob"). | |
| path | No | Optional folder path for organizing personalities. Supports up to 3 levels (e.g., "dept/feature/variant"). Maps to GitOps resource folder structure. | |
| assistant | Yes | Full tester assistant configuration, validated against the bundled Vapi OpenAPI schema. See https://api.vapi.ai/api-json (TransientAssistantDTO). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It says nothing beyond the bare fact of creation: no word on name-collision behavior, whether the referenced assistant must already exist, required permissions, or what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero padding; the definition of the resource follows immediately after the verb. Nothing here is wasted or restated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool takes a nested, additionalProperties-open assistant DTO validated against an external Vapi schema, has no annotations, and no output schema. For that complexity the description is thin: it never hints that the assistant argument is a full transient-assistant configuration, nor what a successful call produces or how the personality relates to a later simulation run.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with name, path, and the nested assistant object all documented in the schema, so the baseline is 3. The description adds no parameter-level meaning beyond identifying that the personality acts as a simulated caller, which is contextual rather than semantic detail about the arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb plus resource ("Creates a simulation personality") and then defines the concept inline as "the simulated caller that talks to the assistant under test," which an agent could not infer from the name alone. It stops short of differentiating this from close siblings such as create_simulation_scenario or create_simulation, so it is clear but not sibling-aware.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives. Given siblings like create_simulation_scenario and create_simulation, an agent gets no help deciding which creation tool to call when setting up a test.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_simulation_scenarioC
Creates a simulation scenario: instructions for the tester plus evaluations that decide whether the assistant passed
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | This is the name of the scenario. | |
| path | No | Optional folder path for organizing scenarios. Supports up to 3 levels (e.g., "dept/feature/variant"). Maps to GitOps resource folder structure. | |
| evaluations | Yes | This is the structured output-based evaluation plan for the simulation. Each item defines a structured output to extract and evaluate against an expected value. | |
| instructions | Yes | This is the script/instructions for the tester to follow during the simulation. | |
| additionalFields | No | Additional documented API fields. The merged request is validated against the bundled Vapi OpenAPI schema. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden, and it discloses almost nothing beyond creation. It does not state whether the scenario is immediately runnable, whether it is org/workspace scoped, what identifier is returned (no output schema exists), or how duplicates/names are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, defining the resource by its two core components. It is efficient, though the compactness comes at the cost of detail that would otherwise be valuable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The nested evaluations schema and 5-parameter shape are complex, and the very rich schema covers most field-level meaning, so the description is minimally adequate. However, with no annotations and no output schema, it should say what the caller gets back and how the new scenario is consumed downstream.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents name, path, instructions, evaluations, and additionalFields in detail. The description adds only a light gloss that evaluations determine pass/fail, which is already implied by the evaluation fields' own 'required' and comparator semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Creates a simulation scenario') and adds what the artifact contains: tester instructions plus pass/fail evaluations. It distinguishes the artifact conceptually from create_simulation or create_simulation_personality but never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus create_simulation, create_simulation_suite, or create_simulation_personality. It also omits the typical workflow implication that a scenario must be referenced by a simulation before it can run, leaving the agent to infer prerequisites from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_simulation_suiteB
Creates a simulation suite that groups simulations so they can be run together
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | This is the name of the simulation suite. | |
| path | No | Optional folder path for organizing simulation suites. Supports up to 3 levels (e.g., "dept/feature/variant"). Maps to GitOps resource folder structure. | |
| simulationIds | Yes | This is the list of simulation IDs to include in the suite. | |
| additionalFields | No | Additional documented API fields. The merged request is validated against the bundled Vapi OpenAPI schema. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, yet it says nothing about permissions, whether suite names must be unique, what happens on duplicate name or invalid simulationIds, or whether the operation is idempotent. It only explains the conceptual grouping effect, leaving all mutation-risk context to inference.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single well-formed sentence with the verb and resource front-loaded and zero filler. It is efficient, though the brevity is part of why coverage gaps exist elsewhere rather than a flaw in the prose itself.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward create operation with a fully documented four-parameter schema, the description covers the what but not the return value (no output schema) or failure/duplicate behavior. Adequate as minimum viable, but a creation tool with no annotations should say more about what the caller gets back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so name, path, simulationIds, and additionalFields are already documented, including the folder-path pattern and GitOps mapping. The description adds no parameter-level meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Creates a simulation suite") and adds the semantic effect — grouping simulations so they can be run together — which distinguishes it from sibling create_simulation and points toward run_simulations. It does not explicitly name those siblings, so differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the phrase "so they can be run together" hints that a suite exists to be executed as a batch, but the description never says when to create a suite versus individually creating simulations, nor does it reference run_simulations as the follow-up action. No prerequisites (e.g., simulations must already exist) or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_toolC
Creates a new Vapi tool
| Name | Required | Description | Default |
|---|---|---|---|
| sms | No | SMS tool configuration - to send text messages | |
| name | No | Name of the function/tool | |
| type | Yes | Type of the tool to create | |
| function | No | Custom function tool configuration - for custom server-side functions | |
| apiRequest | No | API Request tool configuration - for HTTP API integration | |
| description | No | Description of what the function/tool does | |
| transferCall | No | Transfer call tool configuration - to transfer calls to destinations | |
| additionalFields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states that the tool creates a Vapi tool, without mentioning mutation effects, required type-specific fields, permissions, error behavior, or how the polymorphic type parameter controls valid configuration.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is concise and front-loaded, with no wasted wording. However, for an eight-parameter polymorphic creation tool, this level of brevity leaves the description under-specified rather than optimally structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a complex schema with nested objects, multiple tool type variants, no annotations, and no output schema. The description does not explain the type variants, required type-dependent fields, or creation workflow, leaving significant context gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 88%, so the schema already documents most parameters, including type-specific nested fields. The description adds no additional parameter meaning beyond the generic 'Vapi tool' framing, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Creates a new Vapi tool.' This clearly distinguishes creation from sibling operations like update_tool, get_tool, and list_tools. However, it does not explain the polymorphic tool types or what kinds of tools can be created.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus update_tool or get_api_schema, nor any prerequisites or exclusions. The only implied usage is that it is for creation rather than update or retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_api_schemaA
Looks up a schema in the Vapi API reference (the OpenAPI spec the Vapi SDKs are generated from). Pass search to find schema names, then name to get one schema. References to other schemas are left as "#/components/schemas/" and listed in referencedSchemas, so look those up next if you need them. Use it to find fields that other tools accept through additionalFields.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Exact schema name to return, e.g. "CreateTransferCallToolDTO" or "TransferPlan" | |
| search | No | Case-insensitive text to find schema names, e.g. "transfer". Used when name is not given. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the burden and does real work: it discloses that cross-references are returned as "#/components/schemas/<Name>" placeholders and enumerated in referencedSchemas, which tells the agent how to follow up. It does not mention auth, rate limits, or whether search and name can be combined, but for a read-only reference lookup those gaps are modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: what it is, how to use the two parameters, and what the return shape implies for follow-up. The purpose is front-loaded with no redundant restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only lookup with no output schema and no annotations, the description covers the source data, the call sequence, the return reference format, and the follow-up behavior. An agent has everything needed to call it correctly and interpret what it gets back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented including the "used when name is not given" precedence rule. The description's sequencing adds a little workflow context but no new semantics about the parameters themselves; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("looks up a schema in the Vapi API reference") and identifies the source of truth (the OpenAPI spec the SDKs are generated from). The final sentence about finding fields other tools accept through additionalFields makes its role distinct from the sibling documentation and CRUD tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear two-step workflow (use `search` to discover names, then `name` to fetch one) and a concrete use case, following referenced schemas when needed. It does not explicitly say when to prefer the sibling ask_vapi_docs instead, so the routing guidance is clear on this tool but not on its alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assistantB
Gets a Vapi assistant by ID
| Name | Required | Description | Default |
|---|---|---|---|
| assistantId | Yes | ID of the assistant to get |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden. "Gets" implies a read-only lookup, but it never states what happens when the ID is unknown (error vs. empty result), whether authentication or scope is required, or anything about the returned object.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence, front-loaded with the action and resource, with no filler. It is lean to the point of being under-specified, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup with no output schema, the core fact an agent needs (fetch a single assistant by its UUID) is present. Missing is any statement of return shape or not-found behavior, which matters more here because no annotations or output schema fill that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the single assistantId parameter fully documented including UUID format and pattern, so the baseline is 3. The phrase "by ID" in the description adds no syntax or format meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Gets a Vapi assistant by ID" names a specific verb and resource, and "by ID" implies single-record retrieval, distinguishing it from list_assistants. It does not, however, explicitly differentiate itself from sibling getters such as get_call or get_tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool for fetching one assistant when its ID is known, versus listing them. There is no explicit when-to-use statement, no mention of alternatives like list_assistants or ask_vapi_docs, and no prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_callC
Gets details of a specific call
| Name | Required | Description | Default |
|---|---|---|---|
| callId | Yes | ID of the call to get |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description bears the full burden, yet it only says the tool gets details. It does not state that this is a read-only lookup, whether it errors on unknown or malformed IDs (the schema requires a UUID), or what object shape comes back.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no wasted wording and the resource front-loaded. Brevity here borders on under-specification rather than being padded, so it is efficient but thin.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema and no nested objects, little is required, but the ambiguous word "details" leaves the agent guessing what the response contains. Minimum viable rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and callId is documented as "ID of the call to get", so the schema already covers the only parameter. The description adds no format, sourcing, or lookup-key guidance beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Gets details of a specific call" names a specific verb (gets) and resource (call) and implies single-record lookup, which an agent can distinguish from list_calls or create_call in the sibling set. It stops short of saying which details are returned or explicitly contrasting itself with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all: nothing tells the agent to prefer this over list_calls when only one ID is known, and no prerequisites or failure conditions are mentioned. Usage must be inferred entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_phone_numberB
Gets details of a specific phone number
| Name | Required | Description | Default |
|---|---|---|---|
| phoneNumberId | Yes | ID of the phone number to get |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It says only that it 'gets details' and does not state that the operation is read-only, what permissions are needed, what happens on invalid IDs, or what kind of details are returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant wording or unnecessary background. It is appropriately sized for the trivial surface it attempts to describe.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter getter, the description covers the basic purpose but leaves key gaps: there is no output schema, no annotations, and the description does not explain return shape, read-only behavior, or how it differs from list_phone_numbers. It is minimum viable but incomplete for safe tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the sole parameter phoneNumberId is already documented in the schema as 'ID of the phone number to get.' The description adds no additional meaning, format constraints, or usage hints beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Gets details of a specific phone number.' The word 'specific' implies a single-resource lookup, which distinguishes it somewhat from list_phone_numbers, but it never names the sibling tool explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the agent can infer this is for retrieving one phone number by ID. The description gives no explicit when-to-use guidance, no exclusion for list_phone_numbers, and no prerequisites or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_simulation_runA
Gets a simulation run with its status, item counts, and the first 100 item summaries. itemsTruncated indicates omitted items; itemsMetadata preserves API pagination metadata. Use get_simulation_run_item for an item’s transcript and call details.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden and does disclose the key quirk: results are capped at 100 item summaries, itemsTruncated signals omission, and itemsMetadata holds API pagination metadata. That is genuine behavior beyond the schema. It stops short of stating read-only semantics explicitly or any auth/error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each doing distinct work: what is returned, how truncation is signaled, and where to go for per-item detail. The truncation caveat is placed before the sibling pointer, which is the right order for an agent deciding whether this result is sufficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must convey the return shape, and it does so at a useful level (status, counts, 100 truncated item summaries, two metadata fields). It could be more complete about what the item summary objects contain or how itemsMetadata should be used to page further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the sole required parameter runId has no description in the schema or in the description text. The meaning is inferable from the tool's purpose (a simulation run identifier), and the uuid format in the schema removes most ambiguity, so the gap is small but real.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("Gets a simulation run") and enumerates what comes back: status, item counts, and the first 100 item summaries. It also names the sibling get_simulation_run_item and states what that one returns instead, so an agent can separate the two tools without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit routing rule: use get_simulation_run_item for an item's transcript and call details. That covers the most likely sibling confusion, but it offers no guidance on when to reach for this tool versus list_simulation_runs or run_simulations, and no preconditions for runId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_simulation_run_itemB
Gets one simulation run item in full, including results, call snapshots, transcript, and improvement suggestions
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | ||
| itemId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses the return payload (results, call snapshots, transcript, improvement suggestions), but it does not state that the operation is read-only, whether it has side effects, what permissions are required, or how invalid IDs are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler and efficiently lists the returned content. It could be slightly better structured by separating scope from return details, but it is appropriately concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description conveys the single-item scope and the main returned contents. However, it omits parameter semantics and error or permission context, leaving important gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the undocumented runId and itemId parameters. It never explains what runId and itemId identify, their format, or how they relate to the returned item; it only indirectly alludes to an 'item.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Gets' with the resource 'one simulation run item' and clarifies scope with 'in full,' including the returned contents. It is clear what the tool does, but it does not explicitly contrast itself with the sibling get_simulation_run, so sibling differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a single simulation run item, but it gives no explicit when-to-use guidance, prerequisites, or alternatives such as list_simulation_runs or get_simulation_run. The implied use case is adequate but not directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_toolC
Gets details of a specific tool
| Name | Required | Description | Default |
|---|---|---|---|
| toolId | Yes | ID of the tool to get |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It says nothing about what fields the returned details include, whether the lookup is read-only, or what happens for an invalid or nonexistent toolId — all important for a lookup tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with no filler and the resource scoping front-loaded. Its brevity is appropriate for a one-parameter lookup, though it borders on under-specification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter lookup with complete schema coverage, the description covers the minimum: what it fetches and by what key. Because there is no output schema, the description should have characterized the returned "details," which it does not, leaving a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with toolId fully documented as a UUID with a pattern, so the description need not compensate. The description adds nothing beyond the schema, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Gets details of a specific tool"), so the basic operation is identifiable. However, "details" is vague and never differentiates it from siblings such as list_tools, create_tool, update_tool, or get_api_schema, leaving the agent to infer what the returned details actually are.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like list_tools or get_api_schema, and no mention of prerequisites or lookup workflow. The only implied usage is that an agent must already have a toolId, which comes from the schema rather than the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assistantsB
Lists all Vapi assistants
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discloses nothing beyond the fact that it reads. It says nothing about pagination, result ordering, approximate result volume, or whether truncation occurs, all of which matter for a list endpoint with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded phrase with zero filler, which is the right shape for a no-parameter list tool. The brevity is efficient rather than padded, though it leaves the description barren.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is structurally simple (no params, flat, no output schema), so a short description is defensible, but a list operation with no annotations and no declared return shape still benefits from at least a note on pagination and return contents, which is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter meaning to add; baseline is 4. The empty schema means there is nothing the description could clarify here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Lists) and resource (Vapi assistants), which an agent can easily distinguish from get_assistant, create_assistant, and the unrelated list_* siblings by resource noun. It stops short of 5 because it does not explicitly contrast itself with get_assistant or note that it returns all assistants regardless of filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all: no mention of when to prefer get_assistant for a single record, no prerequisites, and no indication of what the list covers (org-wide vs. a subset). The only usable signal is the name itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_callsC
Lists all Vapi calls
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden, but it discloses nothing about result size, ordering, pagination, or whether the listing includes all calls or only ones visible to the caller. That omission matters for a list operation over a potentially large collection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four words with zero filler and the key concept front-loaded. It is trimmed, but the brevity is only acceptable because there is nothing else supplied; if it had more to convey, this would be under-specification rather than concision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with no output schema, the description should say what comes back, such as full call objects versus summaries, and how large result sets are handled. As written, it leaves the agent guessing about the return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool accepts zero parameters, so there is no parameter semantics for the description to explain, and the baseline of 4 applies. The empty schema leaves nothing ambiguous that the description needs to clarify.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Lists") and resource ("Vapi calls"), so the basic operation is unambiguous. It adds nothing about scope, filtering, or pagination to separate it from the neighboring get_call and create_call tools beyond the plain verb, which keeps it at a minimum-viable 3.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives such as get_call for a single call. The agent must infer from the name alone that this tool is the bulk-retrieval path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_phone_numbersB
Lists all Vapi phone numbers
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and discloses almost nothing beyond the fact of listing. It does not say whether results are paginated, whether the list is org-wide or credential-scoped, what fields each entry contains, or what an empty result means.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler and the resource front-loaded after the verb. It is efficient, though its brevity stems partly from under-specification rather than deliberate economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool this is close to adequate, but with no annotations and no output schema the description is the only source of behavioral information and leaves return shape, pagination, and scoping unstated. It is the minimum viable definition rather than a complete one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-parameter tool applies. The description correctly implies a parameterless full listing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Lists) and resource (Vapi phone numbers), and the word 'all' implicitly contrasts with the sibling get_phone_number. It does not explicitly name that sibling or clarify whether the listing is scoped to an organization, but an agent can still tell what the tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus get_phone_number, and no mention of prerequisites such as authentication or org scope. Usage is only implied by the name and the word 'all'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_simulation_personalitiesA
Lists simulation personalities: the simulated callers (testers) used in Vapi simulations
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and 'Lists' reasonably implies a non-destructive read. However, it says nothing about pagination or truncation behavior (the 50-default, 1000-max limit), whether an empty list is possible, or what fields a personality record contains — context an unannotated tool should supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single clause, front-loaded with the action and resource, with the colon-apposition earning its place by defining a domain term. Nothing extraneous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter list tool with a fully documented schema and no output schema, the description covers the essential question of what is being listed. It stops short of only minor extras such as default page size or return shape, which keeps it close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the sole parameter 'limit' is fully documented in-schema with bounds and a default. The description adds no meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Lists') plus the exact resource ('simulation personalities') and then defines what that resource is — 'the simulated callers (testers) used in Vapi simulations' — a term an agent may not otherwise know. The plural verb form cleanly separates it from the create_simulation_personality sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb: an agent can infer this is the enumeration tool for personalities versus create_simulation_personality. There is no explicit statement of when to reach for this over list_simulation_scenarios or list_simulations, and no note that limit caps the result set rather than returning everything.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_simulation_runsC
Lists simulation runs, newest first
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 50) | |
| status | No | ||
| targetId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden yet only discloses sort order. It says nothing about pagination beyond the implicit limit, whether results are scoped to a workspace, permission requirements, or whether a truncated list is silently capped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no wasted words and the ordering fact placed prominently. It is efficient, though the extreme brevity reads more as under-specification than deliberate concision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a filterable list tool with three parameters, one-third schema coverage, no annotations, and no output schema, the description leaves the agent without enough to call it confidently — especially for the undocumented status and targetId filters. It should at minimum explain what the filters select.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% — limit is documented in the schema, but status (an enum with no stated meaning) and targetId (a UUID with no stated referent) are undocumented. The description adds no meaning to any of the three parameters, leaving a real compensation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Lists') and resource ('simulation runs') plus an ordering guarantee ('newest first'), so an agent knows exactly what it returns. However, it never distinguishes this tool from close siblings like list_simulations or get_simulation_run, so there is no explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, no mention of alternatives (e.g. use get_simulation_run for a single run, list_simulations for the definitions), and no indication of when the status/targetId filters should be applied. Usage can only be inferred from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_simulationsB
Lists simulations. Each simulation pairs one scenario with one personality.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden and it discloses almost nothing behavioral: not whether results are paginated or truncated at a default, not the ordering, and not the shape of a returned simulation. The only hint at read-only behavior comes from the name itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no filler, with the tool's action front-loaded and the entity definition immediately after. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple single-optional-parameter list tool with no output schema, so the description need not explain return values. However, for a tool sitting among half a dozen simulation-related listers, it should say what a call returns in aggregate and how it relates to those siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional limit parameter is fully documented in the schema, including its default of 50 and maximum of 1000. The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("Lists simulations") and the second sentence defines the entity as a scenario+personality pair, which implicitly separates it from list_simulation_runs and list_simulation_personalities. It stops short of naming those siblings outright, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this instead of list_simulation_runs, list_simulation_suites, or the personality/scenario listers, all of which appear in the sibling set. No prerequisites, no exclusions, no alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_simulation_scenariosC
Lists simulation scenarios: the scripts testers follow and the checks that decide pass or fail
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| limit | No | Maximum number of results to return (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a read operation but never states that it is read-only, whether results are paginated, what the default ordering is, or what happens when the limit is exceeded; only the resource's meaning is explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with the resource front-loaded and the gloss following immediately. It wastes no words, though the explanatory clause is more helpful for a human than for tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-optional-parameter list tool with no output schema, the description covers the resource adequately. However, it omits filtering semantics for name and pagination behavior for limit, which an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: the limit parameter is documented in the schema (default 50, max 1000), but the name parameter has no description anywhere. The description does not clarify whether name filters, matches exactly, or some other semantics, so it fails to compensate for the uncovered parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb 'Lists' and a specific resource 'simulation scenarios', then expands with a plain-language gloss ('the scripts testers follow and the checks that decide pass or fail'). It does not differentiate itself from close siblings like list_simulations or list_simulation_suites, so an agent must infer the distinction from names alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool rather than load_skill, list_simulations, list_simulation_suites, or get_simulation_run. The description offers no context, prerequisites, or exclusions, leaving selection entirely to the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_simulation_suitesC
Lists simulation suites: named groups of simulations
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description bears the full disclosure burden, and it discloses almost nothing: it does not confirm this is a non-mutating read, does not mention the default page size of 50 or the 1000 cap, and says nothing about truncation, ordering, or what a returned suite contains. The definition is a one-line label rather than a behavioral account.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, with the clarifying gloss placed where it helps most. There is no filler, though the brevity is close to under-specification rather than disciplined economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple list tool with one optional numeric parameter and no output schema, so the bar is low, and the description does define the resource. It still leaves out the things an agent needs for correct invocation at scale, namely that results are paginated by default and that the response shape is unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single optional parameter and schema description coverage is 100%, so the schema already explains limit, its default of 50, and its bounds. The description adds no extra meaning about pagination semantics, which is the baseline expectation at full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Lists simulation suites" states a specific verb and resource, and the gloss "named groups of simulations" defines the entity well enough to separate suites from the sibling list_simulations and list_simulation_scenarios. It stops short of naming those siblings explicitly, so the differentiation is inferential rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of when a suite is the right thing to look at versus a simulation, scenario, or personality, and no prerequisites. The only signal is the implicit one carried by the verb "Lists".
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_toolsB
Lists all Vapi tools
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and provides almost nothing: no indication of pagination, result volume, ordering, or whether the listing is scoped to an org/workspace. For a listing endpoint whose main risk is unbounded result size, this is a meaningful gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It is arguably under-specified rather than verbose, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (no params, no nested objects), so the low description length is defensible, but with no output schema the agent has no idea what a returned tool object looks like or whether results are paginated. One more sentence on return shape would close the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a 0-param tool is 4. The description is consistent with the empty schema by not describing any filter inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Lists all Vapi tools'), and 'all' signals an unfiltered enumeration that contrasts implicitly with the sibling get_tool. It does not explicitly name any sibling, so an agent must infer the boundary itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, and no mention of the alternatives (get_tool for a single tool, search_skills-adjacent patterns for filtered lookup). The only hint is the word 'all', which is left for the agent to interpret.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_skillARead-only
Read a public Vapi skill or one of its supporting files. Start with SKILL.md, then load relevant files from the returned file list as needed. Returns instructions for this task; does not install skills or execute scripts.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Exact skill name from search_skills. | |
| path | No | File path relative to the skill directory, such as SKILL.md or references/hooks.md. | SKILL.md |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered; the description still adds value by clarifying the return contract (instructions for the task) and by ruling out side effects (no installing, no script execution). It doesn't mention size limits or errors for a missing path, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero filler: purpose first, then the operating sequence, then the boundary condition. Nothing is buried, and every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two well-documented parameters and no output schema, the description has to carry the return-value story, and it does: it says instructions come back plus a file list used for follow-up loads. It stops just short of describing what a skill file's contents look like or what happens when a path doesn't exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented, including the SKILL.md default and the relative-path format. The description's mention of starting at SKILL.md and following the returned file list is workflow context rather than added parameter semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb ("read") plus a specific resource ("a public Vapi skill or one of its supporting files") tells the agent exactly what the tool does. The closing clause ("does not install skills or execute scripts") separates it from anything that would mutate state or run code, and the two-parameter shape makes it easy to tell apart from siblings like search_skills.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real sequencing guidance: start with SKILL.md, then load relevant files from the returned file list as needed. What's missing is any pointer to search_skills for discovering the exact name (that hint lives only in the schema) and any explicit statement of when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_simulationsA
Starts a simulation run of simulations and/or suites against an assistant or squad. Returns the run with its ID and a dashboard URL to share with the user. Check progress with get_simulation_run.
| Name | Required | Description | Default |
|---|---|---|---|
| squadId | No | ID of an existing squad to test against. Cannot be combined with inline squad. | |
| suiteIds | No | ||
| transport | No | Transport provider for the simulation run | |
| iterations | No | Number of times to run each simulation (default: 1) | |
| assistantId | No | ID of an existing assistant to test against. Cannot be combined with inline assistant. | |
| simulationIds | No | ||
| idempotencyKey | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does add real value by stating that the call returns the run with its ID and a shareable dashboard URL, and by implying the run is started asynchronously since progress must be polled via get_simulation_run. It says nothing about idempotency behavior, iteration limits, failure modes, or any permission requirements involved in starting a run.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the return value, then the follow-up tool. Every sentence carries distinct information with no restatement or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a seven-parameter launch tool with no annotations and no output schema, the description covers the essentials: what it starts, what it returns, and how to monitor it. The remaining gap is the undocumented idempotencyKey and any statement about run duration or expected errors, which keeps it short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 57%, so the schema already explains assistantId, squadId, simulationIds, suiteIds, iterations and transport. The description only restates the mutual-exclusion shape ('simulations and/or suites against an assistant or squad'); it adds no guidance on idempotencyKey, the only parameter lacking any schema description, nor on how iterations interacts with the run.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Starts a simulation run') and states the target ('of simulations and/or suites against an assistant or squad'), which mirrors the schema's mutual-exclusion groups. It is immediately distinguishable from get_simulation_run and list_simulations, which read state rather than launch it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to reach for this tool (launching a batch run of existing simulations or suites) and explicitly routes the agent to get_simulation_run for progress polling. It does not, however, position it against siblings like create_simulation or list_simulations, nor state any prerequisites such as needing an existing assistant or squad ID.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_skillsARead-only
Find Vapi agent skills in the public VapiAI/skills repository by name, description or content. Omit query to browse. Use load_skill to read a result.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | Keywords describing the Vapi task, or empty to browse all skills. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description still adds real context: the search target is a public GitHub-hosted repository (consistent with openWorldHint), and results are pointers that must be fetched with load_skill rather than full skill bodies. It does not mention ranking, pagination or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what it searches and where, followed by the browse case and the follow-up tool. No filler, no restatement of the tool name or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only search with no output schema, the description covers purpose, the empty-query behavior and the read follow-up, which is enough to call it correctly. The only loose end is the undocumented 'limit' parameter, whose default and cap of 30 live in the schema but carry no explanation of ordering or result-count tradeoffs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: the 'query' parameter already documents itself as keywords or empty-to-browse, so the description's wording largely mirrors the schema. The description does add the match fields (name, description, content) which the schema omits, but the 'limit' parameter is left entirely unexplained in both places, keeping this at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Find Vapi agent skills') and names the exact repository, scope and match fields (name, description, content). It also distinguishes itself from the sibling that consumes its output ('Use load_skill to read a result'), so an agent can separate search from read without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete usage condition ('Omit query to browse') and routes the agent to the correct follow-up tool (load_skill) for reading a hit. It stops short of an explicit 'do not use this for X' exclusion or guidance on when to prefer ask_vapi_docs, so it is clear but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_assistantC
Updates an existing Vapi assistant
| Name | Required | Description | Default |
|---|---|---|---|
| llm | No | New LLM configuration | |
| name | No | New name for the assistant | |
| voice | No | New voice configuration | |
| toolIds | No | New IDs of tools to use with this assistant | |
| assistantId | Yes | ID of the assistant to update | |
| transcriber | No | New transcription configuration | |
| firstMessage | No | First message to say to the user | |
| instructions | No | New instructions for the assistant | |
| firstMessageMode | No | This determines who speaks first, either assistant or user |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full behavioral burden and does not meet it. It never states whether this is a partial merge or a full replace (critical for a 9-parameter update tool where omitted fields may be wiped), whether the change is reversible, what permissions or auth are needed, or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is front-loaded and free of filler, but its brevity reflects under-specification rather than discipline. There is no wasted wording to cut, yet almost every sentence that would earn its place is missing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 9 parameters, nested objects, an enum, no output schema, and no annotations, a five-word description leaves major gaps. An agent cannot tell whether omitted fields are preserved or cleared, nor what a valid voice/llm object requires, without reading the schema closely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the nested llm, voice, and transcriber objects is already documented in the input schema. The description adds no extra meaning - no format hints for llm/voice objects, no note on the firstMessageMode enum behavior - so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Updates an existing Vapi assistant" names a specific verb and resource, so the basic action is unambiguous. However, it offers no differentiation from siblings such as create_assistant or get_assistant, and it says nothing about which aspects of the assistant are updatable - all of that has to be recovered from the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all: nothing tells the agent to prefer create_assistant for new assistants or get_assistant for read-only inspection. No prerequisites, no mention of whether the assistant must already exist beyond 'existing', and no guidance on partial vs. full configuration replacement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_toolC
Updates an existing Vapi tool
| Name | Required | Description | Default |
|---|---|---|---|
| sms | No | SMS tool configuration - to send text messages | |
| name | No | Name of the function/tool | |
| toolId | Yes | ID of the tool to update | |
| function | No | Custom function tool configuration - for custom server-side functions | |
| apiRequest | No | API Request tool configuration - for HTTP API integration | |
| description | No | Description of what the function/tool does | |
| transferCall | No | Transfer call tool configuration - to transfer calls to destinations | |
| additionalFields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and supplies almost nothing. It does not say whether this is a full replace or a partial merge, what happens to omitted fields, whether mutations are reversible, or whether the tool type can be changed after creation — all critical for a mutation tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is efficient and front-loaded with the verb, so nothing is wasted. But at this length for an 8-parameter polymorphic mutation tool the brevity reads as under-specification rather than concision, leaving the key update semantics unstated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a nested schema with 8 parameters and four mutually plausible tool-type configurations, plus no annotations and no output schema, the description is far too thin to guide a correct call. The rich schema descriptions partially compensate, but the agent still cannot determine partial-vs-full update behavior or success/failure characteristics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 88% and each of the 8 parameters (sms, function, apiRequest, transferCall, toolId, name, description, additionalFields) is documented in the schema itself, so the schema does most of the work. The description adds no meaning beyond that, including no clarification of whether multiple configuration blocks can be passed together, which the schema leaves ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Updates an existing Vapi tool"), so the agent knows this is a mutation on a tool entity. However, it offers no differentiation from sibling tools such as create_tool, get_tool, or list_tools sharing the same resource, and it does not indicate which tool types are modifiable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this instead of create_tool or get_tool, no prerequisites (does the tool already have to exist?), and no note that only one of the polymorphic configurations (sms, function, apiRequest, transferCall) should be supplied. Usage is only implied by the word "Updates".
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
29 tool updates
v0.1.0- Added
ask_vapi_docs - Changed
create_assistant15 fields changed- changed
Input schema / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Input schema / properties / firstMessageMode / enumPrevious value: -[ - "assistant-speaks-first", - "assistant-waits-for-user", - "assistant-speaks-first-with-model-generated-message" -]New value: +[ + "assistant-speaks-first", + "assistant-speaks-first-with-model-generated-message", + "assistant-waits-for-user" +] - added
Input schema / properties / instructions / maxLengthAdded value: +100000000 - changed
Input schema / properties / llm / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "model": { - "enum": [ - "gpt-4o", - "gpt-4o-mini" - ], - "type": "string" - }, - "provider": { - "const": "openai", - "type": "string" - } - }, - "required": [ - "provider", - "model" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "model": { - "enum": [ - "claude-3-7-sonnet-20250219", - "claude-3-5-haiku-20241022" - ], - "type": "string" - }, - "provider": { - "const": "anthropic", - "type": "string" - } - }, - "required": [ - "provider", - "model" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "model": { - "enum": [ - "gemini-1.5-pro", - "gemini-1.5-flash", - "gemini-2.0-flash", - "gemini-2.0-pro" - ], - "type": "string" - }, - "provider": { - "const": "google", - "type": "string" - } - }, - "required": [ - "provider", - "model" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "model": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "provider", - "model" - ], - "type": "object" - } - ] - }, - { - "type": "string" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "model": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "provider" + ], + "type": "object" + }, + { + "type": "string" + } +] - removed
Input schema / properties / llm / defaultRemoved value: -{ - "model": "gpt-4o", - "provider": "openai" -} - added
Input schema / properties / name / maxLengthAdded value: +40 - removed
Input schema / properties / transcriber / defaultRemoved value: -{ - "model": "nova-3", - "provider": "deepgram" -} - removed
Input schema / properties / transcriber / properties / model / descriptionRemoved value: -"Transcription model to use" - removed
Input schema / properties / transcriber / properties / provider / descriptionRemoved value: -"Provider to use for transcription" - changed
Input schema / properties / transcriber / requiredPrevious value: -[ - "provider", - "model" -]New value: +[ + "provider" +] - removed
Input schema / properties / voice / defaultRemoved value: -{ - "provider": "11labs", - "voiceId": "sarah" -} - removed
Input schema / properties / voice / properties / model / descriptionRemoved value: -"Voice model to use" - removed
Input schema / properties / voice / properties / provider / descriptionRemoved value: -"Provider to use for voice" - removed
Input schema / properties / voice / properties / provider / enumRemoved value: -[ - "vapi", - "11labs", - "azure", - "cartesia", - "custom-voice", - "deepgram", - "11labs", - "hume", - "lmnt", - "neuphonic", - "openai", - "playht", - "rime-ai", - "smallest-ai", - "tavus", - "sesame" -] - removed
Input schema / properties / voice / properties / voiceId / descriptionRemoved value: -"Voice ID to use"
- Changed
create_call8 fields changed- changed
Input schema / additionalPropertiesPrevious value: -falseNew value: +{} - removed
Input schema / properties / assistantOverrides / additionalPropertiesRemoved value: -false - added
Input schema / properties / assistantOverrides / properties / variableValues / propertiesAdded value: +{} - removed
Input schema / properties / customer / additionalPropertiesRemoved value: -false - added
Input schema / properties / customer / properties / number / maxLengthAdded value: +40 - added
Input schema / properties / customer / properties / number / minLengthAdded value: +3 - added
Input schema / properties / scheduledAt / formatAdded value: +"date-time" - added
Input schema / properties / scheduledAt / patternAdded value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
- Added
create_simulation - Added
create_simulation_personality - Added
create_simulation_scenario - Added
create_simulation_suite - Changed
create_tool64 fields changed- changed
Input schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Input schema / allOfAdded value: +[ + { + "if": { + "properties": { + "type": { + "const": "apiRequest" + } + }, + "required": [ + "type" + ] + }, + "then": { + "required": [ + "apiRequest" + ] + } + }, + { + "if": { + "anyOf": [ + { + "required": [ + "function" + ] + }, + { + "properties": { + "description": { + "minLength": 1 + } + }, + "required": [ + "description" + ] + } + ], + "properties": { + "type": { + "const": "function" + } + }, + "required": [ + "type" + ] + }, + "then": { + "required": [ + "name" + ] + } + } +] - added
Input schema / properties / additionalFieldsAdded value: +{ + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" +} - removed
Input schema / properties / apiRequest / additionalPropertiesRemoved value: -false - removed
Input schema / properties / apiRequest / properties / backoffPlan / additionalPropertiesRemoved value: -false - added
Input schema / properties / apiRequest / properties / backoffPlan / properties / baseDelaySeconds / maximumAdded value: +10 - added
Input schema / properties / apiRequest / properties / backoffPlan / properties / baseDelaySeconds / minimumAdded value: +0 - added
Input schema / properties / apiRequest / properties / backoffPlan / properties / maxRetries / maximumAdded value: +10 - added
Input schema / properties / apiRequest / properties / backoffPlan / properties / maxRetries / minimumAdded value: +0 - added
Input schema / properties / apiRequest / properties / backoffPlan / properties / type / descriptionAdded value: +"This is the type of backoff plan to use. Defaults to fixed.\n\n@default fixed" - removed
Input schema / properties / apiRequest / properties / body / additionalPropertiesRemoved value: -false - added
Input schema / properties / apiRequest / properties / body / properties / descriptionAdded value: +{ + "description": "This is the description to help the model understand what it needs to output.", + "type": "string" +} - added
Input schema / properties / apiRequest / properties / body / properties / enumAdded value: +{ + "description": "This array specifies the allowed values that can be used to restrict the output of the model.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / apiRequest / properties / body / properties / formatAdded value: +{ + "type": "string" +} - added
Input schema / properties / apiRequest / properties / body / properties / itemsAdded value: +{} - added
Input schema / properties / apiRequest / properties / body / properties / patternAdded value: +{ + "type": "string" +} - removed
Input schema / properties / apiRequest / properties / body / properties / properties / $refRemoved value: -"#/properties/function/properties/parameters/properties/properties" - added
Input schema / properties / apiRequest / properties / body / properties / properties / additionalPropertiesAdded value: +{ + "allOf": [ + {} + ] +} - added
Input schema / properties / apiRequest / properties / body / properties / properties / descriptionAdded value: +"This is required if the type is \"object\". This specifies the properties of the object. This is a map of property names to JsonSchema objects." - added
Input schema / properties / apiRequest / properties / body / properties / properties / propertiesAdded value: +{} - added
Input schema / properties / apiRequest / properties / body / properties / properties / typeAdded value: +"object" - removed
Input schema / properties / apiRequest / properties / body / properties / required / $refRemoved value: -"#/properties/function/properties/parameters/properties/required" - added
Input schema / properties / apiRequest / properties / body / properties / required / descriptionAdded value: +"This is a list of properties that are required.\n\nThis only makes sense if the type is \"object\"." - added
Input schema / properties / apiRequest / properties / body / properties / required / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / apiRequest / properties / body / properties / required / typeAdded value: +"array" - added
Input schema / properties / apiRequest / properties / body / properties / titleAdded value: +{ + "description": "This is the title of the schema.", + "type": "string" +} - removed
Input schema / properties / apiRequest / properties / body / properties / type / $refRemoved value: -"#/properties/function/properties/parameters/properties/type" - added
Input schema / properties / apiRequest / properties / body / properties / type / enumAdded value: +[ + "string", + "number", + "integer", + "boolean", + "array", + "object" +] - added
Input schema / properties / apiRequest / properties / body / properties / type / typeAdded value: +"string" - changed
Input schema / properties / apiRequest / properties / body / requiredPrevious value: -[ - "type", - "properties" -]New value: +[ + "type" +] - added
Input schema / properties / apiRequest / properties / headers / propertiesAdded value: +{} - changed
Input schema / properties / apiRequest / properties / method / enumPrevious value: -[ - "GET", - "POST" -]New value: +[ + "POST", + "GET", + "PUT", + "PATCH", + "DELETE" +] - added
Input schema / properties / apiRequest / properties / timeoutSeconds / maximumAdded value: +300 - added
Input schema / properties / apiRequest / properties / timeoutSeconds / minimumAdded value: +1 - removed
Input schema / properties / function / additionalPropertiesRemoved value: -false - removed
Input schema / properties / function / properties / parameters / additionalPropertiesRemoved value: -false - removed
Input schema / properties / function / properties / parameters / properties / properties / additionalProperties / additionalPropertiesRemoved value: -false - removed
Input schema / properties / function / properties / parameters / properties / properties / additionalProperties / propertiesRemoved value: -{ - "description": { - "type": "string" - }, - "enum": { - "items": { - "type": "string" - }, - "type": "array" - }, - "items": {}, - "properties": { - "additionalProperties": {}, - "type": "object" - }, - "required": { - "items": { - "type": "string" - }, - "type": "array" - }, - "type": { - "type": "string" - } -} - removed
Input schema / properties / function / properties / parameters / properties / properties / additionalProperties / requiredRemoved value: -[ - "type" -] - removed
Input schema / properties / function / properties / parameters / properties / properties / additionalProperties / typeRemoved value: -"object" - added
Input schema / properties / function / properties / parameters / properties / properties / propertiesAdded value: +{} - added
Input schema / properties / function / properties / parameters / properties / required / descriptionAdded value: +"This specifies the properties that are required by the function." - added
Input schema / properties / function / properties / parameters / properties / type / descriptionAdded value: +"This must be set to 'object'. It instructs the model to return a JSON object containing the function call properties." - removed
Input schema / properties / function / properties / server / additionalPropertiesRemoved value: -false - added
Input schema / properties / function / properties / server / properties / headers / propertiesAdded value: +{} - added
Input schema / properties / name / maxLengthAdded value: +64 - added
Input schema / properties / name / patternAdded value: +"^[a-zA-Z0-9_-]{1,64}$" - removed
Input schema / properties / sms / additionalPropertiesRemoved value: -false - removed
Input schema / properties / sms / properties / metadata / additionalPropertiesRemoved value: -false - removed
Input schema / properties / transferCall / additionalPropertiesRemoved value: -false - changed
Input schema / properties / transferCall / properties / destinations / items / additionalPropertiesPrevious value: -falseNew value: +{} - added
Input schema / properties / transferCall / properties / destinations / items / descriptionAdded value: +"Transfer destination. Other TransferDestinationNumber fields, such as transferPlan and message, are sent as given (see get_api_schema)." - removed
Input schema / properties / transferCall / properties / destinations / items / properties / callerId / descriptionRemoved value: -"Caller ID to use for the transfer" - added
Input schema / properties / transferCall / properties / destinations / items / properties / callerId / maxLengthAdded value: +40 - changed
Input schema / properties / transferCall / properties / destinations / items / properties / description / descriptionPrevious value: -"Description of the transfer destination"New value: +"This is the description of the destination, used by the AI to choose when and how to transfer the call." - changed
Input schema / properties / transferCall / properties / destinations / items / properties / extension / descriptionPrevious value: -"Extension number if applicable"New value: +"This is the extension to dial after transferring the call to the `number`." - added
Input schema / properties / transferCall / properties / destinations / items / properties / extension / maxLengthAdded value: +10 - added
Input schema / properties / transferCall / properties / destinations / items / properties / extension / minLengthAdded value: +1 - changed
Input schema / properties / transferCall / properties / destinations / items / properties / number / descriptionPrevious value: -"Phone number to transfer to (e.g., \"+16054440129\"). It can be any phone number in E.164 format."New value: +"This is the phone number to transfer the call to." - added
Input schema / properties / transferCall / properties / destinations / items / properties / number / maxLengthAdded value: +40 - added
Input schema / properties / transferCall / properties / destinations / items / properties / number / minLengthAdded value: +3 - added
Input schema / properties / type / anyOfAdded value: +[ + { + "const": "sms", + "description": "The type of tool. \"sms\" for Twilio SMS sending tool.", + "type": "string" + }, + { + "const": "transferCall", + "type": "string" + }, + { + "const": "function", + "description": "The type of tool. \"function\" for Function tool.", + "type": "string" + }, + { + "const": "apiRequest", + "description": "The type of tool. \"apiRequest\" for API request tool.", + "type": "string" + } +] - removed
Input schema / properties / type / enumRemoved value: -[ - "sms", - "transferCall", - "function", - "apiRequest" -] - removed
Input schema / properties / type / typeRemoved value: -"string"
- Added
get_api_schema - Changed
get_assistant3 fields changed- changed
Input schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Input schema / properties / assistantId / formatAdded value: +"uuid" - added
Input schema / properties / assistantId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Changed
get_call3 fields changed- changed
Input schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Input schema / properties / callId / formatAdded value: +"uuid" - added
Input schema / properties / callId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Changed
get_phone_number3 fields changed- changed
Input schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Input schema / properties / phoneNumberId / formatAdded value: +"uuid" - added
Input schema / properties / phoneNumberId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Added
get_simulation_run - Added
get_simulation_run_item - Changed
get_tool3 fields changed- changed
Input schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Input schema / properties / toolId / formatAdded value: +"uuid" - added
Input schema / properties / toolId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Changed
list_assistants1 field changed- added
Input schema / additionalPropertiesAdded value: +{}
- Changed
list_calls1 field changed- added
Input schema / additionalPropertiesAdded value: +{}
- Changed
list_phone_numbers1 field changed- added
Input schema / additionalPropertiesAdded value: +{}
- Added
list_simulation_personalities - Added
list_simulation_runs - Added
list_simulation_scenarios - Added
list_simulation_suites - Added
list_simulations - Changed
list_tools1 field changed- added
Input schema / additionalPropertiesAdded value: +{}
- Added
load_skill - Added
run_simulations - Added
search_skills - Changed
update_assistant14 fields changed- changed
Input schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Input schema / properties / assistantId / formatAdded value: +"uuid" - added
Input schema / properties / assistantId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" - changed
Input schema / properties / firstMessageMode / enumPrevious value: -[ - "assistant-speaks-first", - "assistant-waits-for-user", - "assistant-speaks-first-with-model-generated-message" -]New value: +[ + "assistant-speaks-first", + "assistant-speaks-first-with-model-generated-message", + "assistant-waits-for-user" +] - added
Input schema / properties / instructions / maxLengthAdded value: +100000000 - changed
Input schema / properties / llm / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "model": { - "enum": [ - "gpt-4o", - "gpt-4o-mini" - ], - "type": "string" - }, - "provider": { - "const": "openai", - "type": "string" - } - }, - "required": [ - "provider", - "model" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "model": { - "enum": [ - "claude-3-7-sonnet-20250219", - "claude-3-5-haiku-20241022" - ], - "type": "string" - }, - "provider": { - "const": "anthropic", - "type": "string" - } - }, - "required": [ - "provider", - "model" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "model": { - "enum": [ - "gemini-1.5-pro", - "gemini-1.5-flash", - "gemini-2.0-flash", - "gemini-2.0-pro" - ], - "type": "string" - }, - "provider": { - "const": "google", - "type": "string" - } - }, - "required": [ - "provider", - "model" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "model": { - "type": "string" - }, - "provider": { - "type": "string" - } - }, - "required": [ - "provider", - "model" - ], - "type": "object" - } - ] - }, - { - "type": "string" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "model": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "required": [ + "provider" + ], + "type": "object" + }, + { + "type": "string" + } +] - added
Input schema / properties / name / maxLengthAdded value: +40 - removed
Input schema / properties / transcriber / properties / model / descriptionRemoved value: -"Transcription model to use" - removed
Input schema / properties / transcriber / properties / provider / descriptionRemoved value: -"Provider to use for transcription" - changed
Input schema / properties / transcriber / requiredPrevious value: -[ - "provider", - "model" -]New value: +[ + "provider" +] - removed
Input schema / properties / voice / properties / model / descriptionRemoved value: -"Voice model to use" - removed
Input schema / properties / voice / properties / provider / descriptionRemoved value: -"Provider to use for voice" - removed
Input schema / properties / voice / properties / provider / enumRemoved value: -[ - "vapi", - "11labs", - "azure", - "cartesia", - "custom-voice", - "deepgram", - "11labs", - "hume", - "lmnt", - "neuphonic", - "openai", - "playht", - "rime-ai", - "smallest-ai", - "tavus", - "sesame" -] - removed
Input schema / properties / voice / properties / voiceId / descriptionRemoved value: -"Voice ID to use"
- Changed
update_tool62 fields changed- changed
Input schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Input schema / properties / additionalFieldsAdded value: +{ + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" +} - removed
Input schema / properties / apiRequest / additionalPropertiesRemoved value: -false - removed
Input schema / properties / apiRequest / properties / backoffPlan / additionalPropertiesRemoved value: -false - added
Input schema / properties / apiRequest / properties / backoffPlan / properties / baseDelaySeconds / maximumAdded value: +10 - added
Input schema / properties / apiRequest / properties / backoffPlan / properties / baseDelaySeconds / minimumAdded value: +0 - added
Input schema / properties / apiRequest / properties / backoffPlan / properties / maxRetries / maximumAdded value: +10 - added
Input schema / properties / apiRequest / properties / backoffPlan / properties / maxRetries / minimumAdded value: +0 - added
Input schema / properties / apiRequest / properties / backoffPlan / properties / type / descriptionAdded value: +"This is the type of backoff plan to use. Defaults to fixed.\n\n@default fixed" - removed
Input schema / properties / apiRequest / properties / body / additionalPropertiesRemoved value: -false - added
Input schema / properties / apiRequest / properties / body / properties / descriptionAdded value: +{ + "description": "This is the description to help the model understand what it needs to output.", + "type": "string" +} - added
Input schema / properties / apiRequest / properties / body / properties / enumAdded value: +{ + "description": "This array specifies the allowed values that can be used to restrict the output of the model.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / apiRequest / properties / body / properties / formatAdded value: +{ + "type": "string" +} - added
Input schema / properties / apiRequest / properties / body / properties / itemsAdded value: +{} - added
Input schema / properties / apiRequest / properties / body / properties / patternAdded value: +{ + "type": "string" +} - removed
Input schema / properties / apiRequest / properties / body / properties / properties / $refRemoved value: -"#/properties/function/properties/parameters/properties/properties" - added
Input schema / properties / apiRequest / properties / body / properties / properties / additionalPropertiesAdded value: +{ + "allOf": [ + {} + ] +} - added
Input schema / properties / apiRequest / properties / body / properties / properties / descriptionAdded value: +"This is required if the type is \"object\". This specifies the properties of the object. This is a map of property names to JsonSchema objects." - added
Input schema / properties / apiRequest / properties / body / properties / properties / propertiesAdded value: +{} - added
Input schema / properties / apiRequest / properties / body / properties / properties / typeAdded value: +"object" - removed
Input schema / properties / apiRequest / properties / body / properties / required / $refRemoved value: -"#/properties/function/properties/parameters/properties/required" - added
Input schema / properties / apiRequest / properties / body / properties / required / descriptionAdded value: +"This is a list of properties that are required.\n\nThis only makes sense if the type is \"object\"." - added
Input schema / properties / apiRequest / properties / body / properties / required / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / apiRequest / properties / body / properties / required / typeAdded value: +"array" - added
Input schema / properties / apiRequest / properties / body / properties / titleAdded value: +{ + "description": "This is the title of the schema.", + "type": "string" +} - removed
Input schema / properties / apiRequest / properties / body / properties / type / $refRemoved value: -"#/properties/function/properties/parameters/properties/type" - added
Input schema / properties / apiRequest / properties / body / properties / type / enumAdded value: +[ + "string", + "number", + "integer", + "boolean", + "array", + "object" +] - added
Input schema / properties / apiRequest / properties / body / properties / type / typeAdded value: +"string" - changed
Input schema / properties / apiRequest / properties / body / requiredPrevious value: -[ - "type", - "properties" -]New value: +[ + "type" +] - added
Input schema / properties / apiRequest / properties / headers / propertiesAdded value: +{} - changed
Input schema / properties / apiRequest / properties / method / enumPrevious value: -[ - "GET", - "POST" -]New value: +[ + "POST", + "GET", + "PUT", + "PATCH", + "DELETE" +] - added
Input schema / properties / apiRequest / properties / timeoutSeconds / maximumAdded value: +300 - added
Input schema / properties / apiRequest / properties / timeoutSeconds / minimumAdded value: +1 - removed
Input schema / properties / function / additionalPropertiesRemoved value: -false - removed
Input schema / properties / function / properties / parameters / additionalPropertiesRemoved value: -false - removed
Input schema / properties / function / properties / parameters / properties / properties / additionalProperties / additionalPropertiesRemoved value: -false - removed
Input schema / properties / function / properties / parameters / properties / properties / additionalProperties / propertiesRemoved value: -{ - "description": { - "type": "string" - }, - "enum": { - "items": { - "type": "string" - }, - "type": "array" - }, - "items": {}, - "properties": { - "additionalProperties": {}, - "type": "object" - }, - "required": { - "items": { - "type": "string" - }, - "type": "array" - }, - "type": { - "type": "string" - } -} - removed
Input schema / properties / function / properties / parameters / properties / properties / additionalProperties / requiredRemoved value: -[ - "type" -] - removed
Input schema / properties / function / properties / parameters / properties / properties / additionalProperties / typeRemoved value: -"object" - added
Input schema / properties / function / properties / parameters / properties / properties / propertiesAdded value: +{} - added
Input schema / properties / function / properties / parameters / properties / required / descriptionAdded value: +"This specifies the properties that are required by the function." - added
Input schema / properties / function / properties / parameters / properties / type / descriptionAdded value: +"This must be set to 'object'. It instructs the model to return a JSON object containing the function call properties." - removed
Input schema / properties / function / properties / server / additionalPropertiesRemoved value: -false - added
Input schema / properties / function / properties / server / properties / headers / propertiesAdded value: +{} - added
Input schema / properties / name / maxLengthAdded value: +64 - added
Input schema / properties / name / patternAdded value: +"^[a-zA-Z0-9_-]{1,64}$" - removed
Input schema / properties / sms / additionalPropertiesRemoved value: -false - removed
Input schema / properties / sms / properties / metadata / additionalPropertiesRemoved value: -false - added
Input schema / properties / toolId / formatAdded value: +"uuid" - added
Input schema / properties / toolId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" - removed
Input schema / properties / transferCall / additionalPropertiesRemoved value: -false - changed
Input schema / properties / transferCall / properties / destinations / items / additionalPropertiesPrevious value: -falseNew value: +{} - added
Input schema / properties / transferCall / properties / destinations / items / descriptionAdded value: +"Transfer destination. Other TransferDestinationNumber fields, such as transferPlan and message, are sent as given (see get_api_schema)." - removed
Input schema / properties / transferCall / properties / destinations / items / properties / callerId / descriptionRemoved value: -"Caller ID to use for the transfer" - added
Input schema / properties / transferCall / properties / destinations / items / properties / callerId / maxLengthAdded value: +40 - changed
Input schema / properties / transferCall / properties / destinations / items / properties / description / descriptionPrevious value: -"Description of the transfer destination"New value: +"This is the description of the destination, used by the AI to choose when and how to transfer the call." - changed
Input schema / properties / transferCall / properties / destinations / items / properties / extension / descriptionPrevious value: -"Extension number if applicable"New value: +"This is the extension to dial after transferring the call to the `number`." - added
Input schema / properties / transferCall / properties / destinations / items / properties / extension / maxLengthAdded value: +10 - added
Input schema / properties / transferCall / properties / destinations / items / properties / extension / minLengthAdded value: +1 - changed
Input schema / properties / transferCall / properties / destinations / items / properties / number / descriptionPrevious value: -"Phone number to transfer to (e.g., \"+16054440129\"). It can be any phone number in E.164 format."New value: +"This is the phone number to transfer the call to." - added
Input schema / properties / transferCall / properties / destinations / items / properties / number / maxLengthAdded value: +40 - added
Input schema / properties / transferCall / properties / destinations / items / properties / number / minLengthAdded value: +3
2 tool updates
v0.0.11- Removed
vapi_login - Removed
vapi_logout
2 tool updates
v0.0.9- Added
vapi_login - Added
vapi_logout
13 tool updates
v1.0.0- Added
create_assistant - Added
create_call - Added
create_tool - Added
get_assistant - Added
get_call - Added
get_phone_number - Added
get_tool - Added
list_assistants - Added
list_calls - Added
list_phone_numbers - Added
list_tools - Added
update_assistant - Added
update_tool
TDQS
Scored across 29 tools
Most tools target a distinct resource+action pair, and the simulation cluster (personality vs scenario vs simulation vs suite vs run) is disambiguated by explicit descriptions. The closest overlaps are list_simulations vs list_simulation_runs and the four read/query helpers (ask_vapi_docs, get_api_schema, search_skills, load_skill), which are related but still separable.
Nearly everything follows a snake_case verb_noun pattern (list_assistants, create_call, get_simulation_run_item), which is predictable. Minor deviations exist in the docs/skills group where 'ask_vapi_docs' and 'load_skill' depart slightly from the get_/list_/create_ convention.
29 tools is heavy and well past the comfortable range, dominated by 12 near-repetitive simulation tools (list/create/get for personalities, scenarios, simulations, suites, runs). While they map to real product areas, the surface feels bloated rather than deliberately scoped.
Core flows (create assistant/call/tool, run simulations and inspect results) are covered, but lifecycle coverage is patchy: no delete operations anywhere, phone numbers are read-only (list/get only, no create/update/delete), and simulations have list/create but no get_simulation or update/delete.
Maintenance
Related MCP Connectors
Access your Callin.io AI phone agents, call history and transcripts from any AI assistant.
Find and call verified APIs from any AI assistant, with free trial calls and previewed writes.
Lets Claude, Cursor or any MCP client build voice agents and place real phone calls.
Give your AI assistant a real phone line. Place and end real phone calls with AI voice agents, read call transcripts, run a live two-way interpreter between two people who share no language (31 languages, browser link or phone), create and edit voice agents, and search, buy and bind phone numbers in 21 countries. OAuth 2.1 with PKCE — the model never sees your API key; a read-only scope is available. Pay as you go from $0.10/min, $5 free credit for new accounts.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables integration with Vapi's voice AI platform to manage assistants, create and schedule phone calls with dynamic variables, and manage phone numbers through function calling.414 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI models to send messages to Lark users and manage calendar events (list, create, add attendees) through the Model Context Protocol.18 npm6MIT
- AlicenseNot gradedqualityDmaintenanceProvides a standardized interface for interacting with Falai's tools and services through the Model Context Protocol, enabling AI assistants to leverage Falai capabilities.2MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI clients to seamlessly take HubSpot actions and interact with your HubSpot data through the Model Context Protocol.45,845 npmMIT