<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Blog de Ask Marsan</title>
  <link>https://askmarsan.com/es/blog</link>
  <atom:link href="https://askmarsan.com/feed.es.xml" rel="self" type="application/rss+xml" />
  <description>Reflexiones sobre Ad Tech, IA, estrategia de producto y construir cosas que importan, de Marcel Sandoval y el equipo de Ask Marsan.</description>
  <language>es-es</language>
  <lastBuildDate>Tue, 07 Apr 2026 11:51:10 GMT</lastBuildDate>
  <item>
    <title>Migrar tu setup de OpenClaw usando solo Claude Code</title>
    <link>https://askmarsan.com/es/blog/migrar-openclaw-a-claude-code</link>
    <guid isPermaLink="true">https://askmarsan.com/es/blog/migrar-openclaw-a-claude-code</guid>
    <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
    <description>Anthropic acaba de cambiar cómo se factura el uso de Claude en apps de terceros, y de repente OpenClaw sale mucho más caro. Esto es cómo reconstruir el mismo setup tú mismo, en tu propio VPS, usando solo Claude Code y compartiendo el plan Max o Pro que ya pagas.</description>
    <content:encoded><![CDATA[<p>Vale, esto es lo que ha pasado. El 4 de abril, Anthropic soltó un cambio que prácticamente rompió la economía de OpenClaw de la noche a la mañana: cualquier uso de Claude que pase por una app de terceros (como OpenClaw, como cualquier wrapper de los que hay por ahí) ya no cuenta para la cuota de tu plan Max o Pro. A partir de ahora tira del uso por tokens de la API. Traducción: si estabas tan a gusto mandándole 50 mensajes al día a tus agentes de OpenClaw bajo un plan plano, de repente te enfrentas a una factura real a final de mes, y no es pequeña.</p>
<p>La buena noticia es que en realidad no necesitas OpenClaw para nada. Puedes reconstruir exactamente el mismo setup tú mismo, en tu propio VPS, usando solo Claude Code, y que tire de la suscripción que ya pagas. De eso va este post. Al final tendrás un servidor de Discord privado, un canal por agente, cada canal conectado a su propio botcito con Claude detrás, y todo el invento sobreviviendo a reinicios sin que tengas que volver a tocarlo.</p>
<p>Truco rápido antes de empezar: si vas a hacer esto en el mismo VPS donde ya tienes OpenClaw funcionando, tienes un atajo bastante majo. Simplemente abre Claude Code en ese directorio y pídele que husmee en los ficheros existentes de OpenClaw y reproduzca el setup lo más fielmente posible. Claude Code puede leer tus configs antiguas, listar qué agentes tenías, ver qué hacía cada uno y traducirlo todo a la nueva estructura por ti. Honestamente es lo más cercano a una migración de un click que vas a tener, y de paso es un buen ejemplo de para qué sirven estos agentes.</p>
<h2>Cómo encaja Discord en todo esto</h2>
<p>Antes de tocar código, hablemos de por qué Discord pinta algo aquí, sobre todo si nunca lo has usado para nada más que chatear con amigos. La idea es simple: Discord es una app de mensajería, pero tiene una API de bots gratuita y muy buena. Eso significa que puede hacer de front-end para cualquier agente que construyas. Te llevas apps móviles y de escritorio bonitas y gratis sin tener que diseñar ni hostear tu propia UI.</p>
<p>La estructura va así. Te montas un servidor de Discord privado (piensa en un servidor como tu propio espacio de Slack personal, totalmente bajo tu control). Dentro de ese servidor creas un canal por agente: #email-manager, #research, #coding, lo que sea. Cada canal está conectado a su propio bot dedicado. Cuando escribes algo en #research, solo el agente de research lo lee, lo piensa y responde en ese mismo canal. Los demás agentes ni se enteran.</p>
<p>Esta separación por canales es lo que hace que todo funcione. Cada agente tiene su propio historial de conversación, su propio scrollback, sus propios mensajes anclados, sus propios ajustes de notificaciones en el móvil. Y no te cuesta nada porque Discord no cobra por nada de esto. Tres razones por las que es la elección correcta: apps gratis y pulidas en cada dispositivo, una API de bots madura sin coste por mensaje, y los canales te dan aislamiento natural por agente sin escribir una sola línea de UI. Si vienes de OpenClaw, ya sabes exactamente cómo se ve esto. Si no, en el Paso 2 te explico cómo montar el servidor y los bots desde cero.</p>
<h2>Lo que vas a construir</h2>
<p>Claude Code Channels es el plugin oficial de Anthropic que conecta una sesión activa de Claude Code con un bot de Discord. Cuando posteas un mensaje en el canal del agente, ese mensaje se enruta a la sesión, Claude lo lee, piensa, usa herramientas y responde en el mismo canal. Cada agente es un proceso independiente de Claude Code con su propio token de bot, su propio directorio de trabajo y su propio fichero CLAUDE.md describiendo quién es y qué hace.</p>
<p>Las cuatro cosas que sacas de esto y que no sacas de una alternativa alojada:</p>
<ul><li>Sin terceros en medio. Tus datos solo tocan tu VPS y la API de Anthropic.</li><li>Sin coste por mensaje más allá de tu plan Claude Max o Pro existente.</li><li>Múltiples agentes especializados en una sola máquina, cada uno con su propia identidad y herramientas.</li><li>Sobrevive a reinicios. Los agentes se autorreinician vía cron sin que tengas que estar encima.</li></ul>
<h2>La arquitectura en una imagen</h2>
<p>Cada agente vive en su propio directorio bajo ~/agents/ y se ejecuta dentro de una sesión persistente de tmux. El recorrido de un único mensaje es así:</p>
<pre><code>Tu mensaje en #nombre-agente (canal de Discord)
   ↓
Plugin de Discord (servidor MCP)
   ↓
Sesión de Claude Code (tmux)
   ↓
Directorio de trabajo del agente (~/agents/&lt;nombre&gt;/)</code></pre>
<p>Un directorio mínimo de agente tiene tres ficheros dentro:</p>
<ul><li>CLAUDE.md: la persona, el tono y las capacidades. Este es el cerebro del agente.</li><li>start.sh: lanza Claude Code con el plugin del canal de Discord conectado.</li><li>.env: guarda DISCORD_BOT_TOKEN, protegido con chmod 600.</li></ul>
<h2>Ejemplos de agentes que puedes ejecutar</h2>
<p>Prácticamente cualquier cosa para la que querrías un asistente siempre activo puede convertirse en un agente. Algunos puntos de partida buenos:</p>
<ul><li>email-manager: redacta, resume y organiza emails imitando tu tono.</li><li>news-agent: busca y sintetiza noticias en directo sobre los temas que te interesan.</li><li>investing: sigue una cartera y manda un informe diario disparado por cron.</li><li>coding: un ingeniero senior para depuración, revisión de código y decisiones de arquitectura.</li><li>research: un analista que escribe informes en markdown estructurados con citas.</li><li>home-assistant: gestiona listas de la compra, recordatorios y horarios del hogar.</li></ul>
<h2>Paso 1: Instalar los prerrequisitos</h2>
<p>En un VPS Debian o Ubuntu nuevo necesitas Node.js 20, Bun, el propio Claude Code, además de tmux y cron. Bun es lo que usa el plugin de Discord, y depende de unzip, que no viene instalado en imágenes mínimas.</p>
<pre><code># Node.js 20
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
apt-get install -y nodejs

# Bun (instala unzip primero)
apt-get install unzip -y
curl -fsSL https://bun.sh/install | bash
echo &apos;export PATH=&quot;$HOME/.bun/bin:$PATH&quot;&apos; &gt;&gt; ~/.bashrc
source ~/.bashrc

# Claude Code
npm install -g @anthropic-ai/claude-code

# tmux + cron
apt-get install -y tmux cron
systemctl enable --now cron</code></pre>
<h2>Paso 2: Crear el servidor de Discord, los canales y los bots</h2>
<p>Si todavía no tienes un servidor de Discord privado, créate uno. Abre Discord, pulsa el + en la barra izquierda, elige &quot;Crear el mío&quot;, luego &quot;Para mí y mis amigos&quot;, ponle un nombre como &quot;Agentes Personales&quot; y listo. Dentro de ese servidor, crea un canal de texto por cada agente que vayas a ejecutar (#email-manager, #research, #coding, etc). Click derecho en cada canal, Editar Canal → Permisos, y déjalo privado para que solo tú y el bot correspondiente puedan leerlo.</p>
<p>Ahora necesitas una aplicación de Discord para cada agente, así cada uno tiene su propio nombre, avatar e identidad de bot. Vete al Discord Developer Portal y para cada agente:</p>
<ul><li>New Application: ponle un nombre que coincida con el agente (p. ej. &quot;Email Manager Bot&quot;).</li><li>Pestaña Bot → Reset Token → cópialo y guárdalo en sitio seguro de inmediato. Solo lo verás una vez.</li><li>Privileged Gateway Intents → activa Message Content Intent → Save.</li><li>OAuth2 → URL Generator → scope: bot → permisos: Send Messages, Read Message History, Attach Files, Add Reactions.</li><li>Abre la URL de invitación generada y añade el bot a tu servidor de Discord.</li><li>De vuelta en el servidor, restringe el acceso del bot a los canales: el bot de email solo ve #email-manager, el de research solo ve #research, etc. Este aislamiento es lo que mantiene a cada agente centrado.</li></ul>
<blockquote>Guarda cada token en un sitio seguro en cuanto lo crees. Discord no volverá a mostrártelo.</blockquote>
<h2>Paso 3: Iniciar sesión en Claude Code</h2>
<p>Autentica Claude Code una sola vez en el VPS. La sesión es compartida por todos los agentes de la máquina, así que solo se hace una vez y nunca más.</p>
<pre><code>claude login</code></pre>
<h2>Paso 4: Instalar el plugin de Discord</h2>
<p>Abre Claude Code, añade el marketplace oficial de plugins de Anthropic y luego instala el plugin de Discord. Atento a cómo se escribe la organización de GitHub (anthropics, no anthrop​ics). Un error tipográfico ahí es la causa más común de fallo en este paso.</p>
<pre><code>claude
/plugin marketplace add anthropics/claude-plugins-official
/plugin install discord@claude-plugins-official
/reload-plugins
# después Ctrl+C para salir</code></pre>
<p>Si el clonado del marketplace falla con un error de autenticación de Git, limpia cualquier credential helper obsoleto y reintenta:</p>
<pre><code>git config --global credential.helper &quot;&quot;</code></pre>
<h2>Paso 5: Crear un agente con new-agent.sh</h2>
<p>Cablear cada agente a mano se hace pesado rápido. En lugar de eso, deja un pequeño script en ~/agents/new-agent.sh que haga tres preguntas (nombre, token del bot, persona) y se encargue de todo lo demás. El script debería:</p>
<ul><li>Comprobar que claude, tmux y bun están instalados antes de hacer nada.</li><li>Validar el token del bot contra la API de Discord para fallar pronto si hay un error.</li><li>Crear ~/agents/&lt;nombre&gt;/ con CLAUDE.md (construido a partir de la persona), start.sh y un .env con chmod 600.</li><li>Añadir una entrada @reboot en cron para que el agente se reinicie tras cada reinicio.</li><li>Lanzar el agente en una sesión tmux desacoplada con su nombre.</li><li>Guiarte por el emparejamiento con Discord y cerrar la lista de permitidos.</li></ul>
<p>El start.sh generado es corto. Carga Bun en el PATH, hace source del .env, entra al directorio del agente y lanza Claude Code con el plugin de Discord:</p>
<pre><code>#!/bin/bash
export PATH=&quot;$HOME/.bun/bin:$PATH&quot;
set -a; source ~/agents/&lt;nombre&gt;/.env; set +a
cd ~/agents/&lt;nombre&gt;
claude --channels plugin:discord@claude-plugins-official</code></pre>
<h3>Por qué lo envolvemos en tmux: mantener al agente vivo cuando cierras sesión</h3>
<p>Esta es la parte que confunde a casi todo el mundo la primera vez. Cuando entras a tu VPS por SSH y lanzas un programa, ese programa queda atado a tu sesión de SSH. En el momento en que cierras la terminal o tu portátil pierde el WiFi, el programa muere, y tu agente de IA se va con él. Obviamente no es lo que queremos para un asistente que se supone está disponible 24/7.</p>
<p>tmux resuelve esto de la manera más simple posible: te permite arrancar un programa dentro de una terminal invisible que vive en el propio servidor, totalmente independiente de tu conexión SSH. Imagínalo como abrir una pestaña de Chrome en un ordenador remoto y luego desenchufar tu portátil. La pestaña sigue funcionando en la máquina remota porque nunca dependió de tu portátil. Puedes volver horas o días después, conectarte a esa misma terminal invisible y encontrar al agente exactamente donde lo dejaste, todavía escuchando mensajes de Discord.</p>
<p>Cada agente vive en su propia sesión de tmux con un nombre, así que puedes listarlas todas, conectarte a cualquiera para echar un vistazo a lo que está haciendo, desconectarte y el agente sigue funcionando. Por eso cada comando de esta guía que arranca un agente pasa por tmux.</p>
<h3>Sobrevivir a los reinicios: la entrada @reboot de cron</h3>
<p>tmux mantiene al agente vivo mientras el servidor está encendido. Pero, ¿qué pasa cuando el VPS en sí se reinicia? Los proveedores parchean kernels, la máquina se queda sin memoria, hay ventanas de mantenimiento. Sin ayuda, todos los agentes morirían en silencio en el primer reinicio y solo te darías cuenta la próxima vez que intentaras escribirle a uno.</p>
<p>cron es el planificador estándar de Linux, y tiene un disparador especial llamado @reboot que ejecuta un comando cada vez que la máquina arranca. Lo usamos para lanzar automáticamente la sesión de tmux de cada agente 15 segundos después del arranque. Desde tu punto de vista: reinicias el VPS, te vas, vuelves, y todos tus agentes ya están de nuevo en línea. Tú no has hecho nada.</p>
<pre><code>@reboot sleep 15 &amp;&amp; /usr/bin/tmux new-session -d -s &lt;nombre&gt; /root/agents/&lt;nombre&gt;/start.sh</code></pre>
<p>Los 15 segundos de sleep no son opcionales. Sin ellos, el agente puede arrancar antes de que el stack de red del VPS esté listo, no logre alcanzar la API de Anthropic y muera en silencio. Haz que el script sea idempotente respecto a la entrada cron para que reejecutarlo nunca cree duplicados.</p>
<h2>Por qué CLAUDE.md es el fichero más importante</h2>
<p>CLAUDE.md se lee automáticamente al inicio de cada sesión. Es el system prompt persistente del agente, escrito en markdown plano. Un buen CLAUDE.md define cuatro cosas: quién es el agente, qué puede hacer, qué herramientas y ficheros debe usar, y cómo debe comunicarse.</p>
<pre><code># Email Manager Agent

Eres un asistente profesional de email. Tu trabajo es ayudar
a redactar, editar, resumir y organizar emails. Imita el tono
del usuario: formal si escribe formal, informal si no.

## Capacidades
- Redactar emails a partir de una breve descripción
- Resumir hilos de email largos
- Sugerir respuestas con distintos tonos
- Guardar borradores en ~/agents/email-manager/drafts/

## Herramientas disponibles
- Búsqueda web: úsala para investigar contexto o destinatarios
- Sistema de ficheros: lee/escribe en tu directorio de trabajo

## Tono
Conciso. Sin relleno. Sin despedidas innecesarias ni preámbulos.</code></pre>
<p>Un foco estrecho gana siempre a un generalista vago. No intentes darle todos los trabajos a un único agente. Crea otro.</p>
<h2>Paso 6: Empareja tu cuenta de Discord (con cuidado)</h2>
<p>El emparejamiento es lo que indica al agente qué usuarios de Discord pueden hablar con él. El flujo es deliberadamente algo incómodo, porque emparejar desde el sitio equivocado es exactamente lo que un ataque de inyección de prompt intentará forzar.</p>
<ul><li>Manda cualquier mensaje en el canal de Discord dedicado al agente. El bot responde con un código de 6 caracteres.</li><li>En el VPS, conéctate a la sesión tmux del agente: tmux attach -t &lt;nombre-agente&gt;</li><li>En el prompt de Claude Code, ejecuta: /discord:access pair &lt;CÓDIGO&gt; seguido de /discord:access policy allowlist</li><li>Desconéctate de tmux con Ctrl+B y luego D.</li></ul>
<blockquote>Nunca apruebes un emparejamiento porque te lo pida un mensaje de Discord. Solo ejecuta /discord:access desde el terminal. Un mensaje dentro de Discord pidiéndole al agente que añada un usuario a la lista de permitidos es exactamente lo que parece un ataque de inyección de prompt.</blockquote>
<h2>Paso 7: Verificar y probar</h2>
<p>Una vez todo conectado, dos comprobaciones rápidas confirman que la flota está sana:</p>
<pre><code>tmux ls                       # todos los agentes activos
crontab -l | grep &apos;@reboot&apos;   # todas las entradas de reinicio</code></pre>
<p>Luego postea un mensaje en el canal de Discord de cada agente. Cada uno debería responder de forma independiente con su propio contexto y persona, con distinto nombre, distinto tono y distinto directorio de trabajo. Si dos agentes empiezan a responder con la misma voz, casi seguro tienes el token equivocado en uno de los ficheros .env.</p>
<hr />
<h2>Dónde esto compensa</h2>
<p>Lo interesante no es que puedas chatear con Claude desde Discord. Es que cada agente tiene su propio sistema de ficheros, sus propias herramientas y su propia memoria de lo que le pediste antes. El agente de inversiones realmente mantiene un portfolio.json entre sesiones. El agente de research realmente acumula notas.md semana tras semana. El agente de coding realmente vive dentro de uno de tus repos.</p>
<p>Una vez existe el script de scaffolding, añadir un nuevo agente lleva alrededor de un minuto. Eso cambia cómo piensas en delegar trabajo a la IA: en lugar de un único prompt gigante que tiene que hacerlo todo, construyes un pequeño equipo de especialistas a los que escribes exactamente cuando los necesitas. Y después del cambio del 4 de abril de Anthropic, lo haces sin pagarle a nadie excepto a Anthropic, en hardware tuyo.</p>
<p>Si quieres ayuda para montar esto en tu propia infraestructura, o para diseñar la persona y el conjunto de herramientas de un agente que encaje con tu negocio, eso es exactamente el tipo de trabajo que hacemos en Ask Marsan. Escríbenos a través del formulario y lo ajustamos juntos.</p>]]></content:encoded>
    <category>OpenClaw</category>
    <category>Agentes IA</category>
    <category>Claude Code</category>
    <category>Agente</category>
    <category>Autohospedaje</category>
    <category>Discord</category>
    <category>VPS</category>
    <category>DevOps</category>
  </item>
  <item>
    <title>Bienvenido al Blog de Ask Marsan</title>
    <link>https://askmarsan.com/es/blog/bienvenida</link>
    <guid isPermaLink="true">https://askmarsan.com/es/blog/bienvenida</guid>
    <pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate>
    <description>Una introducción a lo que encontrarás aquí: reflexiones sobre Ad Tech, IA, Estrategia de Producto y lecciones de construir cosas que importan.</description>
    <content:encoded><![CDATA[<p>¡Hola! Soy Marcel, y este es el espacio donde compartiré lo que he aprendido en años trabajando en Ad Tech, construyendo productos y, más recientemente, ayudando a organizaciones a adoptar IA.</p>
<h2>¿Por Qué Este Blog?</h2>
<p>He pasado años acumulando conocimiento que mayormente vivía en mi cabeza, en documentos dispersos o en conversaciones con colegas. Este blog es mi intento de organizar esas ideas y compartirlas con otros que puedan encontrarlas útiles.</p>
<p>Ya seas un publisher intentando entender la optimización de yield, un product manager navegando el ecosistema de ad tech, o alguien con curiosidad sobre la adopción práctica de IA, espero que encuentres algo valioso aquí.</p>
<h2>Qué Esperar</h2>
<p>Escribiré sobre las cosas que conozco y me importan:</p>
<ul><li>Análisis profundos de Ad Tech: SSPs, DSPs, header bidding, curación y el panorama programático en evolución</li><li>IA en la práctica: No hype, sino herramientas reales y flujos de trabajo que mejoran cómo trabajamos</li><li>Estrategia de producto: Lecciones de construir y escalar productos en entornos B2B complejos</li><li>El camino de la consultoría: Lo que aprendo mientras ayudo a diferentes organizaciones a resolver sus desafíos</li></ul>
<h2>Una Nota Sobre el Estilo</h2>
<p>Creo en ser directo. No encontrarás relleno aquí. Si escribo sobre algo, es porque creo que es genuinamente útil o interesante. Compartiré lo que funcionó, lo que no, y por qué.</p>
<blockquote>La mejor manera de aprender es haciendo. La segunda mejor es compartiendo lo que aprendiste.</blockquote>
<hr />
<p>Gracias por pasarte. Si hay algún tema que te gustaría que cubriera, no dudes en contactarme a través del formulario. Aprendamos juntos.</p>]]></content:encoded>
    <category>Personal</category>
    <category>Anuncios</category>
  </item>
</channel>
</rss>
