Spécification du format des Skills

Le format skills.md définit comment les Skills sont structurés, configurés et exécutés. Cette spécification garantit un comportement cohérent pour tous les Skills Tajo.

Structure du fichier

Un skill est défini dans un unique fichier markdown avec un frontmatter YAML :

---
name: customer-sync
version: 2.1.0
description: Sync customer data to Brevo contacts
category: data-sync
status: stable
triggers:
- event: customer_created
- event: customer_updated
- event: customer_deleted
actions:
- brevo/create-contact
- brevo/update-contact
- brevo/delete-contact
brevoEndpoints:
- POST /v3/contacts
- PUT /v3/contacts/{identifier}
- DELETE /v3/contacts/{identifier}
permissions:
- contacts:write
- contacts:read
---
# Customer Sync
Automatically synchronize customer data from your platform to Brevo contacts.
## Overview
This skill listens for customer lifecycle events and mirrors changes to Brevo...

Champs du frontmatter

Champs obligatoires

ChampTypeDescription
namestringIdentifiant unique (kebab-case)
versionstringVersion sémantique (ex. « 2.1.0 »)
descriptionstringDescription courte (160 caractères max)
categoryenumL’une des suivantes : data-sync, email-marketing, sms-whatsapp, loyalty, analytics, integrations
triggersarrayÉvénements qui activent ce skill
actionsarrayOpérations que ce skill peut effectuer

Champs optionnels

ChampTypePar défautDescription
statusenumstableL’une des suivantes : stable, beta, experimental
brevoEndpointsarray[]Endpoints API Brevo utilisés
permissionsarray[]Permissions API Brevo requises
relatedSkillsarray[]Identifiants des skills associés
featuredbooleanfalseMettre en avant dans le catalogue de skills

Déclencheurs

Les déclencheurs définissent les événements qui activent le skill.

Déclencheurs d’événement

triggers:
- event: cart_abandoned
conditions:
- cart_value: "> 50" # Minimum cart value
- items_count: ">= 1" # At least one item
- time_since_activity: "> 30m" # 30 minutes of inactivity
debounce: 5m # Wait 5 minutes before re-triggering

Déclencheurs planifiés

triggers:
- schedule: "0 9 * * *" # Cron expression (daily at 9am)
timezone: "America/New_York"
- schedule: every_hour
- schedule: every_day

Déclencheurs webhook

triggers:
- webhook: /skills/customer-sync/trigger
method: POST
authentication: api_key

Opérateurs de condition

OpérateurDescriptionExemple
=Égalstatus: "active"
!=Différent destatus: "!= deleted"
>Supérieur àcart_value: "> 50"
>=Supérieur ou égalitems: ">= 1"
<Inférieur àage: "< 30"
<=Inférieur ou égalquantity: "<= 10"
containsChaîne contientemail: "contains @gmail.com"
starts_withPréfixe de chaînename: "starts_with Dr."
inValeur dans une listecountry: "in US,CA,UK"

Actions

Les actions définissent les opérations effectuées par le skill.

Définition d’une action

actions:
- id: send_reminder_email
type: brevo/send-email
parameters:
template_id: 12345
to: "{{ contact.email }}"
params:
first_name: "{{ contact.firstName }}"
cart_items: "{{ cart.items }}"
retry:
attempts: 3
backoff: exponential
on_error: continue # or 'stop'

Types d’action

TypeDescription
brevo/send-emailEnvoyer un email transactionnel
brevo/send-smsEnvoyer un SMS
brevo/send-whatsappEnvoyer un message WhatsApp
brevo/create-contactCréer un nouveau contact
brevo/update-contactMettre à jour les attributs d’un contact
brevo/delete-contactSupprimer un contact
brevo/add-to-listAjouter un contact à une liste
brevo/remove-from-listRetirer un contact d’une liste
brevo/track-eventSuivre un événement personnalisé
http/requestEffectuer une requête HTTP
transform/mapTransformer des données
control/delayAttendre avant de continuer
control/conditionBrancher selon une condition

Variables de modèle

Utilisez la syntaxe {{ }} pour référencer des données :

parameters:
to: "{{ contact.email }}"
subject: "Your order #{{ order.number }} has shipped"
params:
name: "{{ contact.firstName | default: 'Customer' }}"
items: "{{ cart.items | map: 'name' | join: ', ' }}"
total: "{{ cart.total | currency: 'USD' }}"

Filtres disponibles

FiltreDescriptionExemple
defaultValeur par défaut{{ name | default: 'Guest' }}
uppercaseChaîne en majuscules{{ name | uppercase }}
lowercaseChaîne en minuscules{{ email | lowercase }}
capitalizePremière lettre en majuscule{{ name | capitalize }}
truncateTronquer une chaîne{{ desc | truncate: 100 }}
dateFormater une date{{ date | date: 'YYYY-MM-DD' }}
currencyFormater en devise{{ price | currency: 'EUR' }}
mapMapper une propriété de tableau{{ items | map: 'name' }}
joinJoindre un tableau{{ tags | join: ', ' }}
firstPremier élément du tableau{{ items | first }}
lastDernier élément du tableau{{ items | last }}
sizeTaille du tableau/de la chaîne{{ items | size }}

Permissions

Définissez les permissions API Brevo requises :

permissions:
- contacts:read # Read contact data
- contacts:write # Create/update contacts
- email:send # Send transactional emails
- sms:send # Send SMS messages
- lists:write # Manage contact lists
- events:write # Track events

Exemple complet

---
name: abandoned-cart-recovery
version: 3.0.0
description: Recover abandoned shopping carts with a multi-step email sequence
category: email-marketing
status: stable
triggers:
- event: cart_abandoned
conditions:
- cart_value: "> 25"
- customer_email: "exists"
- items_count: ">= 1"
debounce: 30m
actions:
- id: wait_1h
type: control/delay
parameters:
duration: 1h
- id: check_purchase
type: control/condition
parameters:
condition: "{{ cart.converted }} = false"
then: send_first_email
else: stop
- id: send_first_email
type: brevo/send-email
parameters:
template_id: {{ env.ABANDONED_CART_TEMPLATE_1 }}
to: "{{ contact.email }}"
params:
first_name: "{{ contact.firstName }}"
cart_url: "{{ cart.recovery_url }}"
items: "{{ cart.items }}"
total: "{{ cart.total | currency }}"
- id: wait_24h
type: control/delay
parameters:
duration: 24h
- id: check_purchase_2
type: control/condition
parameters:
condition: "{{ cart.converted }} = false"
then: send_second_email
else: stop
- id: send_second_email
type: brevo/send-email
parameters:
template_id: {{ env.ABANDONED_CART_TEMPLATE_2 }}
to: "{{ contact.email }}"
params:
first_name: "{{ contact.firstName }}"
cart_url: "{{ cart.recovery_url }}"
discount_code: "{{ generate_discount(10, 'percent') }}"
brevoEndpoints:
- POST /v3/smtp/email
- GET /v3/contacts/{identifier}
permissions:
- contacts:read
- email:send
relatedSkills:
- customer-sync
- order-events
- browse-abandonment
---
# Abandoned Cart Recovery
Recover lost sales with a proven multi-step email sequence...

Exposition en tant qu’outil MCP

Les Skills peuvent être exposés en tant qu’outils MCP, les rendant invocables par les agents IA. Ajoutez le champ mcp à votre frontmatter :

---
name: abandoned-cart-recovery
version: 3.0.0
description: Recover abandoned shopping carts with a multi-step email sequence
category: email-marketing
# MCP Configuration
mcp:
tool_name: tajo/recover-abandoned-cart
description: Execute abandoned cart recovery sequence for a specific cart
inputSchema:
type: object
properties:
cart_id:
type: string
description: The abandoned cart identifier
customer_email:
type: string
description: Customer email address
min_cart_value:
type: number
description: Minimum cart value to trigger recovery
default: 25
required: [cart_id, customer_email]
brevo_servers:
- brevo_contacts
- brevo_email_campaign_management
- brevo_templates
---

Fonctionnement de l’exposition MCP

Lorsqu’un skill possède un champ mcp, il devient un outil que les agents IA peuvent découvrir et invoquer :

Agent: "Recover abandoned cart #4521 for [email protected]"
MCP Tool Discovery: finds tajo/recover-abandoned-cart
Tool Execution: runs the skill's action chain
Brevo MCP Servers: contacts + email modules called
Result: recovery sequence initiated

Champs MCP

ChampTypeDescription
mcp.tool_namestringNom de l’outil MCP (format : tajo/skill-name)
mcp.descriptionstringDescription présentée aux agents IA lors de la découverte d’outils
mcp.inputSchemaobjectJSON Schema définissant les paramètres d’entrée de l’outil
mcp.brevo_serversarrayModules de serveur MCP Brevo dont ce skill a besoin

Skills vs outils MCP directs

AspectSkill en tant qu’outil MCPMCP Brevo direct
AbstractionÉlevée - l’agent dit « récupérer ce panier »Faible - l’agent doit appeler chaque endpoint Brevo individuellement
ComplexitéEncapsule une logique en plusieurs étapesL’agent doit orchestrer chaque étape
Garde-fousIntégrés au skill (conditions, debounce)L’agent doit les implémenter lui-même
Idéal pourWorkflows répétablesOpérations ponctuelles

Tip

Utilisez les Skills comme outils MCP pour les workflows complexes en plusieurs étapes que les agents ne devraient pas réinventer à chaque fois. Utilisez les outils MCP Brevo directs pour les opérations simples et ponctuelles comme la recherche d’un contact ou l’envoi d’un seul email.

Composer Skills et Agents

Un agent peut utiliser à la fois des Skills (en tant qu’outils MCP) et des modules MCP Brevo directs :

# Agent spec
---
name: retention-agent
tools:
# Tajo Skills as MCP tools
- tajo/recover-abandoned-cart
- tajo/customer-sync
- tajo/win-back-sequence
# Direct Brevo MCP modules
- brevo_contacts
- brevo_campaign_analytics
- brevo_segments
---

Cela donne aux agents une automatisation de haut niveau (Skills) pour les schémas courants tout en conservant un accès bas niveau (MCP Brevo) pour la logique personnalisée.

Consultez Format de spécification d’agent et Construire des agents pour tous les détails.

Bonnes pratiques

Tip

Versionnez vos skills à l’aide du versionnage sémantique. Les changements cassants nécessitent une montée de version majeure.

  1. Gardez les skills focalisés - Un skill doit faire une seule chose, et bien
  2. Utilisez des noms descriptifs - abandoned-cart-recovery et non acr
  3. Documentez les conditions - Expliquez pourquoi chaque condition existe
  4. Gérez les erreurs avec élégance - Utilisez on_error: continue pour les actions non critiques
  5. Testez avec de petites audiences - Utilisez status: experimental pendant le développement
  6. Ajoutez une exposition MCP pour les skills que les agents devraient pouvoir invoquer directement

Étapes suivantes

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
Assistant AI

Bonjour ! Posez-moi vos questions sur la documentation.