Host tools over the bridge
host_tool_list() and host_tool_call(name, args) are the host-side
mirror of Harn’s LLM-facing tool_search flow: the script can ask the
host what tools exist right now, inspect their schemas, and invoke the
one it actually needs.
This is useful when the host owns the real capabilities:
- Claude Code style tools such as
Read,Edit, andBash - IDE actions such as
open_file,ide.panel.focus, oride.git.worktree - product-specific actions that vary by project, session, or user role
Worked example
The script below discovers a readable tool at runtime, refuses to use a deprecated one, and then calls it with a single structured argument payload.
import { host_tool_available, host_tool_lookup } from "std/host"
pipeline inspect_readme(task) {
if !host_tool_available("Read") {
log("Host does not expose a Read tool in this session")
return nil
}
let read_tool = host_tool_lookup("Read")
assert(read_tool != nil, "Read tool metadata should be present")
assert(read_tool?.deprecated != true, "Read tool is deprecated on this host")
let result = host_tool_call("Read", {path: "README.md"})
log(result)
}
What happens at runtime:
host_tool_list()sendshost/tools/listto the active bridge host.- The host replies with tool descriptors:
name,description,schema, anddeprecated. host_tool_call("Read", {path: "README.md"})reuses the bridge’s existingbuiltin_callpath, so the host receives the dynamic tool invocation without Harn needing a second bespoke call protocol.
Shape conventions
Harn normalizes each entry returned by host/tools/list to this form:
{
"name": "Read",
"description": "Read a file",
"schema": {
"type": "object",
"properties": {
"path": {"type": "string"}
},
"required": ["path"]
},
"deprecated": false
}
That means scripts can safely branch on tool.schema or
tool.deprecated without having to care whether the host originally
used compatibility field names such as short_description or
input_schema.
Notes
- Without a bridge host,
host_tool_list()returns[]. host_tool_call(...)requires an attached bridge host and throws if none is active.- Hosts remain authoritative: if a tool disappears between discovery and invocation, the host error is surfaced to the script normally.