Specificatie van het skills-formaat

Het skills.md-formaat definieert hoe Skills worden gestructureerd, geconfigureerd en uitgevoerd. Deze specificatie zorgt voor consistent gedrag over alle Tajo-skills.

Bestandsstructuur

Een skill wordt gedefinieerd in één markdown-bestand met YAML-frontmatter:

---
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...

Frontmatter-velden

Verplichte velden

VeldTypeBeschrijving
namestringUnieke identifier (kebab-case)
versionstringSemantische versie (bv. “2.1.0”)
descriptionstringKorte beschrijving (max 160 tekens)
categoryenumEen van: data-sync, email-marketing, sms-whatsapp, loyalty, analytics, integrations
triggersarrayEvents die deze skill activeren
actionsarrayOperaties die deze skill kan uitvoeren

Optionele velden

VeldTypeStandaardBeschrijving
statusenumstableEen van: stable, beta, experimental
brevoEndpointsarray[]Gebruikte Brevo API-endpoints
permissionsarray[]Vereiste Brevo API-permissies
relatedSkillsarray[]ID’s van gerelateerde skills
featuredbooleanfalseUitlichten in de skill-catalogus

Triggers

Triggers definiëren welke events de skill activeren.

Event-triggers

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

Schedule-triggers

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

Webhook-triggers

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

Conditie-operators

OperatorBeschrijvingVoorbeeld
=Gelijk aanstatus: "active"
!=Niet gelijk aanstatus: "!= deleted"
>Groter dancart_value: "> 50"
>=Groter dan of gelijkitems: ">= 1"
<Kleiner danage: "< 30"
<=Kleiner dan of gelijkquantity: "<= 10"
containsString bevatemail: "contains @gmail.com"
starts_withStringprefixname: "starts_with Dr."
inWaarde in lijstcountry: "in US,CA,UK"

Acties

Acties definiëren welke operaties de skill uitvoert.

Actiedefinitie

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'

Actietypes

TypeBeschrijving
brevo/send-emailVerstuur transactionele e-mail
brevo/send-smsVerstuur SMS-bericht
brevo/send-whatsappVerstuur WhatsApp-bericht
brevo/create-contactMaak nieuw contact aan
brevo/update-contactWerk contactattributen bij
brevo/delete-contactVerwijder contact
brevo/add-to-listVoeg contact toe aan lijst
brevo/remove-from-listVerwijder contact uit lijst
brevo/track-eventVolg aangepast event
http/requestDoe HTTP-request
transform/mapTransformeer data
control/delayWacht voordat je verdergaat
control/conditionVertakking op basis van conditie

Templatevariabelen

Gebruik {{ }}-syntax om naar data te verwijzen:

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' }}"

Beschikbare filters

FilterBeschrijvingVoorbeeld
defaultStandaardwaarde{{ name | default: 'Guest' }}
uppercaseString in hoofdletters{{ name | uppercase }}
lowercaseString in kleine letters{{ email | lowercase }}
capitalizeEerste letter hoofdletter{{ name | capitalize }}
truncateString inkorten{{ desc | truncate: 100 }}
dateDatum opmaken{{ date | date: 'YYYY-MM-DD' }}
currencyValuta opmaken{{ price | currency: 'EUR' }}
mapArray-eigenschap mappen{{ items | map: 'name' }}
joinArray samenvoegen{{ tags | join: ', ' }}
firstEerste array-item{{ items | first }}
lastLaatste array-item{{ items | last }}
sizeLengte van array/string{{ items | size }}

Permissies

Definieer vereiste Brevo API-permissies:

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

Volledig voorbeeld

---
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...

MCP-tool-exposure

Skills kunnen worden blootgesteld als MCP-tools, waardoor ze aan te roepen zijn door AI-agents. Voeg het mcp-veld toe aan je 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
---

Hoe MCP-exposure werkt

Wanneer een skill een mcp-veld heeft, wordt deze een tool die AI-agents kunnen ontdekken en aanroepen:

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

MCP-velden

VeldTypeBeschrijving
mcp.tool_namestringMCP-toolnaam (formaat: tajo/skill-name)
mcp.descriptionstringBeschrijving die aan AI-agents wordt getoond tijdens tool discovery
mcp.inputSchemaobjectJSON Schema dat de inputparameters van de tool definieert
mcp.brevo_serversarrayWelke Brevo MCP-servermodules deze skill nodig heeft

Skills versus directe MCP-tools

AspectSkill als MCP-toolDirecte Brevo MCP
AbstractieHoog, agent zegt “herstel deze winkelwagen”Laag, agent moet afzonderlijke Brevo-endpoints aanroepen
ComplexiteitKapselt logica met meerdere stappen inAgent moet elke stap zelf orkestreren
GuardrailsIngebouwd in de skill (condities, debounce)Agent moet deze zelf implementeren
Geschikt voorHerhaalbare workflowsAd-hoc operaties

Tip

Gebruik Skills als MCP-tools voor complexe workflows in meerdere stappen die agents niet steeds opnieuw hoeven uit te vinden. Gebruik directe Brevo MCP-tools voor simpele, eenmalige operaties zoals een contact opzoeken of één e-mail versturen.

Skills en agents combineren

Een agent kan zowel Skills (als MCP-tools) als directe Brevo MCP-modules gebruiken:

# 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
---

Dit geeft agents high-level automatisering (Skills) voor veelvoorkomende patronen en behoudt tegelijkertijd low-level toegang (Brevo MCP) voor aangepaste logica.

Zie Agent Specification Format en Building Agents voor alle details.

Best practices

Tip

Versie je skills volgens semantische versienummering. Breaking changes vereisen een major versiebump.

  1. Houd skills gericht - Eén skill zou één ding goed moeten doen
  2. Gebruik beschrijvende namen - abandoned-cart-recovery in plaats van acr
  3. Documenteer condities - Leg uit waarom elke conditie bestaat
  4. Handel fouten netjes af - Gebruik on_error: continue voor niet-kritieke acties
  5. Test met kleine doelgroepen - Gebruik status: experimental tijdens ontwikkeling
  6. Voeg MCP-exposure toe voor skills die agents direct moeten kunnen aanroepen

Volgende stappen

Subscribe to updates

developer-docs

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

auto-detect
AI-assistent

Hallo! Stel me vragen over de documentatie.