SMS.ir MCP server
Servidor MCP de SMS.ir
Un servidor local Model Context Protocol que expone un conjunto de herramientas seleccionadas y con control de seguridad para la API Panel V2 de SMS.ir. Construido con Python + FastMCP.
Transporte stdio para Codex / Claude Desktop / Claude Code
Transporte HTTP transmisible para desarrollo y pruebas locales
Las operaciones de lectura funcionan de serie; cada envío es facturable y está bloqueado por defecto detrás de un indicador de confirmación y un interruptor de seguridad en el servidor.
Los números de teléfono, el texto de los mensajes, las claves API y los códigos OTP se enmascaran en los registros.
Construido a partir de la colección de Postman SMS.ir Panel V2 (no incluida en este repositorio: contiene una clave API real). La descripción normalizada de la API se encuentra en docs/API.md y docs/openapi.yaml.
1. Configuración
Requiere Python 3.10+ (desarrollado y probado en 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: meta-mcp-py
2. Configuración
Toda la configuración proviene de variables de entorno. Para uso local, copie el archivo de entorno de ejemplo y complételo: está ignorado por git y nunca se confirma.
copy .env.example .env
notepad .envVariable | Requerido | Por defecto | Propósito |
| sí | – | Clave API del Panel SMS.ir, enviada como cabecera |
| no | – | Línea de remitente predeterminada para las herramientas de envío |
| no |
| Interruptor de seguridad. Debe ser |
| no |
| URL base de la API (host en lista blanca) |
| no |
| Permitir un host distinto de |
| no |
| Tiempo de espera por solicitud |
| no |
| Reintentos para fallos transitorios (429 / 5xx / red) |
| no |
| Límite de velocidad del lado del cliente |
| no |
| Límite superior aceptado para |
| no |
|
|
| no |
| Ruta al archivo de entorno a cargar automáticamente |
Las variables de entorno reales siempre anulan los valores del archivo de entorno.
3. Ejecución
# 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 8000Para una comprobación rápida de conectividad y autenticación que nunca gasta crédito, llame a la herramienta health_check (o get_balance) desde cualquier cliente conectado; ambas son GET /v1/credit internamente.
4. Herramientas
Las herramientas de solo lectura están siempre disponibles. Las herramientas de escritura requieren confirm=true y SMSIR_ALLOW_SEND=true; la herramienta destructiva requiere confirm=true.
Herramienta | Tipo | API | Descripción |
| lectura |
| Crédito SMS restante |
| lectura |
| Números de línea de remitente / números virtuales |
| lectura |
| Informe/estado de entrega de un mensaje enviado |
| lectura |
| Resultados por destinatario para un paquete masivo (paginado) |
| lectura |
| Mensajes enviados, |
| lectura |
| Paquetes masivos, |
| lectura |
| Mensajes entrantes, |
| lectura |
| Mensaje entrante más reciente que contiene un código de un solo uso analizable (heurístico) |
| lectura |
| Comprobación de alcance y autenticación, nunca facturable; también devuelve la configuración efectiva |
| administración | – | Vuelve a leer |
| facturable |
| Un texto a uno o más destinatarios |
| facturable |
| Mensaje de verificación/OTP con plantilla |
| facturable |
| Un texto distinto por destinatario |
| destructiva |
| Cancelar un paquete programado aún no enviado |
Cada herramienta devuelve {"ok": true, "data": …, …} en caso de éxito o {"ok": false, "error": {"code": …, "message": …}} en caso de error. Códigos de error: config_error, validation_error, confirmation_required, send_disabled, auth_error, rate_limited, transient_error, api_error, internal_error.
Ejemplos
// 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. Modelo de seguridad
Operaciones facturables (
send_sms,send_verification_code,send_personalized_sms) requieren ambas:confirm=trueen la llamada a la herramienta, ySMSIR_ALLOW_SEND=trueen el entorno del servidor. Con el interruptor de seguridad desactivado, una llamada confirmada no envía nada.
Operación destructiva (
cancel_scheduled_send) requiereconfirm=true.Sin URLs base arbitrarias: solo se acepta
api.sms.ira menos queSMSIR_ALLOW_CUSTOM_BASE_URL=true. Se aplica HTTPS.Sin inyección de cabeceras: los llamadores no pueden establecer cabeceras de solicitud; solo se reenvían campos tipados y validados.
Tiempos de espera + reintentos limitados + limitación de velocidad del lado del cliente en cada solicitud.
Enmascaramiento: las claves API, los números de teléfono, los cuerpos de los mensajes y los valores OTP se enmascaran en la salida de los registros.
Sin endpoints de administración: solo se exponen las operaciones de la colección de Postman; nada para gestión de cuentas/configuración.
6. Registro de clientes
Su clave API real va en .env en esta carpeta — nunca en un archivo de configuración del cliente. Cada configuración a continuación solo apunta al cliente a este servidor y a su .env.
Codex CLI (instalado)
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-irEquivalente manual: docs/codex_config.example.toml.
Claude Code (instalado)
Este repositorio incluye un .mcp.json de ámbito de proyecto. Abra Claude Code en este directorio y apruebe el servidor sms-ir cuando se le solicite:
cd C:\Users\Kasra\Documents\sms.ir-mcp
claude
/mcp # shows sms-ir and its toolsPara registrarlo en el ámbito de usuario en su lugar:
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 stdioClaude Desktop (no instalado)
Cuando esté instalado, combine docs/claude_desktop_config.example.json en %APPDATA%\Claude\claude_desktop_config.json (haga una copia de seguridad primero; conserve otros servidores).
7. Desarrollo
.\.venv\Scripts\python.exe -m ruff check src tests
.\.venv\Scripts\python.exe -m ruff format --check src tests
.\.venv\Scripts\python.exe -m pytestLas pruebas cubren la construcción de solicitudes, la cabecera de autenticación, el análisis del sobre, la normalización de errores, los reintentos/limitación de velocidad, la validación de argumentos, el enmascaramiento, la extracción de OTP, la integración simulada para cada herramienta (usando las cargas útiles de ejemplo de Postman), la consistencia entre OpenAPI y la colección, y el descubrimiento de herramientas MCP.
8. Primera prueba en vivo (después de proporcionar una credencial)
Nada en este repositorio ha realizado una llamada facturable. Para ejecutar el primer envío real, que usted autoriza explícitamente:
Ponga su clave en
.env:SMSIR_API_KEY=<your real key> SMSIR_DEFAULT_LINE_NUMBER=<your approved line> SMSIR_ALLOW_SEND=trueVerifique la conectividad sin gastar nada: desde un cliente conectado llame a
health_check(oget_balance).Entonces, y solo entonces, realice la primera llamada facturable. Llamada exacta a la herramienta:
send_sms({ "message_text": "SMS.ir MCP test", "mobiles": ["<your own mobile>"], "line_number": "<your approved line>", "confirm": true })Fraseo de Codex: "Use la herramienta send_sms del servidor sms-ir para enviar 'SMS.ir MCP test' a <su propio móvil> desde la línea <línea>, con confirm true."
9. Solución de problemas
Síntoma | Causa/solución |
| No hay clave en el entorno o en |
| Clave incorrecta/rotada, o la clave no tiene acceso a la API del Panel |
|
|
Editó | El servidor lee la configuración una vez al inicio. Llame a |
| Vuelva a llamar a la herramienta con |
| Use 10–15 dígitos, con |
| Se activó el limitador del lado del cliente; aumente |
| Red/5xx después de reintentos; compruebe la conectividad y el estado de SMS.ir |
El cliente no muestra herramientas | Ruta |
| SMS.ir rechazó la solicitud; |
This server cannot be deployed
Maintenance
Related MCP Connectors
Quote, send and track SMS, campaigns, contacts and Verify codes, with a confirmation before sending.
Send SMS, manage contacts and groups, and read delivery reports. OAuth 2.1 SureSMS login.
Transactional email API & AI agent safety runtime with 12 scoped tools and SpendGuard.
Read Messente balance, prices, delivery status and statistics; send SMS to up to 10 numbers.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables sending SMS, querying delivery reports, and managing senders and blacklists through the iletiMerkezi SMS API.1114 npm2MIT
- AlicenseCqualityCmaintenanceEnables reading analytics and publishing content to Facebook Pages, Instagram, and Threads via Meta's Graph API, with a safety toggle for write operations.56MIT
- AlicenseNot gradedqualityAmaintenanceEnables sending and managing SMS, voice messages, contacts, templates, blacklists, and account reports through the przypominamy.com REST API, with key-scoped authorization and safety confirmations for destructive actions.MIT
- AlicenseBqualityCmaintenanceEnables secure, typed access to the HestiaCP server management API via MCP, with explicit allowlists for read-only operations and opt-in mutation/destructive tools.381MIT