Skip to content

The Agent Skills API provides comprehensive management of skills across the Hoody platform: browse and install from the hub, create and manage local skills, import from external locations, read and write source bodies, and control runtime state via enable/disable and trust flags. Use these endpoints when building tooling that operates on the skill registry for a given working directory.


Lists the installed skills (identity = root + rel) for the requesting cwd/config_dir, with their enabled/trust state. Realm-scoped to the gateway’s own realm (pinned or active); a client-supplied X-Hoody-Realm / ?realm= is ignored.

NameInTypeRequiredDescription
pagequeryintegerNo1-based page number for pagination.
limitqueryintegerNoMaximum items per page (0 = no pagination).
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1): the .hoody project layer / record cwd / tool+workflow cwd.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id (also accepted as ?realm=).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
await client.agent.skills.listSkillsIterator({ page: 1, limit: 50 });
{
"items": [
{
"root": "user",
"rel": "skills/data-viz",
"name": "data-viz",
"description": "Render charts from tabular data.",
"enabled": true,
"trusted": false,
"origin": "local"
},
{
"root": "project",
"rel": "skills/release-notes",
"name": "release-notes",
"description": "Draft release notes from a git log.",
"enabled": true,
"trusted": true,
"origin": "hub"
}
],
"meta": {
"total": 2,
"page": 1,
"limit": 50
}
}

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

NameInTypeRequiredDescription
qquerystringNoSearch query.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
await client.agent.skills.searchSkillHub({ q: "kubernetes deploy" });
{
"results": [
{
"id": "k8s-deploy-blueprint",
"name": "k8s-deploy-blueprint",
"description": "Scaffold Kubernetes deployments from a service spec.",
"author": "hoody",
"version": "1.4.0"
}
],
"total": 1
}

Fetches 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 (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
await client.agent.skills.previewSkillHub({ id: "k8s-deploy-blueprint" });
{
"id": "k8s-deploy-blueprint",
"name": "k8s-deploy-blueprint",
"description": "Scaffold Kubernetes deployments from a service spec.",
"version": "1.4.0",
"readme": "# k8s-deploy-blueprint\n\nGenerates manifests, kustomize overlays, and a rollout plan.",
"files": [
{ "path": "SKILL.md", "size": 1450 },
{ "path": "templates/deployment.yaml", "size": 612 }
]
}

Installs a skill from the hub (skills.hub_install). This writes arbitrary skill code to disk. The daemon’s human-only _machine_confirmed denial lives only on the model-facing tool path, not on the skills.hub_install RPC this route dispatches.

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
NameTypeRequiredDescription
idstringYesHub skill identifier (from searchSkillHub / previewSkillHub).
await client.agent.skills.installSkillHub({ id: "k8s-deploy-blueprint" });
{
"ok": true,
"id": "k8s-deploy-blueprint",
"root": "user",
"rel": "skills/k8s-deploy-blueprint",
"trusted": false
}

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

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
await client.agent.skills.getSkillHubCache();
{
"entries": 12,
"bytes": 184320,
"hits": 47,
"misses": 9,
"pinned": 2
}

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

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
await client.agent.skills.clearSkillHubCache();
{
"ok": true,
"cleared_entries": 12,
"cleared_pins": 2
}

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

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
await client.agent.skills.scanSkillImport();
{
"candidates": [
{
"path": "/home/user/.legacy-skills/old-notebook",
"name": "old-notebook",
"has_skill_md": true,
"size_bytes": 8421
}
]
}

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

The request body is forwarded verbatim to the daemon RPC (the gateway scrubs every _-prefixed key and folds in the request scope). Identify the discovered skill to import using the fields returned by scanSkillImport (e.g. its scan path/id).

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.

The body schema is open (additionalProperties: true); the gateway passes through every non-_-prefixed key to skills.import_apply. Use the keys the daemon RPC reads — for example, the scan path or candidate id returned by scanSkillImport.

await client.agent.skills.applySkillImport({ path: "/home/user/.legacy-skills/old-notebook" });
{
"ok": true,
"root": "user",
"rel": "skills/old-notebook",
"name": "old-notebook"
}

Returns a skill’s source body (skills.read_source). Identify the skill by the daemon keys root_dir + rel_dir in the query (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 (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
await client.agent.skills.getSkillSource({ root_dir: "user", rel_dir: "skills/data-viz" });
{
"content": "# data-viz\n\nRender charts from tabular data using the local chart-renderer tool.\n",
"gen": 7,
"path": "user/skills/data-viz/SKILL.md"
}

Overwrites a skill’s source body (skills.write_source). Identify the skill by 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 (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
NameTypeRequiredDescription
root_dirstringYesSkill root directory (identity; alias: root).
rel_dirstringYesSkill relative directory (identity; alias: rel).
contentstringYesNew SKILL.md body (alias: source).
base_genintegerNoThe gen returned by skills.read_source, for conflict detection.
await client.agent.skills.putSkillSource({
root_dir: "user",
rel_dir: "skills/data-viz",
content: "# data-viz\n\nUpdated chart-renderer docs.\n",
base_gen: 7,
});
{
"ok": true,
"gen": 8,
"path": "user/skills/data-viz/SKILL.md"
}

Creates a new local skill (skills.create).

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
NameTypeRequiredDescription
namestringYesSkill name (the SKILL.md directory stem).
descriptionstringNoSkill description (frontmatter).
contentstringNoInitial SKILL.md body.
await client.agent.skills.createSkill({
name: "release-notes",
description: "Draft release notes from a git log.",
content: "# release-notes\n\nSummarize a git log range.\n",
});
{
"ok": true,
"root": "user",
"rel": "skills/release-notes",
"name": "release-notes"
}

Deletes 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 (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
NameTypeRequiredDescription
root_dirstringYesSkill root directory (identity; alias: root).
rel_dirstringYesSkill relative directory (identity; alias: rel).
await client.agent.skills.deleteSkill({ root_dir: "user", rel_dir: "skills/old-notebook" });
{
"ok": true,
"root": "user",
"rel": "skills/old-notebook"
}

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

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
NameTypeRequiredDescription
root_dirstringYesSkill root directory (identity; alias: root).
rel_dirstringYesSkill relative directory (identity; alias: rel).
new_namestringYesNew skill directory name.
await client.agent.skills.renameSkill({
root_dir: "user",
rel_dir: "skills/release-notes",
new_name: "changelog",
});
{
"ok": true,
"root": "user",
"rel": "skills/changelog",
"old_rel": "skills/release-notes"
}

Toggles a skill’s enabled state (skills.togglename-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 (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
NameTypeRequiredDescription
namestringYesEffective skill name (not root/rel — toggle is name-scoped).
disabledbooleanNotrue to disable the skill, false to enable it.
await client.agent.skills.toggleSkill({ name: "data-viz", disabled: true });
{
"ok": true,
"name": "data-viz",
"disabled": true
}

Sets a skill’s trust state (skills.set_trust). Identify the skill by 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 (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1).
realmquerystringNoQuery alias of the X-Hoody-Realm header.
NameTypeRequiredDescription
root_dirstringYesSkill root directory (identity; alias: root).
rel_dirstringYesSkill relative directory (identity; alias: rel).
trustedbooleanYestrue to grant execution trust, false to revoke.
await client.agent.skills.trustSkill({
root_dir: "user",
rel_dir: "skills/data-viz",
trusted: true,
});
{
"ok": true,
"root": "user",
"rel": "skills/data-viz",
"trusted": true
}