Built-in tools
Every tool Hubzoid gives an agent, with its arguments, limits, the capability that gates it and the surfaces that receive it.
Every tool a Hub starts with. They are built for the Hub they run in, so file paths resolve inside the Hub folder and chat tools resolve to the current conversation. Some are present only when the Hub has what they act on, such as workflows offered in chat. Your own tools from tools_local/ and restricted/, and tools from MCP servers and connectors, are added on top.
Summary
| Tool | What it does |
|---|---|
read_file | Read a text file inside the Hub folder. |
list_files | List Hub files matching a glob. |
write_artifact | Save a file the user can download, and return a download link. |
list_artifacts | List files saved in this chat. |
read_upload | Preview a file the user attached in this chat. |
read_upload_full | Read an attached text file in full. |
list_knowledge | List knowledge documents. |
read_knowledge | Read one knowledge document. |
list_skills | List skills. |
load_skill | Load one skill's instructions. |
grep_data | Search raw_data/ for a pattern. |
http_get | Fetch a URL. |
web_search | Search the web. |
current_time | Current date and time in a timezone. |
render_jinja | Render a Jinja2 template with JSON values. |
search_sources | Search the person's own knowledge sources, with citations. |
remember | Propose a note in the Hub's shared knowledge. Needs Save shared knowledge and browser editing on. |
read_hub_file | Read AGENTS.md or a Markdown file under knowledge/ or skills/ exactly. |
propose_hub_change | Propose an exact edit to the Hub's instructions or knowledge. Needs browser editing on. |
hub_change_status | Where a proposed Hub change is. |
save_memory, remove_memory | Keep or remove a short note about the person, only they see it. |
ask_question | Ask the person one question and wait for the answer. |
record_feedback | Save the person's rating of an earlier answer, when they ask. Off unless turned on. |
call_jev | Typed decisions from Jev, for people with Call Jev (jev). Experimental. |
connect_account | Send a personal link to connect an app, or list what the person can connect. |
list_workflows | List this agent's workflows and scheduled tasks, for people with See workflows and runs. |
workflow_runs | Check recent runs or one run in detail, for people with See workflows and runs. |
run_workflow | Start a team run now, for people with Run and control workflows. |
pause_workflow | Pause a schedule, for people with Run and control workflows. |
resume_workflow | Resume a paused schedule, for people with Run and control workflows. |
cancel_workflow_run | Cancel a queued or running run, for people with Run and control workflows. |
| Run for me tools | One tool per workflow offered in chat, named after it. Runs it as the person asking. |
my_reports | The person's own reports, team reports they can open and their recent runs. |
schedule_workflow | Save a personal schedule of a report, for people with Schedule reports for themselves. |
my_schedules | List the person's own schedules. |
change_schedule | Pause, resume, run, change or stop one of the person's own schedules. |
repeat_request | Repeat a request for the person on a schedule, as them. |
my_management_scope | List the agents you manage and what you can grant. For people with Manage access from chat. |
who_has_access | List who has access to one agent you manage. For people with Manage access from chat. |
explain_access | Explain one person's access and where it comes from. For people with Manage access from chat. |
propose_access_change | Propose a grant or removal for one person, to confirm in Settings. |
propose_new_account | Propose a new account with access, to confirm in Settings. |
run_git | Read or sync a Git checkout. Scheduled markdown tasks only. |
write_hub_file | Write inside a task's declared paths. Scheduled markdown tasks only. |
publish_artifact | Publish a file the run wrote as a private artifact. Markdown tasks that opt in. |
send_email | Email the account the run acts as. Markdown tasks that opt in. |
github__<operation> | GitHub operations, for a Hub with a GitHub channel. |
agent_health, eval_status, recent_denials | Read-only admin tools. MCP only, for agent administrators. |
Where each tool is available
| Tool | Chat surfaces and /v1 | Markdown tasks | Code workflow agent calls, evals, hubzoid test | MCP server |
|---|---|---|---|---|
| File, knowledge, skill, search, web and utility tools | yes | yes | yes | yes |
write_artifact, list_artifacts, read_upload, read_upload_full | yes | yes | yes | no |
search_sources | for a signed-in person | for the run's account | for the run's account | for the signed-in person |
remember, propose_hub_change | with Save shared knowledge and browser editing on | same | same | no |
read_hub_file, hub_change_status | with Save shared knowledge | same | same | no |
call_jev | with the capability | with the capability | with the capability | no |
save_memory, remove_memory | for a signed-in person | for the run's account | for the run's account | no |
ask_question | yes, unless hitl.yaml turns questions off | answers that nobody can answer | not offered in code workflows | no |
record_feedback | when chat feedback turns it on | no | no | no |
connect_account | yes | yes | yes | yes |
| Workflow tools | with the capability, not in Slack | no | no | with the capability |
Run for me tools, my_reports, repeat_request and the schedule tools | with the capability, not in Slack | no | no | with the capability |
| Access tools | with Manage access from chat, not in Slack | no | no | with Manage access from chat |
run_git, write_hub_file | no | yes | no | no |
publish_artifact, send_email | no | when the task opts in | no | no |
Your tools_local/ tools | yes | yes | yes | yes |
Your restricted/ tools | with the permission | with the permission | with the permission | with the permission |
Delegates (handover_<name>) | yes | yes | yes | no |
Tools from connectors/.mcp.json and the shared browser | yes | yes | yes | no |
| Connectors added in Settings | with the connector's capability | with the connector's capability | with the connector's capability | no |
Chat surfaces are the Hubzoid web app, Slack, WhatsApp, Telegram and the OpenAI-compatible API. A surface decides more than the table shows:
remember,call_jev,restricted/tools and connectors need a surface listed inHUBZOID_RESTRICTED_SURFACES. The default list is the web app, the API, MCP, workflow runs and embedded apps, so Slack, WhatsApp and Telegram reach them only when you add those surfaces. A shared Slack channel never carries a connector's credential.- The workflow, report, schedule and access tools have their own rule. They work on the web app, the API, MCP, WhatsApp and Telegram, refuse anonymous callers, and are never offered on Slack or inside a scheduled run, a code workflow or an eval, so a run cannot start, pause or schedule other work.
- Markdown tasks, code workflow agent calls and evals with
run_asact as an account on theworkflowsurface, so a capability counts when that account holds it. An eval case withoutrun_ashas no account, so gated tools stay hidden.
The MCP server leaves out the chat-scoped tools (write_artifact, list_artifacts, read_upload, read_upload_full and record_feedback), because an MCP call has no conversation. It also leaves out remember, the Hub change tools, save_memory, remove_memory, ask_question, call_jev, delegates and the built-in dashboard skill, and it does not relay the Hub's own MCP servers, the shared browser or connectors added in Settings. Its tools/list hides restricted/ tools and the gated built-ins (the workflow, report, schedule and access tools) from a caller who may not use them, with the same decision a call would get, and every call is checked again. connect_account is always listed. See connect an assistant.
Markdown tasks and code workflow agent calls run without a chat, so write_artifact saves into output/<session>/ and reports a local path, and the upload tools have nothing to read. Evals run each case in its own chat, eval-<case>-<random suffix>.
Files and uploads
read_file
Read a UTF-8 text file under the Hub folder.
Prop
Type
Without a limit, results over 25,000 characters are cut, and the full text is saved to an overflow file whose path the result names, so the agent can continue with offset and limit. Paths outside the Hub are refused, and so are private paths wherever they appear: restricted/, .hubzoid/, .git/ and other version control folders, .env files and database files. The current chat's own uploads and saved files, and a scheduled task's scratch folder, stay readable during that chat or run.
list_files
List files under the Hub folder that match a glob.
Prop
Type
Returns up to 100 paths, with a note to narrow the glob when there are more. Files that read_file would refuse are never listed.
write_artifact
Save a text file for the user and return a download link.
Prop
Type
The file goes to .hubzoid/chats/<chat>/artifacts/. The link is signed, so a browser can open it without an API key, and it is built from HUBZOID_PUBLIC_URL, then the bridge's loopback address. The runtime also shows the link to the user even when the model does not repeat it. A new link expires after 7 days, and the signed-in owner of the conversation can still download the file after that. HUBZOID_ARTIFACT_LINK_TTL overrides that, and 0 means never. The built-in dashboard skill uses this tool to deliver single-file HTML dashboards. These chat downloads are separate from published artifacts, which workflows create with hub.publish_artifact and people open in the artifact viewer.
list_artifacts
List the files saved in this chat so far, with their sizes. Takes no arguments.
read_upload
Preview a file the user attached in this chat. The preview depends on the file type.
Prop
Type
| File type | Preview |
|---|---|
| Text | The first 200 lines, or the whole file when it is shorter. |
| JSON | A structural summary and the start of the formatted document. |
| CSV | The header, the first 20 rows and the row count. |
| Extracted text of the first 5 pages, or the pages you ask for. | |
| Image | Metadata only. With HUBZOID_VISION on, the model sees attached images directly. |
| Other binary | A hex preview of the first bytes. |
Text previews start with the file's path on disk, so the agent can pass the file to a tool that takes a path.
read_upload_full
Read an attached text file in full, up to 500,000 characters.
Prop
Type
Refuses images and other binary files. Use it after read_upload when the preview says more is available.
Knowledge and skills
list_knowledge
List every document in knowledge/ as name: description. Takes no arguments.
read_knowledge
Return the body of one knowledge document.
Prop
Type
Both knowledge tools read the folder from disk on each call, so edits and documents saved with remember are visible immediately.
list_skills
List every skill as name: description. Takes no arguments.
load_skill
Return the instructions of one skill.
Prop
Type
Skills include skills/, sub-agents loaded as skills, and the built-in dashboard skill, which the MCP server does not offer. A Hub skill with the same name replaces a built-in one. The skill list is read when the Hub starts. See Hub files.
Search and web
grep_data
Search inside the Hub for a regular expression or plain string. Uses rg (ripgrep) when it is installed and a Python search otherwise, with the same output.
Prop
Type
Returns path:line:content lines grouped by file, most matches first. Limits: 100 matches in total, 30 per file, 300 characters per line and 25,000 characters per result, with notes on how to narrow the search. Folders such as .git, node_modules, .venv, dist and build are skipped, as are files over 5 MB in the Python search. The tool needs a raw_data/ folder, and refuses paths outside the Hub and the private paths read_file refuses.
http_get
Fetch a URL and return the status and body as text. No JavaScript runs and no credentials are sent.
Prop
Type
Follows redirects, times out after 15 seconds, and cuts bodies at 50,000 characters. With HTTP_ALLOWLIST set, the URL's host must be a listed host or one of its subdomains. Redirects are followed without that check, so a listed host that redirects elsewhere is still followed. Do not rely on the list as a network boundary. HUBZOID_DISABLE_HTTP_GET=true removes the tool.
web_search
Search the web through DuckDuckGo's HTML results. No API key is needed.
Prop
Type
Returns a list of titles, links and snippets. Times out after 15 seconds. HUBZOID_DISABLE_WEB_SEARCH=true removes the tool.
Utilities
current_time
Return the current date and time as ISO 8601, for example 2026-05-20T14:32:01+05:30.
Prop
Type
render_jinja
Render a Jinja2 template with values from a JSON object, in Jinja2's sandbox. Undefined variables are an error rather than empty text.
Prop
Type
Knowledge sources
search_sources
Search the knowledge sources the person may read (collections synced with hubzoid knowledge) and return the best passages, each with a citation marker the chat shows as a link.
Prop
Type
The caller is the signed-in person of the run, never a name from the model. With nobody signed in it answers that sources are only available to a signed-in person. A marker the model makes up resolves to nothing.
Shared knowledge and Hub changes
These change the Hub's own files, so they follow browser editing, which is Beta and off by default. With it off, remember and propose_hub_change are not offered, and a call answers that changing the agent's shared files from the browser is off and says where to change them instead: in the Hub's files on this computer, or in Git and a deploy. Files that come from an image are never written.
All four need the caller to hold Save shared knowledge (curator) or manage the Hub, on a surface allowed to use restricted tools. Grant it in Settings or with hubzoid grant <email> curator. A scheduled task or workflow can use them only when the account it acts as holds the grant.
remember
Save something for everyone who uses the Hub, only when the person explicitly asks the agent to remember it for the team. For something only about the person, the agent uses save_memory instead.
Prop
Type
remember is a proposal. It becomes a Hub change that a Hub manager applies from the card in chat or in Settings. A change an agent proposes never applies itself, even for a manager. When applied, the file is written and, in a Git checkout, committed. Every person using the Hub then reads it through read_knowledge. A Hub tool named remember replaces this one.
Hub change tools
| Tool | Arguments | What it does |
|---|---|---|
read_hub_file | path | Reads AGENTS.md, or a Markdown file under knowledge/ or skills/, exactly. Read a file before proposing an edit to it. |
propose_hub_change | title, edits, optional reason | Proposes a change to the Hub's instructions or knowledge, only when the person asks for the Hub itself to change. Each edit is {path, old_text, new_text}, {path, append} or {path, content} for a new file. Someone who manages the Hub reviews and applies it. |
hub_change_status | id | Whether a proposed change is pending, applied, rejected or in conflict. |
Access, approval and run settings, workflow code, local tools, secrets and anything outside the Hub are never proposable. Proposals are also listed and decided with hubzoid hub-changes, which works whether or not browser editing is on.
Personal memory
save_memory and remove_memory keep one short note per person per Hub, in the operational database, never in the Hub's files. Only that person sees it. The chat reads it at the start of each conversation, below the Hub's own instructions and knowledge, which win when they disagree.
| Tool | Arguments | What it does |
|---|---|---|
save_memory | note | Adds one short sentence, only when the person asks the agent to remember something about themselves. The note is at most 4,000 characters in all. |
remove_memory | note | Removes lines containing these words, when the person asks to forget them. |
No grant is needed. With nobody signed in, the tools refuse. People read, edit or delete their notes in Settings → Memory. See memory and history.
Questions and feedback
ask_question
Ask the person one question and wait. The agent uses it only when it cannot make good progress without their input.
Prop
Type
The question appears in chat and the agent ends its turn. The answer arrives as the person's next message. When nobody can answer, for example in a scheduled run, it returns unavailable and the agent goes on with its best judgment. questions: false in hitl.yaml turns it off for the Hub or one agent.
record_feedback
Save the person's rating of one of the agent's earlier answers, only when they ask. Offered only when the deployment's chat configuration turns on feedback.enabled and feedback.tool.
Prop
Type
The quoted words must appear in the person's latest message, so the tool cannot invent a rating. A rating never becomes memory, a Hub edit or an action.
Decisions
call_jev
Ask Jev, TypeSafe's decision model, typed questions about a piece of text through OpenRouter. It returns answers with probabilities instead of prose. Experimental.
Prop
Type
| Type | Asks | Answer |
|---|---|---|
noul | Does it hold? | The probability of yes. Criteria are optional. |
choice | Which label fits? | One of two or more labels given in criteria, with probabilities. |
score | Where on a scale? | A score from 0 to the last of two or more levels in criteria, lowest first. |
call_jev is on every Hub but works only for a caller who holds the jev capability, shown in Settings as Call Jev, on a surface allowed to use restricted tools. Nobody holds it by default, and Settings shows "Jev key missing" until JEV_OPENROUTER_API_KEY is set. The tool uses only that key, never OPENROUTER_API_KEY or the Hub's model. A call has up to 90 seconds, and a rate limit, server error or timeout is retried once. Each call writes a usage row. A failure comes back as readable text. A Hub tool named call_jev replaces this one. Workflows use the same adapter as hub.call_jev. See the workflow API.
Personal connections
connect_account
Start a connection journey for the caller's own account in an app, for example Gmail, or list what the caller can connect in this agent. On by default. HUBZOID_CONNECT_JOURNEY=false removes it from the agent.
Prop
Type
- The app must be a connector an organization administrator added in Settings and offers in this agent. A name that matches nothing returns the list of what exists.
- The caller needs the connector's capability,
connector_<id>, shown in Settings as Connect <name> (Use <name> for a Shared key connector), on a surface allowed to use restricted tools. A refusal names the capability to ask for, and is recorded in the access log. - The result is a note that the app is already connected, a note that a Shared key connector uses one company account so there is nothing to connect, or a personal link to
/portal/connect/<id>. The link works only for the person who asked, while signed in, and expires afterHUBZOID_CONNECT_TTLseconds (600 by default). The tool never returns a provider URL or a token. - People review and disconnect their connections at
/portal/connections.
See tools and connectors and the connection pages.
Workflow tools
Six tools let an agent list, report on, start, pause, resume and cancel the workflows and scheduled markdown tasks of the agent it runs in. Two capabilities, under Hubzoid tools > Workflows in Settings, control them. Nobody holds either until a manager grants it.
| Tool | Arguments | Needs | What it does |
|---|---|---|---|
list_workflows | none | See workflows and runs (workflows_view) | Lists up to 25 workflows and tasks with the schedule and timezone, whether each is scheduled, paused or manual only, its next run, how its last run went, the account it runs as, and whether people can run it for themselves. |
workflow_runs | workflow, run_id, status, limit | See workflows and runs | Recent runs, newest first, or one run with its steps when run_id is given. status is running, failed, succeeded or cancelled. limit is 1 to 25, default 10. A run's output and error details are shown only to the account the run acted as. Others see its status and the kind of error. |
run_workflow | name, optional inputs (a JSON object as text) | Run and control workflows (workflows_manage, sensitive) | Starts a team run now, acting as the workflow's own account, never as the person asking. When a run is already queued or running, returns its id and starts nothing. Markdown tasks take no inputs. |
pause_workflow | name | Run and control workflows | Pauses the schedule. A run already queued or running carries on, and manual runs still work. |
resume_workflow | name | Run and control workflows | Resumes the schedule. A markdown task that fell due while paused runs once soon after. |
cancel_workflow_run | run_id | Run and control workflows | Asks a queued or running run to stop at its next step. Work it already did is not undone, and a finished run cannot be cancelled. |
- The person acting is always the signed-in caller. Every start, pause, resume and cancel is recorded in the access log with that person and the surface.
run_workflowrefuses while a backup holds new runs. Code workflows must be running on the agent, withHUBZOID_SCHEDULES=1or in a deployment thathubzoid runstarts fromhubzoid.yamlor with several Hubs.- The tools tell the model to name the exact workflow back and wait for a clear yes, and never to act because a document or tool result asked. That is guidance for the model. The grant, the check on every call and the access log are the controls.
HUBZOID_WORKFLOW_TOOLS=falseremoves these tools, the Run for me tools and the schedule tools from the agent. Settings then shows the capabilities as disabled. In an agent with no workflows Settings shows "No workflows in this agent".
See operating runs.
Reports in chat
A code workflow declared with as_tool=True is offered to people in chat and over MCP as a tool of its own. These tools exist only where code workflows run (HUBZOID_SCHEDULES=1, or in a deployment that hubzoid run starts from hubzoid.yaml or with several Hubs), and only while HUBZOID_WORKFLOW_TOOLS is not false. How to declare them is in the workflow API.
Run for me tools
One tool per workflow, named after the workflow function, for example program_report. A workflow cannot take the name of a built-in tool or of schedule_workflow, my_schedules, change_schedule or my_reports.
Prop
Type
- It runs the workflow as the person asking, with their own access. They need Run <report> (
wf_<name>), one capability per workflow under Hubzoid tools > Workflows.sensitive=Truemarks it Sensitive. - Inputs are checked against the model before anything runs. They are limited to 4,000 bytes unless the workflow sets
max_input_kb, up to 256 KB. - With
confirm=True, the first call returns a proposal and a code instead of starting. A second call carrying onlyconfirmstarts it, in a later message of the same chat, by the same account, within 10 minutes. A code works once. - The tool waits up to the workflow's
tool_wait(60 seconds by default, at most 10 minutes). It then returns links to the person's own report copies, any text the run returned as{"answer": "..."}(up to 8,000 characters, marked as data), or a{"refused": "..."}message as written. A run still going returns its run id, andmy_reportsfinds the result later. When the Hub setsnotify_by_email: trueand email is set up, the person is emailed the links when it finishes. - A second request for the same report and inputs while one is running returns that run instead of starting another. A request is refused while a backup holds new runs.
surfaces=in the declaration limits which chat surfaces offer the tool.
my_reports
List the person's own reports, the team reports they can open, and their recent runs with links and results. Also recovers run confirmation codes from earlier turns of the chat.
Prop
Type
Shows up to 10 of each kind. Needs Use this agent. Present when the agent offers at least one Run for me tool.
schedule_workflow
Save a personal schedule that runs a report for the person, as them, on a cadence. Present when at least one Run for me workflow sets schedulable=True.
Prop
Type
- The person needs Schedule reports for themselves (
schedule_reports) and the report's own Run <report> capability. - The first call returns what will run, as whom, and the next three runs, with a code. Nothing is saved until a second call carries only that code, in a later message of the same chat, within 10 minutes.
- Saving starts a first run at once. When that run fails, the schedule is saved paused.
- Limits come from
personal_schedulesinworkflows/settings.yaml: at most hourly (min_interval, which a workflow's ownmin_intervalcan raise), 10 schedules per person per agent (per_person), and a pause after 3 failures in a row (pause_after_failures). A schedule also pauses when the person's access or the report's inputs change. A second schedule with the same report, inputs and time is refused.
my_schedules
List the person's own schedules on this agent with the next run and the last result, and a link to My schedules in Settings (/settings#/schedules). Also recovers pending confirmation codes. Takes no arguments. Needs Use this agent.
repeat_request
Repeat a request for the person on a schedule, as them, when they say "repeat this" or "every Monday" about something the agent can do now. Each answer arrives as a new private chat.
Prop
Type
The first call returns a proposal with a code. Nothing is saved until a second call carries only that code after a clear yes. Saving starts a first run at once. It needs permission to schedule the built-in repeated request workflow. On a laptop where code workflows do not run, the agent says it cannot schedule.
change_schedule
Change one of the person's own schedules.
Prop
Type
Needs Use this agent and acts only on the caller's own schedules. A stopped schedule's live link keeps its last copy. People can also see and change their schedules under My schedules in Settings.
Access tools
Five tools help people who manage access see it and propose changes from chat or an assistant. An organization administrator turns them on per person with Manage access from chat (access_tools, sensitive), under Hubzoid tools > Access control. Delegated managers cannot grant it. It has an effect only for a person who also manages access, and what they see or propose stays within what they manage.
| Tool | Arguments | What it does |
|---|---|---|
my_management_scope | none | Lists the agents the caller manages and the capabilities they can grant in each, with Settings labels and ids. Read only. |
who_has_access | hub | Lists up to 50 people and services with access to one agent the caller manages, with their capabilities, account flags such as blocked or awaiting approval, and whether everyone signed in can use the agent. Read only. |
explain_access | person, optional hub | Explains one person's access in the agents the caller manages, capability by capability, and where each comes from: a direct grant, everyone signed in, or organization administration. Also gives the account state. Read only. |
propose_access_change | person (email), hub, optional grant and revoke lists of capability ids | Proposes granting or removing capabilities for one person in one agent. Removing use_hub removes all of that person's access there. |
propose_new_account | email, name, hub, optional grant list | Proposes a new chat account with access to one agent. Chat access is included. The password is set on the confirmation page, never in chat. |
- The acting person is always the signed-in caller. No tool takes an actor, and no tool accepts or returns a password.
- They work on the web app, the API, MCP, WhatsApp and Telegram. They refuse anonymous callers, scheduled work and every Slack surface, and are hidden from anyone who fails these checks.
- The two proposal tools only propose. Nothing changes until the same person opens the link the tool returns (
/settings#/confirm/<id>), signs in on the web and confirms the exact change in Settings. On WhatsApp and Telegram the reply says to open the link in a browser. - A proposal is checked against the caller's own access when made and again when confirmed, can be used once, and expires after
HUBZOID_CHANGE_REQUEST_TTLseconds (900 by default). At most 20 can wait per person. Each proposal, confirmation, rejection and expiry is recorded in the access log with its surface. HUBZOID_ACCESS_TOOLS=falseremoves the tools from the agent, and Settings shows the capability as disabled.HUBZOID_MANAGEMENT_TOOLS=falsedoes the same.HUBZOID_MANAGEMENT_TOOLS=truekeeps its meaning from older releases, giving every manager the tools without the grant. It is deprecated, andhubzoid doctorwarns about it. Grant Manage access from chat instead, then remove the setting.
Scheduled task tools
A markdown task run receives two more tools, and two others when its frontmatter opts in. They are never available in chat. They replace a Hub tool of the same name for that run.
run_git
Run a read or sync Git command in a checkout inside the Hub.
Prop
Type
Allowed verbs are pull, fetch, log, diff, show, status, rev-parse, ls-files, branch, shortlog, describe and the read-only forms of remote (-v, show and get-url). Flags that could write files or run commands, such as --output, --upload-pack, -c and --git-dir, are refused. Each call times out after 300 seconds, and output is cut at 60,000 characters. Hubzoid itself commits the task's commit: paths after the run.
write_hub_file
Create or overwrite a file inside the task's writable paths.
Prop
Type
Writable paths are the task's commit: and write: paths plus its scratch folder for the account it runs as, .hubzoid/schedule/<task>@<person>/. The schedule/ folder and any .git/ folder are never writable, even under a broad commit: path. See markdown tasks.
publish_artifact
Publish a file the run wrote as a private artifact owned by the account the run acts as. Offered only when the task sets publish_artifacts: true.
Prop
Type
Returns the artifact's id and its viewer link, /portal/artifacts/<id>. Only the owner can open it until they share it. Files that hold secrets, such as .env files and databases, are refused. See the HTTP endpoints for the viewer.
send_email
Email the account the run acts as, the only possible recipient, with optional links to artifacts published in the same run. Offered only when the task sets send_email: true.
Prop
Type
At most five emails per run. The body is sent as plain text. Only an accepted result means the SMTP server took the message, and even then it does not confirm delivery to the inbox. It uses the HUBZOID_SMTP_* settings, or writes to a preview outbox with HUBZOID_EMAIL_DELIVERY=preview. See configuration.
Tools from other sources
- Delegates. A sub-agent that runs on its own model becomes a tool named
handover_<name>on the OpenAI Agents and Codex runtimes, and a Claude subagent onclaude-local. See Hub files. - MCP servers. Each server in
connectors/.mcp.jsonadds its tools. On the OpenAI Agents and Codex runtimes a call to an MCP tool may take 30 seconds unless the server sets its ownclient_session_timeout_seconds.HUBZOID_MCP_TIMEOUTchanges the default, and onclaude-localit becomes the Claude CLI's MCP tool timeout. See tools and connectors. - The shared browser.
HUBZOID_BROWSER=trueadds the Playwright tools, such asbrowser_navigate,browser_clickandbrowser_snapshot, as an MCP server namedplaywright. See the shared browser. - GitHub operations. A Hub with an active GitHub channel connection adds tools named
github__<operation>. An agent or station lists the ones it needs in itstools:. Writes run only inside channel work. - Admin tools on MCP.
agent_health,eval_statusandrecent_denialsare read-only tools for people who administer an agent (admin.diagnostics.read). They are added to hosted MCP only, never to a chat model, and never return secret values or names. - Remote connectors. Remote MCP servers defined in
connectors/<id>.yamland offered in an agent. A person's turns and the runs that act as them reach each connector's tools with their own connection, or with the company's key for a Shared key connector, when they hold itsconnector_<id>capability. When the administrator picked the allowed tools, only those are added. See tools and connectors.
Names on each backend
On the OpenAI Agents and Codex runtimes, Hubzoid's tools keep the names above, and tools from connectors/.mcp.json and the shared browser keep their own names. On claude-local, Hubzoid's tools are served to Claude as an in-process MCP server, so the model sees mcp__hubzoid__read_file, and servers from connectors/.mcp.json appear as mcp__<server>__<tool>.
Connector tools added in Settings are named mcp__my_<id>__<tool> on every runtime. On OpenAI Agents and Codex, a connector tool name with characters other than letters, digits, _ and - has them replaced by _ and ends in a short hash, so two tools never share a name, and a name longer than 64 characters is cut and ends in a hash. Eval checks such as expect_tools match Hubzoid's own tools by their short name on every runtime.
On claude-local, Claude Code's own tools (shell, file editing and the rest) are switched off, so the agent only has the tools on this page and the ones you add. The one exception is Claude's subagent tool, which is enabled when the Hub has delegates. The claude process uses only the MCP servers Hubzoid passes, never the host account's claude.ai connectors or a user or project MCP configuration. On codex-local, Codex's own shell, file, browser and web search tools are switched off in the same way, and Hubzoid runs every tool the agent calls.
On every runtime the agent sees only the gated tools the caller may use: restricted/ tools, remember and the Hub change tools, call_jev, the workflow, report and schedule tools, and the access tools. The decision is made again on each turn, so a grant or removal shows on the next turn, and every call is checked once more when it runs.
Change the tool set
| To | Do this |
|---|---|
Remove http_get or web_search | Set HUBZOID_DISABLE_HTTP_GET=true or HUBZOID_DISABLE_WEB_SEARCH=true. |
Limit http_get to known hosts | Set HTTP_ALLOWLIST=example.com,api.example.com. |
| Remove the workflow, report and schedule tools | Set HUBZOID_WORKFLOW_TOOLS=false in the Hub's .env. |
| Remove the access tools | Set HUBZOID_ACCESS_TOOLS=false in the Hub's .env. |
Remove connect_account | Set HUBZOID_CONNECT_JOURNEY=false. |
| Replace a built-in | Add a tools_local/ tool with the same name. |
| Require a permission for a tool | Put it in restricted/<permission>.py. See restrict tools. |
| Limit a delegate's tools | List them in the sub-agent's tools:. |

