Спецификация формата навыков
Формат skills.md определяет, как устроены, настраиваются и выполняются навыки. Эта спецификация обеспечивает единообразное поведение всех навыков Tajo.
Структура файла
Навык описывается в одном markdown-файле с YAML-frontmatter:
---name: customer-syncversion: 2.1.0description: Sync customer data to Brevo contactscategory: data-syncstatus: 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
Обязательные поля
| Поле | Тип | Описание |
|---|---|---|
name | string | Уникальный идентификатор (kebab-case) |
version | string | Семантическая версия (например, “2.1.0”) |
description | string | Краткое описание (до 160 символов) |
category | enum | Одно из: data-sync, email-marketing, sms-whatsapp, loyalty, analytics, integrations |
triggers | array | События, активирующие навык |
actions | array | Операции, которые выполняет навык |
Опциональные поля
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
status | enum | stable | Одно из: stable, beta, experimental |
brevoEndpoints | array | [] | Используемые эндпоинты API Brevo |
permissions | array | [] | Требуемые разрешения API Brevo |
relatedSkills | array | [] | ID связанных навыков |
featured | boolean | false | Выделять в каталоге навыков |
Триггеры
Триггеры определяют, какие события активируют навык.
Триггеры событий
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-recoveryversion: 3.0.0description: Recover abandoned shopping carts with a multi-step email sequencecategory: email-marketingstatus: 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-recoveryversion: 3.0.0description: Recover abandoned shopping carts with a multi-step email sequencecategory: email-marketing
# MCP Configurationmcp: 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_name | string | Имя MCP-инструмента (формат: tajo/skill-name) |
mcp.description | string | Описание, которое видят ИИ-агенты при обнаружении инструмента |
mcp.inputSchema | object | JSON Schema входных параметров инструмента |
mcp.brevo_servers | array | Какие модули MCP-сервера Brevo нужны этому навыку |
Навыки против прямых MCP-инструментов
| Аспект | Навык как MCP-инструмент | Прямой Brevo MCP |
|---|---|---|
| Абстракция | Высокая, агент говорит «восстанови эту корзину» | Низкая, агент должен вызывать отдельные эндпоинты Brevo |
| Сложность | Инкапсулирует многоэтапную логику | Агент должен оркестрировать каждый шаг |
| Защита | Встроена в навык (условия, debounce) | Агент реализует сам |
| Лучше для | Повторяющихся сценариев | Разовых операций |
Tip
Используйте навыки как MCP-инструменты для сложных многоэтапных сценариев, которые агентам не стоит изобретать заново каждый раз. Используйте прямые MCP-инструменты Brevo для простых одноразовых операций, поиска контакта или отправки одного письма.
Композиция навыков и агентов
Агент может использовать и навыки (как MCP-инструменты), и прямые модули Brevo MCP:
# Agent spec---name: retention-agenttools: # 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
Версионируйте навыки по семантической схеме. Ломающие изменения требуют увеличения мажорной версии.
- Делайте навыки узкоспециализированными, один навык должен делать одно дело хорошо
- Используйте понятные имена,
abandoned-cart-recovery, а неacr - Документируйте условия, объясняйте, зачем каждое условие
- Корректно обрабатывайте ошибки, используйте
on_error: continueдля некритичных действий - Тестируйте на малых аудиториях, используйте
status: experimentalво время разработки - Добавляйте публикацию через MCP для навыков, которые агенты должны уметь вызывать напрямую
Следующие шаги
- Обзор MCP и агентов, место навыков в агентной архитектуре
- Спецификация формата агентов, описание агентов, использующих навыки как инструменты
- Создание агентов, соберите своего первого маркетингового агента
- Навыки синхронизации данных, изучите навыки синхронизации