Read Spoke calls, transcripts, directory and users; manage phonebook contacts and send SMS.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
WRITE, destructive: delete one contact from a phonebook (it stops showing in caller ID). DELETE /phonebooks/{id}/contacts/{contactId}.
Must be true: the user approved deleting this contact.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
WRITE, destructive: delete one contact from a phonebook (it stops showing in caller ID). DELETE /phonebooks/{id}/contacts/{contactId}.
| Argument | Type | Description |
|---|---|---|
| confirm* | boolean | Must be true: the user approved deleting this contact. |
| contactId* | string | |
| phonebookId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"phonebookId",
"contactId",
"confirm"
],
"properties": {
"confirm": {
"type": "boolean",
"const": true,
"description": "Must be true: the user approved deleting this contact."
},
"contactId": {
"type": "string",
"minLength": 1
},
"phonebookId": {
"type": "string",
"minLength": 1
}
}
}Get one call record by call id.
| Argument | Type | Description |
|---|---|---|
| id* | string | Call id. |
| includeRecordingUrl | boolean |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "Call id."
},
"includeRecordingUrl": {
"type": "boolean"
}
}
}Get the details and download URL of one recording of a call.
| Argument | Type | Description |
|---|---|---|
| id* | string | Call id. |
| recordingId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"recordingId"
],
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "Call id."
},
"recordingId": {
"type": "string",
"minLength": 1
}
}
}Get one content-analysis result by id.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
}
}
}Get one directory entry (user, team or device) by entry id.
| Argument | Type | Description |
|---|---|---|
| entryId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"entryId"
],
"properties": {
"entryId": {
"type": "string",
"minLength": 1
}
}
}Get one location by id.
| Argument | Type | Description |
|---|---|---|
| locationId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"locationId"
],
"properties": {
"locationId": {
"type": "string",
"minLength": 1
}
}
}Get one phonebook and a page of its contacts. The id may also be a user's email address for that user's personal phonebook.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| next | string | Cursor from the previous reply's meta.next; omit for the first page. |
| limit | integer | Page size (default 100, max 1000). |
| search | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"next": {
"type": "string",
"description": "Cursor from the previous reply's meta.next; omit for the first page."
},
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Page size (default 100, max 1000)."
},
"search": {
"type": "string",
"minLength": 3
}
}
}Get one contact of a phonebook.
| Argument | Type | Description |
|---|---|---|
| id* | string | Phonebook id. |
| contactId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"contactId"
],
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "Phonebook id."
},
"contactId": {
"type": "string",
"minLength": 1
}
}
}Get one transcript by id.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
}
}
}Get the per-speaker segments of one transcript.
| Argument | Type | Description |
|---|---|---|
| id* | string | Transcript id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "Transcript id."
}
}
}Get one SIP trunk by id.
| Argument | Type | Description |
|---|---|---|
| trunkId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"trunkId"
],
"properties": {
"trunkId": {
"type": "string",
"minLength": 1
}
}
}Get one Spoke user with availability, by user id.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
}
}
}Get one webhook subscription by id.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
}
}
}List the Enlighten AI content-analysis results (summaries etc.) stored for one call.
| Argument | Type | Description |
|---|---|---|
| id* | string | Call id. |
| next | string | Cursor from the previous reply's meta.next; omit for the first page. |
| limit | integer | Page size (default 5, max 10). |
| artifact | string | Artifact schema name, e.g. "generalSummary". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "Call id."
},
"next": {
"type": "string",
"description": "Cursor from the previous reply's meta.next; omit for the first page."
},
"limit": {
"type": "integer",
"maximum": 10,
"minimum": 0,
"description": "Page size (default 5, max 10)."
},
"artifact": {
"type": "string",
"description": "Artifact schema name, e.g. \"generalSummary\"."
}
}
}List call records (oldest first by default; pass sortOrder descending for the latest calls), with caller, direction, duration, assigned user/team and recording URLs. Filter by time window or the external party's number. Returns { meta: { next }, calls }.
| Argument | Type | Description |
|---|---|---|
| next | string | Cursor from the previous reply's meta.next; omit for the first page. |
| limit | integer | Page size (default 100, max 1000). |
| since | integer | Only calls created at or after this time (unix timestamp in milliseconds). |
| before | integer | Only calls created before this time (unix timestamp in milliseconds). |
| modified | integer | Only calls created or modified since this time (calls gain notes/recordings after they end) (unix timestamp in milliseconds). |
| sortOrder | string | ascending = oldest first (the API default); descending = latest first. |
| contactNumber | string | Only calls with this external party number (+E.164). |
| includeActive | boolean |
List AI content-analysis results (needs the Enlighten entitlement). Filter by time, source, participant or artifact name.
| Argument | Type | Description |
|---|---|---|
| next | string | Cursor from the previous reply's meta.next; omit for the first page. |
| limit | integer | Page size (default 5, max 10). |
| since | integer | First recording/transcript started at or after (unix timestamp in milliseconds). |
| before | integer | First recording/transcript started before (unix timestamp in milliseconds). |
| artifact | string | Artifact schema name, e.g. "generalSummary". |
| sourceId | string | |
| contactNumber | string | |
| participantId | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"next": {
"type": "string",
"description": "Cursor from the previous reply's meta.next; omit for the first page."
},
"limit": {
"type": "integer",
"maximum": 10,
"minimum": 0,
"description": "Page size (default 5, max 10)."
},
"since": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "First recording/transcript started at or after (unix timestamp in milliseconds)."
},
"before": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "First recording/transcript started before (unix timestamp in milliseconds)."
},
"artifact": {
"type": "string",
"description": "Artifact schema name, e.g. \"generalSummary\"."
},
"sourceId": {
"type": "string"
},
"contactNumber": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$"
},
"participantId": {
"type": "string"
}
}
}List or search the unified Spoke directory (users, teams, devices) with extensions and live availability. Exactly one of extension, phoneNumber or ivrKey may be used to look up an entry. Returns { meta: { next }, entries }.
| Argument | Type | Description |
|---|---|---|
| next | string | Cursor from the previous reply's meta.next; omit for the first page. |
| limit | integer | Page size (default 100, max 1000). |
| ivrKey | string | Exact IVR key. |
| extension | string | Exact extension number. |
| phoneNumber | string | Exact phone number assigned to an entry. |
| includeSuspendedUsers | boolean | |
| includeHiddenCallGroups | boolean |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"next": {
"type": "string",
"description": "Cursor from the previous reply's meta.next; omit for the first page."
},
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Page size (default 100, max 1000)."
},
"ivrKey": {
"type": "string",
"description": "Exact IVR key."
},
"extension": {
"type": "string",
"description": "Exact extension number."
},
"phoneNumber": {
"type": "string",
"description": "Exact phone number assigned to an entry."
},
"includeSuspendedUsers": {
"type": "boolean"
},
"includeHiddenCallGroups": {
"type": "boolean"
}
}
}List the users assigned to one location.
| Argument | Type | Description |
|---|---|---|
| next | string | Cursor from the previous reply's meta.next; omit for the first page. |
| limit | integer | Page size (default 100, max 1000). |
| locationId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"locationId"
],
"properties": {
"next": {
"type": "string",
"description": "Cursor from the previous reply's meta.next; omit for the first page."
},
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Page size (default 100, max 1000)."
},
"locationId": {
"type": "string",
"minLength": 1
}
}
}List the locations of the organisation.
| Argument | Type | Description |
|---|---|---|
| next | string | Cursor from the previous reply's meta.next; omit for the first page. |
| limit | integer | Page size (default 100, max 1000). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"next": {
"type": "string",
"description": "Cursor from the previous reply's meta.next; omit for the first page."
},
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Page size (default 100, max 1000)."
}
}
}List shared phonebooks (the CRM contact containers used for caller ID), each with its contacts. Use limit 0 to list phonebooks without contacts.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size (default 100, max 1000). |
| search | string | Filter contacts (at least 3 characters). |
| excludeEmpty | boolean | Skip phonebooks that have no matching contacts. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Page size (default 100, max 1000)."
},
"search": {
"type": "string",
"minLength": 3,
"description": "Filter contacts (at least 3 characters)."
},
"excludeEmpty": {
"type": "boolean",
"description": "Skip phonebooks that have no matching contacts."
}
}
}List Spoke teams (call groups) with their members and availability.
| Argument | Type | Description |
|---|---|---|
| next | string | Cursor from the previous reply's meta.next; omit for the first page. |
| limit | integer | Page size (default 100, max 1000). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"next": {
"type": "string",
"description": "Cursor from the previous reply's meta.next; omit for the first page."
},
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Page size (default 100, max 1000)."
}
}
}List call and voicemail transcripts. Filter by time window or source.
| Argument | Type | Description |
|---|---|---|
| next | string | Cursor from the previous reply's meta.next; omit for the first page. |
| limit | integer | Page size (default 100, max 1000). |
| since | integer | Created at or after (unix timestamp in milliseconds). |
| before | integer | Created before (unix timestamp in milliseconds). |
| sourceId | string | |
| sourceContextId | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"next": {
"type": "string",
"description": "Cursor from the previous reply's meta.next; omit for the first page."
},
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Page size (default 100, max 1000)."
},
"since": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Created at or after (unix timestamp in milliseconds)."
},
"before": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Created before (unix timestamp in milliseconds)."
},
"sourceId": {
"type": "string"
},
"sourceContextId": {
"type": "string"
}
}
}List the SIP trunks that overlay a legacy PBX onto Spoke.
| Argument | Type | Description |
|---|---|---|
| next | string | Cursor from the previous reply's meta.next; omit for the first page. |
| limit | integer | Page size (default 100, max 1000). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"next": {
"type": "string",
"description": "Cursor from the previous reply's meta.next; omit for the first page."
},
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Page size (default 100, max 1000)."
}
}
}List active Spoke users with real-time availability. Optionally filter by email address.
| Argument | Type | Description |
|---|---|---|
| string | Return only the user with this email address. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"email": {
"type": "string",
"description": "Return only the user with this email address."
}
}
}List the webhook subscriptions of the account.
| Argument | Type | Description |
|---|---|---|
| next | string | Cursor from the previous reply's meta.next; omit for the first page. |
| limit | integer | Page size (default 100, max 1000). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"next": {
"type": "string",
"description": "Cursor from the previous reply's meta.next; omit for the first page."
},
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Page size (default 100, max 1000)."
}
}
}WRITE: add a contact to a phonebook, REPLACING any contact there with the same contactId (other contacts are untouched). The phonebook id may be a user's email for a personal phonebook. Contacts feed caller ID. PUT /phonebooks/{id}/contacts.
| Argument | Type | Description |
|---|---|---|
| emails | array | |
| jobTitle | string | |
| lastName | string | |
| contactId | string | Your own stable id for the contact; reuse it to replace that contact. |
| firstName | string | |
| countryIso | string | ISO country code for formatting local numbers, e.g. GB. |
| companyName | string | |
| phonebookId* | string | Phonebook id (from spokephone_list_phonebooks) or a user's email address. |
| phoneNumbers* | array | At least one number, e.g. { label: 'work', value: '+442071234567' }. |
WRITE: send a real SMS to a phone number (or a group MMS to several) from a company number or from a Spoke user's conversation number. The message appears in the Spoke conversation. Confirm the recipient and text with the user first. Needs an SMS-enabled number. POST /conversationMessages.
| Argument | Type | Description |
|---|---|---|
| to* | array | Recipient number(s) in +E.164 form. More than one sends a group MMS. |
| body* | string | Message text, up to 1600 characters. |
| confirm* | boolean | Must be true: the user approved sending this exact text to these recipients. |
| fromNumber | string | Company number to send from (+E.164). Give this OR fromUserEmail. |
| assignUsers | array | User emails to assign (required with routingAction assign_users). |
| fromUserEmail | string | Email of the Spoke user whose conversation number sends the message. Give this OR fromNumber. |
| routingAction | string | Who handles replies in a new conversation. |
| conversationName | string |
| Also return calls still in progress (default false). |
| includeRecordingUrl | boolean | Include recording/voicemail URLs (default true). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"next": {
"type": "string",
"description": "Cursor from the previous reply's meta.next; omit for the first page."
},
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Page size (default 100, max 1000)."
},
"since": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Only calls created at or after this time (unix timestamp in milliseconds)."
},
"before": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Only calls created before this time (unix timestamp in milliseconds)."
},
"modified": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Only calls created or modified since this time (calls gain notes/recordings after they end) (unix timestamp in milliseconds)."
},
"sortOrder": {
"enum": [
"ascending",
"descending"
],
"type": "string",
"description": "ascending = oldest first (the API default); descending = latest first."
},
"contactNumber": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$",
"description": "Only calls with this external party number (+E.164)."
},
"includeActive": {
"type": "boolean",
"description": "Also return calls still in progress (default false)."
},
"includeRecordingUrl": {
"type": "boolean",
"description": "Include recording/voicemail URLs (default true)."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"phonebookId",
"phoneNumbers"
],
"properties": {
"emails": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"minLength": 1,
"description": "e.g. work, mobile, home"
},
"value": {
"type": "string",
"minLength": 1
}
}
}
},
"jobTitle": {
"type": "string"
},
"lastName": {
"type": "string"
},
"contactId": {
"type": "string",
"minLength": 1,
"description": "Your own stable id for the contact; reuse it to replace that contact."
},
"firstName": {
"type": "string"
},
"countryIso": {
"type": "string",
"maxLength": 2,
"minLength": 2,
"description": "ISO country code for formatting local numbers, e.g. GB."
},
"companyName": {
"type": "string"
},
"phonebookId": {
"type": "string",
"minLength": 1,
"description": "Phonebook id (from spokephone_list_phonebooks) or a user's email address."
},
"phoneNumbers": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"minLength": 1,
"description": "e.g. work, mobile, home"
},
"value": {
"type": "string",
"minLength": 1
}
}
},
"minItems": 1,
"description": "At least one number, e.g. { label: 'work', value: '+442071234567' }."
}
}
}| notificationMode | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"to",
"body",
"confirm"
],
"properties": {
"to": {
"type": "array",
"items": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$"
},
"maxItems": 10,
"minItems": 1,
"description": "Recipient number(s) in +E.164 form. More than one sends a group MMS."
},
"body": {
"type": "string",
"maxLength": 1600,
"minLength": 1,
"description": "Message text, up to 1600 characters."
},
"confirm": {
"type": "boolean",
"const": true,
"description": "Must be true: the user approved sending this exact text to these recipients."
},
"fromNumber": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$",
"description": "Company number to send from (+E.164). Give this OR fromUserEmail."
},
"assignUsers": {
"type": "array",
"items": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"maxItems": 10,
"description": "User emails to assign (required with routingAction assign_users)."
},
"fromUserEmail": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Email of the Spoke user whose conversation number sends the message. Give this OR fromNumber."
},
"routingAction": {
"enum": [
"assign_owner",
"assign_users",
"do_not_route"
],
"type": "string",
"description": "Who handles replies in a new conversation."
},
"conversationName": {
"type": "string",
"maxLength": 100
},
"notificationMode": {
"enum": [
"notify_unread",
"silent_read",
"silent_unread"
],
"type": "string"
}
}
}