npx skills add ...
npx skills add vapiai/skills --skill create-tool
Select, define, create, inspect, update, attach, detach, and verify reusable Vapi tools through the public API. Use for native call-control tools, supported provider integrations, API Request tools, custom function tools, MCP tools, tool messages, credentials, or configuration-preserving assistant attachment changes.
npx skills add vapiai/skills --skill create-tool
Choose the documented tool type that directly provides the requested capability. Default to a payload or implementation plan unless the user explicitly requests a live Vapi mutation.
| Need | Select |
|---|---|
| End calls, transfer calls, hand off between assistants, send DTMF or SMS, make a SIP request, or handle voicemail | The matching native Vapi tool |
| Use a publicly documented Google Calendar, Google Sheets, Slack, GoHighLevel, or other supported provider action | The exact integration tool after resolving its connection and required resource |
| Call a known HTTP endpoint with a declarative method, URL, headers, and body | apiRequest |
| Send a model-selected function call to custom backend logic that implements Vapi's callback contract | function |
| Discover and use tools from an existing MCP server | mcp with the default Streamable HTTP transport |
Do not choose function merely because the model invokes the capability. Native, integration, API Request, and MCP tools are also model-invoked.
Do not proactively recommend or create a Code Tool (type: "code"); it is not generally available on most accounts. Prefer apiRequest for a known HTTP endpoint or function with the user's server.url for user-hosted callback logic. Discuss a Code Tool only when the user explicitly asks about it, and do not present it as the recommended option.
Read Tool Type Selection before building a payload. Read only the section for the selected family.
Determine the execution mode.
VAPI_API_KEY is available.Inspect before creating.
GET /tool and match any supplied name and capability to existing tools.GET /tool/{id} before updating an existing tool.Resolve the capability and dependencies.
Build the smallest valid payload.
function.name, use 1–64 characters matching ^[a-zA-Z0-9_-]+$. Generate a stable descriptive name when the user does not supply one.apiRequest, validate its top-level name, method, URL, headers, body schema, credentials, and timeout against the current public schema.messages unless progress feedback is useful. When included, use only types currently accepted by the selected tool schema, such as request-start, request-response-delayed, request-complete, and request-failed.Create or update safely.
POST /tool. Validate the returned id, type, callable name where applicable, and requested configuration.type and only changed top-level fields to PATCH /tool/{id}. When changing a nested object, deep-merge the requested change into that object from the fetched tool and send the merged nested object so its omitted keys are not lost. Do not resend unchanged top-level fields or response-only fields.Attach or detach without losing assistant configuration.
GET /assistant/{id}, copy the complete current model, merge the tool ID into or remove it from model.toolIds, and preserve model.tools plus every unrelated model field.PATCH /assistant/{id}. Never patch a hand-written partial model.Implement external behavior only when requested.
apiRequest, Vapi executes the configured HTTP request; do not also build a function callback server.mcp, the MCP server supplies the callable tools; do not duplicate them as individual Vapi function tools.function whose backend must be built, read Function Tool Server. Do not load that reference for other tool families.Handle failures honestly.
400, correct a documented shape or validation error before at most one justified retry.401 or 403, stop for authentication or permission issues. On 404, report the missing tool, assistant, destination, or dependency. On 5xx, report the service failure.Read Tool API Examples when the user requests TypeScript, Python, or cURL implementation code. Read current tool and assistant state before update or attachment changes. Placeholders are acceptable in draft artifacts, never in live requests.