This guide explains how to add new capabilities to the AWOS Recruitment registry.
The registry contains three types of capabilities:
- Skills — best practices, code examples, and standards for a specific language, library, framework, or database
- MCP Definitions — MCP server configurations ready to be inserted into
.mcp.json - Agents — behavioral rules and constraints for specialized roles
When to create a skill vs. an agent:
- Create a skill when you want to teach the AI best practices, code examples, or standards for a specific language, library, framework, or database
- Create an agent when you need to enforce behavioral rules — for example, restrict a tester agent from reading source code so it stays unbiased
See Philosophy for the reasoning behind this distinction.
Before writing a skill, read the official Best Practices for Writing Skills. It covers structure, prompting techniques, and common pitfalls.
registry/
├── skills/
│ └── <skill-name>/
│ ├── SKILL.md # Required — front matter + instructions
│ └── references/ # Optional — supporting files
│ └── *.md
├── mcp/
│ └── <server-name>.yaml # One YAML file per MCP server
└── agents/
└── <agent-name>.md # One markdown file per agent
- Each skill lives in its own subdirectory under
registry/skills/. The directory must contain aSKILL.mdfile and may include additional reference files. - Each MCP definition is a single
.yamlfile directly underregistry/mcp/. - Each agent is a single
.mdfile directly underregistry/agents/.
Create a directory under registry/skills/ and add a SKILL.md file with YAML front matter:
---
name: my-skill-name
description: When to use this skill and what it does.
---
# My Skill
Instructions for the AI assistant go here...| Field | Type | Rules |
|---|---|---|
name |
string | Kebab-case only (a-z, 0-9, -). Max 64 characters. |
description |
string | Non-empty. Describes what the skill does and when to trigger it. |
| Field | Type | Description |
|---|---|---|
version |
string | Semver version string. |
argument-hint |
string | Hint for expected arguments (e.g., [filename]). |
disable-model-invocation |
boolean | Prevent Claude from auto-loading this skill. |
user-invocable |
boolean | Show/hide from the / slash command menu. |
allowed-tools |
string | Comma-separated list of tools Claude can use. |
model |
string | Model override when this skill is active. |
context |
string | Set to fork to run in an isolated subagent. |
agent |
string | Subagent type when context: fork is set. |
hooks |
object | Skill-scoped hooks configuration. |
No other fields are allowed. The validator rejects unknown front matter fields.
The markdown body below the front matter must be non-empty — it contains the actual instructions.
See registry/skills/python/SKILL.md for a complete example.
Create a .yaml file under registry/mcp/:
name: "My Server"
description: "What this MCP server provides and when to use it."
config:
my-server:
type: stdio
command: npx
args:
- -y
- "@scope/package@latest"| Field | Type | Rules |
|---|---|---|
name |
string | Non-empty. Human-readable display name. |
description |
string | Non-empty. What the server provides. |
config |
object | Must contain exactly one key — the server identifier. |
The config block is a complete .mcp.json server entry. The key is the server identifier and the value is the server configuration:
| Field | Type | Required | Description |
|---|---|---|---|
type |
string | Yes | Transport type: stdio, sse, http, or websocket. |
command |
string | No | Command to run (for stdio type). |
args |
list of strings | No | Command arguments. |
env |
map of strings | No | Environment variables. |
url |
string | No | Server URL (for sse, http, websocket types). |
Additional transport-specific fields are allowed.
See registry/mcp/context7.yaml for a complete example.
Create a .md file under registry/agents/:
---
name: my-agent-name
description: When to use this agent and what expertise it provides.
model: sonnet
skills:
- skill-one
- skill-two
---
# My Agent
You are an expert in...
System prompt instructions go here.| Field | Type | Rules |
|---|---|---|
name |
string | Kebab-case only (a-z, 0-9, -). Max 64 characters. Must match the filename (without .md). |
description |
string | Non-empty. Describes the agent's expertise and when to invoke it. |
| Field | Type | Description |
|---|---|---|
model |
string | Target model identifier (e.g., opus, sonnet, haiku). |
skills |
list of strings | Skill names this agent references. Each must be kebab-case. All referenced skills must exist in registry/skills/. May be an empty list (skills: []) or omitted entirely when the agent does not depend on any skills (see registry/agents/testing-expert.md for an example with skills: []). |
No other fields are allowed. The validator rejects unknown front matter fields.
The markdown body below the front matter must be non-empty — it contains the agent's system prompt.
When a user installs an agent, its referenced skills are automatically installed alongside it.
See registry/agents/testing-expert.md for a complete example.
Before submitting, run the registry validator:
just validate-registryThis scans all entries under registry/ and checks them against the schemas described above. You should see output like:
OK skills/my-skill/SKILL.md
OK mcp/my-server.yaml
All 2 entries valid.
If there are errors:
FAIL skills/bad-skill/SKILL.md
- Field 'name' contains invalid characters
1 errors in 1 files. Validation failed.
just validate-registry --format jsonReturns structured JSON:
{
"valid": true,
"errors": [],
"summary": { "total": 4, "passed": 4, "failed": 0 }
}The command exits with code 0 on success and 1 on any validation failure.
Before submitting a new capability:
- File is in the correct location (
registry/skills/<name>/SKILL.md,registry/mcp/<name>.yaml, orregistry/agents/<name>.md) - All required fields are present and non-empty
-
nameis kebab-case, max 64 characters - No unknown fields in front matter (skills and agents use
extra="forbid") - MCP
confighas exactly one server key with a validtype - Agent
skillsreferences only existing skills inregistry/skills/ -
just validate-registrypasses with exit code 0