Спецификация формата навыков

Формат skills.md определяет, как устроены, настраиваются и выполняются навыки. Эта спецификация обеспечивает единообразное поведение всех навыков Tajo.

Структура файла

Навык описывается в одном markdown-файле с 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

Обязательные поля

ПолеТипОписание
namestringУникальный идентификатор (kebab-case)
versionstringСемантическая версия (например, “2.1.0”)
descriptionstringКраткое описание (до 160 символов)
categoryenumОдно из: data-sync, email-marketing, sms-whatsapp, loyalty, analytics, integrations
triggersarrayСобытия, активирующие навык
actionsarrayОперации, которые выполняет навык

Опциональные поля

ПолеТипПо умолчаниюОписание
statusenumstableОдно из: stable, beta, experimental
brevoEndpointsarray[]Используемые эндпоинты API Brevo
permissionsarray[]Требуемые разрешения API Brevo
relatedSkillsarray[]ID связанных навыков
featuredbooleanfalseВыделять в каталоге навыков

Триггеры

Триггеры определяют, какие события активируют навык.

Триггеры событий

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

Триггеры расписания

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

Триггеры webhook

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

Операторы условий

ОператорОписаниеПример
=Равноstatus: "active"
!=Не равноstatus: "!= deleted"
>Большеcart_value: "> 50"
>=Больше или равноitems: ">= 1"
<Меньшеage: "< 30"
<=Меньше или равноquantity: "<= 10"
containsПодстрока в строкеemail: "contains @gmail.com"
starts_withПрефикс строкиname: "starts_with Dr."
inЗначение в спискеcountry: "in US,CA,UK"

Действия

Действия определяют, какие операции выполняет навык.

Описание действия

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'

Типы действий

ТипОписание
brevo/send-emailОтправка транзакционного письма
brevo/send-smsОтправка SMS
brevo/send-whatsappОтправка сообщения WhatsApp
brevo/create-contactСоздание нового контакта
brevo/update-contactОбновление атрибутов контакта
brevo/delete-contactУдаление контакта
brevo/add-to-listДобавление контакта в список
brevo/remove-from-listУдаление контакта из списка
brevo/track-eventОтслеживание пользовательского события
http/requestВыполнение HTTP-запроса
transform/mapПреобразование данных
control/delayЗадержка перед продолжением
control/conditionВетвление по условию

Переменные шаблонов

Используйте синтаксис {{ }} для ссылок на данные:

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

Доступные фильтры

ФильтрОписаниеПример
defaultЗначение по умолчанию{{ name | default: 'Guest' }}
uppercaseВерхний регистр{{ name | uppercase }}
lowercaseНижний регистр{{ email | lowercase }}
capitalizeЗаглавная первая буква{{ name | capitalize }}
truncateОбрезать строку{{ desc | truncate: 100 }}
dateФорматирование даты{{ date | date: 'YYYY-MM-DD' }}
currencyФорматирование валюты{{ price | currency: 'EUR' }}
mapИзвлечение свойства из массива{{ items | map: 'name' }}
joinОбъединение массива{{ tags | join: ', ' }}
firstПервый элемент массива{{ items | first }}
lastПоследний элемент массива{{ items | last }}
sizeДлина массива/строки{{ items | size }}

Разрешения

Задайте необходимые разрешения API Brevo:

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

Полный пример

---
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-инструмента

Навыки можно выставлять как MCP-инструменты, чтобы их могли вызывать ИИ-агенты. Добавьте поле mcp во 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
---

Как работает публикация через MCP

Когда у навыка есть поле mcp, он становится инструментом, который ИИ-агенты могут обнаружить и вызвать:

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

ПолеТипОписание
mcp.tool_namestringИмя MCP-инструмента (формат: tajo/skill-name)
mcp.descriptionstringОписание, которое видят ИИ-агенты при обнаружении инструмента
mcp.inputSchemaobjectJSON Schema входных параметров инструмента
mcp.brevo_serversarrayКакие модули MCP-сервера Brevo нужны этому навыку

Навыки против прямых MCP-инструментов

АспектНавык как MCP-инструментПрямой Brevo MCP
АбстракцияВысокая, агент говорит «восстанови эту корзину»Низкая, агент должен вызывать отдельные эндпоинты Brevo
СложностьИнкапсулирует многоэтапную логикуАгент должен оркестрировать каждый шаг
ЗащитаВстроена в навык (условия, debounce)Агент реализует сам
Лучше дляПовторяющихся сценариевРазовых операций

Tip

Используйте навыки как MCP-инструменты для сложных многоэтапных сценариев, которые агентам не стоит изобретать заново каждый раз. Используйте прямые MCP-инструменты Brevo для простых одноразовых операций, поиска контакта или отправки одного письма.

Композиция навыков и агентов

Агент может использовать и навыки (как MCP-инструменты), и прямые модули Brevo MCP:

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

Это даёт агентам высокоуровневую автоматизацию (навыки) для типовых паттернов и сохраняет низкоуровневый доступ (Brevo MCP) для пользовательской логики.

Подробности в спецификации формата агентов и руководстве по созданию агентов.

Лучшие практики

Tip

Версионируйте навыки по семантической схеме. Ломающие изменения требуют увеличения мажорной версии.

  1. Делайте навыки узкоспециализированными, один навык должен делать одно дело хорошо
  2. Используйте понятные имена, abandoned-cart-recovery, а не acr
  3. Документируйте условия, объясняйте, зачем каждое условие
  4. Корректно обрабатывайте ошибки, используйте on_error: continue для некритичных действий
  5. Тестируйте на малых аудиториях, используйте status: experimental во время разработки
  6. Добавляйте публикацию через MCP для навыков, которые агенты должны уметь вызывать напрямую

Следующие шаги

Subscribe to updates

developer-docs

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

auto-detect
AI-ассистент

Привет! Спрашивайте меня о документации.