Tips & Tricks

Guia completa de integracion Claude Code x SaaS: Notion, Slack, Linear, GitHub, Figma

Guia practica para manejar tu stack SaaS diario directamente desde Claude Code. Codigo funcional y patrones reales para las cinco integraciones mas importantes.

Sigues pensando que Claude Code es solo una herramienta para editar codigo? Si lo conectas con los SaaS que usas a diario, Claude Code se convierte en un verdadero “orquestador de trabajo”. Escribir una pagina en Notion, publicar en Slack, abrir un ticket en Linear, crear un PR en GitHub o leer valores desde Figma — todo desde un unico prompt en lenguaje natural.

En este articulo recorremos los cinco patrones de integracion SaaS que usamos a diario para operar ClaudeCodeLab, con codigo funcional y pasos de configuracion. Al terminar tendras tu propio hub de automatizacion.

Las tres arquitecturas basicas de integracion

Hay basicamente tres formas de conectar Claude Code con un producto SaaS:

EnfoqueCoste de implementacionFlexibilidadRecomendado para
Servidor MCPMedioAltaIntegraciones frecuentes, reutilizadas entre proyectos
Wrapper de CLIBajoMediaScripts unicos, integraciones simples
Receptor de webhookAltoAltaIntegraciones bidireccionales disparadas desde el SaaS

Los principiantes deben arrancar con un wrapper de CLI: es el camino mas corto. Solo dejas que Claude Code llame una API mediante la herramienta Bash, asi que basta con tener una clave en una variable de entorno. Cuando ganes soltura, lo natural es promoverlo a un servidor MCP.

1. Integracion con Notion: producir paginas en serie con IA

Casos de uso

  • Publicar minutas de reunion directamente en Notion
  • Generar reportes semanales automaticamente
  • Dejar que la IA amplie la base de conocimiento interna

Implementacion

// scripts/notion-create-page.mjs
import { Client } from "@notionhq/client";

const notion = new Client({ auth: process.env.NOTION_TOKEN });

async function createPage(databaseId, title, markdown) {
  const blocks = markdown.split("\n\n").map((para) => ({
    object: "block",
    type: "paragraph",
    paragraph: {
      rich_text: [{ type: "text", text: { content: para } }],
    },
  }));

  const page = await notion.pages.create({
    parent: { database_id: databaseId },
    properties: {
      Name: { title: [{ text: { content: title } }] },
      Status: { select: { name: "Draft" } },
    },
    children: blocks,
  });

  return page.url;
}

const [, , dbId, title, ...bodyParts] = process.argv;
const url = await createPage(dbId, title, bodyParts.join(" "));
console.log(`Created: ${url}`);

Uso desde Claude Code

claude -p "
Lee la siguiente minuta y resumela en tres secciones
(decisiones / accionables / agenda siguiente), luego publicala
en la base de datos de minutas de Notion:

$(cat ~/inbox/meeting-raw.txt)

Usa database_id: abc123...
Tras publicar, envia la URL al canal slack-channel-general.
"

Claude Code invoca notion-create-page.mjs mediante la herramienta Bash y reenvia la URL resultante a Slack, todo en un unico prompt.

2. Integracion con Slack: automatizar notificaciones y posts

Casos de uso

  • Notificaciones de despliegue completado
  • Post semanal con resumen de errores
  • Dar formato a reportes largos en hilos

Implementacion (Incoming Webhook — lo mas sencillo)

// scripts/slack-notify.mjs
const webhookUrl = process.env.SLACK_WEBHOOK_URL;
const message = process.argv.slice(2).join(" ");

const res = await fetch(webhookUrl, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    text: message,
    blocks: [
      { type: "section", text: { type: "mrkdwn", text: message } },
    ],
  }),
});

console.log(res.ok ? "✓ Sent" : `✗ ${res.status}`);

Variante con Slack Bolt SDK (respuestas en hilo, DM, etc.)

// scripts/slack-post-thread.mjs
import { WebClient } from "@slack/web-api";

const client = new WebClient(process.env.SLACK_BOT_TOKEN);

async function postThread(channel, parent, replies) {
  const main = await client.chat.postMessage({ channel, text: parent });
  for (const reply of replies) {
    await client.chat.postMessage({
      channel,
      text: reply,
      thread_ts: main.ts,
    });
  }
  return main.ts;
}

const channel = process.argv[2];
const [parent, ...replies] = process.argv.slice(3);
await postThread(channel, parent, replies);

Ejemplo real desde Claude Code

claude -p "
Ejecuta scripts/deploy.sh.
Si tiene exito, publica 'Despliegue en prod listo 🚀' en #dev
y como respuestas de hilo:
1. Hash del commit
2. Numero de archivos modificados
3. Tiempo de build
Si falla, envia una alerta roja a #dev-alerts.
"

3. Integracion con Linear: ticketing automatico

Casos de uso

  • Convertir una discusion de bug en ticket
  • Crear varios tickets a la vez desde una revision de diseno
  • Separar comentarios de code review en tareas individuales

Implementacion

// scripts/linear-create-issue.mjs
const LINEAR_API_KEY = process.env.LINEAR_API_KEY;
const LINEAR_TEAM_ID = process.env.LINEAR_TEAM_ID; // p. ej. "ENG"

async function createIssue(title, description, priority = 2) {
  const query = `
    mutation CreateIssue($input: IssueCreateInput!) {
      issueCreate(input: $input) {
        success
        issue { id identifier url }
      }
    }
  `;
  const res = await fetch("https://api.linear.app/graphql", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: LINEAR_API_KEY,
    },
    body: JSON.stringify({
      query,
      variables: {
        input: {
          teamId: LINEAR_TEAM_ID,
          title,
          description,
          priority, // 0=None, 1=Urgent, 2=High, 3=Medium, 4=Low
        },
      },
    }),
  });
  const json = await res.json();
  return json.data.issueCreate.issue;
}

const [, , title, ...desc] = process.argv;
const issue = await createIssue(title, desc.join(" "), 2);
console.log(`Created: ${issue.identifier} - ${issue.url}`);

Ejemplo: registro en lote desde revisiones de PR

claude -p "
Lee todos los comentarios de revision del PR #234 en GitHub y, por cada
comentario que requiera correccion, crea un ticket individual en Linear.

Cada ticket:
- Titulo: resumen breve del comentario
- Cuerpo: comentario original + URL del PR + archivo:linea
- priority: 1 si es 'obligatorio', 3 si es 'sugerencia'
"

4. Integracion con GitHub: apoyarse en la gh CLI

Para GitHub, la gh CLI es mucho mas comoda que la API directa. Basta con que Claude Code la invoque via Bash.

Patrones clave

# Crear PR
gh pr create --title "feat: add cache layer" --body "$(cat desc.md)"

# Abrir issue
gh issue create --title "Bug: user logout fails" --label "bug,priority-high"

# Ver revision de PR
gh pr view 234 --comments

# Estado de CI
gh run list --workflow deploy.yml --limit 5

# Crear release
gh release create v1.2.0 --notes "Changelog here"

Ejemplo: respuesta a incidentes

claude -p "
En produccion hay 500 errores con mucha frecuencia. Sigue este procedimiento:

1. Lee la ultima hora de logs/prod-*.log y extrae patrones de error
2. Identifica el commit sospechoso desde el stack trace usando git log
3. Crea un PR que revierta ese commit (gh pr create)
4. Abre un ticket de incidencia en Linear
5. Publica el estado en #incident-response en Slack

Objetivo: maximo 15 minutos.
"

5. Integracion con Figma: convertir disenos en codigo

Casos de uso

  • Leer la estructura de componentes de un archivo Figma
  • Convertir valores de Figma (colores, espacios, tipografia) a CSS
  • Pruebas visuales por comparacion de screenshots

Implementacion (API REST de Figma)

// scripts/figma-extract.mjs
const FIGMA_TOKEN = process.env.FIGMA_TOKEN;
const fileKey = process.argv[2];
const nodeId = process.argv[3];

const res = await fetch(
  `https://api.figma.com/v1/files/${fileKey}/nodes?ids=${nodeId}`,
  { headers: { "X-Figma-Token": FIGMA_TOKEN } }
);
const data = await res.json();
const node = data.nodes[nodeId].document;

// Extraer colores, tipografia y layout
const tokens = {
  colors: extractColors(node),
  typography: extractTypography(node),
  spacing: extractSpacing(node),
};

console.log(JSON.stringify(tokens, null, 2));

function extractColors(node) { /* implementacion omitida */ }
function extractTypography(node) { /* implementacion omitida */ }
function extractSpacing(node) { /* implementacion omitida */ }

Uso desde Claude Code

claude -p "
Lee nodeId=456:789 (el componente card) del archivo Figma abc123
e implementalo como componente React components/Card.tsx.

- Alinea con los tokens de Tailwind (elige colores desde theme.colors)
- Props: children, variant (primary/secondary)
- Genera tambien una historia de Storybook
- Usa scripts/figma-extract.mjs para obtener los valores de Figma
"

Gestion de credenciales: .env + gitignore son imprescindibles

Regla de oro comun a todas las integraciones:

# .env (NUNCA subir a git)
NOTION_TOKEN=secret_xxx
SLACK_BOT_TOKEN=xoxb-xxx
SLACK_WEBHOOK_URL=https://hooks.slack.com/xxx
LINEAR_API_KEY=lin_api_xxx
LINEAR_TEAM_ID=ENG
FIGMA_TOKEN=figd_xxx
# .gitignore
.env
.env.*
!.env.example

Documentalo en CLAUDE.md para evitar accidentes

## Gestion de secretos
- Nunca commitear .env
- Leer los valores en los scripts via process.env
- No incluir API keys en prompts ni en la salida
- No imprimir el header Authorization en mensajes de error

Cinco trampas habituales

1. Ignorar los rate limits Slack admite 1 llamada por segundo, Notion 3 cada 3 segundos y Linear aplica limites de complejidad GraphQL. En procesos batch, intercala siempre un sleep.

async function batchPost(items) {
  for (const item of items) {
    await postToNotion(item);
    await new Promise((r) => setTimeout(r, 500)); // 500 ms entre llamadas
  }
}

2. No verificar la firma del webhook Al montar un receptor de webhook, omitir la verificacion de firma te expone a ataques de replay. Slack y GitHub publican su esquema de firmado, asi que impleentalo siempre.

3. No aclarar con que permisos se ejecuta Se publica como bot pero creemos que saldra con nuestro nombre. Documenta los scopes de permisos en el README.

4. Ejecucion duplicada por reintentos Un fallo de red dispara un retry y acabas con tres paginas identicas en Notion. Usa una idempotency key para garantizar un unico efecto.

5. Sin fallback cuando el servicio cae Si Slack esta caido, no llegan las notificaciones de deploy y la operativa manual se queda colgada. Prepara dos rutas principales (por ejemplo Slack + email).

Operacion integrada: un prompt que atraviesa cinco servicios

La forma definitiva: un workflow que cruza multiples SaaS en un solo tiro:

claude -p "
Prepara el release de esta semana:

1. Extrae con gh log los commits no liberados de master
2. Genera las release notes en Markdown
3. Crea una pagina nueva en la base 'Releases' de Notion
4. Cuenta en Linear los issues cerrados esta semana
5. Exporta 5 screenshots de cambios desde la pagina Figma 'v2.0 Design'
6. Publica un post en #team en Slack
   (hilo con detalle, main con resumen de 3 lineas)
7. Ejecuta gh release create v2.0.0 para el release oficial

Reporta un log conciso por cada paso.
"

Si todo fluye, el release semanal que tomaba una hora pasa a ser 5 minutos delegados a Claude Code.

Resumen

SaaSIntegracion expressEvolucion
NotionWrapper de CLI + APIConvertir en servidor MCP
SlackIncoming WebhookBolt SDK + gestion de hilos
LinearGraphQL directoEmpaquetar como herramienta MCP
GitHubCon la gh CLI bastaCombinar con Actions
FigmaAPI RESTPlugin + MCP

Suelta la creencia de que “Claude Code = herramienta para escribir codigo” y el horizonte se amplia de inmediato. Empieza con Slack Incoming Webhook: coste minimo y lista en 10 minutos. Suma despues Notion o Linear y podras automatizar aproximadamente el 30 % del trabajo diario.

Articulos relacionados

Referencias

#claude-code #saas #notion #slack #linear #github #figma #integration

Lleva tu flujo con Claude Code al siguiente nivel

50 plantillas de prompts probadas en producción, listas para copiar y pegar en Claude Code.

Gratis

PDF gratuito: Hoja de trucos de Claude Code en 5 minutos

Solo deja tu correo y te enviaremos al instante la hoja de trucos en una página A4.

Cuidamos tus datos personales y nunca enviamos spam.

Masa

Sobre el autor

Masa

Ingeniero apasionado por Claude Code. Dirige claudecode-lab.com, un medio tecnológico en 10 idiomas con más de 2.000 páginas.