/docs / skills/examples

Examples

Each example below is complete and loads as written. Copy one, rename the folder and the name field together, and change the instructions.

Instructions and a reference file

The simplest useful skill is instructions plus one reference file the employee reads only when it needs it. Triggers add words to the skill's entry in the employee's list, which helps it match requests phrased in different ways.

weekly-status/
├── SKILL.md
└── references/
    └── format.md
---
name: weekly-status
description: Write the weekly status update from the week's finished work, open items and risks. Use when someone asks for a weekly update, a status report or a Friday summary.
triggers: [status report, weekly update, friday summary]
---

# Weekly status

1. Collect what was finished this week, what is still open, and anything at risk.
2. Read references/format.md with read_skill_file and follow its layout exactly.
3. Keep each section to five bullets or fewer. Lead with outcomes, not activity.
4. End with the one decision you need from the reader, or write "No decisions needed."

A skill that runs a script

Use a script when the work needs exact answers, such as arithmetic or file conversion. The employee runs it with execute, passing arguments that the script reads as JSON from SKILL_ARGS. Whatever the script prints to stdout is the result. This script uses only the Python standard library.

invoice-totals/
├── SKILL.md
└── scripts/
    └── totals.py
---
name: invoice-totals
description: Add up invoice line items, apply a tax rate, and report the subtotal, tax and total. Use when someone asks to total, check or recalculate an invoice.
version: "1.0.0"
---

# Invoice totals

Never add numbers in your head. Run the script:

execute(skill: "invoice-totals", script: "scripts/totals.py",
        args: { "items": [{ "description": "...", "quantity": 2, "unit_price": 40.0 }], "tax_rate": 0.08 })

Report the subtotal, tax and total from the script's output, and list any line
item the script flagged.
import json
import os

args = json.loads(os.environ.get("SKILL_ARGS", "{}"))
items = args.get("items", [])
rate = float(args.get("tax_rate", 0))

subtotal = 0.0
flagged = []
for item in items:
    qty = item.get("quantity", 0)
    price = item.get("unit_price", 0)
    if qty <= 0 or price < 0:
        flagged.append(item.get("description", "unnamed item"))
        continue
    subtotal += qty * price

tax = round(subtotal * rate, 2)
print(json.dumps({
    "subtotal": round(subtotal, 2),
    "tax": tax,
    "total": round(subtotal + tax, 2),
    "flagged": flagged,
}))

A secret and network access

Scripts have no network access unless the skill declares the network capability, and then only to package registries and the domains in metadata.allowed_domains. A secret declared in metadata.secrets arrives as an environment variable named by its key. Because the secret is required, execute refuses to run until the owner sets it.

---
name: company-lookup
description: Look up a company's size, industry and headquarters from its web domain. Use when someone asks who a company is or wants a prospect researched.
version: "1.0.0"
capabilities: [network]
metadata:
  allowed_domains: [api.example.com]
  secrets:
    - key: EXAMPLE_API_KEY
      label: Example API key
      hint: Create a key at https://example.com/settings/keys
      required: true
---

# Company lookup

Run scripts/lookup.py with the domain:

execute(skill: "company-lookup", script: "scripts/lookup.py", args: { "domain": "example.com" })

If the script reports that the key is missing, ask the owner to add it with
configure_skill. Report only what the lookup returned; say so when a field is empty.
import json
import os
import urllib.request

domain = json.loads(os.environ.get("SKILL_ARGS", "{}")).get("domain", "")
req = urllib.request.Request(
    "https://api.example.com/v1/companies?domain=" + domain,
    headers={"Authorization": "Bearer " + os.environ["EXAMPLE_API_KEY"]},
)
with urllib.request.urlopen(req, timeout=20) as resp:
    print(resp.read().decode())

A skill that uses a plugin

When a skill needs a specific plugin, list it under plugins. If the plugin is not installed, the skill still loads, marked degraded, so the owner can see what is missing. Prefer writing a skill around the capability and letting the employee use whatever connection it has; declare a plugin only when the instructions truly depend on it.

---
name: month-end-close
description: Walk through the month-end close checklist, reconcile each account and list what still needs the owner. Use at month end or when someone asks to close the books.
version: "1.0.0"
plugins:
  - name: example-ledger
    version: ">=2.0.0"
---

# Month-end close

For each balance-sheet account, in chart-of-accounts order, read its balance and unreconciled transactions from the ledger, reconcile what
matches, and list what does not. Never lock a period yourself; ask the owner.

Next