Skill schema

SKILL.md schema

A skill is a folder. SKILL.md is the manifest the agent reads.

For the conceptual story (and the security model) see Skills. This page is the field-by-field reference.

Folder shape

.agents/skills/competitor-brief/
├── SKILL.md             # required — frontmatter + body
├── scripts/             # optional — helper scripts (require allowed-tools: run_script)
│   └── pull-funding.py
├── templates/           # optional — reference files
│   └── brief.md
└── assets/              # optional — logos, schemas, etc.
    └── competitor-schema.json

Cabinet mounts the folder into the agent's run sandbox. Files outside the folder are inaccessible via the skill.

Frontmatter fields

Identity

FieldTypeRequiredDefaultWhat it does
namestringyesSlug used for @ mentions and the picker. [a-z0-9-]+.
displayNamestringnoderived from namePretty name for the picker.
descriptionstringyesHover-card explanation. ≤140 chars is the convention.
versionsemverno"0.1.0"For registry publishing.
authorobjectno{name, url}.
licenseSPDX idno"MIT"Shown on skills.sh.

Permissions

FieldTypeRequiredDefaultWhat it does
allowed-toolsstring[]yes[]Allow-list. Only these tools fire while the skill is active.
networkobjectnoNetwork egress allow-list.
network.allowstring[]no[]Hostname patterns the skill may fetch from, e.g. "*.crunchbase.com".
filesystemobjectnoFilesystem read/write scope.
filesystem.readstring[]noinherits agentGlob patterns this skill may read.
filesystem.writestring[]noinherits agentGlob patterns this skill may write.

IO contract

FieldTypeRequiredDefaultWhat it does
input-schemaJSON schema fragmentnoLets users invoke the skill with structured args (e.g. /competitor-brief company=acme).
output-schemaJSON schema fragmentnoHints which paths the skill writes. Used for link-checking and approvals.
estimated-cost-usdnumbernoAverage cost. Surfaced in the approval queue.
estimated-runtime-sintegernoAverage runtime in seconds. Surfaced in the run UI.

Discovery

FieldTypeRequiredDefaultWhat it does
tagsstring[]no[]Free-form tags for skills.sh filters.
categorystringno"research", "writing", "data", etc.
requiresProviderstring[]noIf set, the skill won't load unless one of these providers is configured.

Common tool names

The exact list ships with the app and grows. Common ones:

Tool nameWhat it can do
read_fileRead a single file (subject to filesystem.read).
write_fileWrite or create a file (subject to filesystem.write).
list_dirList a directory's contents.
web_fetchHTTP GET (subject to network.allow).
web_searchSearch the web through the configured backend.
run_scriptExecute a script under scripts/ (per-run user confirm).
shellArbitrary shell command. Almost never grant this.
llm_callInner LLM call. Only needed for skills that call models themselves.

Body — what the agent reads

Everything after the closing --- is what the agent sees when it picks up the skill. Treat it like a runbook:

  • What this skill does in one sentence.
  • How to run it — step-by-step, including which scripts to call.
  • What inputs it expects.
  • What outputs it produces and where.
  • What to watch for — failure modes, edge cases, when not to use it.

Keep it concise. Long preambles get diluted.

Complete example

---
name: competitor-brief
displayName: Competitor Brief
description: One-page competitive brief for any company. Pulls funding, reads launches, summarizes positioning.
version: 1.2.0
license: MIT
author:
  name: cabinet-app
  url: https://github.com/cabinet-app/skills

allowed-tools:
  - read_file
  - write_file
  - run_script
  - web_fetch
network:
  allow:
    - "*.crunchbase.com"
    - "*.producthunt.com"
filesystem:
  read:
    - "research/**"
    - "templates/**"
  write:
    - "research/competitors/**"

input-schema:
  company:
    type: string
  depth:
    type: string
    enum: [quick, deep]
    default: quick
output-schema:
  path:
    type: string
estimated-cost-usd: 0.20
estimated-runtime-s: 90

tags: [research, competitive, gtm]
category: research
requiresProvider: [openai, anthropic, google]
---

You produce one-page competitor briefs.

## How to run

1. Read templates/brief.md for the output shape.
2. Run scripts/pull-funding.py {company} for fresh funding data.
3. Use web_fetch on the company's homepage and pricing page.
4. Compose the brief at /research/competitors/{company-slug}.md using the template.
5. Always include a "Last updated: {date}" line at the top.

## When NOT to use

- For private companies with no public footprint — output will be sparse. Recommend the manual research routine instead.
- For internal projects — this skill is built for external competitive intel.

Validation

Skills are validated:

  • At install time (security scan + schema check).
  • At every run (allow-list enforcement, network/filesystem scopes).
  • At update time (re-scan, re-confirm any new allowed-tools).

A skill that violates its own allow-list at runtime is killed mid-run with a clear error. Cabinet never escalates a skill's permissions silently.

Read on