Assistable

Give any AI agent a phone: make and answer calls, get through phone menus, and send texts.

Should I use this

Quality & Safety

A
Description quality
94%
Schema completeness
80%
Naming quality
83%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'tools_update' description lacks action verbin tools_update

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,839Tokens (tool definitions)
~1.6 KBTypical response size
Significant attention impact (2.22% of 128k context)

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-http

What it can do

Tool inventory

Tools (16)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded16 tools