packages/docs/rest/skills.md
The skills API covers three areas: local skills (markdown-based SKILL.md extensions that teach the agent task-specific procedures), the skills catalog (curated registry of community skills), and the skills marketplace (git-based skill packages). Skills are injected into the agent's context at runtime to guide its behavior.
When ELIZA_API_TOKEN is set, include it as a Bearer token in the Authorization header.
| Method | Path | Description |
|---|---|---|
| GET | /api/skills | List all local skills with metadata |
| POST | /api/skills/refresh | Re-scan the skills directory |
| GET | /api/skills/:id/scan | Scan a skill file and return parsed metadata |
| POST | /api/skills/create | Create a new skill file from a template |
| POST | /api/skills/:id/open | Open a skill file in the default editor |
| GET | /api/skills/:id/source | Read the source code of a skill |
| PUT | /api/skills/:id/source | Write updated source code for a skill |
| POST | /api/skills/:id/acknowledge | Acknowledge a skill security scan |
| POST | /api/skills/:id/enable | Enable a skill (honors scan acknowledgments) |
| POST | /api/skills/:id/disable | Disable a skill |
| POST | /api/skills/:id/acknowledge | Acknowledge a skill security scan |
| DELETE | /api/skills/:id | Delete a skill |
| Method | Path | Description |
|---|---|---|
| GET | /api/skills/catalog | List the skills catalog with pagination |
| GET | /api/skills/catalog/search | Search the catalog by query |
| GET | /api/skills/catalog/:id | Get details for a single catalog entry |
| POST | /api/skills/catalog/refresh | Refresh the catalog from the remote registry |
| POST | /api/skills/catalog/install | Install a catalog skill |
| POST | /api/skills/catalog/uninstall | Uninstall a catalog skill |
| Method | Path | Description |
|---|---|---|
| GET | /api/skills/marketplace/search | Search the npm marketplace for skills |
| GET | /api/skills/marketplace/installed | List installed marketplace skills |
| POST | /api/skills/marketplace/install | Install a skill from npm |
| POST | /api/skills/marketplace/uninstall | Uninstall a marketplace skill |
| GET | /api/skills/marketplace/config | Get marketplace configuration |
| PUT | /api/skills/marketplace/config | Update marketplace configuration |
List all local skills found in the agent's skills directory. Each entry includes the file path, parsed action metadata, and enabled/priority preferences.
Response
{
"skills": [
{
"id": "my-custom-action",
"name": "MY_CUSTOM_ACTION",
"description": "Does something useful",
"filePath": "/path/to/skills/my-custom-action.ts",
"enabled": true,
"priority": 0,
"valid": true,
"scanStatus": "clean"
}
]
}
Re-scan the skills directory and reload all skill metadata. Useful after manually adding or editing skill files.
Response
{
"skills": [
{
"id": "my-custom-action",
"name": "MY_CUSTOM_ACTION",
"description": "Does something useful",
"enabled": true,
"scanStatus": "clean"
}
]
}
Scan a single skill file and return its parsed AST metadata — exported actions, providers, and evaluators.
Response
{
"id": "my-skill",
"actions": [
{
"name": "MY_ACTION",
"description": "Action description",
"similes": ["DO_THING"],
"parameters": []
}
],
"providers": [],
"evaluators": []
}
Create a new skill file from a built-in template.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Skill file name (e.g. my-action) |
template | string | No | Template to use — defaults to a basic action template |
Response
{
"ok": true,
"skill": {
"id": "my-action",
"filePath": "/path/to/skills/my-action.ts"
}
}
Open the skill file in the system's default code editor.
Response
{
"ok": true
}
Read the raw TypeScript source code of a skill file.
Response
{
"id": "my-skill",
"source": "import { Action } from '@elizaos/core';\n\nexport const myAction: Action = { ... };"
}
Write updated source code to a skill file. The server validates basic syntax before saving.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
source | string | Yes | The new TypeScript source code |
Response
{
"ok": true
}
Enable an installed skill. Returns 409 if the skill has unacknowledged scan findings — acknowledge via POST /api/skills/:id/acknowledge first.
Response
{
"ok": true,
"skill": {
"id": "my-skill",
"enabled": true
},
"scanStatus": null
}
Disable an installed skill.
Response
{
"ok": true,
"skill": {
"id": "my-skill",
"enabled": false
},
"scanStatus": null
}
Delete a skill and remove its files from the skills directory.
Response
{
"ok": true
}
Errors: 404 skill not found.
Browse the curated skills catalog with pagination and sorting.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | number | 1 | Page number |
perPage | number | 50 | Items per page (max 100) |
sort | string | downloads | Sort field |
Response
{
"skills": [
{
"id": "greeting-skill",
"name": "Greeting Skill",
"description": "Custom greeting actions",
"author": "community",
"downloads": 1234,
"installed": false
}
],
"total": 42,
"page": 1,
"perPage": 50
}
Search the catalog by text query.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
q | string | Search query (required) |
limit | number | Max results (default 30, max 100) |
Response
{
"skills": [ ... ],
"total": 5
}
Get full details for a single catalog skill entry.
Response
{
"skill": {
"id": "greeting-skill",
"name": "Greeting Skill",
"description": "Full description...",
"author": "community",
"version": "1.0.0",
"installed": false,
"readme": "# Greeting Skill\n..."
}
}
Force-refresh the catalog from the remote registry.
Response
{
"ok": true
}
Install a skill from the catalog.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Catalog skill ID |
Response
{
"ok": true,
"skill": { "id": "greeting-skill", "installed": true }
}
Uninstall a previously installed catalog skill.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Catalog skill ID |
Response
{
"ok": true
}
Search the npm-based skills marketplace.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
q | string | Search query |
limit | number | Max results (default 30, max 100) |
Response
{
"results": [
{
"name": "@community/skill-weather",
"description": "Weather lookup skill",
"version": "2.1.0"
}
]
}
List all marketplace skills currently installed.
Response
{
"skills": [
{
"name": "@community/skill-weather",
"version": "2.1.0",
"installedAt": "2025-06-01T12:00:00Z"
}
]
}
Install a skill package from the npm marketplace.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | npm package name |
version | string | No | Specific version (defaults to latest) |
Response
{
"ok": true
}
Uninstall a marketplace skill package.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | npm package name |
Response
{
"ok": true
}
Get the current marketplace configuration.
Response
{
"config": { ... }
}
Update the marketplace configuration.
Request Body
Arbitrary configuration object — varies by marketplace backend.
Response
{
"ok": true
}
POST /api/skills/:id/acknowledge
Acknowledges the security scan findings for a skill. Required before the skill can be enabled. Optionally enables the skill in the same request.
Path params:
| Param | Type | Description |
|---|---|---|
id | string | Skill slug |
Request body:
{ "enable": true }
enable is optional — omit or set to false to acknowledge without enabling.
Response — findings present:
{
"ok": true,
"skillId": "my-skill",
"acknowledged": true,
"enabled": true,
"findingCount": 3
}
Response — no findings (clean scan):
{
"ok": true,
"message": "No findings to acknowledge.",
"acknowledged": true
}
Errors: 404 no scan report found; 403 skill status is "blocked" (cannot be acknowledged).
~/.eliza/workspace/skills/) is readable and writable by the runtime.https://clawhub.ai). Check SKILLS_REGISTRY, CLAWHUB_REGISTRY, or SKILLS_MARKETPLACE_URL environment variables.bun and git) are present in runtime PATH.SKILLSMP_API_KEY in the environment.@elizaos/plugin-agent-skills).Search and catalog:
POST /api/skills/catalog/refresh or restart the agent.Install and uninstall:
git is available.blocked status):
The scan detected binary files (.exe, .dll, .so), symlink escapes, or a missing SKILL.md. The skill directory is automatically deleted.POST /api/skills/marketplace/uninstall, then retry.marketplace-installs.json.Skill loading:
/api/skills:
Confirm the skill directory contains a valid SKILL.md with name/description frontmatter. Run POST /api/skills/refresh to re-scan.denyBundled blocks unconditionally.~/.eliza/workspace/skills/.marketplace/<skill-id>/ and remove its entry from ~/.eliza/workspace/skills/.cache/marketplace-installs.json, then re-install.@elizaos/plugin-agent-skills to restore the bundled catalog.# Skill catalog and marketplace unit tests
bunx vitest run src/services/plugin-installer.test.ts src/services/skill-marketplace.test.ts src/services/skill-catalog-client.test.ts
# Skills marketplace API and services e2e
bunx vitest run --config test/vitest/e2e.config.ts test/skills-marketplace-api.e2e.test.ts test/skills-marketplace-services.e2e.test.ts
# API server e2e (includes skills routes)
bunx vitest run --config test/vitest/e2e.config.ts test/api-server.e2e.test.ts
bun run typecheck
| Status | Code | Description |
|---|---|---|
| 400 | INVALID_REQUEST | Request body is malformed or missing required fields |
| 401 | UNAUTHORIZED | Missing or invalid authentication token |
| 404 | NOT_FOUND | Requested resource does not exist |
| 500 | SKILL_BLOCKED | Skill is blocked due to security scan findings |
| 500 | SYNTAX_ERROR | Skill source code contains syntax errors |
| 500 | ALREADY_INSTALLED | Skill is already installed |
| 500 | INTERNAL_ERROR | Unexpected server error |