Mattermost
Estado: plugin incluido (token de bot + eventos de WebSocket). Se admiten canales, grupos y mensajes directos. Mattermost es una plataforma de mensajería para equipos que puede alojarse por cuenta propia; consulta el sitio oficial en mattermost.com para obtener detalles del producto y descargas.Plugin incluido
Mattermost se incluye como plugin integrado en las versiones actuales de OpenClaw, por lo que las compilaciones empaquetadas normales no requieren una instalación independiente. Si usas una compilación antigua o una instalación personalizada que excluye Mattermost, instálalo manualmente: Instalar mediante CLI (registro npm):Configuración rápida
- Asegúrate de que el plugin de Mattermost esté disponible.
- Las versiones empaquetadas actuales de OpenClaw ya lo incluyen.
- Las instalaciones antiguas o personalizadas pueden añadirlo manualmente con los comandos anteriores.
- Crea una cuenta de bot de Mattermost y copia el token de bot.
- Copia la URL base de Mattermost (por ejemplo,
https://chat.example.com). - Configura OpenClaw e inicia el gateway.
Comandos de barra nativos
Los comandos de barra nativos son opcionales. Cuando se habilitan, OpenClaw registra comandos de barraoc_* mediante
la API de Mattermost y recibe POST de devolución de llamada en el servidor HTTP del gateway.
native: "auto"está deshabilitado de forma predeterminada para Mattermost. Configuranative: truepara habilitarlo.- Si se omite
callbackUrl, OpenClaw deriva una a partir del host/puerto del gateway ycallbackPath. - En configuraciones con varias cuentas,
commandspuede definirse en el nivel superior o enchannels.mattermost.accounts.<id>.commands(los valores de la cuenta prevalecen sobre los campos de nivel superior). - Las devoluciones de llamada de comandos se validan con los tokens por comando devueltos por
Mattermost cuando OpenClaw registra comandos
oc_*. - Las devoluciones de llamada de comandos de barra fallan de forma segura cuando falla el registro, el inicio es parcial o el token de devolución de llamada no coincide con uno de los comandos registrados.
- Requisito de accesibilidad: el endpoint de devolución de llamada debe ser accesible desde el servidor de Mattermost.
- No configures
callbackUrlcomolocalhosta menos que Mattermost se ejecute en el mismo host o espacio de nombres de red que OpenClaw. - No configures
callbackUrlcon tu URL base de Mattermost a menos que esa URL haga proxy inverso de/api/channels/mattermost/commandhacia OpenClaw. - Una comprobación rápida es
curl https://<gateway-host>/api/channels/mattermost/command; un GET debería devolver405 Method Not Alloweddesde OpenClaw, no404.
- No configures
- Requisito de lista de permitidos de salida de Mattermost:
- Si tu devolución de llamada apunta a direcciones privadas, de tailnet o internas, configura
ServiceSettings.AllowedUntrustedInternalConnectionsde Mattermost para incluir el host/dominio de la devolución de llamada. - Usa entradas de host/dominio, no URL completas.
- Correcto:
gateway.tailnet-name.ts.net - Incorrecto:
https://gateway.tailnet-name.ts.net
- Correcto:
- Si tu devolución de llamada apunta a direcciones privadas, de tailnet o internas, configura
Variables de entorno (cuenta predeterminada)
Configúralas en el host del gateway si prefieres usar variables de entorno:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
default). Las demás cuentas deben usar valores de configuración.
Modos de chat
Mattermost responde automáticamente a los mensajes directos. El comportamiento en canales se controla conchatmode:
oncall(predeterminado): responde solo cuando se le menciona con @ en canales.onmessage: responde a cada mensaje del canal.onchar: responde cuando un mensaje comienza con un prefijo de activación.
oncharsigue respondiendo a menciones explícitas con @.channels.mattermost.requireMentionse respeta para configuraciones heredadas, pero se prefierechatmode.
Hilos y sesiones
Usachannels.mattermost.replyToMode para controlar si las respuestas de canales y grupos permanecen en el
canal principal o inician un hilo bajo la publicación que las activó.
off(predeterminado): solo responde en un hilo cuando la publicación entrante ya está en uno.first: para publicaciones de canal o grupo de nivel superior, inicia un hilo bajo esa publicación y enruta la conversación a una sesión con ámbito de hilo.all: mismo comportamiento quefirsten Mattermost actualmente.- Los mensajes directos ignoran esta configuración y siguen sin hilos.
- Las sesiones con ámbito de hilo usan el id de la publicación activadora como raíz del hilo.
firstyallson actualmente equivalentes porque, una vez que Mattermost tiene una raíz de hilo, los fragmentos y medios de seguimiento continúan en ese mismo hilo.
Control de acceso (mensajes directos)
- Predeterminado:
channels.mattermost.dmPolicy = "pairing"(los remitentes desconocidos reciben un código de emparejamiento). - Aprobar mediante:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- Mensajes directos públicos:
channels.mattermost.dmPolicy="open"máschannels.mattermost.allowFrom=["*"].
Canales (grupos)
- Predeterminado:
channels.mattermost.groupPolicy = "allowlist"(con restricción por mención). - Define remitentes permitidos con
channels.mattermost.groupAllowFrom(se recomiendan IDs de usuario). - Las anulaciones de mención por canal están en
channels.mattermost.groups.<channelId>.requireMentionochannels.mattermost.groups["*"].requireMentioncomo valor predeterminado. - La coincidencia
@usernamees mutable y solo se habilita cuandochannels.mattermost.dangerouslyAllowNameMatching: true. - Canales abiertos:
channels.mattermost.groupPolicy="open"(con restricción por mención). - Nota de tiempo de ejecución: si falta por completo
channels.mattermost, el tiempo de ejecución usagroupPolicy="allowlist"para las comprobaciones de grupo (incluso sichannels.defaults.groupPolicyestá configurado).
Destinos para entrega saliente
Usa estos formatos de destino conopenclaw message send o cron/webhooks:
channel:<id>para un canaluser:<id>para un mensaje directo@usernamepara un mensaje directo (resuelto mediante la API de Mattermost)
64ifufp...) son ambiguos en Mattermost (ID de usuario frente a ID de canal).
OpenClaw los resuelve priorizando el usuario:
- Si el ID existe como usuario (
GET /api/v4/users/<id>devuelve éxito), OpenClaw envía un mensaje directo resolviendo el canal directo mediante/api/v4/channels/direct. - En caso contrario, el ID se trata como un ID de canal.
user:<id> / channel:<id>).
Reintento de canal de mensaje directo
Cuando OpenClaw envía a un destino de mensaje directo de Mattermost y necesita resolver primero el canal directo, reintenta por defecto los fallos transitorios al crear ese canal directo. Usachannels.mattermost.dmChannelRetry para ajustar ese comportamiento globalmente para el plugin de Mattermost,
o channels.mattermost.accounts.<id>.dmChannelRetry para una cuenta concreta.
- Esto solo se aplica a la creación de canales de mensajes directos (
/api/v4/channels/direct), no a todas las llamadas a la API de Mattermost. - Los reintentos se aplican a fallos transitorios como límites de tasa, respuestas 5xx y errores de red o tiempo de espera.
- Los errores de cliente 4xx distintos de
429se consideran permanentes y no se reintentan.
Reacciones (herramienta de mensajes)
- Usa
message action=reactconchannel=mattermost. messageIdes el id de la publicación de Mattermost.emojiacepta nombres comothumbsupo:+1:(los dos puntos son opcionales).- Configura
remove=true(booleano) para eliminar una reacción. - Los eventos de añadir o quitar reacciones se reenvían como eventos del sistema a la sesión del agente enrutada.
channels.mattermost.actions.reactions: habilita o deshabilita acciones de reacción (predeterminado: true).- Anulación por cuenta:
channels.mattermost.accounts.<id>.actions.reactions.
Botones interactivos (herramienta de mensajes)
Envía mensajes con botones en los que se puede hacer clic. Cuando un usuario hace clic en un botón, el agente recibe la selección y puede responder. Habilita los botones añadiendoinlineButtons a las capacidades del canal:
message action=send con un parámetro buttons. Los botones son un arreglo 2D (filas de botones):
text(obligatorio): etiqueta mostrada.callback_data(obligatorio): valor que se devuelve al hacer clic (se usa como ID de acción).style(opcional):"default","primary"o"danger".
- Todos los botones se sustituyen por una línea de confirmación (por ejemplo, ”✓ Yes selected by @user”).
- El agente recibe la selección como mensaje entrante y responde.
- Las devoluciones de llamada de botones usan verificación HMAC-SHA256 (automática, sin configuración necesaria).
- Mattermost elimina los datos de devolución de llamada de sus respuestas de la API (función de seguridad), por lo que todos los botones se eliminan al hacer clic; no es posible una eliminación parcial.
- Los IDs de acción que contienen guiones o guiones bajos se sanean automáticamente (limitación del enrutamiento de Mattermost).
channels.mattermost.capabilities: arreglo de cadenas de capacidad. Añade"inlineButtons"para habilitar la descripción de la herramienta de botones en el prompt del sistema del agente.channels.mattermost.interactions.callbackBaseUrl: URL base externa opcional para las devoluciones de llamada de botones (por ejemplohttps://gateway.example.com). Úsala cuando Mattermost no pueda llegar al gateway directamente en su host de enlace.- En configuraciones con varias cuentas, también puedes definir el mismo campo en
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - Si se omite
interactions.callbackBaseUrl, OpenClaw deriva la URL de devolución de llamada degateway.customBindHost+gateway.port, y luego usahttp://localhost:<port>como reserva. - Regla de accesibilidad: la URL de devolución de llamada del botón debe ser accesible desde el servidor de Mattermost.
localhostsolo funciona cuando Mattermost y OpenClaw se ejecutan en el mismo host o espacio de nombres de red. - Si tu destino de devolución de llamada es privado, de tailnet o interno, añade su host o dominio a
ServiceSettings.AllowedUntrustedInternalConnectionsde Mattermost.
Integración directa con la API (scripts externos)
Los scripts externos y webhooks pueden publicar botones directamente mediante la API REST de Mattermost en lugar de pasar por la herramientamessage del agente. Usa buildButtonAttachments() de
la extensión siempre que sea posible; si publicas JSON sin procesar, sigue estas reglas:
Estructura de la carga útil:
- Los adjuntos van en
props.attachments, no enattachmentsde nivel superior (se ignoran silenciosamente). - Cada acción necesita
type: "button"; sin ello, los clics se descartan silenciosamente. - Cada acción necesita un campo
id; Mattermost ignora las acciones sin ID. - El
idde la acción debe ser solo alfanumérico ([a-zA-Z0-9]). Los guiones y guiones bajos rompen el enrutamiento de acciones del lado del servidor de Mattermost (devuelve 404). Elimínalos antes de usarlo. context.action_iddebe coincidir con eliddel botón para que el mensaje de confirmación muestre el nombre del botón (por ejemplo, “Approve”) en lugar de un ID sin procesar.context.action_ides obligatorio; el controlador de interacciones devuelve 400 sin él.
- Deriva el secreto a partir del token del bot:
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken) - Construye el objeto de contexto con todos los campos excepto
_token. - Serializa con claves ordenadas y sin espacios (el gateway usa
JSON.stringifycon claves ordenadas, lo que produce una salida compacta). - Firma:
HMAC-SHA256(key=secret, data=serializedContext) - Añade el resumen hexadecimal resultante como
_tokenen el contexto.
json.dumpsde Python añade espacios de forma predeterminada ({"key": "val"}). Usaseparators=(",", ":")para coincidir con la salida compacta de JavaScript ({"key":"val"}).- Firma siempre todos los campos del contexto (menos
_token). El gateway elimina_tokeny luego firma todo lo restante. Firmar un subconjunto provoca un fallo silencioso de la verificación. - Usa
sort_keys=True; el gateway ordena las claves antes de firmar, y Mattermost puede reordenar los campos del contexto al almacenar la carga útil. - Deriva el secreto a partir del token del bot (determinista), no de bytes aleatorios. El secreto debe ser el mismo en el proceso que crea los botones y en el gateway que verifica.
Adaptador de directorio
El plugin de Mattermost incluye un adaptador de directorio que resuelve nombres de canales y usuarios mediante la API de Mattermost. Esto permite usar destinos#channel-name y @username en
openclaw message send y entregas por cron/webhook.
No se necesita configuración: el adaptador usa el token del bot de la configuración de la cuenta.
Varias cuentas
Mattermost admite varias cuentas enchannels.mattermost.accounts:
Solución de problemas
- No hay respuestas en canales: asegúrate de que el bot esté en el canal y menciónalo (oncall), usa un prefijo de activación (onchar) o configura
chatmode: "onmessage". - Errores de autenticación: comprueba el token del bot, la URL base y si la cuenta está habilitada.
- Problemas con varias cuentas: las variables de entorno solo se aplican a la cuenta
default. - Los comandos de barra nativos devuelven
Unauthorized: invalid command token.: OpenClaw no aceptó el token de devolución de llamada. Las causas típicas son:- el registro del comando de barra falló o solo se completó parcialmente al iniciar
- la devolución de llamada está llegando al gateway o a la cuenta equivocados
- Mattermost todavía tiene comandos antiguos que apuntan a un destino de devolución de llamada anterior
- el gateway se reinició sin reactivar los comandos de barra
- Si los comandos de barra nativos dejan de funcionar, revisa los registros en busca de
mattermost: failed to register slash commandsomattermost: native slash commands enabled but no commands could be registered. - Si se omite
callbackUrly los registros advierten que la devolución de llamada se resolvió enhttp://127.0.0.1:18789/..., esa URL probablemente solo sea accesible cuando Mattermost se ejecuta en el mismo host o espacio de nombres de red que OpenClaw. Configura en su lugar unacommands.callbackUrlexplícita y accesible externamente. - Los botones aparecen como cuadros blancos: es posible que el agente esté enviando datos de botones mal formados. Comprueba que cada botón tenga los campos
textycallback_data. - Los botones se muestran pero los clics no hacen nada: verifica que
AllowedUntrustedInternalConnectionsen la configuración del servidor Mattermost incluya127.0.0.1 localhost, y queEnablePostActionIntegrationseatrueenServiceSettings. - Los botones devuelven 404 al hacer clic: el
iddel botón probablemente contiene guiones o guiones bajos. El enrutador de acciones de Mattermost se rompe con IDs no alfanuméricos. Usa solo[a-zA-Z0-9]. - Los registros del gateway muestran
invalid _token: discrepancia de HMAC. Comprueba que firmas todos los campos del contexto (no un subconjunto), que usas claves ordenadas y JSON compacto (sin espacios). Consulta la sección de HMAC anterior. - Los registros del gateway muestran
missing _token in context: el campo_tokenno está en el contexto del botón. Asegúrate de incluirlo al construir la carga útil de integración. - La confirmación muestra el ID sin procesar en lugar del nombre del botón:
context.action_idno coincide con eliddel botón. Configura ambos con el mismo valor saneado. - El agente no conoce los botones: añade
capabilities: ["inlineButtons"]a la configuración del canal de Mattermost.
Relacionado
- Resumen de canales — todos los canales compatibles
- Emparejamiento — autenticación de mensajes directos y flujo de emparejamiento
- Grupos — comportamiento del chat grupal y restricción por mención
- Enrutamiento de canales — enrutamiento de sesiones para mensajes
- Seguridad — modelo de acceso y refuerzo