Skip to content
Hoody.com

The agent exposes a built-in tool catalogue and a per-session effective tool list. You can inspect schemas, list the tools a live session actually has on PATH (including its MCP subset), and run tools either inside a live session (gated, claims the serial turn slot) or sessionless (gated, read-only by default). Sessionless runs ship in three forms: synchronous (run), async (runAsync — returns a job id you poll), and streamed (stream — SSE envelopes).

List the full tool catalogue. Returns each tool’s name, description, JSON-Schema input, and read_only flag. Catalogue-wide and realm-independent — a per-request realm header is rejected with realm_scope_unsupported.

NameInTypeRequiredDescription
pagequeryintegerNo1-based page number for pagination.
limitqueryintegerNoMaximum items per page (0 = no pagination).
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector ("global" or a 24-hex id). Rejected on this route.
realmquerystringNoRealm selector (in:query alias of X-Hoody-Realm). Rejected on this route.
{
"items": [
{
"name": "bash",
"description": "Run a shell command in the session's working directory.",
"input_schema": {
"type": "object",
"properties": {
"command": { "type": "string" },
"timeout_ms": { "type": "integer" }
},
"required": ["command"]
},
"read_only": false
},
{
"name": "read_file",
"description": "Read a UTF-8 text file from the workspace.",
"input_schema": {
"type": "object",
"properties": {
"path": { "type": "string" }
},
"required": ["path"]
},
"read_only": true
}
],
"meta": {
"total": 42,
"page": 1,
"limit": 20
}
}
Terminal window
curl -X GET "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/tools?page=1&limit=20" \
-H "Authorization: Bearer $HOODY_TOKEN"

Get the schema for a single built-in tool by name. Returns the tool’s full descriptor — the body is the forwarded daemon reply (free-form). 404 tool_not_found for an unknown name.

NameInTypeRequiredDescription
namepathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector. Rejected on this route.
realmquerystringNoRealm selector (in:query alias). Rejected on this route.
{
"name": "bash",
"description": "Run a shell command in the session's working directory.",
"input_schema": {
"type": "object",
"properties": {
"command": { "type": "string" },
"timeout_ms": { "type": "integer" }
},
"required": ["command"]
},
"read_only": false
}
Terminal window
curl -X GET "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/tools/bash" \
-H "Authorization: Bearer $HOODY_TOKEN"

List the read-only tool subset — tools safe for planning and sessionless runs. Same envelope and pagination as the full catalogue.

NameInTypeRequiredDescription
pagequeryintegerNo1-based page number for pagination.
limitqueryintegerNoMaximum items per page (0 = no pagination).
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector. Rejected on this route.
realmquerystringNoRealm selector (in:query alias). Rejected on this route.
{
"items": [
{
"name": "read_file",
"description": "Read a UTF-8 text file from the workspace.",
"input_schema": {
"type": "object",
"properties": { "path": { "type": "string" } },
"required": ["path"]
},
"read_only": true
},
{
"name": "list_dir",
"description": "List a directory.",
"input_schema": {
"type": "object",
"properties": { "path": { "type": "string" } },
"required": ["path"]
},
"read_only": true
}
],
"meta": {
"total": 11,
"page": 1,
"limit": 20
}
}
Terminal window
curl -X GET "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/tools/read-only" \
-H "Authorization: Bearer $HOODY_TOKEN"

These endpoints return the effective tool list for a live session — the subset of the catalogue that is both enabled in config and on the session’s compute PATH, gated by the session’s tool mode, agent allowlist, and headless exclusions. Both return 404 when the session is not live.

List a session’s effective tool set.

NameInTypeRequiredDescription
idpathstringYesSession identifier.
pagequeryintegerNo1-based page number for pagination.
limitqueryintegerNoMaximum items per page (0 = no pagination).
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector. Rejected on this route.
realmquerystringNoRealm selector (in:query alias). Rejected on this route.
{
"items": [
{
"name": "bash",
"description": "Run a shell command in the session's working directory.",
"input_schema": {
"type": "object",
"properties": {
"command": { "type": "string" },
"timeout_ms": { "type": "integer" }
},
"required": ["command"]
},
"read_only": false
},
{
"name": "read_file",
"description": "Read a UTF-8 text file from the workspace.",
"input_schema": {
"type": "object",
"properties": { "path": { "type": "string" } },
"required": ["path"]
},
"read_only": true
}
],
"meta": {
"total": 28,
"page": 1,
"limit": 20
}
}
Terminal window
curl -X GET "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/sessions/{id}/tools" \
-H "Authorization: Bearer $HOODY_TOKEN"

List a session’s MCP tools (mcp__*). Same envelope and semantics as the effective tool list, but filtered to the MCP subset of the session’s compute PATH snapshot.

NameInTypeRequiredDescription
idpathstringYesSession identifier.
pagequeryintegerNo1-based page number for pagination.
limitqueryintegerNoMaximum items per page (0 = no pagination).
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector. Rejected on this route.
realmquerystringNoRealm selector (in:query alias). Rejected on this route.
{
"items": [
{
"name": "mcp__github__create_issue",
"description": "Open a new issue on a GitHub repo.",
"input_schema": {
"type": "object",
"properties": {
"repo": { "type": "string" },
"title": { "type": "string" },
"body": { "type": "string" }
},
"required": ["repo", "title"]
},
"read_only": false
},
{
"name": "mcp__github__list_issues",
"description": "List open issues on a GitHub repo.",
"input_schema": {
"type": "object",
"properties": {
"repo": { "type": "string" },
"state": { "type": "string", "enum": ["open", "closed", "all"] }
},
"required": ["repo"]
},
"read_only": true
}
],
"meta": {
"total": 6,
"page": 1,
"limit": 20
}
}
Terminal window
curl -X GET "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/sessions/{id}/tools/mcp" \
-H "Authorization: Bearer $HOODY_TOKEN"

Sessionless runs create an ephemeral local session from the scope headers (X-Hoody-Cwd, X-Hoody-Config-Dir) and run the full permission checks. They are read-only by default — a mutating tool requires allow_mutations: true or confirm: true, otherwise the run is refused with tool_mutation_refused. A parked confirmation returns 409 tool_needs_confirmation with the echoed tool+params; re-issue with confirm: true (and the confirm_token returned in the 409 details).

A sessionless run resolves paths under the caller-supplied X-Hoody-Cwd subtree (dir-scope defaults to home, restricted to cwd).

A session-scoped run claims the session’s single serial turn slot — it never races the turn loop. Concurrent activity returns 409 turn_in_flight or 409 gate_parked. A parked confirmation returns 409 tool_needs_confirmation.


Run a tool sessionless, gated. Returns the tool result directly.

NameInTypeRequiredDescription
namepathstringYesTool name.
confirmquerybooleanNoQuery alias of the body confirm field — re-issue a previously-parked confirmation.
confirm_tokenquerystringNoQuery alias of the body confirm_token field — the single-use token returned in the 409 details.
X-Hoody-Tool-ModeheaderstringNoSessionless tool-mode for the ephemeral session (e.g. read_only, full).
X-Hoody-Dir-ScopeheaderstringNoSessionless directory-access scope (home or full); default home.
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector. Rejected on this route.
realmquerystringNoRealm selector (in:query alias). Rejected on this route.
NameTypeRequiredDescription
paramsobjectNoThe tool’s input parameters (its JSON-Schema body).
confirmbooleanNoRe-issue a previously-parked confirmation. MUST be paired with a valid confirm_token.
confirm_tokenstringNoThe single-use token returned in the 409 tool_needs_confirmation details.
allow_mutationsbooleanNoSessionless only: opt a non-read-only tool into running under the full permission checks.
{
"params": {
"command": "ls -la",
"timeout_ms": 5000
}
}
{
"stdout": "total 12\ndrwxr-xr-x 3 user user 4096 May 1 12:00 .\ndrwxr-xr-x 6 user user 4096 May 1 12:00 ..\n-rw-r--r-- 1 user user 220 May 1 12:00 README.md",
"stderr": "",
"exit_code": 0
}
Terminal window
curl -X POST "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/tools/bash/run" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Hoody-Cwd: /home/user/project" \
-d '{
"params": {
"command": "ls -la",
"timeout_ms": 5000
}
}'

Async form of runTool. Returns {job_id} immediately; the gated tool runs in the background. Poll GET /jobs/{id}/result for the result, a parked confirmation, or an execution error.

NameInTypeRequiredDescription
namepathstringYesTool name.
confirmquerybooleanNoQuery alias of the body confirm field.
confirm_tokenquerystringNoQuery alias of the body confirm_token field.
X-Hoody-Tool-ModeheaderstringNoSessionless tool-mode for the ephemeral session.
X-Hoody-Dir-ScopeheaderstringNoSessionless directory-access scope.
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector. Rejected on this route.
realmquerystringNoRealm selector (in:query alias). Rejected on this route.
NameTypeRequiredDescription
paramsobjectNoThe tool’s input parameters.
confirmbooleanNoRe-issue a previously-parked confirmation.
confirm_tokenstringNoThe single-use token returned in the 409 details.
allow_mutationsbooleanNoSessionless only: opt a non-read-only tool into running under the full permission checks.
{
"params": {
"command": "npm test",
"timeout_ms": 120000
}
}
{
"job_id": "job_67e89abc123def456789abcd"
}
Terminal window
curl -X POST "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/tools/bash/runAsync" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Hoody-Cwd: /home/user/project" \
-d '{
"params": {
"command": "npm test",
"timeout_ms": 120000
}
}'

Stream a tool run over Server-Sent Events. Frame sequence: a start frame, then a single result / needs_confirmation / error frame, then end. The gated work is a one-shot RPC, so there is no per-token stream — the SSE shape mirrors the kit streaming convention for symmetry with the session stream.

NameInTypeRequiredDescription
namepathstringYesTool name.
confirmquerybooleanNoQuery alias of the body confirm field.
confirm_tokenquerystringNoQuery alias of the body confirm_token field.
X-Hoody-Tool-ModeheaderstringNoSessionless tool-mode for the ephemeral session.
X-Hoody-Dir-ScopeheaderstringNoSessionless directory-access scope.
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector. Rejected on this route.
realmquerystringNoRealm selector (in:query alias). Rejected on this route.
NameTypeRequiredDescription
paramsobjectNoThe tool’s input parameters.
confirmbooleanNoRe-issue a previously-parked confirmation.
confirm_tokenstringNoThe single-use token returned in the 409 details.
allow_mutationsbooleanNoSessionless only: opt a non-read-only tool into running.
{
"params": {
"command": "tail -f /var/log/app.log",
"timeout_ms": 30000
}
}
event: start
data: {"id":"job_67e89abc123def456789abcd"}
event: result
data: {"stdout":"INFO listening on :3000\n","stderr":"","exit_code":0}
event: end
data: {}
Terminal window
curl -N -X POST "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/tools/bash/stream" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Hoody-Cwd: /home/user/project" \
-d '{
"params": {
"command": "tail -f /var/log/app.log",
"timeout_ms": 30000
}
}'

POST /api/v1/agent/sessions/{id}/tools/{name}/run

Section titled “POST /api/v1/agent/sessions/{id}/tools/{name}/run”

Run a named tool inside a live session, gated and constrained to the session’s frozen realm/container/cwd/tool-mode/dir-scope. Claims the session’s single serial turn slot, so a direct tool run never races the turn loop. The run is also cancellable (concurrent POST /sessions/{id}/cancel, a WS cancel frame, or session close aborts an in-flight run).

NameInTypeRequiredDescription
idpathstringYesSession identifier.
namepathstringYesTool name.
confirmquerybooleanNoQuery alias of the body confirm field.
confirm_tokenquerystringNoQuery alias of the body confirm_token field.
X-Hoody-CwdheaderstringNoPer-request working-directory scope.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector. Rejected on this route.
realmquerystringNoRealm selector (in:query alias). Rejected on this route.
NameTypeRequiredDescription
paramsobjectNoThe tool’s input parameters (its JSON-Schema body).
confirmbooleanNoRe-issue a previously-parked confirmation.
confirm_tokenstringNoThe single-use token returned in the 409 details.
allow_mutationsbooleanNoSessionless only: opt a non-read-only tool into running. Omitted for in-session runs.
{
"params": {
"command": "git status",
"timeout_ms": 5000
}
}
{
"stdout": "On branch main\nnothing to commit, working tree clean",
"stderr": "",
"exit_code": 0
}
Terminal window
curl -X POST "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/sessions/{id}/tools/bash/run" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"params": {
"command": "git status",
"timeout_ms": 5000
}
}'