/docs / skills/reference

SKILL.md Reference

This page lists every part of a skill that Nebo reads: the frontmatter fields, the variables it expands, the tools employees use to work with skills, and the environment scripts run in.

File format

SKILL.md is UTF-8 text. It starts with a line of three hyphens, then YAML frontmatter, then a closing line of three hyphens. Everything after that is the body: Markdown instructions the employee receives when it loads the skill. Nebo finds the file by name without regard to case.

---
name: expense-review
description: Check submitted expenses against the company policy and flag anything that needs a receipt or an approval. Use when someone asks to review expenses or a reimbursement request.
version: "1.2.0"
author: Example Co
license: MIT
tags: [finance, expenses]
triggers: [reimbursement, expense report]
platform: [macos, linux, windows]
capabilities: [network]
metadata:
  allowed_domains: [api.example.com]
  secrets:
    - key: EXAMPLE_API_KEY
      label: Example API key
      hint: Create one at https://example.com/settings/keys
      required: true
requires:
  - name: receipt-capture
    version: ">=1.0.0"
plugins:
  - name: example-ledger
    version: ">=2.0.0"
    optional: true
---

# Expense review

Follow the policy in references/policy.md ...

Frontmatter fields

Only name and description are required. A field with the wrong type fails the whole file, so the skill does not load. Keys not listed here are ignored.

FieldTypeDefaultMeaning
namestringrequiredIdentifier. [a-z0-9-], no leading, trailing or double hyphen, at most 64 bytes. Match the folder name.
descriptionstringrequiredWhat the skill does and when to use it. At most 1,024 bytes. Shown in the employee’s skill list and scored by find_skills.
versionstring"1.0.0"Semantic version. Checked by other skills’ requires ranges. Quote it.
triggerslist of strings[]Words and phrases that describe when the skill applies. Up to three appear in the skill list; all count in find_skills. They never load a skill by themselves.
platformlist of stringsallmacos, linux, windows. The skill loads only where one matches.
capabilitieslist of strings[]network and storage widen the script sandbox. See Script sandbox.
metadatamap{}Holds secrets and allowed_domains. See below.
requireslist of {name, version}[]Other skills this skill builds on. name is the short skill name; version is a semver range, default "*".
pluginslist of {name, version, optional}[]Plugins this skill uses. version defaults to "*", optional to false.
dependencieslist of strings[]Short names of skills that must be present.
priorityinteger0Orders skills in management lists. It does not affect which skill an employee chooses.
authorstring""Stored for display.
licensestring""Stored for display.
compatibilitystring""Free-text note, at most 500 bytes.
tagslist of strings[]Stored for display.
allowed-toolsstring""A space-separated string. Stored; not enforced.

When a skill named in requires or dependencies is missing or outside the range, or a required plugin is not installed, the skill still loads and is marked degraded. The owner sees what is missing.

Secrets

Declare the credentials a skill's scripts need under metadata.secrets. The owner provides the values, and Nebo stores them encrypted for that skill.

metadata:
  secrets:
    - key: EXAMPLE_API_KEY
      label: Example API key
      hint: Create one at https://example.com/settings/keys
      required: true
KeyMeaning
keyEnvironment variable name the script receives. Required.
labelName shown to the owner.
hintWhere to get the value.
requiredWhen true, execute refuses to run the skill’s scripts until the value is set. Default false.

An employee sets a value with configure_skill. You can reference a secret in the body as ${secret.KEY}, though scripts should read the environment variable instead.

Template variables

Nebo replaces these variables in the body when an employee loads the skill. They are not replaced inside other files; scripts read environment variables instead.

VariableValue
${NEBO_SKILL_DIR}Absolute path of the skill’s folder.
${NEBO_DATA_DIR}A writable folder for this skill: <data>/appdata/skills/<name>. Created on first use.
${NEBO_USER_NAME}The owner’s name.
${NEBO_OS}The operating system.
${NEBO_ARCH}The processor architecture.
${plugin.SLUG_BIN}Path of a declared plugin’s binary. The slug is uppercased, with hyphens as underscores: example-ledger becomes ${plugin.EXAMPLE_LEDGER_BIN}.
${secret.KEY}The value of a declared secret.
$ARGUMENTSThe args passed to use_skill. When the body has no $ARGUMENTS, the arguments are appended after it.

Skill tools

Employees work with skills through these tools. use_skill is always available; the others load when an employee needs them.

ToolParametersWhat it does
use_skillname, argsLoads a skill. Returns the expanded body, the folder path, and the first 20 file names. Re-enables a disabled skill.
find_skillsqueryReturns up to 10 skills ranked by name, trigger and description matches.
read_skill_filename, pathReads a file in the skill’s folder. Without path, lists the files and their sizes.
save_skillname, contentWrites a complete SKILL.md to the user skills folder. Marketplace skills cannot be overwritten.
delete_skillnameDeletes a user skill.
install_skillcodeInstalls a marketplace skill from its SKIL- install code.
configure_skillname, key, valueSets a secret. Without key, shows what the skill needs.
rate_skillname, rating, reviewRates a marketplace skill from 1 to 5.
read_skill_reviewsnameReads a marketplace skill’s reviews.
executeskill, script, args, timeoutRuns a script from a skill’s folder. See Script sandbox.

Script sandbox

The execute tool runs one script from a skill's folder. It chooses the runtime from the file.

ScriptRuntime
.pyPython, through Nebo’s bundled uv when present, otherwise python3.
.ts, .jsNebo’s bundled Bun when present, otherwise node.
bin/<file> or binaryRun directly.
.shNot supported.

Each run starts with an empty environment and these variables:

VariableValue
SKILL_ARGSThe args object as JSON.
Each secret keyThe decrypted secret value.
<PLUGIN>_BINPath of each declared plugin’s binary. Plugin folders are also added to PATH.
import json, os

args = json.loads(os.environ.get("SKILL_ARGS", "{}"))
api_key = os.environ["EXAMPLE_API_KEY"]
print(json.dumps({"checked": len(args.get("items", []))}))

The script runs in a temporary copy of the skill folder, with a default timeout of 30 seconds. On macOS and Linux it runs in an operating-system sandbox:

  • It cannot read credential stores, browser and keychain data, or Nebo's own settings and database.
  • It can write only to its working folder and /tmp/nebo. The storage capability adds Nebo's data folder.
  • It has no network access. The network capability allows package registries and the domains listed in metadata.allowed_domains.

Files and limits

ItemRule
ResourcesEvery file except SKILL.md, manifest.json, signatures.json and dotfiles.
ExecutablesFiles under scripts/ or bin/, and a root file named binary.
PathsRelative to the skill folder. Paths with .. or that escape the folder are rejected.
Disabled skillA folder with SKILL.md.disabled instead of SKILL.md.
Skill listEach entry is cut at 250 characters. When the whole list exceeds 8,000 characters, shared skills are shortened first; an employee’s own skills keep their full entries.

Limits for files you publish to the marketplace are on the Publishing page.