Skip to main content
Glama
BusinessNone

WhatsApp MCP Stream

by BusinessNone

WhatsApp MCP Stream

![CI](https://github.loglux/whats... ci/badge.svg)

Un servidor de Interfaz de Contexto de Protocolos (MCP) de WhatsApp construido al rededor del transporte Streamable HTTP, usando Baileys para la conexión con WhatsApp, con un interfaz de administración web y flujo bidirccional de archivos multimedia (subida + descarga).

Puntos claves:

  • Transporte: Streamable HTTP en /mcp

  • Motor: Baileys

  • Interfaz de administración: QR, estdo, cierre de sesión, ajustes de ejecución, visor de historial de chats

  • Archivos: endpoints de subida + alojamiento /media + herramienta de descarga MCP

Inicio rápido (Docker)

# build and run

docker compose build

docker compose up -d

El servidor estará disponible en:

  • Interfaz de administración: http://localhost:3003/admin

  • Punto de acceso MCP: http://localhost:3003/mcp

  • Archivos multimedi: http://localhost:3003/media/<file>

Related MCP server: lingtai-whatsapp

DNS en hosts con --iptables=false

En algunos hosts NAS o más seguros (pad e: j. sinología con dockerd --iptables=false), el proxy DNS limitado por Docker (127.0.0.11) no dispone de reglas de enmascarado para iptables y rechaza las conexiones dentro de los contenedores.

Solución: copie resolv.conf.example a resolv.conf y añada una anulación de volumen:

cp resolv.conf.example resolv.conf

Después, añadalo a un docker-compose.override.yml local (no versionado):

services:
  mcp-whatsapp:
    volumes:
      - ./resolv.conf:/etc/resolv.conf:ro

docker compose up recoge la anulación automáticamente.

Ajustes de ejecución

Los ajustes se pueden editar en la interfaz de administración y se guardan en SETTINGS_PATH (por defecto, MEDIA_DIR/settings.json).

Interfaz de administración

Interfaz de administración Panel de administración con ajustes de ejecucción, vinculación de QR, visor de historial de chats, exportación y estado.

Estatutos admitidos:

  • media_public_base_url

  • upload_max_mb

  • upload_enabled

  • max_files_per_upload

  • require_upload_token

  • upload_token

  • auto_download_media

  • auto_download_max_mb

Autenticación

La autenticación integrada todavía no está implementada. En producción, use una pasare que imponga la autenticación. Este proyecto funciona bien detrás de authmcp-gateway:

https://github.com/loglux/authmcp-gateway

API de subida de archivos multimedia

Base64 JSON:

curl -X POST http://localhost:3003/api/upload \
  -H "Content-Type: application/json" \
  -d {filename:photo.jpg,mime_type:image/jpeg,data:<base64>}

Multipart (recomendado para archivos grandes):

curl -X POST http://localhost:3003/api/upload-multipart \
  -F "file=@/path/to/file.jpg"

Ambos devuelven url y (si está configurado) publicUrl.

Envío de archivos locales mediante send\_media

El directorio ./files/ en la raíz del proyecto está montado dentro del contenedor en /app/files. Coloque cualquier archivo ahí y refiera a él inmediatamente — no necesita reiniciar el contenedor:

# On host:
cp report.pdf /path/to/whatsapp-mcp-stream/files/

# In send_media:
media_path: /app/files/report.pdf

Para un origen HTTPS, pase media_url directamente a send_media o stage_media — el servidor descargará el propio archivo sin base64.

Autenticación de subida (Opcional)

Si require_upload_token=true, proporcione el token con cualquiera de estas opciones:

  • x-upload-token: <token>

  • Authorization: Bearer <token>

Transporte MCP

El servidor expone Streamable HTTP en /mcp.

Flujo típico:

  1. POST /mcp con JSON-RPC initialize

  2. Use el encabezado mcp-session-id devuelto para las solicitudes posteriores

  3. POST /mcp para llamadas de herramientas

Nota: los clientes deben enviar Accept: application/json, text/event-stream en initialize.

Prueba de humo

Prueba de humo de regresión rápida para las herramientas MCP:

npm run smoke:mcp

Destino personalizado opcional:

MCP_BASE_URL=http://localhost:3003 npm run smoke:mcp

Herramientas MCP

Autenticación

Herramienta

Descripción

get_qr_code

Obtener el último código QR de WhatsApp como imagen para la autenticación.

check_auth_status

Comprobar si el cliente de WhatsApp está autenticado y listo.

logout

Cerrar la sesión de WhatsApp y borrar la sesión actual.

Contactos

Herramienta

Descripción

search_contacts

Busca contactos por nombre o número de teléfono.

resolve_contact

Resuelve un contacto por nombre o número de teléfono (mejores coincidencias).

get_contact_by_id

Obtiene los detalles del contacto por JID.

get_profile_pic

Obtiene la URL de la imagen de perfil para un JID.

get_group_info

Obtiene los metadatos del grupo y sus participantes a través del JID del grupo.

Chat

Herramienta

Descripción

list_chats

Lista los chats con metadatos y opcionalmente el último mensaje.

get_chat_by_id

Obtiene los metadatos del chat a través del JID.

list_groups

Lista solo los chats de grupo.

get_direct_chat_by_contact_number

Resuelve un JID de chat directo por número de teléfono.

get_chat_by_contact

Resuelve un contacto por nombre o número y devuelve los metadatos del chat.

analyze_group_overlaps

Encuentra miembros que coinciden en varios grupos.

find_members_without_direct_chat

Encuentra miembros de grupo sin chat directo.

find_members_not_in_contacts

Encuentra miembros de grupo no presentes en los contactos.

run_group_audit

Ejecuta la auditoría de grupo combinada como una única operación de rutina.

Mensajes

Herramienta

Descripción

list_messages

Obtener mensajes de un chat específico.

search_messages

Busca mensajes por texto (opcionalmente delimitados a un chat).

get_message_by_id

Obtener un mensaje concreto mediante su ID (jid:id).

get_message_context

Obtener mensajes recientes alrededor de un mensaje específico.

get_last_interaction

Obtener el mensaje más reciente a través de un JID.

send_message

Enviar un mensaje de texto a un contacto o grupo. Admite idempotency_key opcional.

Archivos

Herramienta

Descripción

send_media

Enviar contenido (imagen/vídeo/documento/audio). Acepta media_path, media_url o media_content (base64). Admite idempotency_key opcional.

stage_media

Guardar un archivo en el directorio de archivos del server y devolver su path local. Use el saved_path devuelto en send_media (media_path) — se evita el base64 si la fuente es una URL (el server lo descarga directamente) o permite enviar el mismo archivo a varios destinatarios sin volver a subir.

download_media

Descargar el archivo de un mensaje.

Utilidades

Herramienta

Descripción

ping

Herramienta de comprobación de salud.

Ajustes de recuperación

Este servicio contiene una solución de recuperación diseñada para corrupción del estado de sesión de Baileys/WhatsApp.

Por qué existe:

  • En producción observamos casos en los que el contenedor permanecía activo y el MCP respondía, pero la sesión de WhatsApp estaba funcionalmente rota.

  • Los indicadores más comunes eran errores de Baileys como failed to find key ... to decode mutation y failed to sync state from version.

  • En ese estado, un reinicio manual del contenedor a menudo restablecía el servicio.

Comportamiento actual:

  • Cuando aparecen señales de corrupción del estado de la aplicación, el servicio primero intenta una recuperación suave con forceResync().

  • Si la misma clase de error se repite dentro de una ventana de tiempo, llega a un reinicio interno del cliente de WhatsApp.

  • En desconexiones como Connection Terminated, el servicio programa un watchdog de desconexión y salta a un reinicio interno si la conexión no vuelve a open a tiempo.

  • El ciclo de reconexión está protegido contra los bloqueos de bloqueo anidados, por lo que la recuperación de desconexiones puede completarse sin requerir un reinicio manual del contenedor.

  • Observaciones recientes en producción muestran que los socket desconexiones repetidas (428 Connection Terminated, 503 Stream Errored) se recuperan automáticamente volviendo a open.

  • Un endpoint dedicado /healthz solo reporta 503 cuando el servicio está genuinamente bloquedo fuere de la ventana de recuperación permitida.

  • Docker comprueba la salud usando /healthz, por lo que container se reinicia solo después de que la recuperación en proceso ha tenido la oportunidad de funcionar.

Estos meónismos de recuperación reducen la intervención manual y mejoran la resiliencia frente a fallos comunes de sesión de WhatsApp/Baileys.

Licencia

MIT

Persistencia

Los chats y los mensajes se persisten en una base de datos SQLite local almacenada en el volúmen de sesión.

Variables de entorno:

Variable

Default

Description

DB_PATH

<SESSION_DIR>/store.sqlite

Ruta de la base de datos SQLite para la persistencia de chats/mensajes.

WA_EVENT_LOG

0

Activa el registro detallado de eventos de WhatsApp.

WA_EVENT_STREAM

0

Escribe el flujo de eventos sin procesar de Baileys en un archivo para una depuración avanzada.

WA_EVENT_STREAM_PATH

/app/logs/wa-events.log

Ruta de archivo para el registro del flujo de eventos.

WA_RESYNC_RECONNECT

1

Activa la red de seguridad de reconexión tras una resincronización forzada.

WA_RESYNC_RECONNECT_DELAY_MS

15000

Retraso antes de la reconexión tras una resincronización forzada (ms).

WA_SYNC_RECOVERY_COOLDOWN_MS

300000

Retardo mínimo entre recuperaciones automáticas del estado de la aplicación.

WA_SYNC_RECOVERY_WINDOW_MS

900000

Ventana de tiempo utilizada para contar fallos repetidos de corrupción del estado de la aplicación.

WA_SYNC_SOFT_RECOVERY_LIMIT

2

Número de recuperaciones suaves antes de escalar a un reinicio interno.

WA_READINESS_GRACE_MS

180000

Período de gracia durante la recuperación o desconexión antes de que /healthz pase a no saludable.

WA_DISCONNECT_RECOVERY_DELAY_MS

30000

Tiempo de espera después de un cierre de socket antes de que el supervisor de desconexión fuerce la reconexión o el reinicio.

WA_DISCONNECT_RECOVERY_RESTART_CODES

428

Códigos de estado de desconexión separados por comas que deben escalar directamente a un supervisor de reinicio interno.

WA_SEND_DEDUP_WINDOW_MS

45000

Suprime las solicitudes send_message exactamente duplicadas hacia el mismo JID dentro de esta ventana.

WA_IDEMPOTENCY_TTL_MS

86400000

Duración durante la cual se conservan en SQLite los registros de idempotencia de send_message completados para reintentos seguros.

WA_MESSAGE_INDEX_MAX

20000

Número máximo de entradas en memoria para el índice de mensajes (jid:id -> mensaje sin procesar).

WA_MESSAGE_KEY_INDEX_MAX

20000

Número máximo de entradas en memoria para el índice de claves de mensaje (id -> mensaje sin procesar).

WA_INITIALIZE_TIMEOUT_MS

120000

La inicialización del cliente de WhatsApp compite contra esta fecha límite; establezca 0 para deshabilitarla. Lanza una excepción al agotar el tiempo para que la recuperación pueda reintentar en lugar de quedarse colgada.

WA_AUTO_DOWNLOAD_CONCURRENCY

3

Máximo de descargas automáticas en paralelo. La descarga automática se ejecuta a través de una cola acotada dentro del proceso para que una ráfaga de medios entrantes no sature el E/S.

WA_AUTO_DOWNLOAD_QUEUE_MAX

200

Máximo de trabajos de descarga automática en cola. El exceso se descarta en modo FIFO (los más antiguos primero) con un registro de advertencia; los mensajes recientes se mantienen priorizados.

MCP_HTTP_ENABLE_JSON_RESPONSE

1

Utiliza respuestas JSON directas por defecto para las solicitudes POST de Streamable HTTP. Establezca 0 para forzar el comportamiento más antiguo de manejo de respuestas POST de estilo SSE.

Diagnósticos adicionales del transporte:

  • Las solicitudes POST de /mcp registran ahora los eventos del ciclo de vida de las solicitudes en logs/mcp-whatsapp.log

  • esto incluye la entrada de la solicitud, el despacho del transporte, la finalización de transport.handleRequest y los eventos HTTP finish / close

  • utiliza estos registros para determinar si la latencia se produce antes de que la respuesta salga de whatsapp-mcp-stream o después, en el lado de la puerta de enlace o del cliente

API de historial de chats

Consulta los chats y mensajes almacenados mediante:

GET /api/chats?limit=50&offset=0&q=<search> — lista de chats paginada, opcionalmente filtrada por nombre.

GET /api/chats/:jid/messages?limit=50&offset=0 — mensajes paginados para un chat (del más nuevo al más antiguo).

Ambos endpoints son utilizados por la pestaña Chats de la interfaz de administración.

Exportación

Exporta un chat (JSON y medios descargados adicionales) mediante:

GET /api/export/chat/:jid?include_media=true

Si include_media=true, el ZIP incluye los archivos ya descargados mediante download_media. No obtiene de WhatsApp los medios faltantes.

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables WhatsApp automation through MCP protocol, allowing users to manage sessions, send messages, handle groups/communities, and access contacts through natural language interactions with AI agents.
    11
  • A
    license
    Not graded
    quality
    F
    maintenance
    MCP server for interacting with the official Meta WhatsApp Business Platform/Cloud API, enabling sending messages, managing contacts, templates, and handling webhook callbacks.
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Integrates WhatsApp with AI agents, enabling message sending, chat search, media sharing, approval workflows, and activity summaries via any MCP client.
    1
    Apache 2.0

View all related MCP servers

Related MCP Connectors

  • Search, document and execute authenticated API calls across 700+ apps via one MCP server

  • Give AI agents real phone numbers, messages, and voice calls via MCP.

  • Instagram, WhatsApp and Messenger DMs through official Meta Business APIs.

View all MCP Connectors

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/BusinessNone/WhatsAppMCP'

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