hive-memory
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., "@hive-memoryrecall what I decided about the Q3 roadmap"
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.
Memory Hive MCP
Local-first personal memory for AI agents, over MCP. Your agents can search what you have confirmed and propose what they think you should keep; only you can confirm it. Everything lives in one file on your own disk, and nothing is sent anywhere.
It runs on its own. A working SQLite memory store ships inside this package — no account, no cloud, no daemon, no dependencies.
pip install memory-hive-mcpWhat you get without the app
A complete, if modest, memory server. On a machine with nothing else installed:
Call | What happens |
| answered locally, protocol |
| answered locally, six tools |
| writes to a real database on your disk |
| searches that database and returns ranked entries |
| a digest of what you confirmed most recently |
| read one entry, list what is pending, forget, restore |
| a shared message board for coordinating several agents |
Storage is SQLite at ~/.memory-hive/hive.db by default. Search is lexical — character bigrams
for Chinese, words for Latin script — so it ranks well when the words overlap and finds nothing
when they do not. There are no embeddings and no vector index. Every response says
"mode": "local" so you can always tell which engine answered.
Without the app, the database is plain SQLite: it is not encrypted. That is stated here rather than discovered later — see Honest limits.
Related MCP server: Lumena MCP Server
What the app adds
Memory Hive for macOS is the same design with the expensive parts built: eight vaults with four of them locked behind a PIN (Argon2id-wrapped key, AES-256 at rest), a daily evolution log, multi-agent identity management, and a UI for reading and confirming. It also answers MCP itself, with richer ranking.
If the app is running, this package uses it and leaves the local file alone. If it is not, the local store answers. You do not have to choose up front:
| Behaviour |
| Ask the app. Use the local store only if the app is unreachable. |
| Never touch the network. Always use the local store. |
| Only the app. A connection failure is an error, not a reroute. |
One rule holds in every mode: if the app is running and answers with an error, that error is returned unchanged. Falling back on a refusal would write your memory into a second database while your client believed it had reached the app. Silent data forking is worse than an error message, so a reply from the app is final. The fallback fires on a connection failure, and on nothing else.
Install
pip install memory-hive-mcp # the server: memory-hive-mcp
# the human's CLI: memory-hive-mcp-cliPython 3.8 or newer. There is nothing else to install — the package uses only the standard
library, and sqlite3 is part of it.
From a checkout:
git clone https://github.com/330899935/memory-hive-mcp
cd memory-hive-mcp
PYTHONPATH=src python -m hive_mcp.stdioConnect a client
Any MCP host that can run a stdio command will work. The minimum is the command; everything else is optional.
Claude Desktop — ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"memory-hive": {
"command": "memory-hive-mcp",
"env": { "HIVE_MODE": "local" }
}
}
}Cursor — ~/.cursor/mcp.json, same mcpServers shape.
Any host that only speaks HTTP — start the app and point it at http://127.0.0.1:8768/mcp
with the headers X-Hive-Agent and X-Hive-Token. This package is the stdio path; the HTTP
endpoint belongs to the app.
Prerequisite
None, for the local store — install the package and it works. A running app is a prerequisite
only for the app's own features: encrypted vaults, the evolution log, and multi-agent identity.
If you want those, install the Hive app (macOS,
version 1.4.5 or newer) and leave HIVE_MODE at auto.
The six tools
The six tools are the whole surface. They are the same six whether the app or the local store answers; only the ranking behind them differs.
Tool | Kind | What it is for |
| read | Search confirmed memory by topic. |
| write | Submit a memory for the human to approve. Lands in a queue; changes no confirmed memory. |
| read/write | Address one entry: |
| read | A short digest of recent confirmed memory, to seed a conversation. |
| write | Post to the shared board so other agents see what was done or handed over. |
| read | Read the board, optionally only what arrived since your last cursor. |
Two properties are worth stating plainly, because they are the product:
proposesucceeding means "queued", not "stored".recallwill not return it until a human confirms it.managehas noapproveaction. There is no path from an agent to a confirmed memory. That is not an omission; it is the design.
Confirming what agents propose
Agents propose. You confirm. The confirmation lives in a terminal, in a command you have to type — deliberately not a tool an agent can call.
memory-hive-mcp-cli list # what is waiting
memory-hive-mcp-cli show <id> # read one in full
memory-hive-mcp-cli approve <id> # confirm it, or --all
memory-hive-mcp-cli reject <id> # drop it for good
memory-hive-mcp-cli search "deploy key" # search confirmed memory
memory-hive-mcp-cli forget <id> # soft delete, reversible
memory-hive-mcp-cli restore <id> # undo forget
memory-hive-mcp-cli stats # counts and the database path
memory-hive-mcp-cli export --out dump.json
memory-hive-mcp-cli path--db <path> on any command points at a different database. HIVE_DB does the same from the
environment.
Where your memory lives
~/.memory-hive/hive.db, unless HIVE_DB says otherwise. One SQLite file; copy it to back it
up, delete it to start over.
The board keeps its messages in the same file and does not expire them unless a ttl was given,
so there is only ever one thing to back up.
How search works, and what it does not do
Chinese text is indexed as single characters plus overlapping character bigrams; Latin text as words. A query is scored by how much of it the entry covers, then nudged by recency — a 10% multiplier, enough to break ties and not enough to overturn relevance.
This is a ranker, not an understander.
Scores are relative.
0.8means "closer than0.4for this query", not "80% confident". They are not comparable across queries.No semantic recall. Ask about "money" and an entry that only says "invoice" will not be found. Related-word coverage needs an embedder; this package has no dependencies and does not pretend otherwise.
A miss is reported as a miss. When nothing matches,
recallsays so and mentions how many entries are awaiting confirmation, rather than returning a plausible neighbour.
Configuration
Variable | Default | Purpose |
|
|
|
|
| Where the local database lives |
|
| The app's endpoint |
| — | Agent id from the app; only for calls the app serves |
| — | Access token from the app; only for calls the app serves |
HIVE_AGENT_ID and HIVE_AGENT_TOKEN are not required to use the local store. They are
read straight from the environment and never written to disk by this package.
Honest limits
Written down because a memory tool that oversells itself is worse than one that does less.
The local store is not encrypted. Plain SQLite. Anyone who can read your home directory can read it. The app's vaults are the encrypted option, and
statsreports"encrypted": falseinstead of leaving you to find out.No semantic search, as above.
One writer at a time. WAL mode lets the CLI confirm while a server is connected, but this is a personal memory file, not a multi-host service. Do not point two machines at one database over a network share.
The board is coordination, not memory. Messages are for hand-offs between agents; they are not searchable with
recall.The app is macOS only. The local store is not — it is pure Python.
Troubleshooting
"no confirmed memory matched this query" with entries pending. Correct behaviour. Confirm
them: memory-hive-mcp-cli list, then approve.
A call fails with a message about HIVE_AGENT_ID. The app answered and refused the
credential. The call did not fall back to the local store, on purpose. Register an agent in
the app and set both variables, or set HIVE_MODE=local if you meant to use the local file.
"Hive app not reachable ... and HIVE_MODE=remote forbids the local fallback". You asked for
the app only and it is not running. Start it, or drop HIVE_MODE=remote.
Where did my memory go? memory-hive-mcp-cli stats prints the database path. If HIVE_MODE
is auto and the app is running, the app has been answering — the local file is untouched by
design.
Development
PYTHONPATH=src python -m unittest discover -s tests -vThe suite needs no running app and no network: it stands up its own fake backend where a real
response is required, and points HIVE_DB at a temporary file so a test never touches a real
memory database.
Layout:
src/hive_mcp/store.py the memory engine (SQLite, stdlib only)
src/hive_mcp/stdio.py the MCP server: routing, envelopes, the app bridge
src/hive_mcp/cli.py the human's half: review and confirm
src/hive_mcp/tools.json the tool surface snapshot for the offline pathLicense
MIT. Your memory file is yours; nothing here phones home.
Available Tools
6 toolsboardRead the shared boardARead-onlyIdempotent
Read the shared board, optionally only what arrived since your last read. Use it to poll for messages or hand-offs addressed to you. To post, use say. Pass the previous cursor as since so a poll returns only new messages instead of the whole board. Annotations declare this read-only; note that messages expire, so an empty result can mean nothing was posted or that earlier messages have aged out.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of messages to return. Omit for the server default. | |
| since | No | Cursor from a previous call. Only messages newer than this cursor are returned; omit to read the current board. | |
| roster | No | Also return which agents are currently on duty. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, and the description adds genuinely non-obvious behavior: message expiration and the resulting ambiguity of an empty result. That is exactly the kind of context structured fields cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each carrying distinct information (purpose, polling use, sibling routing, cursor pattern, expiration caveat) with the core purpose front-loaded and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description could say slightly more about what a returned message looks like, and the 'roster' parameter is untouched. Otherwise it covers purpose, polling semantics, the mutation alternative, and the empty-result caveat adequately for a 3-parameter read 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?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for 'since' by explaining the poll pattern (pass the previous cursor to get only new messages). It does not clarify 'limit' or 'roster' beyond the schema, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('Read the shared board') and immediately adds the scope qualifier ('optionally only what arrived since your last read'). It also names the write counterpart ('To post, use say'), so the agent can distinguish it from siblings like say without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the use case ('poll for messages or hand-offs addressed to you'), gives the alternative for the opposite intent ('To post, use say'), and instructs exactly when/how to use the cursor ('Pass the previous cursor as since so a poll returns only new messages'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contextGet session contextARead-onlyIdempotent
Pull a short digest of recent memory from the human's active threads and open tasks, to seed a conversation before they ask anything. Call this once at session start. For answering a specific question, use recall instead, since that searches all confirmed memory rather than only what is recent. For entries still awaiting approval, use manage with action list_pending. Annotations already declare this read-only; what they cannot say is that the digest reflects the most recent activity, so two calls minutes apart may differ.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of context entries to return. Omit for the server default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover read-only, non-destructive, closed-world, and idempotent behavior. The description adds valuable context not in annotations: the digest reflects recent activity, so two calls minutes apart may differ. This addresses data freshness, which annotations cannot convey. The only minor gap is that it doesn't detail return format or rate limits, but for a read-only tool this is largely sufficient.
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 four sentences with zero waste, front-loading the core purpose and timing before alternatives and behavioral nuance. Every sentence contributes directly to correct selection and invocation.
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 read-only tool with no output schema, the description is complete: it states the purpose, when to call it, alternatives, and a behavioral trait not captured by annotations. The parameter is schema-documented, and the annotations cover safety. Nothing essential for an agent to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'limit' parameter, which is fully documented in the schema. The description does not add meaning beyond what the schema provides, so baseline 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?
The description uses a specific verb ('Pull a short digest') and resource ('recent memory from the human's active threads and open tasks'), and explicitly distinguishes itself from siblings like recall and manage. An agent can immediately understand what this tool does and when it differs from alternatives.
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 explicitly states when to call ('once at session start') and when not to ('For answering a specific question, use recall instead', 'For entries still awaiting approval, use manage with action list_pending'). The alternatives are named with the conditions that select them, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manageManage stored memoriesA
Inspect or change the lifecycle of a specific stored memory, addressed by id or by queue state. Use list_pending to review what is awaiting the human's approval, and get_by_id to read one entry in full. forget soft-deletes and is reversible with restore; discard_pending permanently drops an entry that was never confirmed. To search confirmed memory by topic instead of by address, use recall. Except for discard_pending, every action here is reversible, which is why this is not marked destructive.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Target memory id. Required for forget, restore, get_by_id and discard_pending; ignored by list_pending. | |
| action | Yes | Which lifecycle operation to run. list_pending takes no id; the other four require one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish non-read-only, non-destructive, closed-world behavior. The description adds important context beyond them: forget is a reversible soft-delete, discard_pending permanently drops an unconfirmed entry, and the reversibility exception is disclosed rather than hidden.
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 front-loaded and most sentences earn their place by mapping actions and alternatives. The final sentence repeats the discard_pending exception already stated, though it usefully explains the annotation choice.
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 five-action lifecycle tool with no output schema, the description covers every action, the id requirement, reversibility, permanence, and the relevant sibling alternative. An agent has enough information to choose and invoke the correct action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the id and action parameters are already fully documented. The description reinforces that entries are addressed by id or queue state, but it does not add syntax or format details 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 states a specific verb and resource: inspect or change the lifecycle of a stored memory, addressed by id or queue state. It also enumerates the concrete lifecycle actions and distinguishes the tool from the sibling recall tool.
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 explicit routing guidance: list_pending for items awaiting approval, get_by_id for reading one entry, forget/restore for reversible soft-delete, discard_pending for permanent removal, and recall for topic-based search of confirmed memory. The alternatives and selection conditions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proposePropose a memoryA
Submit a memory for the human to approve. It lands in a pending queue and changes no confirmed memory. Use it when the human says to remember something, or when a decision is reached that will still matter later. Do not use it as a scratchpad for transient reasoning or for data you merely fetched. This tool cannot confirm its own writes: the entry stays pending until the human accepts it inside their own Hive, so a success response means queued, not stored. Supply client_id to make retries idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Free-form tags for later filtering. | |
| title | No | Short label shown in the human's pending queue. Helps them decide quickly. | |
| vault | No | Target vault name. Private vaults are rejected for cloud agents; local agents may target them. | |
| vector | No | Optional precomputed embedding stored alongside the memory, so later recalls are faster and more precise. | |
| content | Yes | The memory to store, written as a standalone fact that still makes sense without this conversation - include the who and the when. | |
| client_id | No | Idempotency key. Submitting twice with the same key does not create a duplicate - use this when retrying after a timeout. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false, so the description carries the real burden and does: it discloses the asynchronous approval flow, that success means queued not stored, and that it cannot confirm its own writes. It does not contradict annotations — nothing written persists without human 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?
Four sentences, each doing distinct work: purpose, trigger, exclusion, and the queued-not-stored caveat. The most decision-critical fact (pending queue, no confirmed write) is front-loaded.
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 the workflow, the async success semantics, and retry safety, which is exactly what an agent needs before calling. It lacks a note on what a rejection looks like or whether tag/vault choices affect routing to the human, a minor gap given no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description only reinforces client_id idempotency semantics, which the schema already explains in nearly identical terms; content, vault, and vector are untouched in the description.
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 (submit a memory for human approval) and resource, and immediately distinguishes the outcome from siblings: it lands in a pending queue and changes no confirmed memory. An agent can tell this apart from recall (read) and say (communication) without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit positive triggers ('when the human says to remember something', 'a decision is reached that will still matter later') and explicit exclusions ('not a scratchpad for transient reasoning', 'not data you merely fetched'). The alternative/anti-pattern guidance is unusually complete for this category.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallRecall memoryARead-onlyIdempotent
Search the human's confirmed memory by natural-language query and return the closest stored entries. Use this to find what was previously decided, recorded, or agreed. Do not use it at session start when you have no query yet - use get_context instead. Do not use it to review entries still awaiting approval - use manage with action list_pending. Annotations already declare this read-only, so this text covers what they cannot: results come from the confirmed store only, private vaults are omitted for agents not permitted to read them, and an empty list means no match rather than no memory.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of memories to return. Omit for the server default. | |
| query | Yes | Natural-language search text, e.g. 'what did we decide about the pricing page'. Matched semantically, not by substring. | |
| vaults | No | Narrow the search to these vault names. Omit to search every vault this agent may read. Naming a vault the agent may not read is not an error - it returns nothing from that vault. | |
| compact | No | Return trimmed records (id, title, snippet) instead of full bodies. Saves tokens when you only need to know whether something exists. | |
| query_vector | No | Precomputed embedding. When supplied, recall ranks by vector similarity and ignores 'query' text matching. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/destructive/idempotent profile, and the description deliberately adds what they cannot: results come only from the confirmed store, unreadable private vaults are silently omitted, and an empty list means no match rather than an empty memory. Those are exactly the non-obvious behaviors an agent would otherwise misread.
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 routing constraints and behavioral caveats are front-loaded and each sentence carries content. The one soft spot is the self-referential clause about what the annotations already declare, which is meta-commentary rather than tool 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?
No output schema exists, and the description compensates by explaining result scope (confirmed store only), permission-driven omission, and the meaning of an empty result set. Nothing an agent needs to call this correctly or interpret its response is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, vaults, compact, query_vector and query are all fully documented in the schema. The description adds ranking framing ("closest stored entries") but says nothing about the parameters themselves, so the baseline of 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 (search) and resource (the human's confirmed memory) plus the retrieval semantics (natural-language query, closest stored entries). It is immediately distinguishable from sibling get_context (session bootstrap) and manage (pending review), which the description names directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (find what was decided, recorded, or agreed) and two explicit when-not-to-use cases, each paired with the correct alternative tool: get_context for session start with no query, manage action list_pending for unapproved entries. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sayPost to the shared boardA
Post a message to the shared board so the human and other agents see what was done or what is being handed over. Use it when finishing a unit of work, or to hand work to another agent. Do not use it to report routine steps the human did not ask about - the human reads this board. To read what others have posted, use board. Identity comes from your credential, so a caller cannot post as another agent.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Who should see it: 'master' for the human (default), or another agent's id. | |
| ttl | No | Seconds after which the message stops being returned by board. Defaults to 24 hours. | |
| kind | No | Card type. May be omitted when stage is given, in which case the kind is derived from the stage. | |
| refs | No | References the reader may want: file paths, commit shas, or memory ids. | |
| stage | No | Work event: starting, handing off, finished, or blocked. Prefixes the body so the board can be filtered and de-duplicated. | |
| summary | Yes | What happened, in one or two sentences. Write the outcome, not a log of steps. | |
| task_id | No | Link this message to an existing task; the hand-off graph aggregates by it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (not read-only, not destructive, closed-world), so the description's added value is the audience-visibility model ('the human reads this board') and the credential constraint ('a caller cannot post as another agent'), which genuinely affects how an agent frames a message. It stops short of stating that repeat posts create duplicate cards despite idempotentHint=false, or what confirmation the caller gets back.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, zero filler, and the ordering is deliberate: what it does, when to use, when not to, where to read instead, then the identity guarantee. No sentence restates the title or the annotations.
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 7-parameter post tool with no output schema, the description covers intent, audience, exclusions, and the auth model, which is nearly everything an agent needs to invoke it correctly. The remaining gap is the return behavior (confirmation, message id, whether the post can be edited or retracted later).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description adds no parameter-level detail beyond what the schema already says ('Write the outcome, not a log of steps' is repeated nearly verbatim from the summary description). With the schema doing all the work on 'to', 'ttl', 'kind', 'stage', 'refs', and 'task_id', the baseline 3 is right.
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 ('Post a message to the shared board') and immediately identifies the audience (human and other agents). It also names the sibling 'board' as the read counterpart, so an agent can separate write-to-board from read-board without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggers ('when finishing a unit of work, or to hand work to another agent'), an explicit exclusion ('Do not use it to report routine steps the human did not ask about'), and the alternative for reading ('use board'). This is the full when/when-not/alternative triad.
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.
6 tool updates
v0.1.7- First observed
board - First observed
get_context - First observed
manage - First observed
propose - First observed
recall - First observed
say
TDQS
Scored across 6 tools
Each tool has a clearly delineated role, and the descriptions actively resolve boundary cases (recall vs get_context vs manage list_pending; say vs board; propose vs manage). No two tools compete for the same action, so misselection is unlikely.
Names are uniformly short and lowercase, but the style is slightly mixed: mostly bare verbs (recall, propose, manage, say) alongside a verb_noun (get_context) and a bare noun (board). It remains readable and predictable in tone, just not a strict single pattern.
Six tools cleanly cover the memory lifecycle plus agent communication, with no redundant or filler entries. Each tool earns its place for a focused memory server.
Full read/create/pending-inspect/soft-delete/restore lifecycle is present, plus session bootstrap and a messaging channel; no dead ends in the core flow. The one visible gap is revising the content of an already-confirmed memory (only forget/restore, not edit), which agents must work around via propose.
Maintenance
Related MCP Connectors
Governed personal world model and memory for your AI agent. Pair once, connect over MCP.
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
- LogRackOAuthai.lograck
Shared memory for your AI tools: tasks, notes and context every tool can read and write over MCP.
1 Persistent memory, knowledge graph, task management and more for AI agents via MCP.
Related MCP Servers
- AlicenseCqualityAmaintenanceProvides AI agents with a human-inspired memory layer via MCP, enabling episodic and semantic memory recall, forgetting curves, consolidation, and contradiction detection. It integrates with MCP clients to offer local-first, dependency-free memory management.981MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to store, search, assemble, and manage local-first memories through seven MCP tools, including conversation turns, feedback, status, and dashboard access without cloud dependencies.AGPL 3.0
- AlicenseAqualityCmaintenanceEnables AI agents to share a portable, user-level memory layer through MCP, allowing them to store, search, update, link, and consolidate facts with optional full-text and vector retrieval.77 npmMIT
- FlicenseAqualityBmaintenanceShared fleet memory for AI agents — what one agent learns, the whole fleet knows. Nightly self-correction: stale facts rewritten in place, duplicates merged. Recall pushed into every prompt in supported coding agents. Self-hosted.113-