Koskamo

Assistable MCP

Provides AI agents with telephony capabilities including making and answering voice calls, navigating phone menus, sending and reading SMS/WhatsApp messages, and booking appointments via connected calendars.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Assistable MCP logo, by Assistable Machine Learning, Inc.Vendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Assistable Machine Learning, Inc.
MCP endpoint (Streamable HTTP)
https://api.assistable.ai/mcp
Vendor documentation

What you can do with it

  • Make and answer AI voice calls
  • Send and read SMS/WhatsApp texts
  • Navigate interactive phone menus
  • Book appointments on calendars

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
assistable 0.4.0
MCP protocol
2025-06-18
Tools
16 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Tools target the CreateAssistants v3 REST API (multi-channel voice AI: voice, SMS, WhatsApp, web chat). Use search_tools with the user's intent first; it returns a small set of exact registered tool names, input schemas, annotations and the current catalog version. Then call the matching tool directly. Search results do not grant access: every operation still requires the caller's v3 API key (Authorization: Bearer ask_live_…) and the key's scopes/subaccount access. Subaccount-scoped tools take a subAccountId argument where shown. list_/get_ tools are read-only; create/update are writes; archive/delete are destructive. Auth + docs: https://www.assistable.ai/auth.md

Tools

16 advertised

search_tools
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

search_tools input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 5,
      "minimum": 1,
      "description": "How many matching tools to return. Defaults to 5."
    },
    "query": {
      "type": "string",
      "maxLength": 240,
      "minLength": 2,
      "description": "A short description of the task or capability needed."
    }
  }
}
search_tools annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
assistants_list
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

assistants_list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "subAccountId"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1
    },
    "cursor": {
      "type": "string"
    },
    "subAccountId": {
      "type": "string"
    },
    "includeArchived": {
      "type": "boolean"
    }
  }
}
assistants_list annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
assistants_get
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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).

assistants_get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "assistantId"
  ],
  "properties": {
    "assistantId": {
      "type": "string"
    }
  }
}
assistants_get annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
assistants_create
Advertised by the server during the last successful anonymous check.

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).

assistants_create input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "subAccountId",
    "name"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "voiceId": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "llmConfig": {
      "type": "object",
      "properties": {
        "model": {
          "type": "string"
        },
        "prompt": {
          "type": "string"
        },
        "temperature": {
          "type": "number"
        }
      }
    },
    "chatConfig": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "description": {
      "type": "string"
    },
    "voiceConfig": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "subAccountId": {
      "type": "string"
    },
    "assistantType": {
      "enum": [
        "STANDARD",
        "FLOW_BUILDER"
      ],
      "type": "string"
    },
    "platform_tools": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "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."
    },
    "voice_settings": {
      "type": "object",
      "properties": {
        "greeting_mode": {
          "enum": [
            "dynamic",
            "fixed",
            "contact_first"
          ],
          "type": "string",
          "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)."
        },
        "voicemail_message": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Played when voicemail is detected, after which the assistant stops. Empty or `null` means the assistant hangs up on voicemail instead."
        },
        "inbound_opening_message": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "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."
        },
        "outbound_opening_message": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Spoken opener for outbound calls. Only valid in `fixed` greeting mode. Template variables are allowed and resolve per call. `null` clears this direction."
        },
        "enable_voicemail_detection": {
          "type": "boolean",
          "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."
        }
      }
    }
  }
}
assistants_create annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
assistants_update
Advertised by the server during the last successful anonymous check.

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).

assistants_update input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "assistantId"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "voiceId": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "llmConfig": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "chatConfig": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "assistantId": {
      "type": "string"
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "voiceConfig": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "platform_tools": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "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."
    },
    "voice_settings": {
      "type": "object",
      "properties": {
        "greeting_mode": {
          "enum": [
            "dynamic",
            "fixed",
            "contact_first"
          ],
          "type": "string",
          "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)."
        },
        "voicemail_message": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Played when voicemail is detected, after which the assistant stops. Empty or `null` means the assistant hangs up on voicemail instead."
        },
        "inbound_opening_message": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "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."
        },
        "outbound_opening_message": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Spoken opener for outbound calls. Only valid in `fixed` greeting mode. Template variables are allowed and resolve per call. `null` clears this direction."
        },
        "enable_voicemail_detection": {
          "type": "boolean",
          "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."
        }
      }
    }
  }
}
assistants_update annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
assistants_archive
Advertised by the server during the last successful anonymous check.
Advertised destructive

Archive (soft-delete) an assistant.

assistants_archive input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "assistantId"
  ],
  "properties": {
    "assistantId": {
      "type": "string"
    }
  }
}
assistants_archive annotations
{
  "readOnlyHint": false,
  "destructiveHint": true
}
tools_list
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

List tools visible to a subaccount. Pass includePrebuilt=false for only custom tools.

tools_list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "subAccountId"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1
    },
    "cursor": {
      "type": "string"
    },
    "search": {
      "type": "string"
    },
    "subAccountId": {
      "type": "string"
    },
    "includePrebuilt": {
      "type": "boolean"
    }
  }
}
tools_list annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
tools_get
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch a tool's full configuration.

tools_get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "toolId"
  ],
  "properties": {
    "toolId": {
      "type": "string"
    }
  }
}
tools_get annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
tools_create_custom
Advertised by the server during the last successful anonymous check.

Create a custom tool (toolType=CUSTOM). Name must match /^[a-zA-Z0-9_-]+$/ and be unique in the subaccount.

tools_create_custom input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "subAccountId",
    "name"
  ],
  "properties": {
    "url": {
      "type": "string",
      "format": "uri"
    },
    "name": {
      "type": "string"
    },
    "headers": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "httpMethod": {
      "enum": [
        "GET",
        "POST",
        "PUT",
        "PATCH",
        "DELETE"
      ],
      "type": "string"
    },
    "parameters": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "type"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        }
      }
    },
    "description": {
      "type": "string"
    },
    "subAccountId": {
      "type": "string"
    }
  }
}
tools_create_custom annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
tools_update
Advertised by the server during the last successful anonymous check.

Patch a custom tool. Supplying parameters/headers replaces those rows; omit to leave them.

tools_update input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "toolId"
  ],
  "properties": {
    "url": {
      "anyOf": [
        {
          "type": "string",
          "format": "uri"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "toolId": {
      "type": "string"
    },
    "headers": {
      "anyOf": [
        {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "httpMethod": {
      "enum": [
        "GET",
        "POST",
        "PUT",
        "PATCH",
        "DELETE"
      ],
      "type": "string"
    },
    "parameters": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "name",
              "type"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "type": {
                "type": "string"
              },
              "description": {
                "type": "string"
              }
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
tools_update annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
tools_delete
Advertised by the server during the last successful anonymous check.
Advertised destructive

Soft-delete a custom tool.

tools_delete input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "toolId"
  ],
  "properties": {
    "toolId": {
      "type": "string"
    }
  }
}
tools_delete annotations
{
  "readOnlyHint": false,
  "destructiveHint": true
}
contacts_list
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

List contacts in a subaccount. meta.total is the number of matching contacts, so use it to answer how many contacts there are.

contacts_list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "subAccountId"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1
    },
    "cursor": {
      "type": "string"
    },
    "search": {
      "type": "string"
    },
    "subAccountId": {
      "type": "string"
    }
  }
}
contacts_list annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
contacts_get
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch a contact by ID.

contacts_get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "contactId"
  ],
  "properties": {
    "contactId": {
      "type": "string"
    }
  }
}
contacts_get annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
conversations_list
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

List conversations in a subaccount.

conversations_list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "subAccountId"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1
    },
    "cursor": {
      "type": "string"
    },
    "subAccountId": {
      "type": "string"
    }
  }
}
conversations_list annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
appointments_list
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

List appointments in a subaccount within an optional date range.

appointments_list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "subAccountId"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1
    },
    "cursor": {
      "type": "string"
    },
    "endDate": {
      "type": "string"
    },
    "startDate": {
      "type": "string"
    },
    "subAccountId": {
      "type": "string"
    }
  }
}
appointments_list annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
calls_get
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch a call (status, recording, transcript) by ID.

calls_get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "callId": {
      "type": "string",
      "minLength": 1,
      "description": "Legacy alias for call_id."
    },
    "call_id": {
      "type": "string",
      "minLength": 1
    }
  }
}
calls_get annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
761 ms
95th percentile latency
761 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 761 ms · metadata changed · 16 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http assistable-mcp https://api.assistable.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add assistable-mcp --url https://api.assistable.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable assistable-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "assistable-mcp": {
      "url": "https://api.assistable.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "assistable-mcp": {
      "type": "streamableHttp",
      "url": "https://api.assistable.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start assistable-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "assistable-mcp": {
      "type": "http",
      "url": "https://api.assistable.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http assistable-mcp https://api.assistable.ai/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "assistable-mcp": {
      "url": "https://api.assistable.ai/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "assistable-mcp": {
      "serverUrl": "https://api.assistable.ai/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Assistable MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Assistable MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing