Skip to content

Tools

What this is for. Tools are the actions an agent can actually take: read a file, search an index, open a browser, send a draft email. This page is the live catalogue of everything registered on this instance. Assignment still happens on the agent Configuration tab; this screen is how you inspect name, category, risk, and whether a call waits on approval.

Route: /tools. Sidebar: Tools. Subtitle: Registered tools available for agent execution.

  • You want to know which tools exist before you put their ids on an agent.
  • A call was blocked and you need the risk tier and whether it requires approval.
  • You are wiring MCP or a Connection and want to see the discovered tools next to the builtins.
  • You need the input schema for a tool the agent keeps mis-calling.
  1. Open Tools in the sidebar (/tools).
  2. Search by name or description, or filter by category and risk tier.
  3. Expand Show schema on a card when you need the JSON input shape.
  4. Put the tool id on the agent Configuration tab, in Tools (comma-separated). See Configure.
  5. Dangerous calls still pass the security gate at runtime — a catalogue row is not a permission grant.

The header counts the tools and how many require approval. Each card shows a monospace id, a short description, a category badge, a risk badge (green risk, yellow risk or red risk), and an amber shield when approval is required.

ConceptMeaning
Tool nameStable id used in agent config and logs
DescriptionWhat the tool does (shown in the catalogue)
CategoryGrouping from the registry: memory, knowledge, search, documents, board, shell, browser, conversation, communication, research, agent, custom (MCP and connection tools bring their own)
Risk tiergreen / yellow / red — the security gate’s low / medium / high
approval requiredThe executor will not run this call until a human approves it
Input schemaJSON Schema of arguments; expand Show schema / Hide schema
PermissionsCASL on the API plus the security gate on each call. A model can only run a tool its agent was offered: any other name is refused (‘<tool>’ is not in this agent’s toolset), without an approval prompt, on every provider — see Configure — Tools
SandboxSome tools run in restricted environments

Empty: No tools registered yet. Loading (Loading tools…) and load errors (Failed to load tools: …) surface as page copy, not a silent blank.

Configure MCP-backed tools under MCP servers. External system credentials under Connections.

Tool execution log

Every tool call is recorded in the tool execution log: the tool’s canonical name, its input, its output or error text, the duration, and the conversation, agent and supervised run it belongs to.

  • Calls the EYAS executor runs — on API providers, and EYAS tools a CLI calls over the EYAS bridge — are logged by the executor, once each.
  • Tools a CLI ran in its own loop — Claude Code, Grok CLI and Kimi Code CLI, such as their shell or file reads — get a row too, under the canonical name (Claude Code’s Bash is logged as run_command). EYAS did not run these, so it only records them: they already ran under EYAS’s permission checks for that CLI.
  • These rows are the tool evidence the completeness critic checks a run against, and they feed the Self-learning and efficiency reports — the same on every provider.
  • The log is not memory: nothing reaches EYAS memory from it. Whether tool output is recorded in memory is decided by memory.l0.captureToolResults alone — see Memory.

The Tools column on Observability — Usage counts the same calls per trace.

Catalogue filters

ControlMeaning
SearchSearch tools… — matches name or description
All categoriesRestrict to one registry category
All risk tiersRestrict to one risk tier

Built-in tool groups (highlights)

Coding surface (model-agnostic)

First-class filesystem tools so every model (Grok, Claude API, Kimi, local, …) can edit code without relying on Claude Code SDK builtins:

ToolPurposeRisk
read_fileRead text file (line offset/limit)green
write_fileCreate/overwrite fileyellow
edit_fileExact string replace (targeted edit)yellow
grepContent search under workspacegreen
globFind files by patterngreen
git_status / git_diffRead-only review helpersgreen
run_commandShell-free program execution (approval)red

Paths are jailed to the conversation working folders (or the agent worktree) — a conversation without folders of its own works in its own EYAS workspace. There is no fallback to the EYAS process directory. Sensitive paths (.env, master.key, .ssh, …) are denied, and so is memory outside EYAS — other tools’ memory, Obsidian vaults, EYAS’s own data folder and another conversation’s workspace — for reads as well as writes (Security & privacy — Memory outside EYAS). A folder that would expose memory or credentials cannot be saved as a working folder at all (Conversations — Folders). In a folder that merely contains such a location — a repository holding EYAS’s data/, ~/Documents with a vault — grep and glob never descend into the protected sub-folders (EYAS’s data folder, a nested Obsidian vault, another tool’s memory, a CLI home, another conversation’s workspace), so a search never returns results from them. A symlink inside the working folder that points outside it is refused, also when its target does not exist yet (this covers read_file, write_file, edit_file and browser_upload paths). Prefer edit_file over full-file rewrites.

Read-only git without a click. If the agent calls run_command (or a CLI Bash) with an argument list that is unambiguously git status or git diff — no shell metacharacters, no -C / --git-dir / --no-index, no absolute path — the security gate remaps it to git_status / git_diff and allows it. You do not get an approval prompt. git commit, git add, ls, and any command with metacharacters stay red or are refused. Dedicated git_status / git_diff tools are green.

Verify before done: configure agent.verifyCommands in YAML (e.g. bun test) to run deterministic checks after a run; failures re-open the agent with the error summary.

Hooks: every tool call passes PreToolUse / PostToolUse on the ToolExecutor (universal, not Claude-only). Claude Code’s own built-in tools additionally pass EYAS’s memory-policy check before they run.

CLI models use their own file tools. Claude Code, Grok and Kimi are not offered this coding surface (run_command, read_file, write_file, edit_file, grep, glob, git_status, git_diff) over the EYAS bridge, because they have their own: they run them in the turn’s folders, under the security gate, the memory-path policy and — for Claude Code’s shell and Grok’s tools — the kernel file sandbox. Every other EYAS tool reaches them.

Search & grounding

ToolPurpose
list_search_sourcesList sources (label, version, edition, family, paths, status) before inventing facts
get_search_contextShow which sources are pinned for this conversation
set_search_contextPin or clear sources (sourceIds, labels, version, edition, or clear: true)
search_indexedHybrid FTS + vector search with citations; respects conversation/project pin; optional sourceIds / labels / version / edition

When multiple odoo-family sources are ready and nothing is pinned, tools return needsPin instead of mixing versions. See Search — multi-version pin.

Memory

ToolPurpose
memory_searchSearch EYAS memory — summaries, facts, vault notes, imported transcripts — never the host CLI’s. Read-only and locked by EYAS to the conversation’s project, its type and global memory; a scope or project argument is ignored. Returns ids to open with memory_expand.
memory_expandOpen one hit by id (vt:, gs:, en:, … — from memory_search or a standing memory line), inside the same project lock
search_memoryAlias of memory_search, with the same project lock
save_memoryRetired — writes nothing. EYAS records memory automatically; agents never write memory themselves

memory_search and memory_expand are always available, whatever an agent’s Tools list says, and they are the only memory tools a model gets on every host — API providers, Claude Code, Grok, Kimi, and OpenCode inside an opencode_run task. The three search/expand tools share one budget of 3 calls per answer on every provider. A caller outside an EYAS conversation — an external MCP client, or an OpenCode session EYAS did not start for a task — reads global memory only, 3 calls per 90 seconds. memory_block_read and memory_block_write are retired: what was stored in blocks was copied once into EYAS memory and is found with memory_search; an agent whose list still names them simply no longer gets them. Results of the memory tools are masked by the privacy policy on every transport (API providers, the CLI bridges, external MCP clients, OpenCode). See Memory.

Browser

Headless Playwright (browser_*) uses the same Chromium as the design print pipeline. Prefer numbered indexes from browser_snapshot over CSS. Indexes and snapshotId die on navigation or back — snapshot again. Cookies persist in an EYAS-owned profile (data/browser/profile, or EYAS_BROWSER_USER_DATA_DIR) — never the daily Chrome profile (Chrome 136+ blocks Default-profile CDP). Downloads land in Documents.

ToolPurpose
browser_navigateOpen a URL; SSRF blocks private/metadata hosts
browser_snapshotAccessibility tree + numbered interactive list + snapshotId
browser_click / browser_fill / browser_hover / browser_selectAct by index or CSS
browser_tabslist / open / switch / close (cannot close the last tab)
browser_back / browser_waitHistory back; wait for selector, URL, load, or timeout
browser_dialogArm accept/dismiss for the next alert/confirm/prompt
browser_uploadFile input — workspace paths or Documents ids
browser_evaluateJavaScript in the page (not Node); JSON result capped
browser_downloadNext download → Documents, linked to the conversation
browser_storageSave/load Playwright storageState (cookies + origins)
browser_replay / browser_action_cacheReplay a saved locator (no LLM). JSON in the project or vault. Never fill values
browser_totpTOTP from Secrets / macOS Keychain → browser_fill. Yellow. Seed never returned
browser_screenshot / browser_get_content / browser_closeCapture, text, end the process (profile stays on disk)
agent_browser_status / agent_browser_runRecommended agent-browser sidecar (@e1 refs, Apache-2.0) — Browser Use
browser_use_status / browser_use_execLegacy Python CLI sidecar (Browser Use)
opencode_status / opencode_runOptional OpenCode coding-engine sidecar (OpenCode). Status is green; run is red + approval. opencode_run runs only inside a conversation. Inside the task, OpenCode can read EYAS memory with the same read-only memory_search / memory_expand, locked to the conversation’s project and sharing the calling turn’s 3-call budget; it cannot write EYAS memory.

The EYAS browser tools, agent_browser_*, browser_use_* and opencode_* also reach CLI models (Claude Code, Grok, Kimi) over the EYAS bridge, under the same gate, approvals and tool scope as on API models.

Studio (optional module)

Local engines, not Media. See Studio.

ToolPurpose
hyperframes_*HTML composition → deterministic MP4 (Hyperframes)
videouse_*Footage + EDL → MP4 (Video Use)

Screen-capture polish is not a Studio tool. Recordly is an AGPL companion under Extensions — no recordly_* tools.

Email (draft → approve → send)

ToolPurpose
email_create_draftCreate local draft
email_approve_draftMark draft approved
email_send_draftSend only if approved

Odoo (optional module)

Live instance (JSON-RPC):

ToolPurpose
odoo_search_tasksSearch tickets/tasks (read-heavy)
odoo_get_taskFetch one task
odoo_message_postPost chatter message
odoo_write_taskGated write

Local source index (coding chain):

ToolPurpose
odoo_search_modelFind _name / _inherit in local Python
odoo_search_fieldFind fields.* assignments
odoo_search_xml_idFind XML record ids

Roots resolve from: conversation/project pin → Search Sources (family: odoo) → EYAS_ODOO_SOURCES_JSON / EYAS_ODOO_SOURCE_PATHS. Optional tool filters: label, labels, sourceIds, version, edition. Citations: [source:odoo-src:label:file:line].

Skill: coding/odoo/odoo-dev-chain. Live credentials via Connections (Odoo type). Multi-version UI: Search · Projects · conversation Sources tab.

Connections inventory

ToolPurpose
connections_list / connections_catalogInventory + catalog
connections_testHealth check
connections_proposePropose connection for human approval

Media (optional module)

Connect Magnific, Higgsfield, fal, or HeyGen under Media. Agents get five shared tools, not one per vendor model. Talking-head / presenter video: pin provider: heygen.

ToolPurposeRisk
media_generateStart image / video / audio / upscale / edit / 3dyellow
media_waitPoll until the job is terminalyellow
media_catalogList models for a kindgreen
media_balanceCredits remaininggreen
media_historyRecent jobsgreen

Completed files ingest into Documents and attach to the producing turn.

Other registered groups

These appear in the catalogue when their module is enabled: board tools, conversation tools, document tools, knowledge tools, research tools, schedule tools, channel send/list, A2A delegate, and optional Google Docs.

Agent-owned routing (registered by the agent module, not duplicated in this catalogue):

ToolPurposeRisk
run_specialistSpawn an enabled specialist and wait for the summary. Alias: delegate_to_agent. The one way to run specialists on every provider — Claude Code’s own subagent tool is not offered.green
handoff_to_colleagueOpen another colleague’s home thread and start a run there at once, with the brief as its goal; refused while that thread is busy.green
assign_taskAsynchronous board card for an enabled agent.green
propose_teamCard for missing roles, epic work, or an explicit team ask.yellow
propose_agent_creationPropose a new specialist template.yellow

See Teams & delegation.

CLI MCP parity

When agents run on Grok CLI or Kimi Code CLI, EYAS injects a stdio MCP bridge so those hosts share the same ToolExecutor tools as in-process / Claude Code sessions — memory tools included. Each turn has its own secret, bound on the server to that conversation, agent, project, folders and tool scope, and bridged calls still pass the security gate. On both bridges — Claude Code’s in-process EYAS MCP server and the Grok/Kimi bridge — a CLI gets exactly the agent’s Tools list plus memory_search / memory_expand (all tools when the list is empty), no delegation tools in a Solo conversation, and not the tools for which the CLI’s own equivalent is granted (read_file, grep, glob always; write_file, edit_file while the list grants writing; run_command, git_status, git_diff while it grants the shell). The same list also limits the CLI’s own write, shell and web tools (see Agents — Tools). A call to any other tool is refused and shows as Denied. EYAS tests the bridge at every start and logs a warning when Grok/Kimi cannot reach EYAS tools. Each host names the tools its own way (Grok: use_tool with eyas__<name>). See MCP.