Agent Tools
Built-in tools available to the Foxl desktop agent
The Foxl desktop agent comes with a set of built-in tools organized into profiles, plus a few capability-gated tools (like generate_image) that register automatically when their credentials are available. Which built-ins are loaded is decided by the tool profile (Full by default - see below), not per message; skill-provided tools and your own custom tools are added on top of whichever profile is active.
Browser
| Tool | Description |
|---|---|
| browser | The agent-browser CLI (Rust + Playwright) driving Foxl's own Chrome profile under ~/.foxl/browser-profile - open <url>, snapshot -i, click @ref, fill @ref "text", screenshot. Asks first, unless you auto-approve it. See Browser Automation |
| browser_extension | Control your real Chrome tabs via the Chrome extension |
Code & Files
| Tool | Description |
|---|---|
| file_read | Read files from your filesystem |
| file_write | Create or overwrite a file. Asks first, unless you auto-approve it |
| code_search | Search across your codebase with ripgrep (regex, file type filters) |
| view_image | View and analyze images |
Shell & System
| Tool | Description |
|---|---|
| exec | Run shell commands (bash, zsh, etc.) - covers git, npm, curl, and arbitrary shell pipelines |
| process | List, monitor, and kill running processes |
| terminal | Persistent terminal session for stateful shell workflows |
Web
| Tool | Description |
|---|---|
| web_fetch | Fetch web pages and API endpoints |
Memory
| Tool | Description |
|---|---|
| memory_save | Save key-value pairs to the SQLite memory database |
| memory_recall | Search and retrieve from the memory database |
| workspace_memory_save | Save content to workspace markdown files (USER.md, MEMORY.md). Asks first, unless you auto-approve it |
| workspace_memory_search | Search across all workspace markdown files |
| workspace_memory_read | Read a specific workspace file |
| workspace_memory_edit | Edit sections within workspace files. Asks first, unless you auto-approve it; SOUL.md, HEARTBEAT.md and AGENTS.md are refused outright - edit those on the Workspace page |
| conversation_search | Search your own past conversations by content, so the agent can find what you decided last week |
Scheduling
| Tool | Description |
|---|---|
| schedule | Create, list, update, delete, and trigger schedules (cron, heartbeat, webhook) |
| feed_add | Heartbeat runs only - posts an item to your For You feed; urgent also raises a system notification. Never offered in a chat |
Agent
| Tool | Description |
|---|---|
| session_status | Get current date/time, timezone, and session info |
| sessions_spawn | Spawn an autonomous sub-agent for a parallel task (max 5 concurrent) |
| sessions_status | Check sub-agent progress |
| sessions_stop | Stop a running sub-agent |
Integrations
Integration tools are only available after you connect the corresponding account in Settings > Connect > Integrations.
| Tool | Actions | Description |
|---|---|---|
| outlook | 22 actions | Email (inbox, read, send, reply, forward, search, folders, drafts, attachments, contacts, move, categories, update), Calendar (view, meeting, availability, room booking, search, shared list), To-Do (lists, tasks, checklist) via Microsoft Graph API |
| slack | 16 actions | search_messages, whoami, get_recent_messages, channels_list, conversations_history/replies/add_message/open/members, check_replies_batch, users_lookup/profile_get, attachment_get_data, reactions_add/remove, file_upload |
These tools use OAuth user tokens - they act as you, not as a bot. Connect them under Settings > Connect > Integrations.
Channels
| Tool | Description |
|---|---|
| channel_send | Send messages or files to connected channels (Telegram, Slack, Signal). Asks first, unless you auto-approve it; a file outside your workspace or a recipient outside the channel's allowlist is refused either way |
Media
| Tool | Description |
|---|---|
| generate_image | Generate or edit PNG images with gpt-image-2 through your ChatGPT Plus/Pro subscription. Pass inputImages paths to edit or compose from existing images; omit for pure text-to-image. Auto-saved as generated/generated-<YYYY-MM-DD>-<slug>.png inside your workspace (~/.foxl/workspace/ on an installed app). |
generate_image uses your ChatGPT subscription, not an OpenAI API key. The tool only registers when an OAuth credential file is found at ~/.codex/auth.json, ~/.chatgpt-local/auth.json, or the path set by CODEX_HOME / CHATGPT_LOCAL_HOME. No additional billing outside your existing $20/month plan.
Image editing and composition
Pass one or more existing image paths as inputImages to switch from text-to-image into edit / compose mode. When you drag images into the chat, Foxl auto-persists them to attachments/ inside your workspace and injects the absolute paths into your message, so the agent can reference them without base64 round-tripping through the model's tool-call args.
Examples the agent can drive end-to-end:
| Prompt | What the agent does |
|---|---|
| "이 사진 만화풍으로 바꿔줘" (attach a photo) | Calls generate_image({ prompt: "convert to watercolor anime style", inputImages: ["<path>"] }) |
| "이 두 이미지 합쳐서 하나로" (attach 2+ photos) | Calls generate_image({ prompt: "compose both subjects into one scene", inputImages: ["<a>", "<b>"] }) |
| "blog hero: a cozy cafe at dusk, 1536x1024" | Calls generate_image({ prompt: "...", size: "1536x1024" }) |
Up to 10 input images per call. Output PNG lives at a date-stamped filename with a slug derived from the prompt, in a generated/ subfolder to keep your workspace root clean.
Tool Profiles
Foxl uses tool profiles to control how many tools are loaded, saving tokens in the system prompt. A tool definition costs roughly 200 tokens, so the profile is a direct trade of capability against every turn's input:
| Profile | Tools | Token Cost | What it adds |
|---|---|---|---|
| Minimal | 9 | ~1,800 | memory, workspace, conversation search, session status, view image |
| Default | 15 | ~3,000 | + file read/write, exec, process, channel send, generate image |
| Standard | 18 | ~3,600 | + code search, web fetch, terminal |
| Full | 24 | ~4,800 | + browser, browser extension, schedule, sub-agents |
The agent runs in Full profile by default. Switch profiles on the System tab of Settings > Connect > Integrations to save tokens on simpler tasks; the same tab lists every built-in and lets you switch one off. generate_image lives in the media category and is included in Default, Standard, and Full; Minimal omits it to preserve its token budget.
Integration tools (outlook, slack), skill-provided tools and your own custom tools are not counted above and are not filtered by the profile - a tool you connected or wrote is available whichever profile you are on.
Git operations route through exec (e.g. exec git status, exec git push). There is no dedicated git tool - piping and custom flags work better from exec anyway, and exec's own approval rule covers them.
The same tools in Foxl Notes
The same tools serve Foxl Notes. Ask the Notes assistant something and it can open your files, search your code and notes, fetch a link or run a command - whatever the System tab has switched on, custom tools and MCP servers included - and it lists the tools it used under the answer. The floating meeting panel's ask bar runs on the same engine, and questions asked there and in the main window land on one thread. One switch governs both, Settings > Notes > AI features > Use Foxl Agent tools, on by default; with it off the assistant reasons about the transcript alone. It needs Foxl running on your computer. The automatic work - the post-meeting summary, the auto title, live translation and dictation clean-up - deliberately uses no tools, so nothing you were not waiting for got slower.
Custom tools
Beyond the built-ins you can add your own on the Custom tab of Settings > Connect > Integrations, which also lists your MCP servers. Six kinds:
| Type | What it is |
|---|---|
| shell | Runs a shell command. |
| script | Evaluates JavaScript. |
| file | Reads or writes a file, from a path template. |
| http | Calls an HTTP endpoint. |
| mcp_local | An MCP server started as a local process (stdio). |
| mcp_remote | An MCP server reached over HTTP. |
A custom tool that runs a shell command, evaluates JavaScript, or writes a
file is gated exactly like the built-in exec tool. That was not always
true: the approval gate matches on a tool's name and treated an unrecognised
name as allowed, so a custom tool wrapping a shell command was a shell with no
per-call prompt - and it is the model that fills in the arguments.
A new install auto-approves every tool, so in the shipped default these calls do not prompt either. Turn that off in Settings > Safety and the per-call prompts appear for custom tools and built-ins alike; a rule you set yourself for a specific tool always wins. Read-only file tools, HTTP tools and calls to MCP tools are unaffected either way - but starting a local MCP server's program asks once regardless (the MCP servers section below explains). See Security.
A file tool's blocked-path list is applied to the path it actually opens, not
to the template - so ~ is expanded first (a ~/notes.md template works), and
/etc/passwd spelled //etc/passwd, reached through .., or under macOS's
/private/etc is covered.
Permission rules accept hyphens in a tool name. A custom tool called
deploy-prod keeps its name, and every MCP tool is exposed as
<server>__<tool> where the right half usually has one, so a rule written with
an argument pattern like deploy-prod(rm *) matches instead of being stored
under a name no tool is ever called.
MCP servers
Foxl is an MCP client. It speaks the current 2026-07-28 revision and every older one, and asks each server which revisions it supports so the newest one both sides know is used:
| Revision | Shape |
|---|---|
| 2026-07-28 | Stateless - no connection handshake, no session header. |
| 2025-11-25, 2025-03-26, 2024-11-05 | The older handshake. |
There is nothing to configure either way. The server's row on the Custom tab shows which revision was agreed, so a server on the new stateless protocol is visibly different from one on an older one.
Starting a local server asks first, once. An mcp_local row is a program on
your computer, so the first time its command is started - when you save the row,
re-check it, open it in the inspector, or the agent first uses one of its tools -
Foxl shows the command it is about to run and asks. The answer is kept for that row
until its command, arguments or environment change; an approved server starts
silently from then on, and calls to its tools are not prompted. This is asked even
with auto-approve all tools switched on, because that switch is about tool calls
rather than about starting programs, and if nobody answers, nothing is started.
Servers you configured before this rule show as needing approval, and the agent
does not see their tools until you press the re-check button beside each one and
approve the command it shows. An mcp_remote row is a URL - nothing is started, so
nothing is asked.
Two things worth knowing:
- A long tool list is read in full. Servers may hand their catalog over in pages; Foxl walks every page rather than reading the first one and treating it as the whole list.
- A slow tool is not called twice. When a tool took longer to answer than the app was willing to wait, the app used to assume its guess about the protocol was stale, reconnect, and send the same request again - so a tool that sends mail sent it twice while the agent saw one call and one error. It now retries only when nothing can have reached the server, or when the request is a read that cannot have an effect.
Skills
Beyond built-in tools, Foxl supports skills - installable capability packages that extend what the agent can do. See Skills for the full catalog.