Skip to main content
Glama
ali-toghiani

SMS.ir MCP server

by ali-toghiani

SMS.ir MCP сервер

Локальный сервер Model Context Protocol, который предоставляет подобранный, защищённый набор инструментов для API панели SMS.ir V2. Создан на Python + FastMCP.

  • Транспорт stdio для Codex / Claude Desktop / Claude Code

  • Транспорт streamable HTTP для локальной разработки и тестирования

  • Операции чтения работают из коробки; каждая отправка платная и по умолчанию заблокирована флагом подтверждения и серверным аварийным выключателем.

  • Номера телефонов, текст сообщений, ключи API и OTP-коды маскируются в логах.

Создано на основе коллекции Postman SMS.ir Panel V2 (не включена в этот репозиторий — она содержит реальный ключ API). Нормализованное описание API находится в docs/API.md и docs/openapi.yaml.


1. Установка

Требуется Python 3.10+ (разработано и протестировано на CPython 3.12).

cd C:\Users\Kasra\Documents\sms.ir-mcp

# create the project-local virtual environment
py -3.12 -m venv .venv

# install runtime deps (pinned)
.\.venv\Scripts\python.exe -m pip install -r requirements.txt

# ...or install with the package + dev/test extras
.\.venv\Scripts\python.exe -m pip install -e ".[dev]"

Related MCP server: iletiMerkezi MCP Server

2. Конфигурация

Вся конфигурация берётся из переменных окружения. Для локального использования скопируйте пример файла env и заполните его — он игнорируется git и никогда не коммитится:

copy .env.example .env
notepad .env

Переменная

Обязательная

По умолчанию

Назначение

SMSIR_API_KEY

да

Ключ API панели SMS.ir, отправляется в заголовке X-API-KEY

SMSIR_DEFAULT_LINE_NUMBER

нет

Резервная линия отправителя для инструментов отправки

SMSIR_ALLOW_SEND

нет

false

Аварийный выключатель. Должен быть true, чтобы любая реальная отправка покинула процесс

SMSIR_BASE_URL

нет

https://api.sms.ir

Базовый URL API (разрешён только из белого списка хостов)

SMSIR_ALLOW_CUSTOM_BASE_URL

нет

false

Разрешить хост, отличный от api.sms.ir (только локальные заглушки)

SMSIR_TIMEOUT_SECONDS

нет

15

Таймаут на каждый запрос

SMSIR_MAX_RETRIES

нет

2

Повторы при временных сбоях (429 / 5xx / сеть)

SMSIR_RATE_LIMIT_PER_MINUTE

нет

60

Клиентское ограничение частоты запросов

SMSIR_MAX_PAGE_SIZE

нет

200

Верхняя граница, принимаемая для page_size

SMSIR_LOG_LEVEL

нет

INFO

DEBUG / INFO / WARNING / ERROR

SMSIR_ENV_FILE

нет

./.env

Путь к файлу env для автоматической загрузки

Реальные переменные окружения всегда имеют приоритет над значениями из файла env.

3. Запуск

# stdio (what MCP clients launch)
.\.venv\Scripts\python.exe -m sms_ir_mcp --transport stdio

# streamable HTTP for local testing (http://127.0.0.1:8000/mcp)
.\.venv\Scripts\python.exe -m sms_ir_mcp --transport http --host 127.0.0.1 --port 8000

Для быстрой проверки подключения и аутентификации, которая никогда не тратит кредиты, вызовите инструмент health_check (или get_balance) из любого подключённого клиента — оба используют GET /v1/credit под капотом.

4. Инструменты

Инструменты только для чтения доступны всегда. Инструменты записи требуют confirm=true и SMSIR_ALLOW_SEND=true; разрушительный инструмент требует confirm=true.

Инструмент

Тип

API

Описание

get_balance

чтение

GET /v1/credit

Оставшийся SMS-кредит

list_lines

чтение

GET /v1/line

Номера линий отправителя / виртуальные номера

get_message_report

чтение

GET /v1/send/{id}

Отчёт о доставке/статус одного отправленного сообщения

get_pack_report

чтение

GET /v1/send/pack/{packId}

Результаты по каждому получателю для массовой рассылки (с пагинацией)

list_sent_messages

чтение

GET /v1/send/live · /archive

Отправленные сообщения, scope=today|archive

list_sent_packs

чтение

GET /v1/send/pack · /archive/pack

Массовые рассылки, scope=today|archive

list_inbound_messages

чтение

GET /v1/receive/latest · /live · /archive

Входящие сообщения, scope=latest|today|archive

extract_latest_otp

чтение

GET /v1/receive/latest

Новейшее входящее сообщение, содержащее разбираемый одноразовый код (эвристика)

health_check

чтение

GET /v1/credit

Проверка доступности + аутентификации, никогда не тарифицируется; также возвращает действующую конфигурацию

reload_config

администрирование

Перечитывает .env / переменные окружения без перезапуска сервера (например, после изменения SMSIR_ALLOW_SEND); ничего не отправляет

send_sms

платный

POST /v1/send/bulk

Один текст одному или нескольким получателям

send_verification_code

платный

POST /v1/send/verify

Шаблонное OTP/верификационное сообщение

send_personalized_sms

платный

POST /v1/send/likeToLike

Отдельный текст для каждого получателя

cancel_scheduled_send

разрушительный

DELETE /v1/send/scheduled/{packId}

Отмена ещё не отправленной запланированной рассылки

Каждый инструмент возвращает {"ok": true, "data": …, …} при успехе или {"ok": false, "error": {"code": …, "message": …}} при ошибке. Коды ошибок: config_error, validation_error, confirmation_required, send_disabled, auth_error, rate_limited, transient_error, api_error, internal_error.

Примеры

// check balance
get_balance() -> {"ok": true, "data": {"credit": 45210}}

// read the latest OTP received on a given number
extract_latest_otp({"mobile": "9821000"})
  -> {"ok": true, "data": {"otp": "834122", "matched": true, "from": "*****1000", ...}}

// attempt a send without confirming -> refused, nothing sent
send_sms({"message_text": "Hi", "mobiles": ["09121234567"]})
  -> {"ok": false, "error": {"code": "confirmation_required", ...}}

// confirmed send, but kill switch still off -> refused, nothing sent
send_sms({"message_text": "Hi", "mobiles": ["09121234567"], "confirm": true})
  -> {"ok": false, "error": {"code": "send_disabled", ...}}

// edited .env to set SMSIR_ALLOW_SEND=true -> apply it without restarting
reload_config()
  -> {"ok": true, "data": {"config": {"allow_send": true, ...}, "changed": ["allow_send"]}}

// with SMSIR_ALLOW_SEND=true AND confirm=true -> actually sends (billable)
send_sms({"message_text": "Hi", "mobiles": ["09121234567"],
          "line_number": "30007732000000", "confirm": true})
  -> {"ok": true, "data": {"packId": "…", "messageIds": [123], "cost": 1.0}, "recipients": 1}

5. Модель безопасности

  • Платные операции (send_sms, send_verification_code, send_personalized_sms) требуют оба условия:

    1. confirm=true в вызове инструмента, и

    2. SMSIR_ALLOW_SEND=true в окружении сервера. При выключенном аварийном выключателе подтверждённый вызов всё равно ничего не отправляет.

  • Разрушительная операция (cancel_scheduled_send) требует confirm=true.

  • Нет произвольных базовых URL: принимается только api.sms.ir, если SMSIR_ALLOW_CUSTOM_BASE_URL=true. HTTPS обязателен.

  • Нет инъекции заголовков: вызывающие не могут устанавливать заголовки запросов; передаются только типизированные, проверенные поля.

  • Таймауты + ограниченные повторы + клиентское ограничение частоты на каждом запросе.

  • Маскирование: ключи API, номера телефонов, тела сообщений и значения OTP маскируются в выводе логов.

  • Нет административных конечных точек: доступны только операции из коллекции Postman; ничего для управления аккаунтом/конфигурацией.

6. Регистрация клиента

Ваш реальный ключ API помещается в .env в этой папке — никогда в файл конфигурации клиента. Каждая конфигурация ниже только указывает клиенту на этот сервер и его .env.

Codex CLI (установлен)

codex mcp add sms-ir `
  --env SMSIR_ENV_FILE=C:\Users\Kasra\Documents\sms.ir-mcp\.env `
  -- C:\Users\Kasra\Documents\sms.ir-mcp\.venv\Scripts\python.exe -m sms_ir_mcp --transport stdio

codex mcp list          # sms-ir should appear
codex mcp get sms-ir

Ручной эквивалент: docs/codex_config.example.toml.

Claude Code (установлен)

Этот репозиторий содержит проектный .mcp.json. Откройте Claude Code в этом каталоге и подтвердите сервер sms-ir при запросе:

cd C:\Users\Kasra\Documents\sms.ir-mcp
claude
/mcp                    # shows sms-ir and its tools

Чтобы зарегистрировать его на уровне пользователя вместо этого:

claude mcp add sms-ir --scope user `
  --env SMSIR_ENV_FILE=C:\Users\Kasra\Documents\sms.ir-mcp\.env `
  -- C:\Users\Kasra\Documents\sms.ir-mcp\.venv\Scripts\python.exe -m sms_ir_mcp --transport stdio

Claude Desktop (не установлен)

Когда установлен, объедините docs/claude_desktop_config.example.json в %APPDATA%\Claude\claude_desktop_config.json (сначала сделайте резервную копию; сохраните другие серверы).

7. Разработка

.\.venv\Scripts\python.exe -m ruff check src tests
.\.venv\Scripts\python.exe -m ruff format --check src tests
.\.venv\Scripts\python.exe -m pytest

Тесты покрывают построение запросов, заголовок аутентификации, разбор конверта, нормализацию ошибок, повторы/ограничение частоты, проверку аргументов, маскирование, извлечение OTP, мокированную интеграцию для каждого инструмента (с использованием примеров полезных нагрузок из Postman), согласованность OpenAPI с коллекцией и обнаружение инструментов MCP.

8. Первый живой тест (после предоставления учётных данных)

Ничто в этом репозитории не совершало платных вызовов. Чтобы выполнить первую реальную отправку, которую вы явно авторизуете:

  1. Поместите ваш ключ в .env:

    SMSIR_API_KEY=<your real key>
    SMSIR_DEFAULT_LINE_NUMBER=<your approved line>
    SMSIR_ALLOW_SEND=true
  2. Проверьте подключение без трат — из подключённого клиента вызовите health_check (или get_balance).

  3. Затем, и только затем, выполните первый платный вызов. Точный вызов инструмента:

    send_sms({
      "message_text": "SMS.ir MCP test",
      "mobiles": ["<your own mobile>"],
      "line_number": "<your approved line>",
      "confirm": true
    })

    Формулировка для Codex: "Используй инструмент send_sms сервера sms-ir, чтобы отправить 'SMS.ir MCP test' на <ваш собственный мобильный> с линии <линия>, с confirm true."

9. Устранение неполадок

Симптом

Причина / исправление

config_error: SMSIR_API_KEY is not set

Нет ключа в окружении или .env; проверьте путь SMSIR_ENV_FILE, который передаёт клиент

auth_error при каждом вызове

Неверный/ротированный ключ, или у ключа нет доступа к API панели

send_disabled

SMSIR_ALLOW_SEND не равен true в окружении сервера

Изменил .env, но ничего не изменилось

Сервер читает конфигурацию один раз при запуске. Вызовите reload_config или перезапустите MCP-клиент, чтобы он перезапустил сервер

confirmation_required

Повторите вызов инструмента с "confirm": true

validation_error: Invalid mobile number

Используйте 10–15 цифр, необязательный ведущий +

rate_limited

Сработал клиентский ограничитель; увеличьте SMSIR_RATE_LIMIT_PER_MINUTE или замедлитесь

transient_error

Сеть/5xx после повторов; проверьте подключение и статус SMS.ir

Клиент не показывает инструменты

Неверный путь command в конфигурации клиента; укажите на .venv\Scripts\python.exe

api_error с api_status

SMS.ir отклонил запрос; message содержит их причину

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Enables comprehensive email marketing and transactional email operations through SendGrid's API v3. Supports contact management, campaign creation, email automation, list management, and email sending with built-in read-only safety mode.
    58
    1,384
    3
    ISC
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables searching SOLAPI documentation and examples, and sending/managing SMS, LMS, MMS, RCS, and Kakao messages with safety guards.
    250
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables MCP clients to read Instantly.ai analytics and manage leads, campaigns, Unibox, sender accounts, blocklist, and webhooks, with write actions gated behind confirm prompts and configurable safety policies.
    40
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ali-toghiani/sms-ir-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server