Cómo conectar Claude con Slack paso a paso
Crea un bot de Slack que responde con Claude usando Bolt y la API de Anthropic.

- Cuenta de Slack con permisos para crear apps
- API key de Anthropic (console.anthropic.com)
- Python 3.9+ instalado
- Node.js opcional si prefieres JavaScript
- Conocimientos básicos de terminal y variables de entorno
- Crear y configurar una app de Slack con los scopes correctos
- Conectar los eventos de Slack con la API de Claude
- Usar Slack Bolt en modo Socket para desarrollo local
- Gestionar el contexto de la conversación por hilo
- Evitar errores comunes de tokens y permisos
Crear la app en Slack y obtener tokens
Ve a api.slack.com/apps y pulsa 'Create New App' > 'From scratch'. Dale un nombre (por ejemplo 'Claude Bot') y elige tu workspace. Dentro de la app, en 'Socket Mode', activa el modo Socket: esto te permite recibir eventos sin exponer un servidor público, ideal para desarrollo y perfecto si trabajas desde España o LATAM sin infra de hosting. Al activarlo se genera un App-Level Token (empieza por 'xapp-'); cópialo con el scope 'connections:write'. Luego en 'OAuth & Permissions' añade estos Bot Token Scopes: 'app_mentions:read', 'chat:write' e 'im:history'. Instala la app en tu workspace y copia el 'Bot User OAuth Token' (empieza por 'xoxb-'). Guarda ambos tokens; los usarás como variables de entorno. Estos dos tokens son la base de toda la integración: el 'xapp-' abre la conexión y el 'xoxb-' autoriza al bot a escribir mensajes.
Suscribir los eventos de Slack
En el panel de tu app ve a 'Event Subscriptions' y actívalo. Como usas Socket Mode no necesitas una Request URL pública. En 'Subscribe to bot events' añade 'app_mention' (para que el bot responda cuando lo menciones) y 'message.im' (para responder a mensajes directos). Guarda los cambios. Slack te pedirá reinstalar la app para aplicar los nuevos permisos: acepta. Este paso es crítico porque sin suscribir eventos tu bot nunca recibirá los mensajes, aunque el código sea correcto. Verifica también en 'App Home' que la opción 'Messages Tab' esté activada y marca 'Allow users to send Slash commands and messages from the messages tab' para permitir DMs. Tras reinstalar, vuelve a comprobar que el Bot Token sigue siendo válido; a veces al reinstalar cambia y hay que actualizar tu variable de entorno.
Preparar el entorno y las dependencias
Crea una carpeta para el proyecto e instala las librerías necesarias. Usaremos 'slack-bolt' para gestionar la conexión con Slack y el SDK oficial 'anthropic' para hablar con Claude. Configura tus tres claves como variables de entorno: el token de Slack, el token de app y la API key de Anthropic. Nunca las escribas directamente en el código. En Linux/macOS usa 'export'; en Windows PowerShell usa '$env:'. Para proyectos reales usa un archivo .env con python-dotenv y añádelo a .gitignore. Verifica que la instalación funciona ejecutando 'python -c "import slack_bolt, anthropic; print(\'ok\')"'. Si trabajas con equipos en distintos husos horarios (típico entre España y LATAM), documenta estas variables en un README para que cualquiera levante el bot en minutos.
pip install slack-bolt anthropic python-dotenv
export SLACK_BOT_TOKEN="xoxb-tu-token"
export SLACK_APP_TOKEN="xapp-tu-token"
export ANTHROPIC_API_KEY="sk-ant-tu-key"Escribir el bot que conecta Slack con Claude
Este es el núcleo de la integración. El código escucha las menciones y los mensajes directos, envía el texto del usuario a Claude con el modelo por defecto y publica la respuesta en el mismo hilo. Usamos 'say' con 'thread_ts' para mantener las respuestas organizadas por conversación. Nota que limpiamos la mención (<@ID>) del texto antes de enviarlo a Claude para que el prompt sea limpio. El 'SocketModeHandler' mantiene la conexión abierta con Slack sin necesidad de servidor web. La llamada a 'messages.create' es idéntica a cualquier otra integración con la API de Claude: defines modelo, max_tokens y la lista de mensajes. Aquí es donde puedes ajustar el system prompt para darle personalidad o restringir el dominio de respuestas de tu bot.
import os, re
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import anthropic
app = App(token=os.environ["SLACK_BOT_TOKEN"])
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
def preguntar_a_claude(texto):
resp = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
system="Eres un asistente conciso que responde en espanol.",
messages=[{"role": "user", "content": texto}],
)
return resp.content[0].text
@app.event("app_mention")
def responder_mencion(event, say):
texto = re.sub(r"<@[^>]+>", "", event["text"]).strip()
respuesta = preguntar_a_claude(texto)
say(text=respuesta, thread_ts=event["ts"])
@app.event("message")
def responder_dm(event, say):
if event.get("channel_type") == "im" and "bot_id" not in event:
respuesta = preguntar_a_claude(event["text"])
say(text=respuesta, thread_ts=event["ts"])
if __name__ == "__main__":
SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()Ejecutar y probar el bot en Slack
Lanza el script con 'python app.py'. Deberías ver en la terminal que el SocketModeHandler establece la conexión ('Bolt app is running'). Ve a tu workspace, entra en el canal donde invitaste al bot y menciónalo: '@Claude Bot resúmeme qué es MCP'. En pocos segundos Claude responderá dentro del hilo. Prueba también un mensaje directo al bot. Si no responde, revisa la terminal: los errores de permisos ('missing_scope') indican que falta añadir un scope y reinstalar; los errores 401 apuntan a un token incorrecto. Este flujo local es suficiente para demos y equipos pequeños. Para producción real deberías desplegar en un servicio siempre activo (Railway, Fly.io o un contenedor) y añadir manejo de errores y reintentos.
python app.pyMantener contexto por hilo (mejora opcional)
Por defecto cada mensaje se envía a Claude sin memoria. Para que el bot recuerde la conversación dentro de un hilo, recupera el historial con la API de Slack y constrúyelo como lista de mensajes. Aquí usamos 'conversations_replies' para leer los mensajes previos del hilo y los mapeamos a roles 'user' y 'assistant'. Esto convierte tu bot en un verdadero asistente conversacional en lugar de un consultor de una sola pregunta. Ten en cuenta el límite de tokens: si el hilo es muy largo conviene truncar los mensajes más antiguos o resumirlos. Esta técnica es la base para construir asistentes de soporte o copilotos internos sobre Slack, un patrón muy demandado en empresas de España y LATAM que quieren IA integrada donde ya trabajan.
@app.event("app_mention")
def responder_con_contexto(event, say, client_slack=app.client):
thread = event.get("thread_ts", event["ts"])
hist = client_slack.conversations_replies(
channel=event["channel"], ts=thread
)["messages"]
mensajes = []
for m in hist:
rol = "assistant" if "bot_id" in m else "user"
texto = re.sub(r"<@[^>]+>", "", m["text"]).strip()
if texto:
mensajes.append({"role": rol, "content": texto})
resp = client.messages.create(
model="claude-opus-4-8", max_tokens=1024, messages=mensajes
)
say(text=resp.content[0].text, thread_ts=thread)Has construido un bot de Slack funcional que recibe menciones y mensajes directos, los envía a la API de Claude y responde dentro del hilo, incluso manteniendo el contexto de la conversación. Con esto tienes un asistente de IA integrado directamente en el flujo de trabajo de tu equipo. A partir de aquí, aprender a construir apps sobre la API de Claude te permitirá añadir herramientas, bases de conocimiento y despliegue en producción para llevar este bot mucho más lejos.