Skip to main content
Glama
ali-toghiani

SMS.ir MCP server

by ali-toghiani

SMS.ir MCP server

Ein lokaler Model Context Protocol-Server, der eine kuratierte, sicherheitsgeschützte Reihe von Tools für die SMS.ir Panel V2 API bereitstellt. Gebaut mit Python + FastMCP.

  • stdio-Transport für Codex / Claude Desktop / Claude Code

  • streamable HTTP-Transport für lokale Entwicklung und Tests

  • Leseoperationen funktionieren sofort; jeder Versand ist kostenpflichtig und standardmäßig blockiert hinter einem Bestätigungsflag und einem serverseitigen Kill-Switch.

  • Telefonnummern, Nachrichtentexte, API-Schlüssel und OTP-Codes werden in Protokollen maskiert.

Erstellt aus der SMS.ir Panel V2 Postman-Sammlung (nicht in diesem Repo enthalten – sie enthält einen echten API-Schlüssel). Die normalisierte API-Beschreibung befindet sich in docs/API.md und docs/openapi.yaml.


1. Setup

Erfordert Python 3.10+ (entwickelt und getestet auf 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. Konfiguration

Die gesamte Konfiguration erfolgt über Umgebungsvariablen. Für die lokale Nutzung kopieren Sie die Beispiel-Env-Datei und füllen sie aus – sie ist git-ignoriert und wird nie committet:

copy .env.example .env
notepad .env

Variable

Erforderlich

Standard

Zweck

SMSIR_API_KEY

ja

SMS.ir Panel-API-Schlüssel, gesendet als X-API-KEY-Header

SMSIR_DEFAULT_LINE_NUMBER

nein

Fallback-Absenderzeile für Sendetools

SMSIR_ALLOW_SEND

nein

false

Kill-Switch. Muss true sein, damit ein echter Versand den Prozess verlässt

SMSIR_BASE_URL

nein

https://api.sms.ir

API-Basis-URL (Host-Allowlist)

SMSIR_ALLOW_CUSTOM_BASE_URL

nein

false

Erlaube einen Nicht-api.sms.ir-Host (nur lokale Mocks)

SMSIR_TIMEOUT_SECONDS

nein

15

Timeout pro Anfrage

SMSIR_MAX_RETRIES

nein

2

Wiederholungen bei vorübergehenden Fehlern (429 / 5xx / Netzwerk)

SMSIR_RATE_LIMIT_PER_MINUTE

nein

60

Clientseitiges Ratenlimit

SMSIR_MAX_PAGE_SIZE

nein

200

Obergrenze für akzeptierte page_size

SMSIR_LOG_LEVEL

nein

INFO

DEBUG / INFO / WARNING / ERROR

SMSIR_ENV_FILE

nein

./.env

Pfad zur automatisch zu ladenden Env-Datei

Echte Umgebungsvariablen überschreiben immer Werte aus der Env-Datei.

3. Ausführen

# 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

Für einen schnellen Konnektivitäts- und Authentifizierungscheck, der nie Guthaben verbraucht, rufen Sie das health_check-Tool (oder get_balance) von einem verbundenen Client auf – beide sind unter der Haube GET /v1/credit.

4. Tools

Nur-Lese-Tools sind immer verfügbar. Schreib-Tools erfordern confirm=true und SMSIR_ALLOW_SEND=true; das destruktive Tool erfordert confirm=true.

Tool

Art

API

Beschreibung

get_balance

lesen

GET /v1/credit

Verbleibendes SMS-Guthaben

list_lines

lesen

GET /v1/line

Absenderzeilennummern / virtuelle Nummern

get_message_report

lesen

GET /v1/send/{id}

Zustellbericht/-status für eine gesendete Nachricht

get_pack_report

lesen

GET /v1/send/pack/{packId}

Ergebnisse pro Empfänger für ein Bulk-Paket (paginiert)

list_sent_messages

lesen

GET /v1/send/live · /archive

Gesendete Nachrichten, scope=today|archive

list_sent_packs

lesen

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

Bulk-Pakete, scope=today|archive

list_inbound_messages

lesen

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

Eingehende Nachrichten, scope=latest|today|archive

extract_latest_otp

lesen

GET /v1/receive/latest

Neueste eingehende Nachricht mit einem parsebaren Einmalcode (Heuristik)

health_check

lesen

GET /v1/credit

Erreichbarkeits- + Auth-Check, nie kostenpflichtig; gibt auch effektive Konfiguration zurück

reload_config

admin

.env / Umgebungsvariablen neu lesen, ohne den Server neu zu starten (z. B. nach Ändern von SMSIR_ALLOW_SEND); sendet nichts

send_sms

kostenpflichtig

POST /v1/send/bulk

Ein Text an einen oder mehrere Empfänger

send_verification_code

kostenpflichtig

POST /v1/send/verify

Vorlagenbasierte OTP-/Verifizierungsnachricht

send_personalized_sms

kostenpflichtig

POST /v1/send/likeToLike

Ein individueller Text pro Empfänger

cancel_scheduled_send

destruktiv

DELETE /v1/send/scheduled/{packId}

Eine noch nicht gesendete geplante Sendung abbrechen

Jedes Tool gibt bei Erfolg {"ok": true, "data": …, …} oder bei Fehler {"ok": false, "error": {"code": …, "message": …}} zurück. Fehlercodes: config_error, validation_error, confirmation_required, send_disabled, auth_error, rate_limited, transient_error, api_error, internal_error.

Beispiele

// 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. Sicherheitsmodell

  • Kostenpflichtige Operationen (send_sms, send_verification_code, send_personalized_sms) benötigen beides:

    1. confirm=true im Tool-Aufruf und

    2. SMSIR_ALLOW_SEND=true in der Serverumgebung. Bei deaktiviertem Kill-Switch sendet ein bestätigter Aufruf trotzdem nichts.

  • Destruktive Operation (cancel_scheduled_send) benötigt confirm=true.

  • Keine beliebigen Basis-URLs: Nur api.sms.ir wird akzeptiert, außer SMSIR_ALLOW_CUSTOM_BASE_URL=true. HTTPS wird erzwungen.

  • Keine Header-Injection: Aufrufer können keine Request-Header setzen; nur typisierte, validierte Felder werden weitergeleitet.

  • Timeouts + begrenzte Wiederholungen + clientseitiges Ratenlimit bei jeder Anfrage.

  • Maskierung: API-Schlüssel, Telefonnummern, Nachrichtentexte und OTP-Werte werden in der Protokollausgabe maskiert.

  • Keine Admin-Endpunkte: Nur die Operationen aus der Postman-Sammlung werden bereitgestellt; nichts für Konto-/Konfigurationsverwaltung.

6. Client-Registrierung

Ihr echter API-Schlüssel gehört in .env in diesem Ordner – niemals in eine Client-Konfigurationsdatei. Jede Konfiguration unten verweist den Client nur auf diesen Server und seine .env.

Codex CLI (installiert)

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

Manuelles Äquivalent: docs/codex_config.example.toml.

Claude Code (installiert)

Dieses Repo enthält eine projektspezifische .mcp.json. Öffnen Sie Claude Code in diesem Verzeichnis und genehmigen Sie den sms-ir-Server, wenn Sie dazu aufgefordert werden:

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

Um es stattdessen im Benutzerbereich zu registrieren:

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 (nicht installiert)

Wenn installiert, fügen Sie docs/claude_desktop_config.example.json in %APPDATA%\Claude\claude_desktop_config.json ein (sichern Sie es zuerst; behalten Sie andere Server).

7. Entwicklung

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

Die Tests decken Anfragekonstruktion, Auth-Header, Envelope-Parsing, Fehlernormalisierung, Wiederholungen/Ratenlimit, Argumentvalidierung, Maskierung, OTP-Extraktion, gemockte Integration für jedes Tool (unter Verwendung der Postman-Beispiel-Payloads), OpenAPI-vs-Collection-Konsistenz und MCP-Tool-Erkennung ab.

8. Erster Live-Test (nachdem Sie eine Anmeldedaten bereitgestellt haben)

Nichts in diesem Repo hat einen kostenpflichtigen Aufruf getätigt. Um den ersten echten Versand durchzuführen, den Sie ausdrücklich autorisieren:

  1. Legen Sie Ihren Schlüssel in .env ab:

    SMSIR_API_KEY=<your real key>
    SMSIR_DEFAULT_LINE_NUMBER=<your approved line>
    SMSIR_ALLOW_SEND=true
  2. Überprüfen Sie die Konnektivität, ohne etwas auszugeben – rufen Sie von einem verbundenen Client health_check (oder get_balance) auf.

  3. Dann, und nur dann, tätigen Sie den ersten kostenpflichtigen Aufruf. Exakter Tool-Aufruf:

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

    Codex-Formulierung: „Verwenden Sie das send_sms-Tool des sms-ir-Servers, um ‚SMS.ir MCP test‘ an von Zeile zu senden, mit confirm true.“

9. Fehlerbehebung

Symptom

Ursache / Lösung

config_error: SMSIR_API_KEY is not set

Kein Schlüssel in env oder .env; prüfen Sie den SMSIR_ENV_FILE-Pfad, den der Client übergibt

auth_error bei jedem Aufruf

Falscher/rotierter Schlüssel oder Schlüssel ohne Panel-API-Zugriff

send_disabled

SMSIR_ALLOW_SEND ist in der Serverumgebung nicht true

.env bearbeitet, aber nichts geändert

Der Server liest die Konfiguration einmal beim Start. Rufen Sie reload_config auf oder starten Sie den MCP-Client neu, damit er den Server neu startet

confirmation_required

Rufen Sie das Tool erneut mit "confirm": true auf

validation_error: Ungültige Mobilnummer

Verwenden Sie 10–15 Ziffern, optional führendes +

rate_limited

Clientseitiger Limiter ausgelöst; erhöhen Sie SMSIR_RATE_LIMIT_PER_MINUTE oder verlangsamen Sie

transient_error

Netzwerk/5xx nach Wiederholungen; prüfen Sie Konnektivität und SMS.ir-Status

Client zeigt keine Tools

Falscher command-Pfad in der Client-Konfiguration; zeigen Sie auf .venv\Scripts\python.exe

api_error mit api_status

SMS.ir hat die Anfrage abgelehnt; message enthält deren Grund

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