Skip to content
Hoody.com

: Skills

The Agent Skills API exposes the agent’s skill subsystem: browsing the installed skill registry, discovering and importing skills from the remote hub, CRUD on local skills, reading and writing skill source bodies, scanning for importable skills, and managing per-skill trust and enabled state. Use these endpoints when building tooling, IDE integrations, or automation around agent skills.

All endpoints are realm-scoped to the gateway’s own realm (its pinned realm, or its active realm when unpinned); a client-supplied X-Hoody-Realm/?realm= is ignored on this surface and cannot select another realm’s definitions.

List the installed skills (identity = root_dir + rel_dir) for the requesting cwd/config_dir, with their enabled/trust state.

NameInTypeRequiredDescription
pagequeryintegerNo1-based page number for pagination.
limitqueryintegerNoMaximum items per page (0 = no pagination).
X-Hoody-CwdheaderstringNoPer-request working-directory scope. Required by routes that resolve a cwd.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override selecting which on-disk .hoody install a stateless read/write resolves.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: "global" or a 24-hex id. Ignored on this route.
realmquerystringNoIn-query alias of X-Hoody-Realm, read only when the header is absent. Ignored on this route.
{
"items": [
{
"name": "pdf-tools",
"root_dir": "workspace",
"rel_dir": "skills/pdf-tools",
"enabled": true,
"trusted": true,
"source": "hub"
},
{
"name": "house-style",
"root_dir": "config",
"rel_dir": "skills/house-style",
"enabled": true,
"trusted": false,
"source": "local"
}
],
"meta": {
"total": 2,
"page": 1,
"limit": 50
}
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.listSkillsIterator({ page: 1, limit: 50 });

Create a new local skill (skills.create).

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
NameInTypeRequiredDescription
namebodystringYesSkill name (the SKILL.md directory stem).
descriptionbodystringNoSkill description (frontmatter).
contentbodystringNoInitial SKILL.md body.
{
"name": "pdf-tools",
"root_dir": "workspace",
"rel_dir": "skills/pdf-tools",
"created": true
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.createSkill({
name: 'pdf-tools',
description: 'PDF parsing, extraction, and page manipulation utilities.',
content: '---\nname: pdf-tools\ndescription: PDF utilities.\n---\n\n# pdf-tools\n'
});

Delete a skill (skills.delete). Identify the skill by the daemon keys root_dir + rel_dir in the body (aliases root/rel accepted).

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
NameInTypeRequiredDescription
root_dirbodystringYesSkill root directory (identity; alias: root).
rel_dirbodystringYesSkill relative directory (identity; alias: rel).
{
"deleted": true,
"root_dir": "workspace",
"rel_dir": "skills/pdf-tools"
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.deleteSkill({
root_dir: 'workspace',
rel_dir: 'skills/pdf-tools'
});

Rename a skill (skills.rename). Identify the skill by the daemon keys root_dir + rel_dir (aliases root/rel accepted) and pass the new name as new_name.

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
NameInTypeRequiredDescription
root_dirbodystringYesSkill root directory (identity; alias: root).
rel_dirbodystringYesSkill relative directory (identity; alias: rel).
new_namebodystringYesNew skill directory name.
{
"renamed": true,
"root_dir": "workspace",
"rel_dir": "skills/pdf-pro",
"new_name": "pdf-pro"
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.renameSkill({
root_dir: 'workspace',
rel_dir: 'skills/pdf-tools',
new_name: 'pdf-pro'
});

Read a skill’s source body (skills.read_source). Identify the skill by the daemon keys root_dir + rel_dir query params (the friendly aliases ?root=/?rel= are also accepted and translated). Returns {content, gen, path}; pass gen back as base_gen on the write to detect conflicts.

NameInTypeRequiredDescription
root_dirquerystringNoSkill root directory (identity; alias: root).
rel_dirquerystringNoSkill relative directory (identity; alias: rel).
rootquerystringNoFriendly alias of root_dir (translated server-side).
relquerystringNoFriendly alias of rel_dir (translated server-side).
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
{
"content": "---\nname: pdf-tools\ndescription: PDF utilities.\n---\n\n# pdf-tools\n",
"gen": 7,
"path": "skills/pdf-tools/SKILL.md"
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.getSkillSource({ root_dir: 'workspace', rel_dir: 'skills/pdf-tools' });

Overwrite a skill’s source body (skills.write_source). Identify the skill by the daemon keys root_dir + rel_dir in the body (aliases root/rel accepted); the new body text is content (alias source); pass the read’s gen as base_gen for conflict detection.

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
NameInTypeRequiredDescription
root_dirbodystringYesSkill root directory (identity; alias: root).
rel_dirbodystringYesSkill relative directory (identity; alias: rel).
contentbodystringYesNew SKILL.md body (alias: source).
base_genbodyintegerNoThe gen returned by skills.read_source, for conflict detection.
{
"written": true,
"gen": 8,
"path": "skills/pdf-tools/SKILL.md"
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.putSkillSource({
root_dir: 'workspace',
rel_dir: 'skills/pdf-tools',
content: '---\nname: pdf-tools\ndescription: PDF utilities (rev 2).\n---\n\n# pdf-tools\n\n## Notes\n',
base_gen: 7
});

Search the remote skill hub (skills.hub_search). Pass ?q= in the query.

NameInTypeRequiredDescription
qquerystringNoSearch query.
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
{
"results": [
{
"id": "pdf-tools",
"name": "pdf-tools",
"description": "PDF parsing, extraction, and page manipulation utilities.",
"version": "1.4.0",
"author": "hoody"
},
{
"id": "ocr-helper",
"name": "ocr-helper",
"description": "Optical character recognition across PDF and image inputs.",
"version": "0.9.2",
"author": "hoody"
}
],
"total": 2
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.searchSkillHub({ q: 'pdf utilities' });

Fetch a preview of a hub skill before install (skills.hub_preview). Pass ?id= to identify the hub skill.

NameInTypeRequiredDescription
idquerystringNoHub skill identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
{
"id": "pdf-tools",
"name": "pdf-tools",
"version": "1.4.0",
"description": "PDF parsing, extraction, and page manipulation utilities.",
"author": "hoody",
"preview": "# pdf-tools\n\nProvides extract_text, merge_pdfs, and split_pdf utilities."
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.previewSkillHub({ id: 'pdf-tools' });

Install a skill from the hub (skills.hub_install). This writes arbitrary skill code to disk.

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
NameInTypeRequiredDescription
idbodystringYesHub skill identifier (from searchSkillHub/previewSkillHub).
{
"installed": true,
"id": "pdf-tools",
"root_dir": "workspace",
"rel_dir": "skills/pdf-tools"
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.installSkillHub({ id: 'pdf-tools' });

Return the skill-hub fetch cache statistics (skills.cache_stats).

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
{
"entries": 42,
"bytes": 3145728,
"hits": 1287,
"misses": 53,
"pins": 4
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.getSkillHubCache();

Clear the skill-hub fetch cache, including pins (skills.cache_clear).

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
{
"cleared": true,
"entries": 0
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.clearSkillHubCache();

Scan well-known locations for importable skills (skills.import_scan).

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
{
"candidates": [
{
"path": "/Users/dev/projects/acme/.cursor/skills/pdf-tools",
"name": "pdf-tools",
"source": "cursor",
"size_bytes": 4096
},
{
"path": "/Users/dev/.config/anthropic/skills/house-style",
"name": "house-style",
"source": "claude",
"size_bytes": 1024
}
],
"total": 2
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.scanSkillImport();

Import a discovered skill into the local store (skills.import_apply).

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).

The body is forwarded to the daemon skills.import_apply RPC. Reserved _-prefixed keys are ignored and the request scope (cwd/config_dir) is applied automatically; all other keys are passed through, so the accepted fields are exactly those the operation reads. Identify the discovered skill to import (e.g. by its scan path/id from scanSkillImport).

{
"imported": true,
"name": "pdf-tools",
"root_dir": "workspace",
"rel_dir": "skills/pdf-tools"
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.applySkillImport({
path: '/Users/dev/projects/acme/.cursor/skills/pdf-tools'
});

Toggle a skill’s enabled state (skills.toggle — NAME-scoped: it gates the effective skill name in the runtime registry). Identify the skill by name in the body, and pass disabled (boolean) for the new state.

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
NameInTypeRequiredDescription
namebodystringYesEffective skill name (NOT root/rel — toggle is name-scoped).
disabledbodybooleanNotrue to disable the skill, false to enable it.
{
"toggled": true,
"name": "pdf-tools",
"disabled": true
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.toggleSkill({
name: 'pdf-tools',
disabled: true
});

Set a skill’s trust state (skills.set_trust). Identify the skill by the daemon keys root_dir + rel_dir (aliases root/rel accepted); the trust flag is trusted (boolean). Trust gates arbitrary code execution.

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container.
X-Hoody-RealmheaderstringNoPer-request realm selector (ignored on this route).
realmquerystringNoIn-query alias of X-Hoody-Realm (ignored on this route).
NameInTypeRequiredDescription
root_dirbodystringYesSkill root directory (identity; alias: root).
rel_dirbodystringYesSkill relative directory (identity; alias: rel).
trustedbodybooleanYestrue to grant execution trust, false to revoke.
{
"trusted": true,
"root_dir": "workspace",
"rel_dir": "skills/pdf-tools"
}
import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com', token: process.env.HOODY_TOKEN });
await client.agent.skills.trustSkill({
root_dir: 'workspace',
rel_dir: 'skills/pdf-tools',
trusted: true
});