Costruisci i tuoi workflow IA: Skills, Cron Job e strumenti MCP personalizzati in OpenClaw
La maggior parte delle persone usa gli agenti IA come chatbot migliorati. Scrivi, risponde, magari cerca sul web. Carino, ma è come comprare un'auto sportiva e usarla solo per andare al supermercato.
Ecco cosa facciamo davvero: gestiamo 13 cron job, 78 strumenti MCP personalizzati e diversi skill in produzione. Il nostro agente pubblica articoli in quattro lingue, gestisce l'engagement sui social media, monitora la posta, genera immagini brandizzate e pilota pipeline di contenuti — tutto in autonomia. Ogni singolo giorno.
Questa non è una guida per principianti. Per quella, leggi la nostra Guida completa OpenClaw. Questo articolo riguarda la costruzione di automazioni reali. Uscirai con esempi copia-incolla per skill, cron job e strumenti MCP personalizzati — più le lezioni apprese dalla messa in produzione.
Iniziamo.
1. Skills — Insegnare nuovi trucchi al tuo agente
Uno skill in OpenClaw è ingannevolmente semplice: è un file Markdown con frontmatter YAML. Tutto qui. Nessun SDK speciale, nessuna fase di compilazione, nessuna pipeline di deployment. Scrivi un file SKILL.md, lo metti nella directory giusta, e il tuo agente sa improvvisamente fare qualcosa di nuovo.
Anatomia di uno skill
~/.openclaw/workspace/skills/my-skill/
├── SKILL.md # Obbligatorio: istruzioni + frontmatter
├── reference/ # Opzionale: documentazione aggiuntiva
│ └── api-docs.md
└── scripts/ # Opzionale: script di utilità
└── validate.sh
Il frontmatter del SKILL.md dice a OpenClaw cos'è lo skill. Il corpo dice all'agente come usarlo. Ecco un esempio reale — una versione semplificata del nostro skill di pubblicazione contenuti:
---
name: content-publisher
description: Pubblicare articoli di blog e contenuti social media tramite strumenti MCP.
---
# Content Publisher Skill
## Quando usare
- L'utente chiede di pubblicare un articolo di blog
- L'utente vuole creare contenuti per i social media
## Workflow
1. Ricercare l'argomento con `web_search`
2. Generare keyword con lo strumento MCP `generate_keywords`
3. Scrivere il contenuto seguendo le linee guida SEO
4. Generare l'immagine hero
5. Pubblicare nel CMS
6. Diffondere sui social media
## Regole importanti
- SEMPRE verificare che l'URL del blog restituisca 200 prima di postare sui social
- Includere l'immagine hero in TUTTI i post social
- Scrivere nella lingua specificata — non mischiare le lingue
- I post social escono in INGLESE con l'URL del blog inglese
La priorità conta
OpenClaw carica gli skill da tre posizioni, in quest'ordine:
- Workspace (
~/.openclaw/workspace/skills/) — i tuoi skill personalizzati, massima priorità - Managed — skill installati tramite ClawHub
- Bundled — skill integrati forniti con OpenClaw
Questo significa che puoi sovrascrivere qualsiasi skill integrato creandone uno con lo stesso nome nel tuo workspace. L'abbiamo fatto per personalizzare lo skill di navigazione web integrato con i nostri flussi di login specifici.
Best practice (imparate a nostre spese)
Sii diretto. Non scrivere «considera di usare web_search se appropriato.» Scrivi «SEMPRE ricercare l'argomento con web_search prima di scrivere.» L'agente performa meglio con direttive chiare.
Includi guardrail. Il nostro skill di contenuti ha una regola: «SEMPRE verificare che l'URL del blog restituisca 200 prima di postare sui social.» L'abbiamo aggiunta dopo che l'agente ha postato link rotti su Twitter. Due volte.
Mantienilo conciso. Gli skill vengono iniettati nella finestra di contesto del LLM. Uno skill da 5.000 parole consuma token e confonde il modello. I nostri skill più efficaci sono sotto le 500 parole.
Aggiungi una sezione «Quando usare». Questo aiuta il routing degli skill di OpenClaw a decidere quando attivare lo skill. Senza, l'agente potrebbe caricare il tuo skill quando non ne ha bisogno.
Suggerimento: Gli skill sono semplicemente prompt strutturati — il LLM li legge come contesto. Pensali come «conoscenza esperta a richiesta». L'agente non esegue lo skill come codice; legge lo skill e segue le istruzioni secondo il proprio giudizio. Questo è potente: puoi codificare workflow complessi in linguaggio naturale.
2. Cron Job — Il battito cardiaco del tuo agente
Se gli skill danno conoscenza al tuo agente, i cron job gli danno un programma. OpenClaw ha uno scheduler integrato che persiste attraverso i riavvii — nessun daemon cron esterno, nessun timer systemd, nessun servizio di pianificazione di terze parti. Definisci un job, e OpenClaw si sveglia e lo esegue in orario.
Due modalità di esecuzione
Qui diventa interessante. I cron job possono funzionare in due modalità:
systemEvent — Inietta un messaggio nella tua sessione principale. L'agente lo vede come una notifica e può rispondere nel contesto. Ideale per promemoria e controlli che beneficiano della cronologia della conversazione.
agentTurn — Avvia una sessione isolata. L'agente si sveglia, fa il lavoro e torna a dormire. Nessuna cronologia, nessuna interferenza con la tua chat principale. Questo è ciò che vuoi per i workflow autonomi.
Esempio 1: Promemoria semplice
{
"name": "Daily Standup Reminder",
"schedule": {
"kind": "cron",
"expr": "0 9 * * 1-5",
"tz": "Europe/Berlin"
},
"payload": {
"kind": "systemEvent",
"text": "Promemoria: Controllare email e calendario per le riunioni di oggi."
},
"sessionTarget": "main"
}
Si attiva dal lunedì al venerdì alle 9:00 ora di Berlino. Inserisce un promemoria nella tua sessione principale, e l'agente può poi controllare la tua posta e il calendario con i suoi strumenti disponibili.
Esempio 2: Pipeline di engagement autonoma
Ecco come appare un vero cron job di produzione — il nostro engagement mattutino sui social media:
{
"name": "Social Media Engagement",
"schedule": {
"kind": "cron",
"expr": "0 10 * * *",
"tz": "Europe/Berlin"
},
"payload": {
"kind": "agentTurn",
"message": "Run the EU morning engagement round. Read memory/daily-intel.md for today's news. Find trending posts on X and LinkedIn. Reply to 5-8 posts with genuine, specific comments. Log results to memory/engagement-log.md.",
"model": "anthropic/claude-opus-4-6"
},
"sessionTarget": "isolated",
"delivery": {
"mode": "announce"
}
}
Nota alcuni dettagli:
sessionTarget: "isolated"— Funziona in una sessione propria. Non inquina la tua chat principale con log di engagement.modelè esplicito — Specifichiamo il modello perché i default possono cambiare. Non vuoi che la tua pipeline complessa giri improvvisamente su un modello più piccolo.delivery.mode: "announce"— Quando il job finisce, OpenClaw invia un riepilogo nella tua sessione principale. Resti informato senza essere nel loop.
Cron vs. Heartbeat
OpenClaw ha anche un sistema di heartbeat — un poll periodico che verifica se qualcosa richiede attenzione. Quando usare quale?
| Cron quando | Heartbeat quando |
|---|---|
| Il timing esatto conta («9:00 in punto») | Più controlli possono essere raggruppati |
| Il task necessita isolamento | Serve il contesto conversazionale |
| Vuoi un modello specifico | Il timing può variare (~30 min) |
| Pianificazioni una tantum o ricorrenti | Vuoi ridurre le chiamate API |
Lezioni apprese
Non lanciare sotto-agenti dai cron job. Abbiamo provato a far lanciare sotto-agenti dal nostro cron job di engagement per l'elaborazione parallela. Hanno perso il contesto, duplicato il lavoro e occasionalmente risposto allo stesso tweet due volte. Mantieni i cron job autonomi.
Specifica sempre il modello esplicitamente. La nostra pipeline di contenuti una volta ha girato su un modello più piccolo perché ci siamo affidati al default. La qualità è calata notevolmente, e non ce ne siamo accorti per due giorni.
Usa i file memory/ per lo stato. I cron job in sessioni isolate non vedono la tua cronologia. Invece, leggiamo e scriviamo nei file della directory memory/. Il job di engagement legge daily-intel.md e scrive in engagement-log.md. I file sono il layer di stato condiviso.
3. Strumenti MCP personalizzati — Dai mani al tuo agente
Gli skill danno conoscenza. Il cron dà il programma. Gli strumenti MCP danno al tuo agente la capacità di fare davvero cose nel mondo reale.
Cos'è MCP?
MCP (Model Context Protocol) è uno standard aperto per collegare modelli IA a strumenti e fonti dati esterne. Pensalo come un sistema di plugin universale: definisci strumenti con nome, descrizione e schema di input, e qualsiasi client compatibile MCP (come OpenClaw) può scoprirli e usarli.
Perché costruire strumenti personalizzati?
Di default, OpenClaw ti offre ricerca web, operazioni su file, controllo del browser e altro. Ma prima o poi avrai bisogno di azioni specifiche per il tuo dominio:
- Pubblicare nel tuo CMS
- Generare immagini brandizzate da template
- Interrogare il tuo database interno
- Attivare pipeline CI/CD
- Postare sui social con il tuo account aziendale
Ecco dove entrano gli strumenti MCP personalizzati.
Architettura: Monolite vs. Microservizi
Abbiamo iniziato con l'idea di server MCP separati per diversi domini — uno per la gestione del blog, uno per la generazione di immagini, uno per i social media. Dopo due settimane, abbiamo consolidato tutto in un singolo server con 78 strumenti.
Perché? Ragioni pratiche:
- Meno connessioni da gestire — OpenClaw si connette a un server, non dieci
- Autenticazione condivisa — Una chiave API, un flusso di auth
- Utility condivise — Upload immagini, gestione errori, logging — tutto riutilizzabile
- Deployment semplificato — Un progetto Vercel, un set di variabili d'ambiente
Lo svantaggio è un codebase più grande, ma per la nostra scala (78 strumenti), è molto gestibile.
Esempio reale: Costruire un generatore di immagini hero
Ecco una versione semplificata del nostro strumento reale per le immagini hero. Prende i metadati dell'articolo, renderizza un template HTML con Puppeteer e carica lo screenshot:
const generateHeroImage: Tool = {
name: "generate_hero_image",
description: "Genera un'immagine hero brandizzata da template HTML. Accetta tipo di articolo, titolo, logo opzionali e colore d'accento. Restituisce un URL all'immagine caricata.",
inputSchema: {
type: "object",
properties: {
type: {
type: "string",
enum: ["product-launch", "tutorial", "comparison", "news"],
description: "Tipo di template — determina layout e stile"
},
title: {
type: "string",
description: "Titolo dell'articolo da mostrare sull'immagine"
},
logos: {
type: "array",
items: { type: "string" },
description: "ID logo dal registro (es. 'openclaw', 'vercel')"
},
accentColor: {
type: "string",
description: "Colore hex per il theming del brand (default: #3B82F6)"
}
},
required: ["type", "title"]
},
handler: async (args) => {
// 1. Caricare il template HTML per il tipo dato
const template = await loadTemplate(args.type);
// 2. Iniettare i dati — titolo, logo, colori
const html = renderTemplate(template, {
title: args.title,
logos: await resolveLogos(args.logos || []),
accentColor: args.accentColor || "#3B82F6"
});
// 3. Screenshot con Puppeteer (1200x630 per la condivisione social)
const screenshot = await puppeteerScreenshot(html, {
width: 1200, height: 630
});
// 4. Upload nello storage
const url = await uploadToStorage(screenshot, "hero-images");
// 5. Restituire dati strutturati
return {
success: true,
url: url,
dimensions: { width: 1200, height: 630 }
};
}
};
Le descrizioni degli strumenti sono tutto
Ecco qualcosa che non è ovvio: il LLM legge le descrizioni dei tuoi strumenti per decidere quale strumento chiamare. Una descrizione vaga come «genera immagini» farà chiamare il tuo strumento per le ragioni sbagliate. Una descrizione specifica come «Genera un'immagine hero brandizzata da template HTML. Accetta tipo di articolo, titolo, logo opzionali e colore d'accento.» — questo è ciò che fa usare lo strumento correttamente all'agente.
Abbiamo dedicato più tempo a perfezionare le descrizioni degli strumenti che a scrivere la logica vera e propria. Ne vale la pena.
Restituisci dati strutturati, non prosa
All'inizio, i nostri strumenti restituivano messaggi come «Immagine generata con successo su https://...». L'agente doveva poi analizzare quella stringa per estrarre l'URL. Ora restituiamo JSON strutturato:
{
"success": true,
"url": "https://storage.example.com/hero-images/abc123.png",
"dimensions": { "width": 1200, "height": 630 }
}
L'agente può usare l'URL direttamente nelle chiamate successive. Nessun parsing, nessuna ambiguità.
Testare con mcporter
OpenClaw include mcporter, uno strumento CLI per testare i server MCP direttamente:
mcporter call myserver.generate_hero_image \
type="tutorial" \
title="Il mio articolo" \
logos='["openclaw"]' \
accentColor="#EF4444"
È inestimabile durante lo sviluppo. Puoi testare strumenti senza passare per il loop completo dell'agente — iterazione più rapida, debug più facile.
4. Mettere tutto insieme
Qui avviene la magia. Nessuno di questi pezzi è impressionante da solo. Un file Markdown? Un'espressione cron? Uno schema JSON? E allora. Ma composti insieme, trasformano il tuo agente da chatbot a collaboratore autonomo.
La nostra pipeline di contenuti mattutina
Ecco come funziona la nostra vera pipeline di produzione, ogni singola mattina:
- 06:00 — Un cron job attiva un agent turn isolato
- L'agente legge lo skill di contenuti — Ora conosce l'intero workflow di pubblicazione: ricerca → scrittura → immagine → pubblicazione → social
- Cerca news di tendenza tramite strumenti MCP di ricerca —
research_topic,search_knowledge_base - Genera proposte di argomenti con keyword SEO da
generate_keywords - Crea un'immagine hero tramite il nostro strumento MCP basato su template
- Invia proposte su Telegram con pulsanti inline — «Approva», «Modifica» o «Salta»
- Su approvazione — Scrive il post in 4 lingue (EN, DE, FR, IT), pubblica tutte le versioni, genera i post social e diffonde su X, LinkedIn e Facebook
L'intera pipeline — dal trigger cron al post pubblicato e promosso — richiede circa 8 minuti. Senza intervento umano (a meno che non vogliamo revisionare).
Il pattern di composizione
Pensalo come tre livelli:
- Skills = Conoscenza («ecco come pubblicare un articolo di blog»)
- Cron = Programma («fallo ogni mattina alle 6»)
- Strumenti MCP = Azioni («ecco come creare il post, generare l'immagine, pubblicare nel CMS»)
Ogni livello da solo è utile. Tutti e tre insieme creano workflow autonomi che funzionano davvero.
Cosa faremmo diversamente
Se ricominciassimo da capo:
- Iniziare con uno skill, un cron job, uno strumento MCP. Far funzionare il loop end-to-end prima di scalare. Abbiamo costruito 30 strumenti prima di testare l'intera pipeline e abbiamo dovuto riscriverne metà.
- Loggare tutto su file. La cronologia delle conversazioni viene compressa. I file persistono. Ogni step della pipeline dovrebbe scrivere il suo output su disco.
- Usare sessioni isolate per i cron job dal primo giorno. Abbiamo iniziato con eventi nella sessione principale e l'abbiamo rimpianto in fretta — la chat è diventata rumorosa.
E poi
OpenClaw è ancora giovane, e l'ecosistema sta crescendo. ClawHub sta diventando un repository comunitario per gli skill — puoi condividere i tuoi e usare quelli degli altri. La documentazione OpenClaw contiene riferimenti dettagliati per tutto ciò che è stato trattato qui.
Se vuoi la storia completa del setup di produzione — come configuriamo OpenClaw, gestiamo workflow multi-agente e gestiamo l'automazione del browser — leggi la nostra Guida completa OpenClaw.
Tutti i pezzi sono lì. Gli skill per la conoscenza, il cron per la pianificazione, gli strumenti MCP per le azioni. Cosa costruirai?
Scrivici a Context Studios o trovaci su X @_contextstudios.