Sara
This server lets you read Sara's memory, planner, notes, and document library, and send her messages or add tasks, notes, and approved facts.
Search Sara's long-term memory about the owner and list learned facts.
View summaries of recent conversations.
Check today's agenda, reminders, calendar events, and coming-up dates.
List and filter the owner's to-dos.
Search the document library and quote matching passages.
List notes and read a specific note by id.
Ask Sara a message and get her reply using her memory and personality.
Add to-dos and notes to Sara's planner.
Ask Sara to remember a fact, which the owner must approve in Sara.
Provides a Discord bridge for chatting with Sara and receiving voice notes.
Supports a helper workflow that starts from a GitHub issue and produces a reviewed pull request.
Connects to Gmail through your own Google app for email access.
Connects to Google Calendar through your own Google app for calendar access.
Integrates with Home Assistant for home automation interactions.
Uses local Ollama models as a model provider.
Connects to OpenAI for cloud models and realtime voice, and exposes an OpenAI-compatible API for other apps.
Provides a Telegram bridge for chatting with Sara, receiving reminders, and exchanging voice notes.
Sara
A self-hosted AI companion with a personality you choose, who is also a real coding partner. She chats, remembers, plans, reads your documents, and builds and tests software in a sandbox, on your own server, with the models you pick.
Status: 1.7, MIT licensed, with seven feature releases since 1.0 (all below). The Android app is on Google Play; the iPhone app and the Mac App Store version are coming as soon as Apple approves them. Read docs/DISCLOSURES.md before using or sharing Sara.
What's new
Release | What you get |
1.7 · Private local mode | One switch, Nothing leaves this computer, enforced in code at a single gate: only this computer is reachable, cloud models and online tools pause, and her chats, memory and library keep working. The Windows and Mac apps find (or help you set up) Ollama, suggest a model that fits your graphics card and download it with a progress bar. What it guarantees |
1.6 · Group chats | Put two to four of your companions in one conversation: each answers in her own personality, voice and colour; pick who answers (whoever fits, everyone, take turns, or only who you @mention) and how much they banter with each other. Safety, AI notices and the strictest adult setting apply to the whole room. How it works |
1.5 · Bring her from another app | Move in from ChatGPT, Claude, Character.AI, SillyTavern, Replika, Nomi or Kindroid. She reads the export on your own server, then shows you what she learned (facts in your own words, your history together, her style) and saves only what you approve. How to export from each app |
1.4 · Smoothness | Watch each file she writes grow live in the chat as the model streams it (OpenAI, Anthropic, xAI, OpenRouter and ChatGPT plans; Ollama sends it in one piece); a talking portrait that lip-syncs with nine mouth shapes; logs in plain text or JSON |
1.3 · Smarter checks | Her "did she really do what she says?" check now works in all six languages; an optional small local model as judge raises what it catches from 38% to 88% at 95% precision (measured) |
1.2 · Fully in your language | The whole app, the help guide and her server messages in English, Español, Français, Deutsch, Português (Brasil) and Italiano |
1.1 · Install anywhere | Set up a new server in the browser with a short code; a Docker image for ARM (Raspberry Pi 4/5) too; Homebrew, Unraid, TrueNAS, Proxmox and Home Assistant (HACS) |
Every release: CHANGELOG.md · releases.
Coming next
Version | Feature |
1.8 | Several servers in one app: the desktop, phone and other apps keep a list of your Saras and switch between them without signing out |
1.9 | Video calls with her moving, lip-synced avatar |
1.10 | Our moments: a shared photo album with her captions |
2.0 | Household mode: several people on one server, each with their own companions and private data |
2.1 | Her voice in your home: Alexa ("Alexa, ask Sara…"), Android's assistant and Google Home, Siri Shortcuts, and reacting to who's home through Home Assistant |
2.2 | Your other servers over SSH: with a password or a key; after a password login she makes her own key, tells you where it is, and keeps the password only if you ask (with a warning) |
2.3 | Big documents: 500–1,000-page PDFs and books in her library, every scanned page read, answers with the page numbers |
The full plan: docs/ROADMAP.md.
Related MCP server: konbu
Why Sara
Fun to be around. Name her anything, pick she/he/they, set her personality with simple dials (or start from a ready-made character), and she keeps it: moods, her own day, running jokes, and memories of what you told her that you can see, correct and forget.
Useful for real work. Files, shell and git in a sandboxed workspace, background jobs, live previews she tests in her own browser, a team of helpers for bigger jobs, and a check that what she says she did matches what actually ran.
Yours. One owner per server; your chats, memories and keys stay there. Bring any model: local (Ollama, vLLM, llama.cpp), cloud (OpenAI, Anthropic, xAI, OpenRouter) or the subscriptions you already pay for (ChatGPT plan, Claude Pro/Max, SuperGrok / X Premium+). Ships with no credentials of any kind.
Small and readable. TypeScript that Node runs directly: no build step, zero runtime dependencies, built from the ground up (not based on Hermes Agent or OpenClaw). Easy to extend.
Feature tour
Companion
Her own character and moods that change with how things go, her own day and hobbies, memory of what matters to you and the dates you care about (see, correct or forget any of it), a weekly look back, texting first if you want (with quiet hours), and a timeline of your story together. Coming from another app? Bring your chats from ChatGPT, Claude, Character.AI, SillyTavern, Replika, Nomi or Kindroid, and approve what she learns from them first (docs/IMPORT.md). Or bring two to four of your companions into one group chat (docs/GROUP_CHATS.md). Want everything on one machine? Switch on Nothing leaves this computer (docs/PRIVATE_LOCAL.md).
Coding partner
A workspace per project with files, shell and git (commit and push with your OK); every file she writes appears live in the chat as the model streams it (on cloud models; Ollama sends it whole); long builds and tests in the background with a ping when done; a live preview of the app she's building, which she tests in a real headless browser and attaches screenshots of; a code map for big codebases; tested starter projects; a team of helpers (plan → build → test → review) from a GitHub issue to a reviewed pull request; hand-off to Claude Code or Grok Build; MCP tools; undo for file changes; a token and cost meter with budgets; and a check, in all six languages, that what she says she did matches what actually ran (optionally judged by a small local model).
Planner and Today
To-dos, notes and reminders from plain sentences, delivered in chat, on your phone and on Telegram or Discord; a morning briefing and a Today page.
Library
Give her PDFs (scans too), Word, Excel, PowerPoint, e-books, web pages and notes. She learns the key points, answers from them and says which document (and page) it came from.
Voice
Live calls you can interrupt (Grok or OpenAI realtime voice), voice notes on Telegram and Discord, read-aloud, a voice that follows her mood, and an animated portrait that talks, lip-synced with nine mouth shapes. Voices run on your Linux server or come from your subscription. (Screenshot from a Windows test server, where local voice isn't available yet.)
Everywhere
Web app and installable PWA, Android and iPhone apps (android/,
ios/), desktop apps for Windows and macOS (docs/desktop.md),
Telegram and Discord bridges, sara-chat in any terminal and a VS Code panel
(docs/clients.md), Gmail and Google Calendar on your own Google app, Home
Assistant, off-the-record conversations that are never saved, and other apps with her own memory
and personality: an OpenAI-compatible API (SillyTavern, Open WebUI, scripts), an MCP server (Claude
Code, Cursor, Claude Desktop; listed on Glama) and character cards in and out (docs/OTHER_APPS.md).
Make it yours
Any name, pronouns, age and look (painted by Grok Imagine, with matching expressions and animation), a guided "create your companion" wizard, personality dials, a gallery of starter characters, character files you can share, a model for each job, and the whole app, help guide and her messages in six languages. Every setting has a ?, there are short guided tours, and you can simply ask her how something works.
Safety, always on
Risky actions wait for your OK (on Windows, which has no command sandbox, every command does). The
safety layer runs in code around every model call and cannot be switched off: AI disclosure at
the start and regularly after, an honest answer whenever she's sincerely asked if she's an AI,
crisis resources, and a hard block on sexual content involving minors
(docs/COMPLIANCE.md, docs/THREAT_MODEL.md). Daily
backups (plus encrypted off-server copies), one-command restore and update, and sara doctor keep
her healthy.
How it fits together
More in docs/ARCHITECTURE.md.
Tested, with published results
Everything below was run for real; the scripts are in the repository, so you can re-run them on your own models. Dates, setup and the result files: docs/RESULTS.md.
Benchmark | Model | Score | Date |
HumanEval, through her agent loop (164 problems, hidden tests) | qwen3.8 27B, local | 158/164 (pass@1 96.3%) | 2026-10-27 |
HumanEval, same model with no tools (baseline) | qwen3.8 27B, local | 161/164 (pass@1 98.2%) | 2026-10-27 |
Repository tasks: 14 original multi-file bug fixes, features and refactors (hidden tests), through her agent loop | qwen3.8 27B, local | 11/14 (both runs) | 2026-10-28 |
Repository tasks, same model with every file in one prompt and no tools (baseline) | qwen3.8 27B, local | 12/14 (both runs) | 2026-10-28 |
Real-size projects: 3 original projects of 22–36 files (hidden tests), through her agent loop | qwen3.8 27B, local | 2/3, then 3/3 | 2026-10-28 |
Real-size projects, same model with every file in one prompt and no tools (baseline) | qwen3.8 27B, local | 3/3 (both runs) | 2026-10-28 |
Claim check in 6 languages (240 held-out replies): patterns only → with a local judge | qwen3.5 9B, local, as judge | caught 38% → 88%, precision 92% → 95% | 2026-10-28 |
Memory across sessions (recall, no inventing, forgetting) | qwen3.8 27B, local | 11/12 checks | 2026-10-27 |
Library: answers from documents and says where | qwen3.8 27B, local | 8/8 in both runs | 2026-10-27 |
Code map: questions about her own code | qwen3.8 27B, local | 8/8 | 2026-10-27 |
The honest reading: her agent loop doesn't add points on either coding benchmark yet. The plain model already aces the short HumanEval problems, and the 14 repository tasks are small enough (5 to 7 files) to paste whole into one prompt (so are the three real-size projects, at under 1,100 lines); the misses in both modes were rules written only in a README or SPEC that no test checked. What she adds today is the way of working (she runs the tests, asks before risky steps, shows what ran), not a higher score on these sets. Details, per-task results and how to re-run: docs/RESULTS.md.
Plus npm run check: a typecheck and 685 automated tests with a scripted fake model (no network,
no GPU): 678 pass on Windows and the other 7 are Linux-only sandbox tests, run on a Linux server.
How Sara compares
A general comparison with the usual kinds of alternatives (individual products vary):
Sara | Hosted AI companion apps | Coding CLIs and agents | Self-hosted chat UIs | |
Runs on your own computer or server | ✅ | ❌ | ✅ | ✅ |
Use any model, including local ones | ✅ | ❌ usually theirs | varies | ✅ |
Lasting personality and memory you can see and edit | ✅ | ✅ | ❌ | varies |
Writes, runs and tests code, asks before risky steps | ✅ | ❌ | ✅ | varies (plug-ins) |
Planner, reminders, documents, voice calls | ✅ | some | ❌ | some |
Phone apps, Telegram and Discord | ✅ | phone apps | ❌ | varies |
Bring your chats from other companion apps, reviewed before saving | ✅ | ❌ usually | ❌ | varies |
The whole app in six languages | ✅ | varies | varies | varies |
Safety layer that no setting can turn off | ✅ | their own policies | n/a | usually not |
Price | free (MIT); you pay for your models | subscription | varies | usually free |
Install
Linux server (Debian/Ubuntu, Fedora/RHEL/Alma/Rocky, Arch, openSUSE), one command that asks a few plain questions (press Enter for the suggestion):
curl -fsSL https://raw.githubusercontent.com/farena-ai/sara/main/deploy/get-sara.sh | sudo bash
# it ends with the address to open and your one-time owner token
sudo sara statusDocker:
git clone https://github.com/farena-ai/sara && cd sara
sudo docker compose up -d # or: sudo docker compose --profile ollama up -d (with a local Ollama)
sudo docker compose logs sara | grep -A1 'owner token' # or: open her page and enter the setup code from this logApp stores and NAS: the image ghcr.io/farena-ai/sara (amd64 and ARM),
brew install --cask farena-ai/tap/sara, TrueNAS, Proxmox and HACS (as a custom repository) work
now; Unraid is approved, and winget, CasaOS/ZimaOS, Umbrel and the HACS store list are waiting for
review
(which is which). A new server is set up in the browser
with a short code from her log (one click on Umbrel), no long token to copy.
Windows and macOS: download Sara-Setup-<version>.exe or Sara-<version>.dmg from the
releases page. The first question: run Sara on
this computer (her server and the desktop app together) or connect to a Sara somewhere else (the app
only).
Phones: the Android app is on Google Play; pair it by scanning the QR code under Settings → Data & health → Devices and sign-in → Add a phone or computer. The iPhone app is coming to the App Store soon (until then, add Sara to your home screen from Safari).
From source (any computer with Node 24+):
git clone https://github.com/farena-ai/sara && cd sara
npm ci
npm start # http://127.0.0.1:7860; the token is in the outputSign in with the token (or the setup code), and a setup guide asks your name, helps you shape your companion and connects a model. Reaching her from your phone (Tailscale, your own web address with HTTPS, or your home network), updates, backups and troubleshooting: docs/INSTALL.md.
Day to day
sudo sara status # is she running, last backup
sudo sara update # backs up, updates, restarts
sudo sara backup # back up now
sudo sara restore FILE # restore a backup
sudo sara access # how you reach her (change: tailscale, local, domain, lan)Documentation
Linux, Docker, Windows, macOS, HTTPS, updates, troubleshooting | |
Before you start: hardware, models with GPU sizes, running costs | |
Phone setup start to finish; backup, install, restore | |
Five minutes after installing; every outgoing connection and how to turn it off | |
Common questions, and what the words mean | |
Terminal, VS Code, Windows and macOS; Sara in Home Assistant and Home Assistant in Sara | |
OpenAI-compatible API (SillyTavern, Open WebUI, scripts), MCP (Claude Code, Cursor, Claude Desktop), character cards; importing chats from Character.AI, SillyTavern, Replika, Nomi, Kindroid, ChatGPT or Claude | |
Add tools, bridges, characters, MCP servers, languages, starters | |
How the pieces fit, module by module | |
Benchmarks and evals, and how to re-run them | |
The app in your language | |
Safety, security, what to know first | |
Where it's going, what changed |
All of these also build into a small searchable website with a dark mode:
node scripts/build-docs.ts writes it to outputs/site/ (open index.html; it's ready for GitHub
Pages).
Contributing
Contributions are welcome. Start with CONTRIBUTING.md and the good first issues; please follow the code of conduct and report security problems privately as described in SECURITY.md.
npm ci
npm run dev # http://127.0.0.1:7860, restarts on save
npm run check # typecheck + all testsLicense
MIT, see LICENSE. Credits for the pieces Sara downloads or calls: docs/CREDITS.md.
Available Tools
17 toolsadd_noteAdd a noteA
Save a new note (a title and free text, Markdown welcome) in the owner's planner in Sara, optionally in a project. Use update_note to change an existing note and remember_fact for a single fact about the owner. Returns "Saved note #id: title" (the #id works with read_note, update_note and delete_note). Only listed when the owner turns on "Let other apps change things" in Sara. Follows the owner's approval setting for her note tool (allowed, ask first, or off): when it asks first, it returns "Waiting for approval in Sara" and nothing changes until the owner presses Allow there; when it is off, it returns that it's turned off.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The note's text (Markdown is fine). Up to 20,000 characters. | |
| title | Yes | The note's title. Up to 200 characters. | |
| project | No | Planner project name to file it under, e.g. "Garden" or "Sara". Created if it doesn't exist. Up to 80 characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation profile (readOnly=false, idempotent=false, destructive=false); the description adds real operational context beyond that: the approval workflow ('Waiting for approval in Sara' and no change until Allow), the off-state response, and the availability gate. It also discloses the return string format and that the #id works with read_note/update_note/delete_note.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose in the first sentence, then alternatives, then return value, then gating — a logical progression with nothing clearly redundant. The final sentences are long and multi-clause, but each clause carries distinct behavioral information about approval modes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs for a non-idempotent creation tool with no output schema: side effects, return strings, ID reuse across sibling tools, availability precondition, and the three approval outcomes. Little is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so title, body, and project are already fully documented, including the 20,000/200/80 character limits and the create-if-missing project behavior. The description only restates 'title and free text, Markdown welcome' and that project is optional, adding no format or semantic detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Save a new note ... in the owner's planner in Sara, optionally in a project') and immediately distinguishes itself from update_note and remember_fact. An agent can pick this over its siblings without inspecting any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use update_note to change an existing note and remember_fact for a single fact. It also states the availability precondition ('Only listed when the owner turns on "Let other apps change things"') and the approval-mode behavior, which tells the agent exactly what to expect in each mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_taskAdd a to-doA
Add a new to-do to the owner's planner in Sara, with an optional due time, project and priority. Use update_task to change an existing one. Returns "Added to-do #id: title" (the #id works with complete_task, update_task and delete_task). A due time without an hour means 9:00 in the owner's time zone. Only listed when the owner turns on "Let other apps change things" in Sara. Follows the owner's approval setting for her todo tool (allowed, ask first, or off): when it asks first, it returns "Waiting for approval in Sara" and nothing changes until the owner presses Allow there; when it is off, it returns that it's turned off.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | When it is due, in words or as a date, read in the owner's time zone. Leave out for no due date. | |
| title | Yes | What to do, short. Up to 200 characters. | |
| project | No | Planner project name to file it under, e.g. "Garden" or "Sara". Created if it doesn't exist. Up to 80 characters. | |
| priority | No | How important: "low", "normal" (default) or "high". | normal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give a safety profile (readOnlyHint=false, destructiveHint=false); the description adds substantial behavioral detail beyond that: the exact return string and its embedded #id, the approval flow ('Waiting for approval in Sara'), the off-state response, and the 9:00 default for hourless due times. This is exactly the context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the primary alternative are front-loaded, and each sentence carries real information (ID usage, due-time default, approval modes). It is dense but slightly long with several semicolon-packed clauses, keeping it just below maximally crisp.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool gated by owner approval with no output schema, the description covers everything an agent needs: what it returns, how the ID is used downstream, the approval-gated outcomes, and the due-time interpretation. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters and their formats. The description still adds value by clarifying that a due time without an hour means 9:00 in the owner's time zone, which the schema does not state. It stops short of explaining every parameter, hence 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a new to-do to the owner's planner in Sara') plus the optional fields it supports. It explicitly distinguishes itself from update_task, so an agent can tell the create path from the edit path without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative ('Use update_task to change an existing one') and the condition that selects it. It also spells out the availability gate ('Only listed when the owner turns on...') and the approval-mode behavior, giving the agent concrete when-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ask_saraAsk SaraA
Send Sara a message and get her reply, as in a chat: she answers with her memory and personality in a conversation kept for this app, which the owner can read in Sara. Use it for questions, opinions or anything conversational; to store a fact on purpose use remember_fact, and to change the planner use the to-do and note tools. Returns her reply as plain text (with the AI notice when a new session starts). If her own tools are allowed for other apps and one needs the owner's OK, it returns a note that it is waiting for approval in Sara. Can take up to a few minutes; one key can have two replies running at once.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | What to say to her, in plain words. Up to 20,000 characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, but the description adds what annotations cannot: the conversation is persisted and owner-readable ('which the owner can read in Sara'), the reply is plain text, an AI notice appears on new sessions, an approval-pending note is returned, and calls can take minutes with up to two concurrent replies per key. The only gap is that 'her own tools are allowed for other apps' sits slightly against openWorldHint=false, though it describes a returned note rather than direct external interaction, so it is not a hard contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by routing, then behavioral caveats. It is dense but nearly every clause carries decision-relevant information; the approval-flow sentence is slightly convoluted but still earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the return value (plain text reply, AI notice, approval-pending note) and sets latency/concurrency expectations. For a one-parameter conversational tool, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already carries a description, examples, and length bounds, so the baseline is 3. The description only adds 'in plain words', which does not meaningfully extend the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Send Sara a message and get her reply, as in a chat') and immediately differentiates from siblings by naming remember_fact and the to-do/note tools. An agent can tell it is the free-form conversational entry point without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: use for 'questions, opinions or anything conversational', use remember_fact to deliberately store a fact, use the to-do/note tools to change the planner. This gives both when-to-use and named alternatives, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_taskComplete a to-doAIdempotent
Mark one of the owner's to-dos in Sara as done, by its id (from list_tasks or get_today). Use update_task with status "open" to reopen one. Returns "Done: to-do #id title". Marking a to-do that is already done changes nothing. Only listed when the owner turns on "Let other apps change things" in Sara. Follows the owner's approval setting for her todo tool (allowed, ask first, or off): when it asks first, it returns "Waiting for approval in Sara" and nothing changes until the owner presses Allow there; when it is off, it returns that it's turned off.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The to-do id: the number after # in list_tasks or get_today's results (e.g. 12 for #12). An unknown id is refused with an error and nothing changes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false. The description adds genuine context beyond them: the exact success string, that re-completing a done item is a no-op, and the three-state approval flow with its return strings (allowed / "Waiting for approval in Sara" / off). The only shortfall is that the idempotent no-op restates the annotation rather than extending it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then alternatives, then return value, then permission gating — a sensible ordering. The approval-gating sentence is long and packs three branches into one line, which costs a little readability but each clause carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the exact return string, plus the approval and disabled-state responses an agent must be able to recognize. Idempotency, error behavior, and permission prerequisites are all covered, so nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single id parameter already documents its provenance and the unknown-id error, so the baseline of 3 applies. The description reinforces the id source but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Mark one of the owner's to-dos in Sara as done, by its id") and implicitly scopes it against delete_task and update_task by naming update_task as the reopen path. An agent can distinguish it from every sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says where ids come from (list_tasks or get_today) and names the alternative for the inverse operation (update_task with status "open"). It also states the precondition that the tool is only listed when the owner enables "Let other apps change things", which is real when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_noteDelete a noteADestructiveIdempotent
Delete one of the owner's notes from Sara's planner for good, by its id (from list_notes). This can't be undone. Returns "Deleted note #id: title". Only listed when the owner turns on "Let other apps change things" in Sara. Deleting always waits for the owner: it returns "Waiting for approval in Sara" and nothing changes until the owner presses Allow there (even when her note tool is set to allowed); when that tool is off, it returns that it's turned off.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The note id: the number after # in list_notes's results (e.g. 12 for #12). An unknown id is refused with an error and nothing changes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds substantial context beyond them: irreversibility, the exact success string returned, the approval handshake ('Waiting for approval in Sara') and the fact that nothing changes until the owner presses Allow, plus the disabled-tool response. That is precisely the kind of workflow/auth behavior annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and irreversibility, and every sentence carries information an agent needs. The final sentence is a long run-on that chains the approval flow and the disabled-tool case together, which slightly hurts readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description covers availability gating, irreversibility, return strings and the approval lifecycle. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the id property already documents the '#12' format and the refusal behavior for unknown ids. The description's 'by its id (from list_notes)' restates that pointer without adding format or validation detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete one of the owner's notes from Sara's planner') and scopes it by id, pointing at list_notes as the source of that id. An agent can distinguish it from update_note/add_note/read_note purely from the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the gating condition under which the tool is even visible (owner must enable 'Let other apps change things') and the approval requirement, which tells the agent when a call will actually take effect. It does not, however, name alternatives such as update_note for non-destructive edits, so it stops short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_taskDelete a to-doADestructiveIdempotent
Delete one of the owner's to-dos from Sara's planner for good, by its id (from list_tasks or get_today). This can't be undone; to tick a to-do off instead, use complete_task. Returns "Deleted to-do #id: title". Only listed when the owner turns on "Let other apps change things" in Sara. Deleting always waits for the owner: it returns "Waiting for approval in Sara" and nothing changes until the owner presses Allow there (even when her todo tool is set to allowed); when that tool is off, it returns that it's turned off.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The to-do id: the number after # in list_tasks or get_today's results (e.g. 12 for #12). An unknown id is refused with an error and nothing changes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint/readOnlyHint annotations: it discloses irreversibility, the exact success string, the mandatory owner-approval gate and its 'Waiting for approval in Sara' response, and the 'turned off' outcome. This is precisely the operational context an agent needs before attempting a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and a one-line sibling contrast; every sentence carries usable information. It is dense — the availability and approval clauses are stacked in long sentences — but nothing is truly wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, it covers return values, irreversibility, approval gating, error path (via schema), and availability conditions. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already explains that id is 'the number after # in list_tasks or get_today's results', so the description's mention of the id source is largely redundant. Nothing is added about the integer constraint or the refusal-on-unknown-id behavior beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete one of the owner's to-dos from Sara's planner ... by its id') and immediately distinguishes itself from the nearest sibling by contrasting deletion with complete_task's ticking-off. An agent can tell exactly what this does without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative ('to tick a to-do off instead, use complete_task') and the id source ('from list_tasks or get_today'). It also states the availability precondition (the owner must enable 'Let other apps change things'), which is real when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_todayGet today's agendaARead-onlyIdempotent
Get the owner's agenda for today in one view: to-dos due today or overdue (and high-priority ones without a date), reminders in the next 24 hours, calendar events when a calendar is connected, and birthdays or other dates that matter coming up. Use it for "what's on today"; use list_tasks for the whole to-do list with filters. Returns plain text: the date, then sections "To-dos:" ("- #id title (due …)"), "Reminders:", "Calendar:" and "Coming up:". The #ids work with complete_task, update_task and delete_task. Read-only; takes no input.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint, so the safety profile is covered; the description still adds real behavioral value by disclosing the aggregation window (next 24 hours for reminders, 'coming up' for dates), the conditional inclusion of calendar events ('when a calendar is connected'), and the fact that it takes no input. That is substantive context beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool does, then usage routing, then return shape — a sensible order with no filler. The return-format sentence is dense (section names plus a sample bullet template) but it earns its place given there is no output schema; slightly verbose for a no-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by describing the plain-text return: the date line, the exact section headers, and the '- #id title (due …)' bullet format. Combined with the usage routing and read-only disclosure, an agent has everything needed to call it and parse the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters the baseline is 4, and the description supports it by stating explicitly that the tool 'takes no input', removing any ambiguity about whether a date or filter could be passed. There is nothing further to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the owner's agenda for today in one view') and enumerates exactly what is aggregated: to-dos due/overdue, high-priority undated, reminders in 24h, calendar events, upcoming dates. It also explicitly distinguishes itself from list_tasks, so an agent can separate the two without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection rule: 'Use it for "what's on today"; use list_tasks for the whole to-do list with filters.' It also names the downstream tools that consume the returned #ids (complete_task, update_task, delete_task), which tells the agent how this tool fits into a workflow rather than standing alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_factsList facts about the ownerARead-onlyIdempotent
List the facts Sara has learned about the owner (name, people, likes, habits, work), newest first. Use it to get a general picture of the owner; use search_memory to find something specific, and remember_fact to add a fact. Returns plain text, one fact per line: "- [fact, YYYY-MM-DD] text", or "No notes yet." Read-only; facts from other people's chats and private conversations are never included.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most facts to return, 1 to 100 (default 30). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: discloses the privacy boundary (facts from other people's chats and private conversations are excluded), the sort order, and the exact return shape including the empty-state string. No output schema exists, so describing the line format is real added value rather than repetition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each doing distinct work: what it returns, when to use it vs alternatives, then the output contract and privacy note. Front-loaded with scope and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool, everything an agent needs is present: scope, ordering, alternatives, exclusions, and return format. No output schema is required because the description specifies the line format and empty case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single optional limit parameter with 100% schema description coverage including default, min and max, so the schema carries the burden. The description adds nothing about the limit or sensible values, which is the baseline 3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource plus the exact content domain (name, people, likes, habits, work) and ordering (newest first), which lets an agent distinguish it from list_notes and search_memory without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes usage: use this for a general picture, search_memory for something specific, remember_fact to add. Both the use case and the alternatives are named with the condition that selects them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notesList notesARead-onlyIdempotent
List the notes in the owner's planner in Sara (titles only), newest first, or the ones matching some words. Use it to find a note's id; then read it with read_note, change it with update_note or remove it with delete_note. Returns plain text, up to 100 lines: "- #id title [project] (updated YYYY-MM-DD)", or "No notes." Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Only notes containing these words (title or text). Leave out to list the newest notes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite readOnlyHint already being present, it adds real behavioral context: exact return shape ('- #id title [project] (updated YYYY-MM-DD)' or 'No notes.'), a 100-line cap, and ordering (newest first). That is the kind of output-shape disclosure an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then workflow, then return format — efficient and well-ordered. The trailing 'Read-only.' slightly duplicates the readOnlyHint annotation, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Single optional parameter, no output schema, and the description covers purpose, workflow, return format, and limits. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the query parameter already documents 'only notes containing these words (title or text)' with examples. The description's 'or the ones matching some words' restates the schema rather than adding syntax, limits, or matching rules, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the notes in the owner's planner'), plus scope details (titles only, newest first, optional word matching) that separate it from read_note and search siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use it to find a note's id, then read_note, update_note, or delete_note. The primary workflow and the downstream alternatives are named rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recent_conversationsList recent conversationsARead-onlyIdempotent
List the owner's most recent conversations with Sara, newest first, each with its title, when it was last active and a short summary when she has one. Use it to see what the owner has been talking about lately; use search_memory to look for a topic across all of her memory. Returns plain text, one conversation per line: "- Title (last ): summary", or "No conversations yet." Read-only. Never lists other people's chats, private, archived or imported conversations.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most conversations to return, 1 to 30 (default 10). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds value beyond them: the exact plain-text return format per line, the empty-state string 'No conversations yet.', and hard scope exclusions (no other people's chats, private, archived, or imported conversations). That is exactly the context an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then return shape, then scope caveats — a sensible order with no filler sentences. Slightly verbose: 'Read-only' repeats the annotation and the exclusion list is long, but both carry real signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by specifying the exact line format and empty case. With one optional parameter and full annotation coverage, nothing an agent needs to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'limit' parameter is fully documented with default, range, and examples in the schema. The description adds no additional semantics about limit, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the owner's most recent conversations with Sara'), plus ordering ('newest first') and per-item fields (title, last active, summary). It is clearly distinguishable from search_memory, which it names explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('see what the owner has been talking about lately') and an explicit alternative with its own condition ('use search_memory to look for a topic across all of her memory'). The routing decision is fully determined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksList to-dosARead-onlyIdempotent
List the to-dos in the owner's planner in Sara, optionally only open or done ones, or one project. Use it to see the whole to-do list or find a to-do's id; use get_today for just what's due today. Returns plain text, up to 100 lines, open ones first by priority and due date: "- #id [ ] title (priority) due [project]" ([x] when done), or "Nothing open." The #id is what complete_task, update_task and delete_task take. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Which to-dos: "open" (default), "done", or "all". | open |
| project | No | Only to-dos in this planner project (name, any case). Leave out for all projects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), yet the description adds substance they don't: plain-text return, a 100-line cap, ordering rules (open first, by priority then due date), the exact line format including the [x]/[ ] marker, the empty-result string "Nothing open." This is a tool with no output schema, and the description compensates for it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the sibling comparison are front-loaded, and the quoted line format is dense but useful. The format/order sentence is long and packs several facts into one clause chain, which costs a little readability but every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only 2 optional params, no output schema, and a simple read, the description covers everything an agent needs: what it returns, how it's ordered, the size limit, the empty case, and how the output id feeds the mutation siblings. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the enum values and project filter are already documented, and the baseline is 3. The description paraphrases the filters as "optionally only open or done ones, or one project" but omits the third enum value "all", adding no real semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource ("List the to-dos in the owner's planner in Sara") with scope qualifiers (open/done, one project). It explicitly distinguishes itself from the sibling get_today, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States two concrete use cases (see the whole list, find a to-do's id) and names the alternative tool plus the condition that selects it ("use get_today for just what's due today"). It also tells the agent the id is the key consumed by complete_task/update_task/delete_task, which links it into a workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_noteRead a noteARead-onlyIdempotent
Read one note from the owner's planner in Sara, in full, by its id. Use list_notes first to find the id. Returns the note as Markdown: "# Title", a blank line, then the text. An unknown id returns an error. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The note id: the number after # in list_notes's results (e.g. 12 for #12). An unknown id is refused with an error and nothing changes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by specifying the exact return shape ('# Title', blank line, then text) and the unknown-id error behavior, and confirms read-only. The 'Read-only' sentence and the unknown-id error both duplicate what the annotations and schema already declare, so it adds less new context than a fully independent disclosure would.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the purpose and followed by the workflow hint, return shape, and error case. Minor waste: 'Read-only' and the unknown-id error restate annotation/schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden of explaining the return value and does so concretely (Markdown with title heading). A one-parameter read tool needs nothing further for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single id parameter is fully documented there, including how to derive it from list_notes output and the minimum of 1. The description's 'by its id' adds no meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one note ... in full, by its id') and scopes the data source ('the owner's planner in Sara'), which distinguishes it from sibling readers like list_notes and search_library. An agent can tell exactly what it retrieves without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite workflow: 'Use list_notes first to find the id,' naming the sibling that produces the required input. It also names the failure condition (unknown id returns an error), so the agent knows when the call will not succeed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remember_factRemember a factA
Ask Sara to remember one fact about the owner in her long-term memory, marked as told by this app. Use it to store something on purpose (ask_sara is for conversation, and she may or may not keep what is said there); use add_note for longer text. Returns "Remembered (#id): fact" once the owner allows it. Only listed when the owner turns on "Let other apps change things" in Sara, and it always asks first: it returns "Waiting for approval in Sara" and nothing is stored until the owner presses Allow there.
| Name | Required | Description | Default |
|---|---|---|---|
| fact | Yes | One short fact about the owner, as a sentence. Up to 400 characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only saying readOnlyHint=false and non-destructive, the description supplies the behavior that matters: it is a two-phase operation that always asks first, returns 'Waiting for approval in Sara' and stores nothing until Allow, and returns 'Remembered (#id): fact' once permitted. That approval gate and attribution behavior cannot be derived from the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then alternatives, then return values and preconditions in a logical order with zero filler. It is dense—long compound sentences and quoted literals—but every clause carries information an agent needs to call it correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by documenting both return strings (approval-pending and success with id). Combined with the availability precondition and the fact that failure to approve means nothing is stored, an agent has everything needed to invoke it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the 'fact' parameter already documents the 1-400 character sentence constraint with examples. The description only restates 'one fact about the owner' and does not add format or granularity guidance beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remember/store) and resource (one fact about the owner in Sara's long-term memory), plus the 'marked as told by this app' attribution. It explicitly names what it is not (ask_sara is for conversation, add_note is for longer text), so an agent can pick it out of a 17-tool sibling set immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives positive guidance ('use it to store something on purpose'), names two alternatives with the exact conditions that select them (ask_sara for conversation, add_note for longer text), and states the availability precondition (owner must enable 'Let other apps change things'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_librarySearch her libraryARead-onlyIdempotent
Search the documents the owner keeps in Sara's library (PDFs, Word files, spreadsheets, books, saved web pages) by words and meaning. Use it for questions answered by the owner's documents; use search_memory for what Sara remembers from conversations. Returns up to 6 passages (each up to 1,400 characters), each headed by "[document title, place]" (page or section), or a line saying nothing was found. Read-only; documents shared in a single chat only are left out.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What to look for, as words or a question. Up to 300 characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the read-only, idempotent, closed-world profile, and the description adds behavior beyond that: the result cap (6 passages), per-passage length (1,400 chars), the '[document title, place]' header format, the explicit 'nothing found' line, and the chat-only-document exclusion. These are exactly the facts an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences with no filler, front-loaded with what the tool searches before routing to the alternative. The parenthetical file-type list and nested parentheticals in the last two sentences add bulk, though each still carries useful routing or result-shape information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter retrieval tool with no output schema, the description fully covers what would otherwise be missing: result count, result size, result formatting, the empty-result signal, and coverage exclusions. Nothing an agent needs in order to call it and read its output correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single, well-exampled 'query' parameter, so the schema does most of the work. The description adds one useful semantic point beyond the schema — matching happens on both words and meaning — which tells the agent that natural-language questions (not just keywords) are valid queries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (the owner's documents in Sara's library), enumerates the document types covered, and notes it works 'by words and meaning' (hybrid keyword + semantic). It is immediately distinguishable from search_memory, which covers conversational memory rather than documents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the selection rule: use this for questions answered by the owner's documents, use search_memory for what Sara remembers from conversations. It also states a scoping exclusion (documents shared in a single chat only are left out), which prevents false-negative interpretations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_memorySearch her memoryARead-onlyIdempotent
Search Sara's long-term memory about the owner (facts, summaries of past conversations, decisions, promises, dates) by words and meaning. Use it for context about the owner's life, preferences and projects; use list_facts to browse all facts, search_library for documents, and list_recent_conversations for what was talked about lately. Returns plain text, one note per line: "- [kind, YYYY-MM-DD] text", best match first, or a line saying nothing was found. Read-only. Never includes other people's chats, private conversations or (while Adult mode is off) anything explicit.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most notes to return, 1 to 50 (default 10). | |
| query | Yes | Words to look for in her memory. Up to 200 characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint, idempotent, non-destructive), but the description adds substantial behavior: exact return format ('- [kind, YYYY-MM-DD] text'), ordering (best match first), the empty-result sentinel line, and content exclusions (other people's chats, private conversations, explicit content while Adult mode is off). These are things the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all load-bearing, with the core purpose front-loaded and alternatives and return format following in logical order. No filler or restatement of the name/title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still specifies the return format, ordering and empty-result case, and it discloses privacy boundaries. An agent has everything needed to call this correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns extra credit by clarifying the query is matched 'by words and meaning' (keyword plus semantic), which the schema's examples alone do not convey. It does not discuss the limit parameter, but the schema documents that fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) plus resource scope ('Sara's long-term memory about the owner') and enumerates the content kinds (facts, summaries, decisions, promises, dates). It also names the sibling tools it is not (list_facts, search_library, list_recent_conversations), so an agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('for context about the owner's life, preferences and projects') and routes the caller to the right alternative for each other need (browse all facts → list_facts, documents → search_library, recent chatter → list_recent_conversations). Both positive and exclusionary guidance are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_noteChange a noteADestructiveIdempotent
Change one of the owner's notes in Sara by its id (from list_notes): its title, its text (replaced as a whole) or its project. Only the fields you give change. Read the note with read_note first if you mean to edit part of the text. Returns "Changed note #id: title". Only listed when the owner turns on "Let other apps change things" in Sara. Follows the owner's approval setting for her note tool (allowed, ask first, or off): when it asks first, it returns "Waiting for approval in Sara" and nothing changes until the owner presses Allow there; when it is off, it returns that it's turned off.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The note id: the number after # in list_notes's results (e.g. 12 for #12). An unknown id is refused with an error and nothing changes. | |
| body | No | New text for the whole note; it replaces the old text. Up to 20,000 characters. | |
| title | No | New title. Up to 200 characters. | |
| project | No | Move it to this planner project (created if new); an empty string takes it out of any project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses whole-text replacement of body, the exact success string 'Changed note #id: title', conditional exposure gated on an owner setting, and an approval mode that returns 'Waiting for approval in Sara' with no change applied. The annotations already flag destructive/idempotent, and the description adds the operational gates and side-effect timing an agent needs before mutating.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the mutation target and scope, followed by return value and then the availability/approval caveats in decreasing priority. Every sentence carries information, though the three-mode approval sentence is dense and could be tightened without losing signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, gated mutation with no output schema, the description supplies the return string, the no-op approval path, the off-state behavior, and the partial-update semantics. Nothing an agent needs to call it safely and interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so length limits, id validation, and the empty-string project removal are already documented in the schema. The description only restates that body is replaced as a whole and enumerates the three optional fields; it adds no format or edge-case detail beyond the structured fields. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change one of the owner's notes in Sara by its id') plus the mutable scope (title, text, project), which cleanly separates it from read_note, add_note, and delete_note. The id provenance from list_notes is named, so an agent can identify both the tool and its key input without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to a sibling ('Read the note with read_note first if you mean to edit part of the text') and names list_notes as the source of ids. It also states the partial-update contract ('Only the fields you give change'), which is the decisive usage fact for an agent deciding between this and full-replacement behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskChange a to-doADestructiveIdempotent
Change one of the owner's to-dos in Sara by its id (from list_tasks or get_today): its title, due time, project, priority, details or status. Only the fields you give change; the rest stay as they are. Use complete_task to simply tick one off. Returns "Changed to-do #id: title" with the new due time. Only listed when the owner turns on "Let other apps change things" in Sara. Follows the owner's approval setting for her todo tool (allowed, ask first, or off): when it asks first, it returns "Waiting for approval in Sara" and nothing changes until the owner presses Allow there; when it is off, it returns that it's turned off.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The to-do id: the number after # in list_tasks or get_today's results (e.g. 12 for #12). An unknown id is refused with an error and nothing changes. | |
| due | No | New due time in words or as a date, read in the owner's time zone; "none" removes the due date. | |
| notes | No | New details for the to-do (replaces the old ones). Up to 2,000 characters. | |
| title | No | New title. Up to 200 characters. | |
| status | No | "done" ticks it off; "open" reopens a done to-do. | |
| project | No | Move it to this planner project (created if new); an empty string takes it out of any project. | |
| priority | No | New priority: "low", "normal" or "high". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context that annotations cannot convey: partial-update semantics ('Only the fields you give change'), the approval gate with its exact 'Waiting for approval in Sara' response and the guarantee that nothing changes until Allow, and the disabled-tool response. This is far richer than the readOnly/idempotent/destructive hints and is consistent with them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and field list, then the alternative, return values, and gating. It is dense with sentences chained by semicolons and parentheses, but nearly every clause carries information an agent needs for a gated mutation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return contract — 'Changed to-do #id: title' with the new due time, the approval-waiting string, and the turned-off string. Combined with the schema's error note for unknown ids, an agent knows the full call and response picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still contributes the cross-cutting partial-update contract that applies to all seven parameters and cannot be inferred from any single field. It does not restate formats already in the schema, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Change one of the owner's to-dos in Sara by its id') and enumerates the mutable fields. It also identifies its source of ids (list_tasks or get_today), which makes it instantly distinguishable from add_task, delete_task and complete_task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the simple case away ('Use complete_task to simply tick one off'), and states the availability prerequisite (the owner must enable 'Let other apps change things'). It does not contrast with delete_task or update_note, but the primary overlap is handled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
17 tool updates
v0.1.1- Changed
add_note10 fields changed- added
Input schema / properties / body / descriptionAdded value: +"The note's text (Markdown is fine). Up to 20,000 characters." - added
Input schema / properties / body / examplesAdded value: +[ + "ssh in, git pull, restart the service" +] - added
Input schema / properties / body / maxLengthAdded value: +20000 - added
Input schema / properties / project / descriptionAdded value: +"Planner project name to file it under, e.g. \"Garden\" or \"Sara\". Created if it doesn't exist. Up to 80 characters." - added
Input schema / properties / project / examplesAdded value: +[ + "Garden" +] - added
Input schema / properties / project / maxLengthAdded value: +80 - added
Input schema / properties / title / descriptionAdded value: +"The note's title. Up to 200 characters." - added
Input schema / properties / title / examplesAdded value: +[ + "Deploy steps" +] - added
Input schema / properties / title / maxLengthAdded value: +200 - added
Input schema / properties / title / minLengthAdded value: +1
- Changed
add_task13 fields changed- changed
Input schema / properties / due / descriptionPrevious value: -"When, in words: \"tomorrow 9am\", \"friday\", \"2026-11-03\"."New value: +"When it is due, in words or as a date, read in the owner's time zone. Leave out for no due date." - added
Input schema / properties / due / examplesAdded value: +[ + "tomorrow 9am", + "friday", + "2026-11-03" +] - added
Input schema / properties / due / maxLengthAdded value: +80 - added
Input schema / properties / priority / defaultAdded value: +"normal" - added
Input schema / properties / priority / descriptionAdded value: +"How important: \"low\", \"normal\" (default) or \"high\"." - added
Input schema / properties / priority / examplesAdded value: +[ + "high" +] - added
Input schema / properties / project / descriptionAdded value: +"Planner project name to file it under, e.g. \"Garden\" or \"Sara\". Created if it doesn't exist. Up to 80 characters." - added
Input schema / properties / project / examplesAdded value: +[ + "Garden" +] - added
Input schema / properties / project / maxLengthAdded value: +80 - added
Input schema / properties / title / descriptionAdded value: +"What to do, short. Up to 200 characters." - added
Input schema / properties / title / examplesAdded value: +[ + "Call the vet" +] - added
Input schema / properties / title / maxLengthAdded value: +200 - added
Input schema / properties / title / minLengthAdded value: +1
- Changed
ask_sara4 fields changed- changed
Input schema / properties / message / descriptionPrevious value: -"What to say to her."New value: +"What to say to her, in plain words. Up to 20,000 characters." - added
Input schema / properties / message / examplesAdded value: +[ + "What did we decide about the garden fence?" +] - added
Input schema / properties / message / maxLengthAdded value: +20000 - added
Input schema / properties / message / minLengthAdded value: +1
- Added
complete_task - Added
delete_note - Added
delete_task - Changed
list_facts3 fields changed- added
Input schema / properties / limit / defaultAdded value: +30 - changed
Input schema / properties / limit / descriptionPrevious value: -"Up to how many (default 30)."New value: +"Most facts to return, 1 to 100 (default 30)." - added
Input schema / properties / limit / examplesAdded value: +[ + 30 +]
- Changed
list_notes3 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"Only notes with these words."New value: +"Only notes containing these words (title or text). Leave out to list the newest notes." - added
Input schema / properties / query / examplesAdded value: +[ + "deploy", + "recipe" +] - added
Input schema / properties / query / maxLengthAdded value: +200
- Added
list_recent_conversations - Changed
list_tasks6 fields changed- changed
Input schema / properties / project / descriptionPrevious value: -"Only this project (name)."New value: +"Only to-dos in this planner project (name, any case). Leave out for all projects." - added
Input schema / properties / project / examplesAdded value: +[ + "Garden" +] - added
Input schema / properties / project / maxLengthAdded value: +80 - added
Input schema / properties / status / defaultAdded value: +"open" - changed
Input schema / properties / status / descriptionPrevious value: -"Which ones (default open)."New value: +"Which to-dos: \"open\" (default), \"done\", or \"all\"." - added
Input schema / properties / status / examplesAdded value: +[ + "open" +]
- Changed
read_note3 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"The note id."New value: +"The note id: the number after # in list_notes's results (e.g. 12 for #12). An unknown id is refused with an error and nothing changes." - added
Input schema / properties / id / examplesAdded value: +[ + 12 +] - added
Input schema / properties / id / minimumAdded value: +1
- Removed
recent_conversations - Changed
remember_fact4 fields changed- changed
Input schema / properties / fact / descriptionPrevious value: -"One short fact, e.g. \"Prefers tabs over spaces\"."New value: +"One short fact about the owner, as a sentence. Up to 400 characters." - added
Input schema / properties / fact / examplesAdded value: +[ + "Prefers tabs over spaces", + "Works from home on Fridays" +] - added
Input schema / properties / fact / maxLengthAdded value: +400 - added
Input schema / properties / fact / minLengthAdded value: +1
- Changed
search_library4 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"What to look for, e.g. \"when does the lease end\"."New value: +"What to look for, as words or a question. Up to 300 characters." - added
Input schema / properties / query / examplesAdded value: +[ + "when does the lease end", + "warranty period" +] - added
Input schema / properties / query / maxLengthAdded value: +300 - added
Input schema / properties / query / minLengthAdded value: +1
- Changed
search_memory7 fields changed- added
Input schema / properties / limit / defaultAdded value: +10 - changed
Input schema / properties / limit / descriptionPrevious value: -"Up to how many notes (default 10)."New value: +"Most notes to return, 1 to 50 (default 10)." - added
Input schema / properties / limit / examplesAdded value: +[ + 10 +] - changed
Input schema / properties / query / descriptionPrevious value: -"Words to look for, e.g. \"sister\" or \"deploy server\"."New value: +"Words to look for in her memory. Up to 200 characters." - added
Input schema / properties / query / examplesAdded value: +[ + "sister", + "deploy server", + "favourite food" +] - added
Input schema / properties / query / maxLengthAdded value: +200 - added
Input schema / properties / query / minLengthAdded value: +1
- Added
update_note - Added
update_task
12 tool updates
v0.1.0- First observed
add_note - First observed
add_task - First observed
ask_sara - First observed
get_today - First observed
list_facts - First observed
list_notes - First observed
list_tasks - First observed
read_note - First observed
recent_conversations - First observed
remember_fact - First observed
search_library - First observed
search_memory
TDQS
Scored across 17 tools
Most tools target a distinct resource+action, and descriptions explicitly disambiguate close calls (get_today vs list_tasks, complete_task vs update_task, ask_sara vs remember_fact). The read-only memory cluster (search_memory, list_facts, list_recent_conversations, search_library) has some conceptual proximity but is well-differentiated by descriptions.
All names follow a consistent verb_noun pattern: read_note, list_tasks, search_memory, add_task, update_note, delete_note, remember_fact, ask_sara. No mixed casing or stray styles.
17 tools for a broad personal-assistant domain (tasks, notes, memory, library, conversations, chat) is slightly heavy but every tool maps to a real operation. It sits just above the comfortable 3-15 range without feeling padded.
Tasks and notes have full CRUD coverage with clear lifecycle. Memory and library are lighter (remember_fact exists but no update/delete fact; search_library has no add-document), but these are reasonable gaps an agent can work around.
Maintenance
Related MCP Connectors
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
- mcpOAuthai.butlerbrain
Persistent memory for AI assistants. Save once; recall from Claude, ChatGPT, or any MCP client.
Shared memory and actions for Claude, Kiro, OpenAI, Cursor, and other MCP-compatible AI clients.
- TaprootOAuthcom.taproothq
Persistent memory layer for AI tools. Save and recall notes across Claude and other MCP clients.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceLocal-first knowledge base MCP server. Lets AI agents (Claude Code, Cursor, etc.) read and write your personal knowledge base through 20 MCP tools. Zero cloud dependency — all files stay on your machine.1,758 npm678MIT
- AlicenseAqualityCmaintenanceMCP server for a self-hostable personal planner — exposes memo, todo, calendar event, and cross-resource full-text search tools so Claude, Cursor, or any MCP client can manage your schedule and notes in natural language.181MIT
- AlicenseBqualityDmaintenanceAn MCP server for Bitfocus Companion that enables AI assistants to program and control Stream Deck surfaces and other Companion-connected devices. It provides 53 tools for button control, styling, page management, variable handling, and batch operations with verification and rollback.539Apache 2.0
- AlicenseNot gradedqualityBmaintenanceAn MCP server that gives Claude Desktop persistent memory, self-awareness, epistemic hygiene, and genuine agency across conversations with a typed memory system, embedding-based semantic search, a 3-judge memory jury, and a real-time dashboard.7MIT