Tools
System, settings and connectors
Finding any tool, connecting apps over MCP, changing Mori's own look and mode, and the controls for your computer, calendar, music and home.
What this family is for
This family holds the tools about Mori herself, how she finds tools, connects apps and checks her own health, and the small controls for the machine around her: volume, dark mode, your calendar, your music and a Home Assistant house.
Finding the right tool
Every request carries one short list of everyday tools. tool_search finds any other tool, native or from a connected app, by what it does, tool_describe returns its full parameters, and tool_call runs it. tool_call grants nothing a direct call would not: the same permissions, the same rails and the same record. See Tool catalog.
Connecting apps
mcp_catalog lists the directory of connectors Mori knows, with what each does and how it signs in. mcp_connect stages one into your setup switched off and holding no secret; you finish on the MCP page by pressing Connect. Mori never asks you to paste a key into the chat. A server outside the directory is added by pasting its link on the MCP page. See MCP.
set_role turns on a role preset, such as UI/UX Designer or Researcher, which suggests a depth and the connectors worth setting up, and never stages them unasked.
Changing Mori's own settings by chat
configure_app changes the safe, cosmetic settings: the theme, a theme made from a picture, the mode and depth, spoken replies and voice, sidebar density, chat font size and the model. It cannot touch permissions, autonomy, keys, spend amounts, bot tokens or your account; those are refused, and she tells you where to change them yourself.
Checking herself
run_self_testexercises the shell, files, keyboard, mouse, app detection, the active window and screen capture on your actual machine, and says which pass. See Proof, not promises.context_reportshows what this turn's request is made of, tools, instructions and history, as approximate shares, for when something is slow or costly. See Usage.list_devicesreports which of your computers are signed in to your account. It only reports; nothing runs on another machine from here.
Your computer, calendar and music
system_controlsets the volume, mutes, switches dark mode, sleeps the displays, locks the screen and turns Wi-Fi on or off.music_controlplays, pauses and skips in Spotify or Apple Music, whichever is running. Making new music ismusic_generate, in Pictures, video, sound and worlds.- The calendar tools read upcoming events and add events and reminders in the Calendar and Reminders apps on the Mac. On Windows they use the system calendar, and a reminder becomes a calendar alert because Windows has no Reminders app.
show_notificationshows a desktop notification, andspeak_aloudsays a sentence or two out loud. A voice needs your own voice key or a paid plan.
A Home Assistant house
The Home Assistant tools list your devices, read one in full, list the actions you can call, and call one: a light, a thermostat, a lock, a scene. They appear only once Mori has your Home Assistant address and token, and make no network call before that. Calling an action is a real change in your home, so she says what she is about to do, and checks the device afterwards when it matters. Actions that run code on the Home Assistant box itself are refused, because one token can do anything there.
Permissions
The tool bridges always run and leave the decision to the tool they reach. The machine, music, calendar and Home Assistant controls follow the App Launching switch in Settings > Permissions; reading Home Assistant always runs. The self test and the context report always run; changing settings by chat runs at the Standard and Full Agent levels.
Each description below is the exact text her model reads when it decides which tool to call.
Your tool list carries the everyday tools, and the catalog has many more: git and pull requests, calendar and reminders, email, the task board, memory files and skills, Chrome and the operator browser, desktop control, music and system, documents, spreadsheets and PDFs, social posts, schedules and workflows, terminal and CLI sessions, devices, and every connected app (MCP). Search it by what you need to do, in a few words ("git commit", "calendar event", "ocr image"). The best matches come back with their parameters, so run one straight away with tool_call.
Get the full parameter schema of one tool from the catalog (found via tool_search) before calling it with tool_call.
Run a catalog tool that is not in your tool list, by exact name: anything tool_search found, a connected app's tool, or one your instructions name. Same permissions and gates as a direct call. Pass its own arguments in args_json, as a JSON object.
Browse Mori's curated MCP connector directory (GitHub, Sentry, Linear, Notion, Supabase, Figma, Playwright, Context7, Stripe and more). Lists name, category, what it does, auth model, and whether it is spend-guarded. Use when the user asks what Mori can connect to, or before mcp_connect. Optional 'category': dev, data, productivity, design, web, memory, reasoning, research, payments.
Stage a directory connector into the user's MCP config, switched off and holding no secret. Relay the reply's next step exactly (usually: press Connect on its row in the MCP page). A server outside the directory is added by pasting its link into the MCP page. NEVER ask the user to paste keys into chat. 'connector' is a name or id from mcp_catalog.
Set up an MCP server IN MORI (its MCP page, More > MCP), for any server that is not in Mori's own directory (a directory connector goes through mcp_connect). Give the launch command and its arguments for a local server (stdio: command 'npx', args ["-y","some-mcp-server"], or 'node' with the absolute path of a built server), or the https endpoint of a remote one. A Python server takes python_package, and Mori installs it in her own virtual environment (never pip install it in a terminal). Secrets by NAME only (env_names): the person fills the values on the MCP page, never in chat. It asks the person first, saves the server, starts it and lists the tools it answers with. When someone asks to set up or add an MCP server, this is how; never write a Claude Desktop, Cursor or other app's config for it unless they ask for that app. End by naming the server you picked and what this tool said about connecting it.
Change SAFE, cosmetic app settings for the user by chat: theme (say "dark" for Night, "light" for Porcelain, or a theme by its name: Porcelain, Overcast, Mist, Paper, Night, Deep night, Terminal, ASCII, Sakura, Slate), the mode (build|spark|trance|forge|swarm: what Mori may do), the depth (instant|quick|balanced|deep|max: how hard she thinks), spoken replies on/off, ElevenLabs voice id, sidebar density (simple|standard|pro), chat font size (sm|md|lg), scheduled-run notification level (info|warning|alert), the active model id for the CURRENT provider, and imagePath to build a whole theme out of a picture. Pass only the fields you want to change. Changes apply and persist immediately. This can NOT touch autonomy/permissions, provider API keys, spend caps, bot tokens or ownership, or the account: those are refused, and you should tell the user to change them in Settings themselves.
List or activate a role preset (UI/UX Designer, App Builder, Full-Stack Coder, Researcher, Marketer, Everyday Assistant). A preset bundles a default gear, an output register, and the connectors worth setting up. Call with no 'role' to list; with 'role' to activate (or 'off' to clear). Suggest the preset's default gear and offer mcp_connect for its connectors, never stage them unasked.
Show what THIS turn's request to the model is actually made of, tool schemas, system prompt, conversation history, in approximate tokens and shares. Use it when the owner asks why something is slow or expensive, when you are deciding whether to compact, or before recommending a lighter gear. The numbers are estimates from character counts, not a tokenizer, so quote them as approximate and compare shares rather than absolutes.
Run Mori's built-in DIAGNOSTICS, actually exercises the terminal, file access, keyboard, mouse, app-detection, active-window, and screen-capture subsystems on THIS machine and reports which pass/fail. Use when the user asks you to 'test yourself', 'run diagnostics', 'check what works', 'are your tools working', or when troubleshooting why actions keep failing (especially on Windows).
Control the machine itself: set_volume (0-100, pass 'value'), mute, unmute, dark_mode_on, dark_mode_off, sleep_displays, lock_screen, wifi_on, wifi_off. Use when the user says 'turn it down', 'dark mode', 'lock my screen'.
Control music playback: play, pause, playpause, next, previous, or now_playing (the current track). Works with Spotify and Apple Music, auto-picking whichever is running, or pass 'app'.
Show a native desktop notification
Say something OUT LOUD through the computer's speakers, in whichever voice the owner has configured. Use it when they ask you to read something aloud, want a spoken heads-up while away from the screen, or are working hands-free. It speaks; it writes no file and sends nothing anywhere. Keep it to a sentence or two, that is what people actually want to hear.
Which of the owner's computers are signed into this Mori account right now, which OS each runs, whether it is this machine, and whether someone appears to be sitting at it. Use it when they ask about their other machine, or before claiming anything about one. You can only REPORT on other machines, never run anything on them.
Read the user's upcoming calendar events (macOS Calendar), for 'what's on my calendar', daily briefs, scheduling around their day. Returns events in the next N days.
Add an event to the user's calendar (macOS Calendar). Give a title and an ISO start time; duration defaults to 60 minutes.
Add a reminder to the user's Reminders app (macOS), for 'remind me to call mom tomorrow at 5'. Optional ISO due time; otherwise it lands undated in the default list.
List the devices in the user's Home Assistant: lights, switches, sensors, locks, climate, media players, scenes, scripts. Returns entity_id + current state + friendly name. Start here when they say 'the kitchen lights' or 'is the garage open' and you don't know the exact entity_id yet. Filter by domain (light, switch, sensor, climate, lock, cover, media_player, scene, script, automation) or by area/room name.
Read one Home Assistant entity in full: its state plus every attribute (brightness, colour, temperature, battery, position, last_changed). Use after ha_list_entities when you need the detail behind a single device, or to VERIFY that a change you made actually took effect.
List the Home Assistant services (actions) you can call, with their parameters, light.turn_on, climate.set_temperature, cover.open_cover, media_player.volume_set, scene.turn_on and so on. Use when you know the device but not the right service or field names. Filter by domain to keep it short.
Actually DO something in the house: turn a light on or off, set a temperature, lock a door, open a cover, run a scene or script. Calls a Home Assistant service. This is a real change in the user's home, so say what you are about to do. Domains that execute code on the Home Assistant host (shell_command, command_line, python_script, pyscript, hassio, rest_command) are refused. Verify with ha_get_state afterwards when it matters.