Iniciar sesiónEmpezar prueba gratis
Meta Tech Provider

Dale un número de WhatsApp a un agente de LangChain

Un agente de LangChain obtiene WhatsApp en dos mitades. Los mensajes entrantes llegan a tu ruta web por el webhook del número, y la ruta invoca al agente. Para actuar, el agente carga las herramientas MCP de EasyCoexistence con el MCPAdapter de LangChain y OAuth, o llama directamente a la Cloud API con el token del número y su phone number id.

1.4.0

Versión mínima de langchain[mcp] para el espacio de nombres langchain.mcp, que está en beta.

auth="oauth"

Ejecuta el flujo completo de OAuth 2.1: descubrimiento, registro dinámico de clientes, redirección del navegador e intercambio de tokens.

131047

El error de Meta cuando han pasado más de 24 horas desde la última respuesta del destinatario.

¿Cómo carga un agente de LangChain las herramientas de WhatsApp?

Mediante MCPAdapter, el cliente MCP de LangChain, que entrega las herramientas de un servidor MCP a create_agent como herramientas normales de LangChain. Requiere langchain[mcp] en la versión 1.4.0 o posterior y está marcado como beta.

La autenticación se delega en FastMCP. Pasar auth="oauth" en el cliente ejecuta el flujo completo de OAuth 2.1: descubrimiento, registro dinámico de clientes, redirección del navegador e intercambio de tokens. Es justo lo que espera el servidor MCP de EasyCoexistence, así que no hay ninguna clave que crear ni pegar. Por defecto los tokens viven en memoria y cada ejecución repite el paso del navegador; un proveedor OAuth de FastMCP con almacén de tokens los conserva entre ejecuciones.

Una vez cargadas, el agente ve las herramientas con sus descripciones: primero list_numbers, porque todas las demás toman de ella un connection_id, y después send_message, send_template, list_templates, get_number_health y el resto.

Load the tools into an agent, from LangChain's documented pattern
from fastmcp.client import Client
from langchain.agents import create_agent
from langchain.mcp import MCPAdapter

URL = "https://easycoexistence.com/api/mcp"

async def build_agent(model: str):
    async with MCPAdapter(Client(URL, auth="oauth")) as adapter:
        tools = await adapter.list_tools()
        return create_agent(model, tools)

¿Cómo llega un mensaje entrante de WhatsApp al agente?

Por el webhook, porque MCP no puede hacerlo. El protocolo es de petición y respuesta, así que nada en él permite que un servidor despierte a un cliente cuando un cliente final escribe.

Configura el destino del webhook del número en una ruta de tu propia aplicación, con un secreto largo y aleatorio en la ruta de la URL. La ruta responde al GET de verificación de Meta con el desafío tal cual, acepta cada POST, devuelve 200 de inmediato y encola el trabajo. Después un worker toma el remitente y el texto del payload e invoca al agente con ellos, usando el número del remitente como id del hilo para que la memoria sea individual por cliente.

Comprueba el secreto en la URL en lugar de la cabecera X-Hub-Signature-256. Meta firma con el app secret del Tech Provider, que nunca se comparte, así que el cliente no puede validar esa cabecera.

¿Debe el agente enviar por MCP o por la Cloud API?

Ambas funcionan, y la diferencia está en quién guarda las reglas. Las herramientas MCP llevan las reglas de WhatsApp en sus descripciones: por ejemplo, send_message solo funciona dentro de la ventana de atención de 24 horas y send_template es la vía para contactar a quien no ha escrito. Un modelo que lee esas descripciones elige la correcta la mayoría de las veces, y eso ayuda cuando el agente decide con libertad.

Una herramienta propia sencilla que publique en el endpoint de mensajes de la Cloud API con el token del número es más simple cuando la tarea del agente es acotada, como responder siempre a la persona que acaba de escribir. Así la comprobación de la ventana queda en tu código, que es donde debe estar una regla que nunca puede romperse. El texto libre fuera de la ventana devuelve el error 131047, y el cliente final no ve nada.

Errores comunes

  • Esperar que MCP entregue los mensajes entrantes. Sin una ruta de webhook, el agente nunca recibe noticias de un cliente.
  • Dejar los tokens de OAuth en memoria en un servidor. Cada reinicio pide un inicio de sesión en el navegador; persístelos con un almacén de tokens.
  • Usar un solo hilo para todos los clientes. Asocia la memoria del agente al número del remitente.
Hacerlo con EasyCoexistence

Conecta el número en easycoexistence.com, configura el destino del webhook en tu ruta y carga las herramientas MCP en el agente con un solo inicio de sesión OAuth. Desde US$ 9 por número al mes, bajando hasta US$ 1 a medida que añades números, con los primeros 3 días gratis.

Preguntas frecuentes

¿Es solo para Python?

El ejemplo de MCPAdapter es en Python. El webhook y la Cloud API son HTTP simple, así que cualquier lenguaje en el que corra LangChain puede encargarse de recibir y enviar.

¿Necesita el agente llamar a list_numbers cada vez?

Necesita un connection_id, y list_numbers es el único lugar de donde sale uno. Con un solo número, el agente la llama una vez al principio.

¿Puede el equipo seguir respondiendo desde el teléfono?

Sí. Coexistencia mantiene en funcionamiento la app de WhatsApp Business, y las respuestas desde el teléfono llegan a tu ruta como eventos echo que el agente puede tener en cuenta.

¿EasyCoexistence lee la conversación?

No. Meta entrega directamente a tu ruta y el contenido de los mensajes nunca se almacena de nuestro lado. Las herramientas MCP leen el estado de la cuenta y del número.

Sigue leyendo

¿Listo para empezar?

Configura WhatsApp Coexistence en minutos, no en meses. La app sigue funcionando en el teléfono.

Empezar prueba gratis

Verificado el

Agente LangChain en WhatsApp con Cloud API