whatconnector

Conecta tu IA al MCP remoto

Pega la URL del servidor en la configuración de MCP remoto de tu asistente. Para entrar, se abre el navegador: inicias sesión y autorizas el acceso.

Texto para tu IA

Pégale esto a tu IA

Claude · ChatGPT · Grok · Cursor

  1. Copia
  2. Pégalo en tu IA
  3. Autoriza el acceso

Instala este MCP: https://staging.whatconnector.tech/mcp

Copia el texto y pégalo en el chat de tu asistente, fuera de esta app.

Añadir a Claude

Con OAuth, elige un acceso al autorizar. Con un token, el token ya fija el acceso. Si el agente no puede instalarlo desde el chat, añade la URL en su configuración de MCP.

Copiar URL del servidor
https://staging.whatconnector.tech/mcp

Grok Bot

  1. Abre la configuración de MCP remoto de Grok Bot.
  2. Pega esta URL del servidor: https://staging.whatconnector.tech/mcp
  3. Para entrar, se abre el navegador: inicias sesión y autorizas el acceso.

Si no encuentras esa pantalla, pégale el texto de instalación a Grok y deja que intente configurarlo.

Claude (Claude.ai / Desktop)

  1. En conectores remotos, añade un conector personalizado. Puedes usar «Añadir a Claude» arriba para rellenar el formulario.
  2. Si lo haces a mano, pega esta URL: https://staging.whatconnector.tech/mcp
  3. Para entrar, se abre el navegador: inicias sesión y autorizas el acceso.

ChatGPT (conectores / modo de desarrollador)

  1. En conectores o en el modo de desarrollador de MCP, agrega un servidor remoto.
  2. Pega esta URL: https://staging.whatconnector.tech/mcp
  3. Para entrar, se abre el navegador: inicias sesión y autorizas el acceso.

Verificar la firma de las notificaciones

Cada entrega incluye X-WAC-Signature, X-WAC-Timestamp, X-WAC-Event y X-WAC-Delivery-ID. La firma es sha256=HMAC_SHA256(secreto, timestamp + "." + cuerpo), calculada sobre el cuerpo sin modificar. Compara en tiempo constante y rechaza timestamps viejos (por ejemplo, más de 5 minutos); después deduplica por X-WAC-Delivery-ID.

Node.js (Express)
import crypto from "node:crypto";
import express from "express";

const app = express();
const secret = process.env.WAC_WEBHOOK_SECRET;

app.post(
  "/webhooks/whatsapp",
  express.raw({ type: "application/json" }),
  (req, res) => {
    const timestamp = req.get("X-WAC-Timestamp") || "";
    const signature = req.get("X-WAC-Signature") || "";
    if (!timestamp || Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) {
      return res.sendStatus(400);
    }
    const expected =
      "sha256=" +
      crypto
        .createHmac("sha256", secret)
        .update(timestamp + ".")
        .update(req.body)
        .digest("hex");
    const a = Buffer.from(expected);
    const b = Buffer.from(signature);
    if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
      return res.sendStatus(401);
    }
    // Deduplica por X-WAC-Delivery-ID antes de procesar el evento.
    res.sendStatus(204);
  },
);
Python (Flask)
import hashlib
import hmac
import time

from flask import Flask, abort, request

app = Flask(__name__)
SECRET = "..."  # secreto de firma, en tu gestor de secretos

@app.post("/webhooks/whatsapp")
def whatsapp_webhook():
    timestamp = request.headers.get("X-WAC-Timestamp", "")
    signature = request.headers.get("X-WAC-Signature", "")
    try:
        age = abs(time.time() - int(timestamp))
    except ValueError:
        abort(400)
    if age > 300:
        abort(400)
    expected = "sha256=" + hmac.new(
        SECRET.encode(),
        timestamp.encode() + b"." + request.get_data(),
        hashlib.sha256,
    ).hexdigest()
    if not hmac.compare_digest(expected, signature):
        abort(401)
    # Deduplica por X-WAC-Delivery-ID antes de procesar el evento.
    return "", 204

Fotos, audios, documentos y respuestas

El historial incluye texto, imagen, video, audio (incluida nota de voz), documento, sticker, ubicación, contacto, encuesta y reacción. Una respuesta cita el mensaje original; una edición o un borrado se aplican a esa misma fila. No hay transcripción ni OCR: tu agente lee o escucha el archivo.

  • list_messages y GET /api/v1/chats/:jid/messages entregan un objeto media con un GET prefirmado de unos 15 minutos, regenerado en cada lectura.
  • get_media y GET /api/v1/messages/:id/media piden un enlace fresco. Exigen permiso de lectura en esa conversación.
  • send_message y POST /api/v1/chats/:jid/messages aceptan reply_to (id de WhatsApp a citar) y un attachment (imagen, documento, audio o video) desde una URL HTTPS. La URL se valida contra SSRF, tamaño y tipo. El flujo de confirmación humana es el de siempre: la vista previa muestra el adjunto y el mensaje citado.
  • Los eventos message.received, message.edited y message.deleted respetan los mismos permisos por chat. No se envían notificaciones vacías.

Cursor (mcp.json)

  1. En la configuración MCP de Cursor, edita mcp.json y declara un servidor remoto.
  2. Usa esta URL:
mcp.json
{
  "mcpServers": {
    "whatconnector": {
      "url": "https://staging.whatconnector.tech/mcp"
    }
  }
}

Para entrar, se abre el navegador: inicias sesión y autorizas el acceso.

No afiliado a WhatsApp ni Meta