Memoreei
Memoreei is a local-first, encrypted MCP memory server that searches your messages across many apps by keyword and meaning, plus local-only tools to sync, import, and add memories.
Search (
search_memoreei): hybrid keyword (BM25) + vector search over all stored messages, best match first; filter by participant (name, partial name, any phone format, email, orme), source app/chat, and date range, with an explanatorynotewhen results are empty or ambiguous.Read around a hit (
get_context): fetch up to 50 messages before and/or after a search result within its chat, oldest first, with the original markedhit: true.Browse the archive (
list_sources): most-messaged people (with their chats), busiest group chats, and platforms, optionally filtered by name.Refresh memory (
sync,sync_all,refresh_memoreei): run every connector already configured on the server and re-read changed import files; takes no arguments, so it can only refresh what the owner set up.Sync one connector at a time: Discord, Telegram, Matrix, Slack, Gmail/email, Mastodon, iMessage, WhatsApp, Signal, and macOS Contacts, some with optional channel/chat/folder/hashtag filters.
Store notes (
add_memoreei, local only): save a manual memory with a source label and optional metadata.Import exports (local only): Android SMS Backup & Restore XML, Discord data package, Facebook Messenger, Instagram DMs, arbitrary JSON/JSON-lines, CSV/TSV, and vCard contacts.
Network-restricted access: over HTTP a key gets only
search_memoreei,get_context,list_sources, andsync; adding, importing, and path-based tools are available only to local stdio clients.Private by design: one encrypted SQLite file on your machine, offline default embedding model, key-hashed network access, and read-only search annotations.
Syncs messages from Discord channels via bot API and imports Discord data packages from GDPR exports.
Syncs emails from Gmail via IMAP.
Syncs iMessage conversations from macOS (beta).
Imports Instagram direct messages from GDPR data exports.
Syncs messages from Mastodon via REST API.
Syncs messages from Matrix rooms using the Client-Server API.
Imports Facebook Messenger messages from GDPR data downloads.
Syncs messages from Signal Desktop (beta).
Syncs messages from Slack via Web API.
Syncs messages from Telegram via bot API.
Imports WhatsApp chat exports (.txt) and indexes messages.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Memoreeiwhat did I discuss with John last week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Memoreei
Remember every conversation you've ever had.
Memoreei is an open-source MCP server that gives your AI assistant a searchable memory of your messages: iMessage, WhatsApp, Signal, Discord, Telegram, Slack, Gmail, Instagram and more. It keeps them in one encrypted SQLite file on your machine and searches them by keyword and by meaning at once.
"What's my friend's favorite restaurant?"
"What did my sister say she wanted for her birthday?"
"How many times have I asked Dory to send that link again?"Every assistant starts each conversation knowing nothing about you. With Memoreei, it can look.
Local-first. One SQLite file, encrypted. The default search model runs offline.
Hybrid search. BM25 keywords and vector similarity, fused with Reciprocal Rank Fusion.
On your network. One always-on machine serves every other one, each client with its own key.
Read-only to the network. A key can search what's stored, never add to it or read a file.
Install
Pick one. Each is the whole server; they differ in how it's packaged.
You have | Get | Includes |
a Mac | Python, the search model, a menu-bar app, iMessage | |
Linux | Python, the search model, a user service | |
anything else |
| Python 3.10 or newer, which you bring |
Everything Memoreei knows lives in one home directory: config.env for settings,
memoreei.db for the memories and the credentials, encrypted, and usually
memoreei.key, its key (Privacy). That's ~/Library/Application Support/Memoreei on macOS, ~/.local/share/memoreei on Linux and ~/.memoreei
elsewhere. Point it somewhere else with --home <dir> or MEMOREEI_HOME.
On a Mac: Memoreei.app
Download the DMG from the latest release:
Memoreei-arm64.dmgfor Apple silicon (About This Mac says Chip Apple M…),Memoreei-x86_64.dmgfor Intel. macOS 11 or newer.Drag Memoreei into Applications.
Open it the first time from Finder. The app isn't signed by Apple yet, so a double-click, Launchpad or Spotlight won't open it. On macOS 11–14, right-click → Open, then Open. On macOS 15 and later, double-click once, then System Settings → Privacy & Security → Open Anyway. Once per download.
Full Disk Access, which iMessage needs. macOS gives apps no way to ask, so a window walks you through dragging Memoreei into the list, and notices when it's done.
The firewall may ask whether Memoreei Server may accept incoming connections. Allow, or other machines can't reach it.
The dashboard opens in your browser. Set up iMessage under Sources, and WhatsApp or Signal too if WhatsApp for Mac or Signal Desktop is installed (Signal's Connect asks macOS once for its key: choose Allow). Then create a key under Clients for each machine or app that will search.
Memoreei then lives in the menu bar and starts at login. Open Dashboard signs you in to the dashboard; Quit stops the server too.
Updates. The menu says Update to X…. Download the new DMG and replace the app. Until Memoreei is signed, macOS treats each new version as a stranger and switches its Full Disk Access off; the setup window reopens, and you switch it back on.
Data is in ~/Library/Application Support/Memoreei, logs in ~/Library/Logs/Memoreei
(Show Log in the menu). A pip-installed memoreei on the same Mac shares that data,
so memoreei key list in Terminal shows the app's keys. Don't run both servers at once;
the app will tell you if you try.
On Linux: a package
Ubuntu 20.04, Debian 11, RHEL and Rocky 8, current Fedora, or newer; x86_64 or ARM64.
Download from Releases:
Ubuntu, Debian:
memoreei_X.Y.Z_amd64.deb(arm64on ARM, such as a Raspberry Pi)Fedora, RHEL, Rocky:
memoreei-X.Y.Z.x86_64.rpm(aarch64on ARM)anything else, or without root:
memoreei-X.Y.Z-linux-x86_64.tar.gz(aarch64on ARM)
Install it, by double-clicking it or:
sudo apt install ./memoreei_*.deb # Ubuntu, Debian sudo dnf install ./memoreei-*.rpm # Fedora, RHEL, Rocky tar xzf memoreei-*-linux-*.tar.gz && memoreei-*-linux-*/install.sh # into ~/.local, no rootOpen Memoreei from your applications. It starts the server, sets it to start at login, and opens the dashboard. Create a key under Clients for each machine or app that will search.
Add sources. Signal, if Signal Desktop is set up, is under Sources in the dashboard: Connect reads its key from your desktop's keyring. The other live connectors are set up in a terminal for now, with
memoreei setup, and chat exports withmemoreei import ….
No desktop? The same package, from a terminal:
memoreei service install # start now and at every login; offers to start at boot too
memoreei key create laptop # one key per client
memoreei admin-url # how to reach the dashboard from your own computerThe server is the systemd user unit memoreei.service. Data is in
~/.local/share/memoreei, the program in /opt/memoreei (or ~/.local/opt/memoreei
from the tarball). Settings go in config.env, except MEMOREEI_HOME itself, which
goes in ~/.config/memoreei/env.
Updates. The dashboard says when there's a new release. Install it the same way; a running Memoreei restarts on the new version by itself.
Two people, one computer? The first to start gets port 3679; the second sets
MEMOREEI_PORT=3680 in their config.env.
Coming from pip? Before 0.4, Linux data lived in ~/.memoreei, and nothing moves
it. Either mv ~/.memoreei ~/.local/share/memoreei, or put MEMOREEI_HOME=~/.memoreei
in ~/.config/memoreei/env.
Uninstall with sudo apt remove memoreei, sudo dnf remove memoreei, or
install.sh --uninstall. Your data stays.
Anywhere else: pip
python3 -m venv ~/memoreei-venv && source ~/memoreei-venv/bin/activate
pip install memoreei # --pre for a release candidate
memoreei setup # pick connectors, enter credentials, make the first key
memoreei sync # pull in messagesOn Debian and Ubuntu, sudo apt install python3-venv first. To keep the network server
running in the background (launchd on macOS, a systemd user unit on Linux):
memoreei service install # starts at login, restarts if it crashes
memoreei service status | logs | uninstallOn a headless Linux box, loginctl enable-linger $USER once, so it starts at boot rather
than at your first login. To update: pip install --upgrade memoreei, then
memoreei service install again.
macOS via pip. iMessage needs Full Disk Access for the Python behind your
virtualenv, which is buried somewhere nobody finds by hand. memoreei service grant-access opens System Settings and a Finder window with the right file already
selected; drag it in, switch it on, and it checks the result. The firewall asks about
the same Python the first time the server starts: Allow. The app does all of this
for you, which is the argument for the app.
Related MCP server: Local Brain MCP
Connect a client
On the same machine
The client starts Memoreei itself and talks over stdio: no network, no key, and every
tool, including the imports. For Claude Code, claude mcp add memoreei -- memoreei serve.
Elsewhere (.mcp.json, claude_desktop_config.json):
{
"mcpServers": {
"memoreei": { "command": "memoreei", "args": ["serve"] }
}
}Use the full path (which memoreei) if it's in a virtualenv your client doesn't know.
Over the network
Create a key per client, in the dashboard or with memoreei key create laptop. The key
is shown once, with ready-to-paste setup and this machine's address filled in:
claude mcp add --transport http memoreei http://<server-ip>:3679/mcp \
--header "Authorization: Bearer <key>"or, in a project's .mcp.json, with the key kept in an environment variable:
{
"mcpServers": {
"memoreei": {
"type": "http",
"url": "http://<server-ip>:3679/mcp",
"headers": { "Authorization": "Bearer ${MEMOREEI_KEY}" }
}
}
}Any MCP client with Streamable HTTP and custom headers works the same way. A lost laptop
costs one memoreei key revoke laptop; memoreei key list shows when each key was last
used.
From Claude.ai, ChatGPT and agents
Claude.ai and ChatGPT call from their own servers, not your browser, so they can't reach
your home network, and they sign in with OAuth rather than a pasted key. Memoreei has a
second, stricter front door for them, the public listener: it answers /mcp, the
sign-in, and the OAuth metadata that tells a chatbot where to sign in, and nothing else
(the dashboard only if you open it from anywhere). Agents that only send a header can use
your mem_ keys there too. Failed attempts are rate-limited, and every call is listed on
the dashboard's Cloud page: when, which chatbot or key, which tool, from where. It's off
until you choose one of the two ways below.
Approving a chatbot
Memoreei signs chatbots in itself, and you approve each one on the computer memoreei
runs on. Add memoreei's address as a connector in Claude or ChatGPT (or sign in from an
agent) and it opens a page with a short code, like K7QM, that waits for you. On the
computer, approve that code:
in the dashboard's Cloud page (every page shows a note while one waits), or
with
memoreei chatbots approve K7QM, orfrom the desktop notification, where there is a desktop, or
away from the computer, if you've opened the dashboard from anywhere: the chatbot's page offers Sign in to approve it here, and sends you back to the chatbot once you have.
The chatbot's page moves on by itself within a couple of seconds. Only approve a code you
just asked for: anyone can ask, and approving lets them read your messages. Compare the
code, and check the name and address beside it. A chatbot with a published client
document shows its own address (claude.ai, chatgpt.com); an app that registered
itself is marked "it named itself", because it could have called itself anything.
Requests that nobody answers lapse after ten minutes.
Agents without a browser (hermes mcp login --flow device) get the same kind of code to
approve the same way.
memoreei chatbots list shows who's waiting and who's connected; Remove on the Cloud
page, or memoreei chatbots remove <id>, cuts one off at once. Its next call fails, not
its next sign-in. Sign-in tokens are memoreei's own: access tokens last ten minutes,
refresh tokens are signed by memoreei, replaced on every use, and stop after a month
unused, and an old one turning up again (someone else has a copy) cancels that chatbot's
sign-in altogether. Nobody else, Memoreei Cloud included, can mint a token for your
memoreei.
Memoreei Cloud
The easy way to give memoreei an address. memoreei cloud connect (or Connect to
Memoreei Cloud in the dashboard) opens a sign-in page, you approve this computer there,
and it gets an address like https://k3x9q2mfa7td.memoreei.net/mcp to add as a connector
in Claude or ChatGPT. Nothing to open on your router: memoreei holds a connection out to
the relay, and chatbots reach it through that. Your messages stay on your computer. The
relay carries TLS it can't open: the certificate's key is made on your computer and never
leaves it. Your Memoreei Cloud account is for the address; chatbots sign in to memoreei
itself, as above. memoreei cloud status says whether it's online; memoreei cloud disconnect takes the computer off your account. While the computer sleeps, chatbots
can't reach it, and memoreei tells them to say so.
Nothing contacts Memoreei Cloud until you connect. To hide the offer, set
MEMOREEI_CLOUD_OFFER=0. Once connected, memoreei suggests a dashboard password, so you
can manage it from anywhere; MEMOREEI_PASSWORD_OFFER=0 hides that too.
Your own tunnel
Memoreei Cloud uses nothing but standards, so you can bring your own address instead. Turn on the public listener and point any tunnel or proxy at it: Cloudflare Tunnel, Tailscale Funnel, ngrok, or Caddy on a machine with a public address.
MEMOREEI_PUBLIC_PORT=3680 # on 127.0.0.1 unless MEMOREEI_PUBLIC_HOST says otherwise
MEMOREEI_PUBLIC_MCP_URL=https://memories.example.com/mcp # the https address clients use
MEMOREEI_TRUSTED_PROXY=127.0.0.1 # optional: read the caller's address from X-Forwarded-ForWith MEMOREEI_PUBLIC_MCP_URL set, memoreei signs chatbots in at that address
(https://memories.example.com/authorize and the rest, announced in its RFC 8414
metadata): dynamic and metadata-document client registration, PKCE, and device codes
for agents, as Claude, ChatGPT and agent harnesses expect, approved as above. Without
it, the public listener takes mem_ keys only. To serve TLS from memoreei itself, add
MEMOREEI_PUBLIC_TLS_CERT and MEMOREEI_PUBLIC_TLS_KEY. The public listener has one
identity at a time, so it's this or Memoreei Cloud.
Run it as a network server
The network server speaks MCP's Streamable HTTP at /mcp on port 3679, and refuses
every request without a key. There is no way to run it open. The app, the Linux package
and memoreei service install all run it for you; by hand, it's memoreei serve --http.
Port 3679 spells DORY on a phone keypad. It is officially registered to the Apple
Newton's dock sync, a device discontinued in 1998, which is not expected to object.
Change it with --port or MEMOREEI_PORT.
What the network can do
Search, and press one refresh button. A network client gets search_memoreei,
get_context, list_sources and sync, and nothing else. Several local tools take a
path on the server, and a key holder shouldn't be able to point one at your SSH keys and
search them back out. Filling the database is a local job.
sync takes no arguments: it runs the connectors configured on the server and re-reads
registered import files that have changed.
The dashboard
/admin shows status, sources, client keys and the log, and switches start-at-login.
Unless you give it a password and open it from anywhere, it answers only
on the server itself, after a one-time sign-in link:
memoreei admin-url # http://localhost:3679/admin/login?token=…The link works once, within five minutes, and signs that browser in for a month. With no
display, admin-url also prints the ssh -L that brings the dashboard to your laptop.
Dashboard sessions and API keys are separate: neither opens the other.
From anywhere
The dashboard can have a password. It's optional: without one, nothing above changes. Set one on the dashboard's Security page, or:
memoreei admin password # set or change it (--stdin for scripts)
memoreei admin remote on # let the dashboard answer away from this computer
memoreei admin status # password, 2FA, from anywhere, recent sign-ins
memoreei admin reset # forgot it? removes the password and 2FA, hereThe rule: with no password, the dashboard answers only on the computer, as above.
With a password and Manage memoreei from anywhere switched on, it also answers
elsewhere, to the password: at your Memoreei Cloud address
(https://<name>.memoreei.net/admin/), through your own tunnel at
MEMOREEI_PUBLIC_MCP_URL's address, and on your network at this computer's address or
name (http://192.168.1.5:3679/admin/, plain HTTP, so prefer the https addresses on a
network you don't trust). Anyone who reaches it sees only a sign-in page. Through a
tunnel, the dashboard checks that Host and Origin name that public address, so the
tunnel must pass Host on unchanged (Cloudflare Tunnel, Tailscale Funnel and Caddy do).
2FA, optional: a code from an authenticator app as well as the password. Set it up on the Security page (scan the QR code), and keep the ten recovery codes it shows once, for a lost phone.
Signing in with the password lasts a week. On the computer, the one-time link still signs you in without it. A new password, or switching on 2FA, signs out every browser that signed in with the old way.
Failed sign-ins away from the computer are limited per address and in all, and listed on the Security page. Nobody can lock you out by guessing: a browser you've signed in with before isn't held up by strangers' failures, and on the computer there's no limit at all.
Away from the computer, the password and 2FA can't be changed, and the switch can only be turned off. So a stolen session can't lock you out, and a forgotten password is reset where memoreei runs.
HTTPS
Plain HTTP is fine on a home network or a VPN. For anything public, put HTTPS in front,
and prefer the public listener (above), which answers only /mcp.
Caddy gets its own certificate:
memories.example.com {
reverse_proxy <server-ip>:3679
}and MEMOREEI_PUBLIC_URL=https://memories.example.com in config.env makes
key create print that URL. Or, with a certificate already in hand,
memoreei serve --http --tls-cert cert.pem --tls-key key.pem (or MEMOREEI_TLS_CERT and
MEMOREEI_TLS_KEY in config.env).
Sources
Source | How | Status |
iMessage (macOS) | live, from | 🧪 Beta |
WhatsApp (WhatsApp for Mac, or an iPhone backup) | live, from | 🧪 Beta |
Signal (Signal Desktop, macOS and Linux) | live, from Signal Desktop's database | 🧪 Beta |
Gmail (IMAP) | live | ✅ |
Discord (bot) | live | ✅ |
Telegram (bot) | live | ✅ |
Slack (bot) | live | ✅ |
Matrix | live | ✅ |
Mastodon | live | ✅ |
Discord Data Package | import | ✅ |
Facebook Messenger (data download) | import | ✅ |
Instagram DMs (data download) | import | ✅ |
Android SMS Backup & Restore (XML) | import | ✅ |
Any JSON, JSON-lines, CSV or TSV | import | ✅ |
Contacts (vCard, or macOS Contacts) | names for phone numbers | ✅ |
WhatsApp is read from where WhatsApp for Mac keeps the chats it has synced from your
phone: texts, photo and video captions, shared links and document names. Stickers, voice
notes and reactions have no words to search, so they're skipped. Its database has the
same layout as the one in an iPhone backup, so WHATSAPP_DB_PATH can point at that
instead, on any OS. WhatsApp on Windows and Linux is WhatsApp Web, whose local copy is
encrypted with a key held by WhatsApp's servers, so there is nothing there to read.
Signal is read from Signal Desktop's database on the same computer. Its key is sealed by the system keyring (the Keychain on a Mac, GNOME Keyring or KWallet on Linux), so connecting reads it once, when you choose Connect under Sources, and saves it; a Mac asks first. Texts, captions, links, group changes and calls are kept. Reactions and edits follow the message they belong to, with both wordings of an edit searchable, and a message deleted for everyone is marked rather than forgotten. Photos and files become labels, never copies. Disappearing messages are never stored.
Live sources sync incrementally, fetching only what's new. Imports are
remembered: memoreei sync re-reads a file when it changes.
Set up live sources with memoreei setup (or memoreei setup gmail for one), and import
with memoreei import …. memoreei import --help lists the formats.
MCP tools
Tool | Does | Network |
| hybrid search, narrowed by | ✅ |
| the messages before and after a search result, in its chat | ✅ |
| the most-messaged people (with their chats) and group chats; | ✅ |
| refresh everything configured on the server; no arguments | ✅ |
| store a note | — |
| sync one connector | — |
| sync every configured connector, without import files | — |
| import an export file | — |
| names for phone numbers, from a vCard or macOS Contacts | — |
A local (stdio) client gets all of them. Each tool's parameters are in its MCP description, which your client shows it, and the server sends a short set of instructions on how to use them.
Finding people. participant takes a name, part of one ("Jane", "jan do") or a
phone number in any format, and finds that person on every app: iMessage stores a
number, WhatsApp and Signal a name, and the two are joined through your contacts and
the number each WhatsApp or Signal message came from. People who only share a name
are never merged; a name that fits several people searches all of them and says so in
the result's note. participant_scope decides how much: conversation (the default)
is what they wrote anywhere plus both sides of your one-to-one chats, sent only what
they wrote, any_chat every chat they're in. me is you, as is your own name.
Every filter narrows the search before anything is ranked, so a filtered search
returns the best matches among those messages. A search returns results, plus
people when you named one and a note whenever there's something to explain, such
as a name that fits several people or why nothing came back.
CLI
memoreei setup [connector] # configure connectors; offers the first API key
memoreei serve # stdio, for a local client
memoreei serve --http [--port 3679] [--tls-cert … --tls-key …]
memoreei open # the dashboard, starting Memoreei if needed
memoreei admin-url # a one-time dashboard sign-in link
memoreei admin password | remote on|off | status | reset # the dashboard from anywhere
memoreei key create | list | revoke <name>
memoreei service install | status | logs | uninstall | grant-access
memoreei status # message counts, sources, last sync times
memoreei config # settings, tokens masked
memoreei sync [source] # everything, or one of discord, telegram, matrix,
# slack, email, mastodon, imessage, whatsapp,
# signal
memoreei search "printer issue" --limit 5 --person "Jane" --after 2026-01-01
memoreei import sms backup.xml # also discord-package, messenger, instagram,
# json, csv, contacts
memoreei import list | forget <id> # the files `sync` re-readsEvery command takes --home <dir>, and --help.
How search works
Every query runs two searches at once, and fuses them:
"that weird API rate limit issue"
├─▶ keyword (SQLite FTS5, BM25) matches "API", "rate", "limit"
└─▶ vector (cosine similarity) matches "throttling", "429 errors", "backoff"
│
▼
Reciprocal Rank Fusion: score = Σ 1 / (60 + rank)Results that both searches found rise to the top; results only one found still count. RRF works on ranks, so the two scores never need to agree on a scale.
The default embedding model is BAAI/bge-small-en-v1.5 via FastEmbed: 384 dimensions,
about 67 MB of ONNX, fully offline. EMBEDDING_PROVIDER=openai swaps in OpenAI's.
Configuration
memoreei setup and the dashboard write settings to config.env and tokens and
passwords into the encrypted database; .env.example lists every setting
for editing by hand. A secret typed into config.env by hand works too: at the next start
it moves into the database and out of the file. The environment wins over a .env in
the current directory, which wins over config.env and the database.
Variable | Default | |
| per platform, above | holds |
|
| |
| — | the database's key, 64 hex characters, in place of the usual places: for containers |
|
| or |
|
| sync in the background while the server runs |
|
| seconds |
|
| network server address |
|
| network server port |
| — | the URL |
| — | serve HTTPS directly |
| your account's full name | names, numbers or addresses that mean you, comma-separated |
Connector settings:
Connector | Variables |
Discord |
|
Telegram |
|
Matrix |
|
Slack |
|
Gmail |
|
Mastodon |
|
iMessage |
|
| |
Signal |
|
The tokens, passwords and Signal's key in that table (and OPENAI_API_KEY) are kept in
the database, not in config.env. API keys aren't settings at all: they live in the
database, hashed.
Privacy
Everything is stored in one database on your machine, always encrypted (SQLCipher, AES-256): a copy of
memoreei.db(a backup, a synced folder, a lost laptop) is unreadable without its key. The sources' tokens and passwords are inside it too. The home directory is readable only by you, andconfig.envis mode 600.The key is 256 random bits, made on first start and kept in GNOME Keyring or KWallet on a Linux desktop, and otherwise in
memoreei.keybeside the database (mode 600): on a Mac (until Memoreei.app has a Developer ID, the Keychain would ask for your password after every update), on a headless Linux box, and elsewhere.memoreei configsays which; in the keyring it is "Memoreei database key". Back it up with the database: without the key, a backup ofmemoreei.dbis noise.A database from an earlier memoreei is encrypted on its first start (about 7 seconds for 150,000 messages). The old file's blocks are freed, not overwritten.
The default search model runs offline. No telemetry, no analytics, no cloud.
Network traffic happens only when you ask for it: live connectors call their own services, and
EMBEDDING_PROVIDER=openaisends message text to OpenAI.The network server is off until you start it, never runs without a key, and stores only hashes of its keys. Over the network it can search, not add or read files.
Contributing
CONTRIBUTING.md covers building from source, running the tests and adding a connector.
License
MIT
Available Tools
24 toolsadd_memoreeiB
Add a manual memory/note to your personal memory store.
Args: content: The text content to remember source: Source label for this memory (default: 'manual') metadata: Optional key-value metadata to attach
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | manual | |
| content | Yes | ||
| metadata | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It confirms a write/add operation but says nothing about persistence, duplicate handling, permissions, or what the add returns. For an unannotated mutation tool this is a real gap.
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?
The purpose sentence is front-loaded and the Args block is compact, one line per parameter. There is little waste, though the Args duplication of the schema is somewhat redundant.
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 3-param tool with no output schema and no annotations, the description covers the inputs but omits behavioral context an agent would want (persistence, return value, duplicate handling). Adequate but with clear gaps.
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 0%, so the description meaningfully compensates by documenting all three params: content ('text to remember'), source (with its 'manual' default), and metadata ('optional key-value metadata'). The metadata entry is thin (no expected keys or format), so it clarifies the basics but not the details.
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 ('add') and resource ('manual memory/note') with the target store ('personal memory store'). It is clear what the tool does, though it does not explicitly distinguish itself from the sibling search_memoreei. The word 'manual' implicitly separates it from the many sync_*/import_* 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?
The term 'manual' implies this is for user-entered notes as opposed to synced or imported data, giving implied usage context. However, there is no explicit when-to-use/when-not-to-use guidance and no alternative tool is named, leaving the agent to infer the boundary against the sync/import siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contextARead-only
The messages around one message, in its chat, oldest first; it has hit: true.
Use it when a search result is relevant but needs what was said around it: the question it answers, the reply, what "it" refers to.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Messages after it. Default 5. | |
| before | No | Messages before it. Default 5. | |
| memory_id | Yes | The id of a search result, exactly as given |
Output Schema
| Name | Required | Description |
|---|---|---|
| messages | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety profile. The description adds one useful behavioral trait, the ordering ('oldest first'), but the clause 'it has hit: true' is opaque and discloses no clear state. With annotations carrying safety, this is an adequate but not rich addition.
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?
Two short sentences, front-loaded with what it returns and followed by the usage cue; there is little waste. The 'it has hit: true' fragment is the one piece that does not earn its place, keeping it from a 5.
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?
An output schema exists, so return values need not be re-explained. The description covers what is returned, the ordering, and the chaining scenario, which is sufficient for a 3-parameter read tool, though naming the sibling search tool would fully close the loop.
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 before/after/memory_id are fully documented in the schema itself, including defaults and the 'exactly as given' note. The description adds no parameter syntax or meaning beyond that, so the baseline of 3 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?
It states the resource clearly (the messages around one message, in its chat, oldest first), giving an agent enough to know it returns surrounding context rather than a message itself. The lack of an explicit verb and the cryptic trailing clause 'it has hit: true' slightly muddy it, but the core purpose is unambiguous.
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?
It says exactly when to reach for it: when a search result is relevant but needs the surrounding exchange (the question it answers, the reply, what 'it' refers to). That is a strong chaining cue after a search. No exclusions or explicit sibling name (e.g. search_memoreei) are given, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_contacts_vcfA
Import contacts from a vCard (.vcf) file.
Export from macOS Contacts: File → Export → Export vCard. Maps phone numbers and email addresses to display names.
Args: file_path: Path to the .vcf file
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden. It does disclose a meaningful trait beyond the schema — that phone numbers and email addresses get mapped to display names — but says nothing about duplicate handling, whether existing contacts are merged or replaced, or what side effects the import has. That is a notable gap for a mutation tool with zero annotation coverage.
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 one-line purpose, followed by a focused export tip and a short Args block. No redundant restatement of the tool name; the macOS export hint is arguably optional but earns its place as practical input guidance.
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 simple one-parameter import with no output schema, the description covers purpose, input format, and one behavioral detail (name mapping). It omits what happens to pre-existing contacts and where the data lands, which an agent would want before invoking a write operation.
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 0%, so the schema documents nothing about the single parameter. The description compensates with an Args block clarifying file_path is a path to the .vcf file, adding format meaning beyond the bare 'string' type. It is minimal but fills the coverage gap.
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 ('Import contacts') plus the exact input format (vCard/.vcf), which distinguishes it from import_csv_file and import_json_file in the sibling set. It stops short of explicitly naming those alternatives, so 4 rather than 5.
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?
Provides a concrete 'how to produce the input' tip (macOS Contacts export path), which is genuinely useful context. However, it gives no guidance on when to use this versus sync_contacts or the other import_* tools, nor any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_csv_fileA
Import messages from any CSV file. Provide column names for your data format.
Auto-detects delimiter (comma, tab, semicolon). Supports header rows. Covers LinkedIn exports, any spreadsheet or custom CSV format.
Args: file_path: Path to the CSV, TSV, or delimited file content_column: Column name containing the message text (required) sender_column: Column name containing the sender name (optional) timestamp_column: Column name containing the timestamp (optional, auto-detects format) source_label: Label to tag imported messages with (default: 'csv-import')
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | ||
| source_label | No | csv-import | |
| sender_column | No | ||
| content_column | Yes | ||
| timestamp_column | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry behavioral disclosure. It mentions auto-detection of delimiter and support for headers, but lacks details on error handling, file size limits, duplicate handling, or side effects. The description provides moderate transparency.
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?
The description is well-structured with a summary line, followed by additional details and parameter documentation. It is efficient but slightly verbose in listing example sources. Most sentences add value.
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?
Given 5 parameters (2 required) and no output schema, the description covers parameter usage and general behavior. However, it omits details on return values, success/failure indications, and prerequisites. While adequate, it could be more complete.
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?
The JSON schema has 0% description coverage, but the description's Args section thoroughly explains each parameter, including required ones like content_column and optional like timestamp_column with auto-detection. It adds significant meaning 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?
The description clearly states 'Import messages from any CSV file,' specifying the action (import) and resource (messages from CSV). It also lists supported formats and provides examples like LinkedIn exports, differentiating it from sibling import tools for other formats.
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?
The description implies usage for CSV files and mentions specific sources, but does not explicitly state when to use alternatives (e.g., import_json_file) or provide conditions for not using this tool. Some guidance on exclusion is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_discord_packageA
Import a Discord Data Package (GDPR export). Imports all messages from all channels and DMs.
Request your data at Discord Settings > Privacy & Safety > Request All of My Data. Once downloaded, extract the ZIP or pass it directly — both are supported.
Args: package_path: Path to extracted data package folder or ZIP file
| Name | Required | Description | Default |
|---|---|---|---|
| package_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explains that all messages from all channels and DMs are imported and that both folder and ZIP formats are accepted, but it does not disclose potential side effects like processing time, size limits, or whether the import overwrites existing data.
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?
The description is extremely concise—four sentences that get straight to the point. It front-loads the purpose, then provides user guidance, and ends with parameter details. No unnecessary words.
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 tool with no output schema, the description covers the essentials: what it does, how to get the data, and the parameter format. It does not explicitly state the outcome (e.g., that data is added to memory), but sibling names like add_memory provide implicit context.
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?
The input schema has 0% description coverage, so the description must compensate. The Args section adds meaning by stating that 'package_path' can be a path to an extracted folder or a ZIP file, clarifying the acceptable formats beyond the schema's minimalist title.
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?
The description clearly states the verb 'Import' and the resource 'Discord Data Package (GDPR export)', and distinguishes it from sibling tools like import_csv_file or import_messenger by specifying its Discord-specific origin.
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?
It provides context on how to obtain the data (Discord Settings > Privacy & Safety > Request All of My Data) and notes that both extracted folders and ZIP files are supported. However, it does not explicitly state when to use this tool over alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_instagramA
Import Instagram DMs from a data download (GDPR export, JSON format). Download at: Instagram Settings > Accounts Center > Your Information > Download Your Information. Args: data_path: Path to the extracted Instagram data folder (containing your_instagram_activity/)
| Name | Required | Description | Default |
|---|---|---|---|
| data_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations; description does not disclose side effects (e.g., overwriting, idempotency), relying only on 'import' as a vague action.
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?
Two sentences plus an args line, no wasted words, efficiently conveys purpose and argument.
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 source format, acquisition steps, and parameter description; lacks error handling and output behavior, but adequate for a single-parameter import tool.
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 0% schema coverage, the description adds valuable meaning by specifying the data_path as the extracted folder containing 'your_instagram_activity/', beyond just type.
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?
The description clearly states it imports Instagram DMs from a GDPR export in JSON format, specifying verb and resource uniquely among 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?
Provides explicit download instructions and argument format, but lacks explicit when-not-to-use or alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_json_fileA
Import messages from any JSON file. Provide field names for your data format.
Supports JSON arrays, JSON-lines format, and wrapped objects. Covers Google Chat takeout, Google Hangouts exports, LinkedIn data, and any custom JSON format.
Args: file_path: Path to the JSON or JSON-lines file content_field: Field name containing the message text (required) sender_field: Field name containing the sender name (optional) timestamp_field: Field name containing the timestamp (optional, auto-detects format) source_label: Label to tag imported messages with (default: 'json-import')
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | ||
| sender_field | No | ||
| source_label | No | json-import | |
| content_field | Yes | ||
| timestamp_field | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It explains what the tool does and parameter roles, but does not disclose whether import is additive or destructive, what happens on failure, or any file size limits. Core behavior is covered, but side effects and error handling are omitted.
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?
The description is brief (four sentences plus list), front-loads the core purpose, and uses a clear structure. Every sentence adds value without repetition or fluff.
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?
Given 5 parameters, no output schema, and no annotations, the description covers purpose, format support, and parameter details. It lacks mention of return value or side effects (e.g., whether data is appended or replaced). Considering complexity, it is mostly complete but misses output context.
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 0%, but the description provides full parameter details in an Args section: purpose, required/optional status, and default values. This adds complete meaning beyond the schema, which only lists names and types.
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?
The description clearly states the tool imports messages from JSON files, specifies supported formats (arrays, JSON-lines, wrapped objects), and lists example data sources (Google Chat, Hangouts, LinkedIn). It distinguishes from siblings by focusing on generic JSON import rather than platform-specific formats.
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?
The description implies use for JSON files, especially those from common services, but does not explicitly exclude other formats like CSV (handled by import_csv_file) or state when not to use this tool. It provides context but lacks explicit alternatives or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_messengerA
Import Facebook Messenger messages from a data download (GDPR export, JSON format). Download from: Facebook Settings > Your Information > Download Your Information. Args: data_path: Path to the extracted Messenger data folder (containing messages/inbox/)
| Name | Required | Description | Default |
|---|---|---|---|
| data_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It only states that the tool imports messages, but does not disclose side effects (e.g., whether it overwrites existing data, requires authentication, or has rate limits). With no further behavioral context, the description is insufficient.
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?
The description is brief (3 sentences) and front-loaded with the purpose. The second sentence provides actionable download instructions, and the third defines the parameter. No redundant information, though the parameter definition could be integrated more seamlessly.
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 simple import tool with one parameter and no output schema, the description covers the essential aspects: what, format, how to obtain data, and expected input. It does not describe the return value, but this is less critical for a straightforward import operation.
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?
The input schema has 0% description coverage, but the description adds meaningful context by explaining that 'data_path' should point to the extracted folder containing 'messages/inbox/'. This compensates well for the schema's lack of detail.
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?
The description specifies exactly what the tool does: import Facebook Messenger messages from a GDPR export in JSON format. It distinguishes itself from sibling import tools (e.g., import_instagram, import_discord_package) by naming the source platform and format.
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?
Provides clear steps for obtaining the required data (Facebook Settings > Download Your Information) and specifies the expected folder structure (messages/inbox/). However, it does not explicitly state when to use this tool over alternatives, though the tool name and context make the context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_sms_backupA
Import SMS/MMS messages from an Android SMS Backup & Restore XML file. Works with the 'SMS Backup & Restore' app (most popular on Google Play).
Args: file_path: Path to the XML backup file
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as whether the import is additive, idempotent, or requires specific permissions. The basic action is stated, but deeper behavior is omitted.
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?
The description is very concise: two sentences plus an Args line. The first sentence front-loads the purpose, and every part is necessary. No wasted words.
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?
Given the tool's simplicity (one parameter, no output schema), the description covers the essentials. However, the lack of behavioral transparency and any usage guidance leaves gaps for an agent to fully understand the tool's implications.
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 0% schema description coverage, the description adds meaning by explaining what 'file_path' is ('Path to the XML backup file'). However, it lacks details like accepted formats, validation rules, or examples, so it only partially compensates.
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?
The description clearly states the verb 'Import' and the resource 'SMS/MMS messages' from a specific source format (Android SMS Backup & Restore XML). This distinguishes it from sibling import tools for other formats.
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?
The description implies the tool should be used when users have an Android SMS Backup & Restore XML file, but it does not explicitly state when not to use it or mention alternatives among the many sibling import tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sourcesARead-only
Who is in the archive: the most-messaged people with their chats, the busiest group chats, and the platforms.
Not needed before searching: search_memoreei finds people by name or number itself.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Only people and groups whose name matches, like participant does ('Jane', 'jan do'). | |
| limit | No | How many people, and how many groups. Default 30. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| total | Yes | |
| groups | Yes | |
| people | Yes | |
| not_shown | No | |
| platforms | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety profile. The description adds that results are ordered by message volume and split across people/groups/platforms, but this is essentially return-content detail also covered by the output schema, so it adds limited behavioral context beyond annotations.
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?
Two short sentences with zero waste, and the routing constraint is front-loaded in the second line. Nothing redundant or padded.
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 an output schema present, return values need not be explained, and annotations cover safety. The description supplies purpose and usage context adequately, though the meaning of 'sources' relies partly on the annotation title ('List people and chats').
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 'name' (partial match, like participant) and 'limit' (default 30, max 200) are already fully documented in the schema. The description adds no parameter detail beyond it, 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?
The description defines what list_sources returns: the most-messaged people with their chats, busiest group chats, and platforms. It conveys the resource concretely, though it is phrased as a label ('Who is in the archive') rather than a clean verb+resource, and it doesn't explicitly contrast against other listing-type 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?
It states when the tool is NOT needed ('Not needed before searching') and names the alternative that handles the case instead (search_memoreei finds people by name or number itself). This is explicit routing guidance an agent can act on directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_memoreeiB
Trigger an immediate sync of all configured sources and return new message count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It states the tool triggers an outward-facing sync but never says whether it blocks, how long it takes, whether it is rate-limited, whether re-running is safe, or whether it can fail on unreachable sources — meaningful gaps for a network-triggering operation.
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?
A single sentence with the action, scope, and outcome front-loaded in that order. No filler, no restatement of the tool name, nothing that could be cut.
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 usefully compensates by naming the return value ('new message count'). Combined with zero parameters and a stated scope, an agent has enough to call it, though blocking behavior and failure modes remain undocumented and there are no annotations to cover them.
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?
The tool takes zero parameters, so there is no parameter semantics to explain and the baseline is 4. The description correctly avoids inventing parameters and instead spends its words on scope and return value.
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?
The description names a specific action ('Trigger an immediate sync'), its scope ('all configured sources'), and its return value ('new message count'). It is clear what the tool does, but it offers no differentiation from the heavy cluster of sync siblings such as sync_all and sync, which appear to overlap with the same 'sync everything' semantics.
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?
There is no guidance on when to prefer this over sync_all, sync, or the per-platform sync_* tools. The agent is left to infer that a tool literally named for a product refresh is distinct from the near-identical 'sync all configured sources' siblings, with no exclusions or alternatives stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_memoreeiARead-only
Search the owner's messages by meaning and by keyword, best match first.
Every filter narrows the search before it ranks anything, so a filtered search finds the best matches within those messages. If results is empty or note is set, note says why and what to try.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only messages on or after this date: 'YYYY-MM-DD' or 'YYYY-MM-DDTHH:MM', in the owner's time zone. | |
| limit | No | How many results. Default 10. | |
| query | Yes | What to look for, in a few words: 'credit card recommendation', 'dinner Saturday'. Leave people's names out; use participant for who. | |
| before | No | Only messages on or before this date: 'YYYY-MM-DD' (the whole day counts) or 'YYYY-MM-DDTHH:MM'. | |
| source | No | Only one app ('imessage', 'whatsapp', 'signal', …) or one chat, by a result's source. For a person, use participant instead. | |
| participant | No | Whose messages to search: a name ('Jane Doe'), part of one ('Jane', 'jan do'), a phone number in any format ('+1 202 555 0142', '2025550142') or an email address. One name finds the person on every app; 'me' is the owner. | |
| participant_scope | No | How much of participant's messages to search. 'conversation' (default): what they wrote anywhere, plus both sides of the owner's one-to-one chats with them. 'sent': only what they wrote. 'any_chat': everything in every chat they are in, groups included. | conversation |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| people | No | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), but the description adds genuine behavioral context: results are ranked best-match-first, filters are applied before ranking, and the failure/empty path surfaces an explanatory 'note'. It stops short of mentioning pagination or result-size behavior, but the filter-then-rank ordering and empty-result semantics are substantive additions.
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, front-loaded with the core capability, and no filler. The final sentence ('If results is empty or note is set, note says why and what to try') is slightly convoluted in phrasing but each sentence carries distinct 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?
An output schema exists, so return-value explanation is not required, and the description still cues the 'results'/'note' structure it returns. For a 7-parameter read-only search with full schema coverage, the definition supplies the retrieval semantics an agent needs; only cross-tool routing guidance 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 description coverage is 100%, so every parameter (after, before, source, participant, participant_scope, limit, query) is already documented in the schema, including examples and the enum semantics. The description only speaks of 'filters' generically and adds no syntax or constraint 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 ('Search the owner's messages') and even names the retrieval mode ('by meaning and by keyword, best match first'). No sibling in the tool list performs search, so the purpose is unambiguous without needing to reference an alternative.
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?
The description explains result/empty behavior ('If results is empty or note is set, note says why and what to try') but never states when to choose this over other tools or any precondition. Usage is implied by the search framing rather than explicitly guided. With a sibling set consisting only of sync/import/add tools, the lack of explicit alternatives is a smaller gap but still a gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
syncAIdempotent
Refresh memory from the sources configured on the server.
Runs every connector set up in the server's config, and re-reads any import files that were registered on the server and have changed since. Takes no arguments: it can only refresh what the server's owner has already set up.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=false, idempotentHint=true, destructiveHint=false and readOnlyHint=false; the description adds real context by spelling out what it touches (all configured connectors plus changed registered import files) and why it is idempotent (only re-reads files that changed since). It stops short of describing runtime behavior such as blocking/duration or the result of a run.
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 short sentences, the core action front-loaded, and each sentence carries distinct information (what it does, which connectors/files, why it takes no arguments). Nothing is 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 no-argument tool with no output schema and strong annotations, the description is nearly sufficient: it defines scope, mechanism, and constraints. It could be better if it named the sync_all alternative or hinted at what a run produces (e.g., new-item counts), but 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?
There are zero parameters, so the baseline is 4, and the description usefully confirms 'Takes no arguments' and explains why (it can only refresh server-configured sources). No additional param meaning is needed.
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+resource ('Refresh memory from the sources configured on the server') and explains the mechanism (runs every configured connector, re-reads changed import files). However, it never distinguishes itself from the sibling sync_all, which on its face sounds like the same broad operation, leaving the agent to guess which to pick.
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?
It implies scope with 'it can only refresh what the server's owner has already set up,' which tells the agent this is a config-driven bulk refresh, but gives no explicit when-to-use versus the many alternatives (sync_all, sync_discord, sync_telegram, etc.). Usage is inferable but not directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_allA
Sync every configured connector and return counts per source.
Iterates over all connectors that have sufficient configuration (Discord, Telegram, Matrix, Slack, email, Mastodon) and syncs each one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It mentions syncing each connector but does not discuss potential side effects, error handling, or whether the operation is idempotent.
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?
The description is two sentences long, front-loaded with the main purpose, and each sentence adds value without 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?
Given the tool has no input schema and no output schema, the description provides essential context: iterates over configured connectors and returns counts. It could mention behavior on failure or ordering, but is fairly complete for a batch sync command.
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?
The tool has zero parameters, and the input schema is empty. The description adds no parameter information, which is acceptable since none are needed. Baseline for 0 params is 4.
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?
The description clearly states the action ('sync every configured connector') and output ('return counts per source'), listing specific connector types, which differentiates it from individual sync sibling tools.
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?
The description implies usage when syncing all configured connectors is desired, and the sibling tools provide clear alternatives for individual syncs. However, it does not explicitly state when not to use or any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_contactsA
Sync contacts from macOS AddressBook into the contacts table.
Maps phone numbers and email addresses to display names so that search results and source listings show contact names instead of raw identifiers. macOS only — returns an empty result on other platforms.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the source, target table, name-mapping behavior, and platform-specific empty-result behavior, but it does not say whether existing contacts are overwritten or merged, whether permissions are required, or how repeated syncs behave.
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?
The description is short, front-loaded with the primary action, and structured into purpose, mapping effect, and platform caveat. Every sentence adds useful information without repetition.
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 parameterless sync tool with no output schema and no annotations, the description covers the source, target, mapping effect, and platform behavior. It leaves some mutation semantics unstated, but it is nearly complete 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?
The tool takes zero parameters, so there are no parameter semantics to clarify. The schema coverage is listed at 100%, and the description correctly adds no unnecessary parameter detail beyond the tool's operation.
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?
The description names a specific verb (sync), resource (contacts), and source (macOS AddressBook), and states the effect of writing into the contacts table. It is clearly distinguishable from generic sync siblings by its macOS-specific source, though it does not explicitly contrast itself with import_contacts_vcf or other contact-import tools.
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?
The description gives an implied usage context: syncing native macOS AddressBook contacts. It also states a platform constraint (macOS only; empty result elsewhere). However, it never says when to choose this over siblings such as import_contacts_vcf, nor does it describe prerequisites or exclusions beyond the platform note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_discordB
Sync recent Discord messages from the configured channel.
Args: channel_id: Discord channel ID to sync (uses DISCORD_CHANNEL_ID env var if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry full behavioral burden. It only says 'sync' without disclosing traits like read/write nature, rate limits, permissions, or impact on state. Minimal transparency.
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?
The description is extremely concise (two lines) and front-loaded with purpose. Every word adds value.
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?
Given a simple tool with 1 optional param and no output schema, the description covers purpose and parameter usage. However, it omits return value, behavior (does it store or just fetch?), and interaction with the configured channel. Adequate but not fully complete.
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 0% schema description coverage, the description compensates by explaining that channel_id is a Discord channel ID and can default from an env var. This adds meaning beyond the schema's type and default.
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?
The description clearly states it syncs recent Discord messages from a configured channel, which is a specific verb and resource. However, among many sync siblings (sync_email, sync_slack, etc.), it does not differentiate beyond the platform name.
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?
No guidance on when to use this tool vs alternatives (e.g., sync_all, import_discord_package). The description does not provide prerequisites, when-not-to-use, or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_emailA
Sync Gmail messages into memory via IMAP.
Fetches emails from a Gmail folder and stores them for search. Uses a per-folder UID checkpoint to avoid re-ingesting messages on subsequent syncs.
Requires environment variables: GMAIL_EMAIL - Gmail address (e.g. you@gmail.com) GMAIL_APP_PASSWORD - Gmail App Password (required if 2FA is enabled). Create one at https://myaccount.google.com/apppasswords GMAIL_PASSWORD may be used instead for non-2FA accounts, but Google has deprecated plain-password IMAP access.
Args: folder: IMAP folder to sync (default: 'INBOX'). Other options: '[Gmail]/Sent Mail', '[Gmail]/All Mail', etc. max_emails: Maximum number of emails to ingest per sync (default: 200).
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | INBOX | |
| max_emails | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the per-folder UID checkpoint (indicating incremental sync), required environment variables, and the default folder. It does not hide any side effects.
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?
The description is divided into a one-sentence summary, a behavioral paragraph, environment variable requirements, and an Args section. Every sentence adds value and there is no 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?
Given the simplicity of the tool (2 parameters, no output schema), the description covers all necessary aspects: purpose, behavior (UID checkpoint), prerequisites (env vars), and parameter details. It leaves no ambiguity.
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?
The input schema provides only type and default for folder and max_emails. The description adds meaningful context: folder options with examples like '[Gmail]/Sent Mail', and max_emails as a cap per sync. This fully compensates for the missing schema descriptions.
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?
The description starts with 'Sync Gmail messages into memory via IMAP.', clearly stating the verb (sync), resource (Gmail messages), and mechanism (IMAP). It distinguishes itself from sibling sync tools (e.g., sync_slack, sync_discord) by targeting email, specifically Gmail.
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?
The description mentions that it fetches emails from a Gmail folder and stores them for search, and explains that it uses a UID checkpoint to avoid re-ingesting. It does not explicitly state when not to use it, but the context is clear for Gmail email syncing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_imessageA
Sync iMessage/SMS conversations from the local macOS Messages database.
Reads ~/Library/Messages/chat.db in read-only mode. macOS only — returns an error dict on other platforms without raising.
Requires Full Disk Access for the program running this server, granted in System
Settings → Privacy & Security → Full Disk Access (memoreei service grant-access
opens it with the right file shown).
The path to chat.db can be overridden with the IMESSAGE_DB_PATH env var.
Args: chat_name: Optional filter — only sync messages from this chat/contact. Matches against chat_identifier (e.g. '+1234567890') or display name.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it discloses read-only access, platform restriction ('returns an error dict on other platforms without raising'), the Full Disk Access prerequisite, and the IMESSAGE_DB_PATH override. It omits idempotency/incremental behavior and whether existing synced data is replaced, which for a sync tool would matter.
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 purpose, then platform/prerequisite details, then the argument. Every sentence carries information, though the Full Disk Access sentence is somewhat long and the parenthetical remediation command is more operational than agent-facing.
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-optional-param tool with no output schema, the definition covers platform, prerequisites, path override, and filter semantics adequately. The return shape is only hinted at ('error dict'), so an agent has a mild gap on what a successful sync produces, but nothing critical 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 0%, so the description must compensate, and it does: chat_name is explained as an optional filter matching against chat_identifier (with the '+1234567890' example) or display name. This adds real matching semantics the bare 'Chat Name' property name does not convey.
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?
The description states a specific verb+resource ('Sync iMessage/SMS conversations from the local macOS Messages database') and names the exact data source (chat.db). It clearly distinguishes itself from siblings like sync_signal, sync_telegram, and import_sms_backup by anchoring to the local macOS Messages store rather than another provider or an import path.
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?
It gives clear operational context: macOS-only, read-only, and the Full Disk Access requirement with a concrete remediation command. It does not, however, tell the agent when to prefer this over sync_all or import_sms_backup, so the alternative-selection guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_mastodonA
Sync recent Mastodon posts from a public or hashtag timeline into memory.
Uses the Mastodon REST API. Public and hashtag timelines require no authentication. An access token is only needed for home timeline or private accounts.
Optional environment variables: MASTODON_INSTANCE - Mastodon instance URL (default: https://mastodon.social) MASTODON_HASHTAG - default hashtag to sync (without #) MASTODON_ACCESS_TOKEN - access token for authenticated requests (optional)
Args: instance: Mastodon instance base URL (e.g. https://fosstodon.org). Uses MASTODON_INSTANCE env var if not provided. hashtag: Hashtag to sync (without #, e.g. 'python'). Uses MASTODON_HASHTAG env var or public timeline if not provided. access_token: OAuth access token. Uses MASTODON_ACCESS_TOKEN env var if not provided.
| Name | Required | Description | Default |
|---|---|---|---|
| hashtag | No | ||
| instance | No | ||
| access_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It covers authentication but fails to disclose critical behavioral traits such as whether syncing overwrites or appends to existing memory, potential rate limits, or error handling. The term 'sync' is ambiguous regarding side effects.
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?
The description is well-structured with sections (purpose, API details, environment, Args). Every sentence adds value, though it could be slightly more concise by merging the environment and args sections.
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?
The description covers authentication and parameter details but lacks information on the sync behavior (e.g., does it merge or replace?), error handling, and rate limits. Given that no output schema exists and the tool imports external data, these gaps reduce completeness.
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?
Despite 0% schema description coverage, the description thoroughly explains each parameter in the Args section, including defaults and environment variable fallbacks. This adds significant meaning beyond the bare JSON Schema, though it could be more precise about input formats.
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?
The description clearly states the action ('sync'), resource ('Mastodon posts'), and scope ('recent', 'public or hashtag timeline'), making the purpose specific and unambiguous. It distinguishes from sibling tools by explicitly mentioning 'Mastodon', which is unique among the listed sibling tools.
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?
The description provides clear context on authentication requirements (public/hashtag vs home/private) and environment variable alternatives. While it doesn't explicitly say when to use this tool over alternatives (e.g., sync_all), the sibling tools are clearly for different platforms, so usage is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_matrixA
Sync Matrix room messages into memory using the Matrix Client-Server API.
Fetches messages from a Matrix room and stores them for search. Uses a per-room pagination token checkpoint to avoid re-ingesting messages.
Requires environment variables: MATRIX_HOMESERVER - e.g. https://matrix.org MATRIX_ACCESS_TOKEN - user access token MATRIX_ROOM_ID - default room to sync (optional if room_id provided)
Args: room_id: Matrix room ID to sync (e.g. !abc123:matrix.org). Uses MATRIX_ROOM_ID env var if not provided.
| Name | Required | Description | Default |
|---|---|---|---|
| room_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the burden of behavioral disclosure. It reveals the use of a pagination token to avoid re-ingesting and the need for environment variables. However, it does not mention potential side effects, idempotency, rate limits, or authorization requirements beyond token provision.
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?
The description is well-organized with a purpose paragraph and an Args section. It is concise at 8 lines but repeats the environment variable information slightly. The structure is front-loaded with the core action.
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?
Given the low complexity (one optional param, no output schema, no annotations), the description covers the main aspects: purpose, parameter, prerequisites (env vars), and internal mechanism (pagination token). It is complete enough for an agent to use, though it omits details like message limits or rate limits.
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?
The input schema has minimal structure (one optional parameter with title only). The description adds critical meaning: the parameter format (example Matrix ID), fallback to environment variable, and default behavior. This fully compensates for the 0% schema description coverage.
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?
The description clearly states the action (sync Matrix room messages) and the resource (messages stored for search). It distinguishes itself from sibling sync tools by naming the platform 'Matrix', but does not explicitly differentiate its behavior or use case from them.
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?
The description mentions required environment variables and optional room_id, but provides no guidance on when to use this tool instead of alternatives like sync_slack or sync_discord. There is no indication of prerequisites or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_signalA
Sync Signal from Signal Desktop's database on this computer.
Needs Signal connected first (the dashboard's Sources page, or memoreei setup signal), which reads Signal's database key from the system keyring once. Texts,
captions, links, group changes and calls are kept, reactions and edits follow
the message they belong to, and disappearing messages are never stored.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well. It discloses the required Signal connection and keyring read, exactly what data is kept (texts, captions, links, group changes, calls), how reactions/edits are handled, and that disappearing messages are never stored.
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?
The description is three tight sentences: purpose first, then prerequisite/setup, then retention behavior. Every sentence adds useful information and there is no filler or repetition.
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?
Given no parameters, no output schema, and no annotations, the description covers purpose, setup requirements, and data handling policies thoroughly. An agent has enough context to know when and how to invoke it without needing additional structured fields.
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?
The tool takes zero parameters, so there are no parameter semantics for the description to clarify. The baseline for a parameterless tool is 4, and the description appropriately does not invent or omit parameter details.
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?
The description states a specific verb and resource: 'Sync Signal from Signal Desktop's database on this computer.' It names the source platform and local database, which distinguishes it from sibling sync tools for WhatsApp, Discord, Telegram, etc. without ambiguity.
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?
It gives a clear prerequisite: Signal must be connected first via the dashboard Sources page or `memoreei setup signal`. This tells the agent when the tool can actually be used, but it does not explicitly contrast this tool with alternatives like sync_all or other sync_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_slackA
Sync recent Slack messages from the configured channel into memory.
Uses the Slack Web API (conversations.history) to fetch messages since the last sync. Requires a bot token with channels:history and users:read scopes.
Requires environment variables: SLACK_BOT_TOKEN - Slack bot token (xoxb-...) SLACK_CHANNEL_ID - default channel to sync (optional if channel_id provided)
Args: channel_id: Slack channel ID to sync (e.g. C1234567890). Uses SLACK_CHANNEL_ID env var if not provided.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations; description mentions API usage and scopes but omits behavior on errors, rate limits, or whether it's read-only (though implied).
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?
Concise, well-structured with clear lead sentence and Args section; no extraneous 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?
Covers parameter and requirements but lacks description of return value or side effects (only says 'into memory').
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?
Adds complete meaning to the single parameter with type, example, and fallback behavior, compensating for 0% schema coverage.
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?
Description clearly states it syncs recent Slack messages into memory, distinguishes from siblings by specifying Slack and using Slack Web API.
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?
Provides prerequisites (scopes, env vars) but lacks explicit guidance on when to use vs alternatives (e.g., sync_all) or when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_telegramA
Sync new Telegram messages received by the bot into memory.
Uses the Telegram Bot API (getUpdates) to fetch messages sent to the bot since the last sync. Requires TELEGRAM_BOT_TOKEN in environment.
Args: chat_id: Telegram chat ID to filter (positive = user DM, negative = group). Syncs all chats if not provided. Uses TELEGRAM_CHAT_ID env var as default.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses core behavior: uses getUpdates, syncs since last sync, requires token, and filters by chat_id. However, it lacks details on side effects (e.g., memory updates, deduplication), idempotency, error handling, or rate limits. Without annotations, the description carries the burden but covers only essential mechanics.
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?
Description is structured with a clear purpose line, technical details, and an argument section. It is reasonably concise but could tighten the arg description into fewer sentences. No wasted words.
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?
Given no output schema and no annotations, the description explains the tool's operation and parameter adequately but misses output behavior or return value. It does not mention what the tool returns (e.g., count of synced messages) or error scenarios. Sibling tools might have similar gaps, but for a mutating sync tool, more completeness would help.
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?
The description adds significant meaning beyond the schema: explains chat_id sign convention (positive DM, negative group), default behavior (syncs all chats if omitted), and environment variable fallback (TELEGRAM_CHAT_ID). Schema coverage is 0%, so this full explanation compensates completely.
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?
Description clearly states 'Sync new Telegram messages received by the bot into memory,' providing a specific verb (sync), resource (Telegram messages), and scope (new messages received by bot). It distinguishes from siblings like sync_discord by explicitly naming Telegram and the bot-specific nature.
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?
No explicit guidance on when to use this tool vs alternatives (e.g., import_telegram, other sync tools). It mentions a prerequisite (TELEGRAM_BOT_TOKEN) but does not specify exclusion criteria or recommend alternatives for different use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_whatsappA
Sync WhatsApp chats from WhatsApp for Mac's database on this machine.
Reads ChatStorage.sqlite read-only: WhatsApp for Mac's, or the file WHATSAPP_DB_PATH names, such as the one in an iPhone backup. Texts, captions, shared links and document names are kept; stickers, voice notes and reactions have no words to keep.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does notable work: it discloses read-only access to ChatStorage.sqlite, the WHATSAPP_DB_PATH override, the iPhone-backup case, and exactly which content is retained versus dropped. It omits dedup/repeat-sync behavior and any auth or rate-limit notes, keeping it below a 5.
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 the purpose, then the data source, then the retention rule. Every clause carries information, though the kept/dropped enumeration is slightly verbose for a 0-param 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?
For a parameterless sync tool with no annotations and no output schema, the description covers source selection and retention policy well. It stops short of saying where synced chats land or how repeat runs behave, which would complete the 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?
The tool takes zero parameters, so there is no parameter surface to document; the baseline for a no-param tool is 4. The description usefully explains the implicit input (WHATSAPP_DB_PATH or the default Mac database) even though no schema field exists for it.
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 (sync WhatsApp chats) and pins the source precisely: WhatsApp for Mac's database on this machine. Among a large family of sync_* and import_* siblings, naming the exact source distinguishes it clearly.
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?
Usage is implied by the source-specific phrasing, but the description never states when to pick this over siblings like import_messenger or sync_imessage, nor any prerequisites such as WhatsApp for Mac being installed or an iPhone backup existing. Adequate but leaves the when-to-use decision to inference.
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.
3 tool updates
v0.4.7- Changed
get_context12 fields changed- added
Input schema / properties / after / descriptionAdded value: +"Messages after it. Default 5." - added
Input schema / properties / after / maximumAdded value: +50 - added
Input schema / properties / after / minimumAdded value: +0 - added
Input schema / properties / before / descriptionAdded value: +"Messages before it. Default 5." - added
Input schema / properties / before / maximumAdded value: +50 - added
Input schema / properties / before / minimumAdded value: +0 - added
Input schema / properties / memory_id / descriptionAdded value: +"The id of a search result, exactly as given" - added
Output schema / $defsAdded value: +{ + "Message": { + "properties": { + "chat": { + "description": "The group's name, or the other person in a one-to-one chat", + "title": "Chat", + "type": "string" + }, + "content": { + "description": "The message, as stored: usually 'sender: text'", + "title": "Content", + "type": "string" + }, + "date": { + "description": "When it was sent, YYYY-MM-DD HH:MM, owner's time zone", + "title": "Date", + "type": "string" + }, + "deleted": { + "description": "Deleted for everyone after it was read", + "title": "Deleted", + "type": "boolean" + }, + "group": { + "description": "True for a group chat", + "title": "Group", + "type": "boolean" + }, + "hit": { + "description": "The message get_context was asked about", + "title": "Hit", + "type": "boolean" + }, + "id": { + "description": "Pass to get_context to read around this message", + "title": "Id", + "type": "string" + }, + "platform": { + "description": "imessage, whatsapp, signal, …", + "title": "Platform", + "type": "string" + }, + "sender": { + "description": "Who wrote it; 'me' is the owner", + "title": "Sender", + "type": "string" + }, + "source": { + "description": "The chat's id, for the source filter", + "title": "Source", + "type": "string" + } + }, + "required": [ + "id", + "date", + "platform", + "chat", + "group", + "sender", + "content", + "source" + ], + "title": "Message", + "type": "object" + } +} - added
Output schema / properties / messagesAdded value: +{ + "items": { + "$ref": "#/$defs/Message" + }, + "title": "Messages", + "type": "array" +} - removed
Output schema / properties / resultRemoved value: -{ - "items": { - "additionalProperties": true, - "type": "object" - }, - "title": "Result", - "type": "array" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "messages" +] - changed
Output schema / titlePrevious value: -"get_contextOutput"New value: +"Context"
- Changed
list_sources3 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 30, + "description": "How many people, and how many groups. Default 30.", + "maximum": 200, + "minimum": 1, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Only people and groups whose name matches, like participant does ('Jane', 'jan do').", + "title": "Name" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "GroupSource": { + "properties": { + "messages": { + "title": "Messages", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + } + }, + "required": [ + "name", + "source", + "messages" + ], + "title": "GroupSource", + "type": "object" + }, + "PersonSources": { + "properties": { + "messages": { + "title": "Messages", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + }, + "sources": { + "additionalProperties": { + "type": "integer" + }, + "description": "Each chat's source id and its message count", + "title": "Sources", + "type": "object" + } + }, + "required": [ + "name", + "messages", + "sources" + ], + "title": "PersonSources", + "type": "object" + } + }, + "properties": { + "groups": { + "items": { + "$ref": "#/$defs/GroupSource" + }, + "title": "Groups", + "type": "array" + }, + "not_shown": { + "anyOf": [ + { + "additionalProperties": { + "type": "integer" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Not Shown" + }, + "note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Note" + }, + "people": { + "items": { + "$ref": "#/$defs/PersonSources" + }, + "title": "People", + "type": "array" + }, + "platforms": { + "items": { + "type": "string" + }, + "title": "Platforms", + "type": "array" + }, + "total": { + "title": "Total", + "type": "integer" + } + }, + "required": [ + "total", + "platforms", + "people", + "groups" + ], + "title": "Sources", + "type": "object" +}
- Changed
search_memoreei16 fields changed- added
Input schema / properties / after / descriptionAdded value: +"Only messages on or after this date: 'YYYY-MM-DD' or 'YYYY-MM-DDTHH:MM', in the owner's time zone." - added
Input schema / properties / before / descriptionAdded value: +"Only messages on or before this date: 'YYYY-MM-DD' (the whole day counts) or 'YYYY-MM-DDTHH:MM'." - added
Input schema / properties / limit / descriptionAdded value: +"How many results. Default 10." - added
Input schema / properties / limit / maximumAdded value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / participant / descriptionAdded value: +"Whose messages to search: a name ('Jane Doe'), part of one ('Jane', 'jan do'), a phone number in any format ('+1 202 555 0142', '2025550142') or an email address. One name finds the person on every app; 'me' is the owner." - added
Input schema / properties / participant_scopeAdded value: +{ + "default": "conversation", + "description": "How much of participant's messages to search. 'conversation' (default): what they wrote anywhere, plus both sides of the owner's one-to-one chats with them. 'sent': only what they wrote. 'any_chat': everything in every chat they are in, groups included.", + "enum": [ + "conversation", + "sent", + "any_chat" + ], + "title": "Participant Scope", + "type": "string" +} - added
Input schema / properties / query / descriptionAdded value: +"What to look for, in a few words: 'credit card recommendation', 'dinner Saturday'. Leave people's names out; use participant for who." - added
Input schema / properties / source / descriptionAdded value: +"Only one app ('imessage', 'whatsapp', 'signal', …) or one chat, by a result's source. For a person, use participant instead." - added
Output schema / $defsAdded value: +{ + "Message": { + "properties": { + "chat": { + "description": "The group's name, or the other person in a one-to-one chat", + "title": "Chat", + "type": "string" + }, + "content": { + "description": "The message, as stored: usually 'sender: text'", + "title": "Content", + "type": "string" + }, + "date": { + "description": "When it was sent, YYYY-MM-DD HH:MM, owner's time zone", + "title": "Date", + "type": "string" + }, + "deleted": { + "description": "Deleted for everyone after it was read", + "title": "Deleted", + "type": "boolean" + }, + "group": { + "description": "True for a group chat", + "title": "Group", + "type": "boolean" + }, + "hit": { + "description": "The message get_context was asked about", + "title": "Hit", + "type": "boolean" + }, + "id": { + "description": "Pass to get_context to read around this message", + "title": "Id", + "type": "string" + }, + "platform": { + "description": "imessage, whatsapp, signal, …", + "title": "Platform", + "type": "string" + }, + "sender": { + "description": "Who wrote it; 'me' is the owner", + "title": "Sender", + "type": "string" + }, + "source": { + "description": "The chat's id, for the source filter", + "title": "Source", + "type": "string" + } + }, + "required": [ + "id", + "date", + "platform", + "chat", + "group", + "sender", + "content", + "source" + ], + "title": "Message", + "type": "object" + }, + "PersonMatch": { + "properties": { + "identifiers": { + "description": "Phone numbers and addresses known for them", + "items": { + "type": "string" + }, + "title": "Identifiers", + "type": "array" + }, + "me": { + "description": "This is the owner", + "title": "Me", + "type": "boolean" + }, + "name": { + "title": "Name", + "type": "string" + } + }, + "required": [ + "name", + "identifiers" + ], + "title": "PersonMatch", + "type": "object" + } +} - added
Output schema / properties / noteAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Note" +} - added
Output schema / properties / peopleAdded value: +{ + "anyOf": [ + { + "items": { + "$ref": "#/$defs/PersonMatch" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "People" +} - removed
Output schema / properties / resultRemoved value: -{ - "items": { - "additionalProperties": true, - "type": "object" - }, - "title": "Result", - "type": "array" -} - added
Output schema / properties / resultsAdded value: +{ + "items": { + "$ref": "#/$defs/Message" + }, + "title": "Results", + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "results" +] - changed
Output schema / titlePrevious value: -"search_memoreeiOutput"New value: +"SearchResult"
9 tool updates
v0.4.4- Added
add_memoreei - Removed
add_memory - Removed
ingest_whatsapp - Added
refresh_memoreei - Removed
refresh_memory - Added
search_memoreei - Removed
search_memory - Changed
sync_signal1 field changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Conversation Id" -}
- Added
sync_whatsapp
3 tool updates
v0.4.1- Added
import_contacts_vcf - Added
sync - Added
sync_contacts
21 tool updates
v0.2.2- First observed
add_memory - First observed
get_context - First observed
import_csv_file - First observed
import_discord_package - First observed
import_instagram - First observed
import_json_file - First observed
import_messenger - First observed
import_sms_backup - First observed
ingest_whatsapp - First observed
list_sources - First observed
refresh_memory - First observed
search_memory - First observed
sync_all - First observed
sync_discord - First observed
sync_email - First observed
sync_imessage - First observed
sync_mastodon - First observed
sync_matrix - First observed
sync_signal - First observed
sync_slack - First observed
sync_telegram
TDQS
Scored across 24 tools
Three tools—sync, sync_all, and refresh_memoreei—all appear to do essentially the same thing (refresh/re-sync configured sources), making selection confusing. The per-source sync_* tools are clearer, but the trio of generic sync tools creates real overlap that descriptions do not resolve.
Most tools follow a predictable verb_noun pattern (sync_discord, import_messenger, list_sources), but add_memoreei, refresh_memoreei, and search_memoreei inconsistently append the server name while the rest do not. Readable overall but the mixed convention is a notable deviation.
24 tools is on the heavy side (16-25 is borderline), though a broad multi-platform memory ingester legitimately needs many per-source connectors. The count is defensible but feels inflated by redundant generic sync tools.
Ingestion across a wide range of platforms plus search, context retrieval, source listing, and contacts coverage make the surface strong. The main gap is the lack of any delete or update operation for stored memories, leaving a lifecycle dead end.
Maintenance
Related MCP Connectors
- EngramOAuthapp.getengram
Persistent, verbatim, searchable memory for AI assistants — one memory across every MCP client.
Persistent personal memory for AI assistants — save, search, and recall across every MCP client.
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Persistent, portable memory for AI assistants — your private memory graph, from any MCP client.
Related MCP Servers
- AlicenseAqualityAmaintenanceA local MCP server that gives AI assistants a long-term memory by capturing sessions verbatim and surfacing relevant context automatically.15911MIT
- FlicenseNot gradedqualityBmaintenanceA local MCP server for AI assistants to store and retrieve personal memories on disk, with optional semantic search using embeddings.1-
- FlicenseNot gradedqualityDmaintenanceAn MCP server for managing persistent AI memory using hybrid search (keyword + semantic vector) with SQLite storage and offline-first local embeddings.-
- AlicenseNot gradedqualityBmaintenanceA self-hosted MCP server that provides a personal semantic memory layer for AI tools. It enables storing, searching, and managing memories using hybrid vector and keyword search, allowing AI assistants to recall information by meaning.MIT