Assistable
Give any AI agent a phone: make and answer calls, get through phone menus, and send texts.
Should I use this
Quality & Safety
Findings (1)
- LOWin tools_update
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"assistable": {
"url": "https://api.assistable.ai/mcp"
}
}
}Remote endpoints
https://api.assistable.ai/mcpstreamable-httpWhat it can do
Tool inventory
Tools (16)
🟢search_tools(query, limit)
Search Assistable's registered MCP tools by the task the user wants to do. Returns up to 5 exact tool definitions with JSON input schemas and annotations. Use this first when you need to choose a tool; the result is not authorization to call it.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 2,
"maxLength": 240,
"description": "A short description of the task or capability needed."
},
"limit": {
"description": "How many matching tools to return. Defaults to 5.",
"type": "integer",
"minimum": 1,
"maximum": 5
}
},
"required": [
"query"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢assistants_list(subAccountId, limit, cursor, includeArchived)
List assistants in a subaccount (excludes archived by default). Note: voice_settings and platform_tools are returned only by assistants_get, not in the list.
Input Schema
{
"type": "object",
"properties": {
"subAccountId": {
"type": "string"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string"
},
"includeArchived": {
"type": "boolean"
}
},
"required": [
"subAccountId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢assistants_get(assistantId)
Fetch an assistant's full configuration by ID. The response includes voice_settings (greeting mode, opening messages, voicemail) and platform_tools (attached platform-catalog tool names).
Input Schema
{
"type": "object",
"properties": {
"assistantId": {
"type": "string"
}
},
"required": [
"assistantId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡assistants_create(subAccountId, name, description, assistantType, voiceId, ...)
Create an assistant. Required: subAccountId, name. Optional config blocks (llmConfig, voiceConfig, chatConfig) mirror the dashboard create dialog. voice_settings configures call greeting mode, opening messages, and voicemail behavior; platform_tools attaches platform-catalog tools (declarative full-replace — see the field description).
Input Schema
{
"type": "object",
"properties": {
"subAccountId": {
"type": "string"
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"assistantType": {
"type": "string",
"enum": [
"STANDARD",
"FLOW_BUILDER"
]
},
"voiceId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"llmConfig": {
"type": "object",
"properties": {
"model": {
"type": "string"
},
"prompt": {
"type": "string"
},
"temperature": {
"type": "number"
}
}
},
"voiceConfig": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"chatConfig": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"voice_settings": {
"type": "object",
"properties": {
"greeting_mode": {
"description": "How the assistant opens a call: `dynamic` (AI-generated opener; default), `fixed` (speaks the configured opening message verbatim), or `contact_first` (stays silent until the contact speaks).",
"type": "string",
"enum": [
"dynamic",
"fixed",
"contact_first"
]
},
"inbound_opening_message": {
"description": "Spoken opener for inbound calls. Only valid in `fixed` greeting mode. Template variables (e.g. a contact first-name placeholder) are allowed and resolve per call. `null` clears this direction.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"outbound_opening_message": {
"description": "Spoken opener for outbound calls. Only valid in `fixed` greeting mode. Template variables are allowed and resolve per call. `null` clears this direction.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"voicemail_message": {
"description": "Played when voicemail is detected, after which the assistant stops. Empty or `null` means the assistant hangs up on voicemail instead.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"enable_voicemail_detection": {
"description": "Records intent only: persisted and returned on read, but voicemail detection is currently platform-managed and this flag does not yet gate runtime behavior.",
"type": "boolean"
}
}
},
"platform_tools": {
"description": "Platform tool names to attach, e.g. [\"book_appointment\", \"send_email\"]. Declarative within the platform catalog: tools in the list are attached, catalog tools missing from the list are detached, custom tools are never touched. Omit for no change; [] detaches all platform tools. See GET /v3/tools for the catalog; custom tools attach via POST /v3/tools/{id}/assign.",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"subAccountId",
"name"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡assistants_update(assistantId, name, description, voiceId, llmConfig, ...)
Patch an assistant. Only supplied fields change; nested config blocks are upserted. voice_settings updates call greeting mode, opening messages, and voicemail behavior; platform_tools declaratively replaces the attached platform-catalog tools (an empty array detaches all — see the field description).
Input Schema
{
"type": "object",
"properties": {
"assistantId": {
"type": "string"
},
"name": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"voiceId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"llmConfig": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"voiceConfig": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"chatConfig": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"voice_settings": {
"type": "object",
"properties": {
"greeting_mode": {
"description": "How the assistant opens a call: `dynamic` (AI-generated opener; default), `fixed` (speaks the configured opening message verbatim), or `contact_first` (stays silent until the contact speaks).",
"type": "string",
"enum": [
"dynamic",
"fixed",
"contact_first"
]
},
"inbound_opening_message": {
"description": "Spoken opener for inbound calls. Only valid in `fixed` greeting mode. Template variables (e.g. a contact first-name placeholder) are allowed and resolve per call. `null` clears this direction.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"outbound_opening_message": {
"description": "Spoken opener for outbound calls. Only valid in `fixed` greeting mode. Template variables are allowed and resolve per call. `null` clears this direction.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"voicemail_message": {
"description": "Played when voicemail is detected, after which the assistant stops. Empty or `null` means the assistant hangs up on voicemail instead.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"enable_voicemail_detection": {
"description": "Records intent only: persisted and returned on read, but voicemail detection is currently platform-managed and this flag does not yet gate runtime behavior.",
"type": "boolean"
}
}
},
"platform_tools": {
"description": "Platform tool names to attach, e.g. [\"book_appointment\", \"send_email\"]. Declarative within the platform catalog: tools in the list are attached, catalog tools missing from the list are detached, custom tools are never touched. Omit for no change; [] detaches all platform tools. See GET /v3/tools for the catalog; custom tools attach via POST /v3/tools/{id}/assign.",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"assistantId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🔴assistants_archive(assistantId)
Archive (soft-delete) an assistant.
Input Schema
{
"type": "object",
"properties": {
"assistantId": {
"type": "string"
}
},
"required": [
"assistantId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢tools_list(subAccountId, search, includePrebuilt, limit, cursor)
List tools visible to a subaccount. Pass includePrebuilt=false for only custom tools.
Input Schema
{
"type": "object",
"properties": {
"subAccountId": {
"type": "string"
},
"search": {
"type": "string"
},
"includePrebuilt": {
"type": "boolean"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string"
}
},
"required": [
"subAccountId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢tools_get(toolId)
Fetch a tool's full configuration.
Input Schema
{
"type": "object",
"properties": {
"toolId": {
"type": "string"
}
},
"required": [
"toolId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡tools_create_custom(subAccountId, name, description, url, httpMethod, ...)
Create a custom tool (toolType=CUSTOM). Name must match /^[a-zA-Z0-9_-]+$/ and be unique in the subaccount.
Input Schema
{
"type": "object",
"properties": {
"subAccountId": {
"type": "string"
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"httpMethod": {
"type": "string",
"enum": [
"GET",
"POST",
"PUT",
"PATCH",
"DELETE"
]
},
"headers": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"parameters": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"description": {
"type": "string"
}
},
"required": [
"name",
"type"
]
}
}
},
"required": [
"subAccountId",
"name"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡tools_update(toolId, name, description, url, httpMethod, ...)
Patch a custom tool. Supplying parameters/headers replaces those rows; omit to leave them.
Input Schema
{
"type": "object",
"properties": {
"toolId": {
"type": "string"
},
"name": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"httpMethod": {
"type": "string",
"enum": [
"GET",
"POST",
"PUT",
"PATCH",
"DELETE"
]
},
"headers": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
{
"type": "null"
}
]
},
"parameters": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"description": {
"type": "string"
}
},
"required": [
"name",
"type"
]
}
},
{
"type": "null"
}
]
}
},
"required": [
"toolId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🔴tools_delete(toolId)
Soft-delete a custom tool.
Input Schema
{
"type": "object",
"properties": {
"toolId": {
"type": "string"
}
},
"required": [
"toolId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢contacts_list(subAccountId, search, limit, cursor)
List contacts in a subaccount. meta.total is the number of matching contacts, so use it to answer how many contacts there are.
Input Schema
{
"type": "object",
"properties": {
"subAccountId": {
"type": "string"
},
"search": {
"type": "string"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string"
}
},
"required": [
"subAccountId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢contacts_get(contactId)
Fetch a contact by ID.
Input Schema
{
"type": "object",
"properties": {
"contactId": {
"type": "string"
}
},
"required": [
"contactId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢conversations_list(subAccountId, limit, cursor)
List conversations in a subaccount.
Input Schema
{
"type": "object",
"properties": {
"subAccountId": {
"type": "string"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string"
}
},
"required": [
"subAccountId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢appointments_list(subAccountId, startDate, endDate, limit, cursor)
List appointments in a subaccount within an optional date range.
Input Schema
{
"type": "object",
"properties": {
"subAccountId": {
"type": "string"
},
"startDate": {
"type": "string"
},
"endDate": {
"type": "string"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string"
}
},
"required": [
"subAccountId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢calls_get(call_id, callId)
Fetch a call (status, recording, transcript) by ID.
Input Schema
{
"type": "object",
"properties": {
"call_id": {
"type": "string",
"minLength": 1
},
"callId": {
"description": "Legacy alias for call_id.",
"type": "string",
"minLength": 1
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}Community
Evidence