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
- SKILL.md reference: every field and variable.
- Publishing: upload a skill and its files.