Manage Sakari SMS contacts, conversations, templates and campaigns, and send texts.
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: mark a conversation closed in the Sakari inbox (a new inbound message reopens it). PUT /v1/accounts/{accountId}/conversations/{conversationId}/close.
Sakari conversation id.
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: mark a conversation closed in the Sakari inbox (a new inbound message reopens it). PUT /v1/accounts/{accountId}/conversations/{conversationId}/close.
| Argument | Type | Description |
|---|---|---|
| conversation_id* | string | Sakari conversation id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"conversation_id"
],
"properties": {
"conversation_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari conversation id."
}
}
}WRITE: create a contact. If a contact with the same mobile number exists, merge_strategy decides what happens (append, core or remove, per Sakari). A contact is not opted in to messages by this call. POST /v1/accounts/{accountId}/contacts.
| Argument | Type | Description |
|---|---|---|
| string | ||
| mobile* | string | Mobile number in international format, e.g. +13471234567. |
| country | string | 2-letter country of the number (default: the account's default country). |
| last_name | string | |
| first_name | string | |
| merge_strategy | string | How an existing contact with the same mobile is treated. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"mobile"
],
"properties": {
"email": {
"type": "string",
"maxLength": 254
},
"mobile": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$",
"description": "Mobile number in international format, e.g. +13471234567."
},
"country": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "2-letter country of the number (default: the account's default country)."
},
"last_name": {
"type": "string",
"maxLength": 200
},
"first_name": {
"type": "string",
"maxLength": 200
},
"merge_strategy": {
"enum": [
"append",
"core",
"remove"
],
"type": "string",
"description": "How an existing contact with the same mobile is treated."
}
}
}WRITE: create a reusable SMS template (does not send anything). POST /v1/accounts/{accountId}/templates.
| Argument | Type | Description |
|---|---|---|
| name* | string | Template name. |
| text* | string | Template text; may contain placeholders such as {{firstName}}. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name",
"text"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Template name."
},
"text": {
"type": "string",
"maxLength": 1600,
"minLength": 1,
"description": "Template text; may contain placeholders such as {{firstName}}."
}
}
}The Sakari account these credentials belong to: name, plan, balance, default country, business info and options. API credentials are never returned. GET /v1/accounts/{accountId}.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Prepaid balance, default country, remaining segments and the price per segment. GET /v1/accounts/{accountId}/balance.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}One call history record by id. GET /v1/accounts/{accountId}/calls/{callId}.
| Argument | Type | Description |
|---|---|---|
| call_id* | string | Sakari call id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"call_id"
],
"properties": {
"call_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari call id."
}
}
}One campaign by id. GET /v1/accounts/{accountId}/campaigns/{campaignId}.
| Argument | Type | Description |
|---|---|---|
| campaign_id* | string | Sakari campaign id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign_id"
],
"properties": {
"campaign_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari campaign id."
}
}
}One contact by id: name, mobile (with validity and line type), email, lists, attributes, opt-in and blocked state. GET /v1/accounts/{accountId}/contacts/{contactId}.
| Argument | Type | Description |
|---|---|---|
| contact_id* | string | Sakari contact id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"contact_id"
],
"properties": {
"contact_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari contact id."
}
}
}One conversation by id. Use sakari_list_messages with conversation_id for its messages. GET /v1/accounts/{accountId}/conversations/{conversationId}.
| Argument | Type | Description |
|---|---|---|
| conversation_id* | string | Sakari conversation id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"conversation_id"
],
"properties": {
"conversation_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari conversation id."
}
}
}One message by id: text, direction, status, segments, price, error. GET /v1/accounts/{accountId}/messages/{messageId}.
| Argument | Type | Description |
|---|---|---|
| message_id* | string | Sakari message id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"message_id"
],
"properties": {
"message_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari message id."
}
}
}One message template by id. GET /v1/accounts/{accountId}/templates/{templateId}.
| Argument | Type | Description |
|---|---|---|
| template_id* | string | Sakari template id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"template_id"
],
"properties": {
"template_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari template id."
}
}
}Autoresponders (automatic replies) configured on the account. GET /v1/accounts/{accountId}/autoresponders.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Call history (voice) with direction, status, duration and contact; filter by contact, conversation, direction, status or date range. GET /v1/accounts/{accountId}/calls.
| Argument | Type | Description |
|---|---|---|
| to | string | End of the date range (ISO 8601 date-time). |
| from | string | Start of the date range (ISO 8601 date-time). |
| limit | integer | Results per page, 1-100 (default 25). |
| offset | integer | Results to skip (default 0). Pass the previous reply's next_offset. |
| status | string | |
| direction | string | |
| contact_id | string | Sakari contact id. |
| conversation_id | string | Sakari conversation id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"to": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "End of the date range (ISO 8601 date-time)."
},
"from": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "Start of the date range (ISO 8601 date-time)."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 25)."
},
"offset": {
"type": "integer",
"maximum": 10000000,
"minimum": 0,
"description": "Results to skip (default 0). Pass the previous reply's next_offset."
},
"status": {
"enum": [
"initiated",
"ringing",
"active",
"ended",
"rejected",
"forwarded",
"missed",
"transferring"
],
"type": "string"
},
"direction": {
"enum": [
"inbound",
"outbound"
],
"type": "string"
},
"contact_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari contact id."
},
"conversation_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari conversation id."
}
}
}List message campaigns with schedule, template, status and reporting. GET /v1/accounts/{accountId}/campaigns.
| Argument | Type | Description |
|---|---|---|
| name | string | Filter by name or part of it. |
| limit | integer | Results per page, 1-100 (default 25). |
| offset | integer | Results to skip (default 0). Pass the previous reply's next_offset. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"description": "Filter by name or part of it."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 25)."
},
"offset": {
"type": "integer",
"maximum": 10000000,
"minimum": 0,
"description": "Results to skip (default 0). Pass the previous reply's next_offset."
}
}
}List or search contacts (partial matches on name, mobile or email; filter by tag). GET /v1/accounts/{accountId}/contacts.
| Argument | Type | Description |
|---|---|---|
| tags | string | Filter by tag(s). |
| string | Filter by email or part of it. | |
| limit | integer | Results per page, 1-100 (default 25). |
| mobile | string | Filter by mobile number or part of it. |
| offset | integer | Results to skip (default 0). Pass the previous reply's next_offset. |
| last_name | string | Filter by last name or part of it. |
| first_name | string | Filter by first name or part of it. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"tags": {
"type": "string",
"maxLength": 200,
"description": "Filter by tag(s)."
},
"email": {
"type": "string",
"maxLength": 254,
"description": "Filter by email or part of it."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 25)."
},
"mobile": {
"type": "string",
"maxLength": 40,
"description": "Filter by mobile number or part of it."
},
"offset": {
"type": "integer",
"maximum": 10000000,
"minimum": 0,
"description": "Results to skip (default 0). Pass the previous reply's next_offset."
},
"last_name": {
"type": "string",
"maxLength": 200,
"description": "Filter by last name or part of it."
},
"first_name": {
"type": "string",
"maxLength": 200,
"description": "Filter by first name or part of it."
}
}
}List conversations (the inbox): contact, last message, unread count, open or closed. GET /v1/accounts/{accountId}/conversations.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Results per page, 1-100 (default 25). |
| offset | integer | Results to skip (default 0). Pass the previous reply's next_offset. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 25)."
},
"offset": {
"type": "integer",
"maximum": 10000000,
"minimum": 0,
"description": "Results to skip (default 0). Pass the previous reply's next_offset."
}
}
}Lead capture forms with active state, impressions and conversions. GET /v1/accounts/{accountId}/forms.
| Argument | Type | Description |
|---|---|---|
| q | string | Search term across form fields. |
| limit | integer | Results per page, 1-100 (default 25). |
| offset | integer | Results to skip (default 0). Pass the previous reply's next_offset. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Search term across form fields."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 25)."
},
"offset": {
"type": "integer",
"maximum": 10000000,
"minimum": 0,
"description": "Results to skip (default 0). Pass the previous reply's next_offset."
}
}
}Shortened tracked links with destination, short URL and click stats. GET /v1/accounts/{accountId}/links.
| Argument | Type | Description |
|---|---|---|
| q | string | Search term across link fields. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Search term across link fields."
}
}
}List messages (sent and received) with status, segments, price and timestamps; filter by contact or conversation. GET /v1/accounts/{accountId}/messages.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Results per page, 1-100 (default 25). |
| offset | integer | Results to skip (default 0). Pass the previous reply's next_offset. |
| contact_id | string | Sakari contact id. |
| conversation_id | string | Sakari conversation id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 25)."
},
"offset": {
"type": "integer",
"maximum": 10000000,
"minimum": 0,
"description": "Results to skip (default 0). Pass the previous reply's next_offset."
},
"contact_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari contact id."
},
"conversation_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari conversation id."
}
}
}List reusable message templates. GET /v1/accounts/{accountId}/templates.
| Argument | Type | Description |
|---|---|---|
| name | string | Filter by name or part of it. |
| limit | integer | Results per page, 1-100 (default 25). |
| offset | integer | Results to skip (default 0). Pass the previous reply's next_offset. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"description": "Filter by name or part of it."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 25)."
},
"offset": {
"type": "integer",
"maximum": 10000000,
"minimum": 0,
"description": "Results to skip (default 0). Pass the previous reply's next_offset."
}
}
}Active webhook subscriptions (message event notifications). GET /v1/accounts/{accountId}/webhooks.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}WRITE: SEND REAL TEXT MESSAGES that cost account balance and cannot be recalled. Recipients: phone numbers (international format), existing contact ids, or conversation ids (max 100 in total). Only text people who opted in; Sakari enforces TCPA/CTIA rules and the sender is responsible. Confirm the recipients and the text with the user first. Placeholders like {{firstName}} are filled per contact. POST /v1/accounts/{accountId}/messages.
| Argument | Type | Description |
|---|---|---|
| text* | string | Message text (the Sakari 'template'). |
| type | string | SMS (default) or MMS. |
| media_urls | array | Public media URLs to attach (MMS). |
| to_numbers | array | Recipient phone numbers in international format. |
| contact_ids | array | Existing Sakari contact ids. |
| confirm_send* | boolean | Must be true: you confirm the user approved these recipients and this text, and that the texts go out now. |
| conversation_ids | array | Existing conversation ids to reply into. |
WRITE: change a contact's name, email or mobile. Sakari's update replaces the contact, so this reads the current contact first and sends it back whole (lists, opt-in, blocked, attributes) with only your changes applied. PUT /v1/accounts/{accountId}/contacts/{contactId}.
| Argument | Type | Description |
|---|---|---|
| string | ||
| mobile | string | New mobile number in international format. |
| country | string | 2-letter country of the mobile number. |
| last_name | string | |
| contact_id* | string | Sakari contact id. |
| first_name | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"contact_id"
],
"properties": {
"email": {
"type": "string",
"maxLength": 254
},
"mobile": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$",
"description": "New mobile number in international format."
},
"country": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "2-letter country of the mobile number."
},
"last_name": {
"type": "string",
"maxLength": 200
},
"contact_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari contact id."
},
"first_name": {
"type": "string",
"maxLength": 200
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"text",
"confirm_send"
],
"properties": {
"text": {
"type": "string",
"maxLength": 1600,
"minLength": 1,
"description": "Message text (the Sakari 'template')."
},
"type": {
"enum": [
"SMS",
"MMS"
],
"type": "string",
"description": "SMS (default) or MMS."
},
"media_urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri",
"maxLength": 2000
},
"maxItems": 10,
"description": "Public media URLs to attach (MMS)."
},
"to_numbers": {
"type": "array",
"items": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$"
},
"maxItems": 100,
"description": "Recipient phone numbers in international format."
},
"contact_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari contact id."
},
"maxItems": 100,
"description": "Existing Sakari contact ids."
},
"confirm_send": {
"type": "boolean",
"const": true,
"description": "Must be true: you confirm the user approved these recipients and this text, and that the texts go out now."
},
"conversation_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Sakari conversation id."
},
"maxItems": 100,
"description": "Existing conversation ids to reply into."
}
}
}