Skills 格式规范
skills.md 格式定义了 Skills 的结构、配置和执行方式。该规范确保所有 Tajo Skills 具有一致的行为。
文件结构
Skill 在单个 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 | 激活此 Skill 的事件 |
actions | array | 此 Skill 可执行的操作 |
可选字段
| 字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
status | enum | stable | 以下之一:stable、beta、experimental |
brevoEndpoints | array | [] | 使用的 Brevo API 端点 |
permissions | array | [] | 所需的 Brevo API 权限 |
relatedSkills | array | [] | 相关 Skills 的 ID |
featured | boolean | false | 在 Skill 目录中突出显示 |
触发器(Triggers)
触发器定义哪些事件会激活 Skill。
事件触发器
triggers: - event: cart_abandoned conditions: - cart_value: "> 50" # 最低购物车金额 - items_count: ">= 1" # 至少一件商品 - time_since_activity: "> 30m" # 30 分钟无活动 debounce: 5m # 等待 5 分钟后再次触发定时触发器
triggers: - schedule: "0 9 * * *" # Cron 表达式(每天上午 9 点) timezone: "America/New_York" - schedule: every_hour - schedule: every_dayWebhook 触发器
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)
Actions 定义 Skill 执行的操作。
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 # 或 'stop'Action 类型
| 类型 | 描述 |
|---|---|
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 }} |
权限
定义所需的 Brevo API 权限:
permissions: - contacts:read # 读取联系人数据 - contacts:write # 创建/更新联系人 - email:send # 发送事务性邮件 - sms:send # 发送 SMS 短信 - lists:write # 管理联系人列表 - events:write # 追踪事件完整示例
---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 Tool 暴露
Skills 可以作为 MCP tools 暴露,使 AI Agent 能够调用它们。在 frontmatter 中添加 mcp 字段:
---name: abandoned-cart-recoveryversion: 3.0.0description: Recover abandoned shopping carts with a multi-step email sequencecategory: email-marketing
# MCP 配置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 暴露的工作原理
当 Skill 包含 mcp 字段时,它将成为 AI Agent 可发现和调用的工具:
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 initiatedMCP 字段说明
| 字段 | 类型 | 描述 |
|---|---|---|
mcp.tool_name | string | MCP 工具名称(格式:tajo/skill-name) |
mcp.description | string | 工具发现时向 AI Agent 展示的描述 |
mcp.inputSchema | object | 定义工具输入参数的 JSON Schema |
mcp.brevo_servers | array | 此 Skill 所需的 Brevo MCP 服务器模块 |
Skills 与 Direct MCP Tools 的对比
| 方面 | Skill 作为 MCP Tool | Direct Brevo MCP |
|---|---|---|
| 抽象层次 | 高,Agent 说”挽回这个购物车” | 低,Agent 必须逐个调用 Brevo 端点 |
| 复杂度 | 封装多步骤逻辑 | Agent 必须自行编排每个步骤 |
| 安全护栏 | 内置于 Skill(条件、防抖) | Agent 必须自行实现 |
| 最适合 | 可重复的工作流 | 一次性操作 |
Tip
对于复杂的多步骤工作流,将 Skills 用作 MCP tools,避免 Agent 每次重复构建。对于简单的一次性操作(如查询联系人或发送单封邮件),使用 direct Brevo MCP tools。
组合 Skills 与 Agents
Agent 可以同时使用 Skills(作为 MCP tools)和直接的 Brevo MCP 模块:
# Agent spec---name: retention-agenttools: # Tajo Skills 作为 MCP tools - tajo/recover-abandoned-cart - tajo/customer-sync - tajo/win-back-sequence # Direct Brevo MCP modules - brevo_contacts - brevo_campaign_analytics - brevo_segments---这使 Agent 既能使用高层自动化(Skills)处理常见模式,又保留对底层接口(Brevo MCP)的访问以实现自定义逻辑。
详情请参阅 Agent 规范格式 和 构建 Agents。
最佳实践
Tip
使用语义化版本号为您的 Skills 控制版本。破坏性变更需要升级主版本号。
- 保持 Skills 专注 - 一个 Skill 应该做好一件事
- 使用描述性名称 - 用
abandoned-cart-recovery而不是acr - 记录条件说明 - 解释每个条件存在的原因
- 优雅处理错误 - 对非关键操作使用
on_error: continue - 小范围测试 - 开发期间使用
status: experimental - 添加 MCP 暴露 - 针对 Agent 应能直接调用的 Skills
后续步骤
- MCP 与 Agents 概览 - Skills 如何融入智能体架构
- Agent 规范格式 - 定义使用 Skills 作为工具的 Agent
- 构建 Agents - 构建您的第一个营销 Agent
- 数据同步 Skills - 探索数据同步 Skills