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
- 1Copia
- 2Pégalo en tu IA
- 3Autoriza 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.
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/mcpGrok Bot
- Abre la configuración de MCP remoto de Grok Bot.
- Pega esta URL del servidor:
https://staging.whatconnector.tech/mcp - 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)
- En conectores remotos, añade un conector personalizado. Puedes usar «Añadir a Claude» arriba para rellenar el formulario.
- Si lo haces a mano, pega esta URL:
https://staging.whatconnector.tech/mcp - Para entrar, se abre el navegador: inicias sesión y autorizas el acceso.
ChatGPT (conectores / modo de desarrollador)
- En conectores o en el modo de desarrollador de MCP, agrega un servidor remoto.
- Pega esta URL:
https://staging.whatconnector.tech/mcp - 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.
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);
},
);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 "", 204Fotos, 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_messagesyGET /api/v1/chats/:jid/messagesentregan un objetomediacon un GET prefirmado de unos 15 minutos, regenerado en cada lectura.get_mediayGET /api/v1/messages/:id/mediapiden un enlace fresco. Exigen permiso de lectura en esa conversación.send_messageyPOST /api/v1/chats/:jid/messagesaceptanreply_to(id de WhatsApp a citar) y unattachment(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.editedymessage.deletedrespetan los mismos permisos por chat. No se envían notificaciones vacías.
Cursor (mcp.json)
- En la configuración MCP de Cursor, edita
mcp.jsony declara un servidor remoto. - Usa esta URL:
{
"mcpServers": {
"whatconnector": {
"url": "https://staging.whatconnector.tech/mcp"
}
}
}Para entrar, se abre el navegador: inicias sesión y autorizas el acceso.