Read Africa's Talking balance, incoming SMS, transactions; send SMS, airtime, data and voice calls.
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.
Fetch incoming SMS received on your shortcodes/numbers, oldest first, in batches (default 25 per call). Pass last_received_id (0 for the first call, then `next_last_received_id` from the previous reply) to move through them; `has_more` stays true while a call returns messages, so keep calling until `count` is 0. Optional shortcode and keyword filters. GET /version1/messaging.
Most messages to return per call (default 25); `has_more` says if more are waiting.
Only messages that start with this keyword.
Only messages sent to this shortcode / number.
Id of the last message already read (default 0 = from the start).
Fetch incoming SMS received on your shortcodes/numbers, oldest first, in batches (default 25 per call). Pass last_received_id (0 for the first call, then `next_last_received_id` from the previous reply) to move through them; `has_more` stays true while a call returns messages, so keep calling until `count` is 0. Optional shortcode and keyword filters. GET /version1/messaging.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Most messages to return per call (default 25); `has_more` says if more are waiting. |
| keyword | string | Only messages that start with this keyword. |
| short_code | string | Only messages sent to this shortcode / number. |
| last_received_id | integer | Id of the last message already read (default 0 = from the start). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Most messages to return per call (default 25); `has_more` says if more are waiting."
},
"keyword": {
"type": "string",
"maxLength": 50,
"description": "Only messages that start with this keyword."
},
"short_code": {
"type": "string",
"maxLength": 20,
"description": "Only messages sent to this shortcode / number."
},
"last_received_id": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Id of the last message already read (default 0 = from the start)."
}
}
}Look up an airtime transaction by its transaction id (the requestId / ATPid_... from a send reply): status, amount, destination and discount. GET /query/transaction/find.
| Argument | Type | Description |
|---|---|---|
| transaction_id* | string | The transaction id, e.g. ATPid_... |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"transaction_id"
],
"properties": {
"transaction_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The transaction id, e.g. ATPid_..."
}
}
}Look up a mobile data transaction by its transactionId (from a send reply): status, product, destination and cost. GET bundles /query/transaction/find.
| Argument | Type | Description |
|---|---|---|
| transaction_id* | string | The mobile data transactionId. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"transaction_id"
],
"properties": {
"transaction_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The mobile data transactionId."
}
}
}The Africa's Talking app balance (SMS/airtime wallet), e.g. {"balance": "KES 1250.0000"}. The sandbox app has no balance. GET /version1/user.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}The balance of the mobile data wallet, e.g. {"status": "Success", "balance": "KES 500.0000"}. GET bundles /query/wallet/balance.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Number of outbound calls currently queued on each of your voice numbers. Live apps only. POST voice /queueStatus (a read: nothing is changed).
| Argument | Type | Description |
|---|---|---|
| phone_numbers* | array | Your Africa's Talking voice numbers to check. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"phone_numbers"
],
"properties": {
"phone_numbers": {
"type": "array",
"items": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$"
},
"maxItems": 20,
"minItems": 1,
"description": "Your Africa's Talking voice numbers to check."
}
}
}WRITE: place an outbound voice call from one of your Africa's Talking numbers to up to 10 phone numbers. The call is billed and rings real phones; what is said is decided by the voice callback URL configured for the number in the dashboard. Needs confirm=true after the user approved the numbers. Live apps only (the sandbox has no voice service). Returns a per-number queue status. POST voice /call.
| Argument | Type | Description |
|---|---|---|
| call_to* | array | Numbers to call (max 10). |
| confirm* | boolean | Must be true. Set it only after the user has explicitly approved this exact send (recipients, text/amount); it spends account credit. |
| call_from* | string | Your Africa's Talking voice number to call from (international format). |
| client_request_id | string | Optional label passed back to your voice callback URL as clientRequestId. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"call_from",
"call_to",
"confirm"
],
"properties": {
"call_to": {
"type": "array",
"items": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$"
},
"maxItems": 10,
"minItems": 1,
"description": "Numbers to call (max 10)."
},
"confirm": {
"type": "boolean",
"description": "Must be true. Set it only after the user has explicitly approved this exact send (recipients, text/amount); it spends account credit."
},
"call_from": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$",
"description": "Your Africa's Talking voice number to call from (international format)."
},
"client_request_id": {
"type": "string",
"pattern": "^[A-Za-z0-9._:-]{1,64}$",
"description": "Optional label passed back to your voice callback URL as clientRequestId."
}
}
}WRITE: top up mobile airtime for up to 25 phone numbers. Spends account credit immediately and cannot be reversed. Needs confirm=true after the user approved each number and amount. Amounts are in the given ISO currency (e.g. KES, UGX, TZS). Pass an idempotency_key to make a retry safe. Returns per-number status and requestId (use africastalking_find_airtime_transaction to follow up). POST /version1/airtime/send.
| Argument | Type | Description |
|---|---|---|
| confirm* | boolean | Must be true. Set it only after the user has explicitly approved this exact send (recipients, text/amount); it spends account credit. |
| recipients* | array | |
| idempotency_key | string | Optional unique key (8-100 chars) for this send; the same key makes Africa's Talking ignore a duplicate request. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"recipients",
"confirm"
],
"properties": {
"confirm": {
"type": "boolean",
"description": "Must be true. Set it only after the user has explicitly approved this exact send (recipients, text/amount); it spends account credit."
},
"recipients": {
"type": "array",
"items": {
"type": "object",
"required": [
"phone_number",
"currency_code",
"amount"
],
"properties": {
"amount": {
"type": "number",
"maximum": 1000000,
"description": "Amount of airtime in that currency.",
"exclusiveMinimum": 0
},
"phone_number": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$"
},
"currency_code": {
"type": "string",
"pattern": "^[A-Z]{3}$"
}
}
},
"maxItems": 25,
"minItems": 1
},
"idempotency_key": {
"type": "string",
"pattern": "^[A-Za-z0-9._:-]{8,100}$",
"description": "Optional unique key (8-100 chars) for this send; the same key makes Africa's Talking ignore a duplicate request."
}
}
}WRITE: send mobile data bundles to up to 25 phone numbers from your Africa's Talking data wallet. Spends wallet credit and cannot be reversed. Needs confirm=true after the user approved each number and bundle. product_name is your data product (created in the Africa's Talking dashboard). Pass an idempotency_key to make a retry safe. Returns per-number status and transactionId (see africastalking_find_mobile_data_transaction). POST bundles /mobile/data/request.
| Argument | Type | Description |
|---|---|---|
| confirm* | boolean | Must be true. Set it only after the user has explicitly approved this exact send (recipients, text/amount); it spends account credit. |
| recipients* | array | |
| product_name* | string | Name of your mobile data product in the Africa's Talking dashboard. |
| idempotency_key | string | Optional unique key (8-100 chars) for this send; the same key makes Africa's Talking ignore a duplicate request. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"product_name",
"recipients",
"confirm"
],
"properties": {
"confirm": {
"type": "boolean",
"description": "Must be true. Set it only after the user has explicitly approved this exact send (recipients, text/amount); it spends account credit."
},
"recipients": {
"type": "array",
"items": {
"type": "object",
"required": [
"phone_number",
"quantity",
"unit",
"validity"
],
"properties": {
"unit": {
"enum": [
"MB",
"GB"
],
"type": "string"
},
"metadata": {
"type": "object",
"description": "Optional key-value labels stored with the transaction.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"quantity": {
"type": "number",
"maximum": 100000,
"description": "Bundle size in `unit`.",
"exclusiveMinimum": 0
},
"validity": {
"enum": [
"Day",
"Week",
"BiWeek",
"Month",
"Quarterly"
],
"type": "string"
},
"phone_number": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$"
}
}
},
"maxItems": 25,
"minItems": 1
},
"product_name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Name of your mobile data product in the Africa's Talking dashboard."
},
"idempotency_key": {
"type": "string",
"pattern": "^[A-Za-z0-9._:-]{8,100}$",
"description": "Optional unique key (8-100 chars) for this send; the same key makes Africa's Talking ignore a duplicate request."
}
}
}WRITE: send one text message to up to 100 phone numbers. Spends account credit and delivers to real phones (the sandbox app only reaches the simulator). Needs confirm=true after the user approved the recipients and text. Returns the vendor's per-recipient status (statusCode 101 = sent), message ids and cost. Never retried. POST /version1/messaging.
| Argument | Type | Description |
|---|---|---|
| to* | array | Recipients in international format, e.g. +254711000000 (max 100). |
| confirm* | boolean | Must be true. Set it only after the user has explicitly approved this exact send (recipients, text/amount); it spends account credit. |
| message* | string | The SMS text (1-1600 characters; long texts are split into several billed parts). |
| sender_id | string | Approved alphanumeric sender ID, shortcode or long-code number (e.g. +27... in South Africa); omit to use the account default. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"to",
"message",
"confirm"
],
"properties": {
"to": {
"type": "array",
"items": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$"
},
"maxItems": 100,
"minItems": 1,
"description": "Recipients in international format, e.g. +254711000000 (max 100)."
},
"confirm": {
"type": "boolean",
"description": "Must be true. Set it only after the user has explicitly approved this exact send (recipients, text/amount); it spends account credit."
},
"message": {
"type": "string",
"maxLength": 1600,
"minLength": 1,
"description": "The SMS text (1-1600 characters; long texts are split into several billed parts)."
},
"sender_id": {
"type": "string",
"pattern": "^(?:\\+\\d{6,16}|[A-Za-z0-9 ._-]{1,16})$",
"description": "Approved alphanumeric sender ID, shortcode or long-code number (e.g. +27... in South Africa); omit to use the account default."
}
}
}