agent-handoff-memory
agent-handoff-memory
MCP-сервер, который предоставляет нескольким агентам одну общую версионированную память — и явный пакет передачи (handoff packet), чтобы следующий сеанс начинался с того места, где закончился предыдущий, а не пересоздавал всё заново.
Агенты теряют свой контекст на границе сеанса. Обычное решение — сбросить стенограмму в промпт и надеяться, что следующий запуск выберет из неё нужное предложение. Пакет передачи — это противоположность: короткий структурированный объект, который сообщает, что было сделано, что нужно сделать дальше, что остаётся неясным и с каких именно версий записей начинать — и принимающий агент получает эти версии разрешёнными в том же вызове, с предупреждением о тех, которые с тех пор изменились.
git clone https://github.com/JusticeUA/agent-handoff-memory.git
cd agent-handoff-memory && npm install
npm run demoЭто запускает двух агентов в двух процессах, работающих с одним SQLite-файлом. Никаких ключей API, никаких сервисов, никакого этапа нативной сборки — node:sqlite является частью среды выполнения.
Что показывает демонстрация
Агент-разведчик сканирует (фиктивную) доску вакансий, записывает найденное, исправляет одну из своих собственных оценок и передаёт управление. Затем отдельный процесс-исполнитель подхватывает работу, не зная ничего больше:
--- 1. pick up whatever is waiting --------------------------------
. packet h_1f4089bf from scout-agent: Two listings worth an application, one source caveat
. next: Draft an application for listing/482 (supplier catalogue scrape, $900)
. next: Draft an application for listing/553 (price monitor, $600)
. open: Is the 60s backoff enough, or does the board keep a longer penalty window?
. 4 pinned record versions arrived with the packet
. stale: listing/553/assessment was pinned at v1, now at v2
--- 3. re-read anything the warning touched -----------------------
. listing/553 v2 now says "maybe" (budget edited down to $400 and 17 more applicants arrived)
. dropping listing/553 - acting on the pinned v1 would be wrong
--- 5. report what actually happened ------------------------------
. success on listing/482/assessment: confidence 80% -> 84%
. failure on source/boards-example/rate-limit: confidence 60% -> 39%Разведчик отредактировал listing/553 после записи пакета. Исполнителю сообщается, что его закреплённая версия устарела, а не передаётся новая версия за его спиной; он перечитывает и отбрасывает объявление. Затем он сообщает, что на самом деле произошло, и уверенность в фактах, лежащих в основе решения, соответствующим образом меняется.
Полный вывод обоих сеансов: docs/demo-transcript.md.
Чтобы просмотреть это в двух терминалах вместо одного скрипта:
# terminal 1
MEMORY_DB=shared.db node dist/demo/scout.js
# terminal 2
MEMORY_DB=shared.db node dist/demo/executor.jsRelated MCP server: junto-memory
Инструменты
Инструмент | Что делает |
| Сохраняет факт в рамках |
| Читает текущую версию ключа или выполняет поиск по префиксу области, тегу, произвольному тексту, минимальной уверенности. |
| Все версии ключа: значение, автор, уверенность и хеш-цепочка, связывающая версии вместе. |
| Записывает пакет: сводку, следующие шаги, открытые вопросы и закреплённые версии записей. Если ссылки не указаны, закрепляется всё, к чему сеанс обращался. |
| Забирает самый старый открытый пакет для этого агента и возвращает его с разрешёнными закреплёнными записями и помеченными устаревшими. |
| Сообщает об успехе или неудаче в отношении записей, которые повлияли на решение; их уверенность меняется, а состояние до/после сохраняется. |
| Количество записей, средняя уверенность, состояния передачи и опциональная проверка целостности всей хеш-цепочки. |
Использование из MCP-клиента
{
"mcpServers": {
"handoff-memory": {
"command": "node",
"args": ["/absolute/path/to/agent-handoff-memory/dist/src/server.js"],
"env": {
"MEMORY_DB": "/absolute/path/to/shared-memory.db",
"AGENT_ID": "researcher"
}
}
}
}Направьте несколько клиентов на одну и ту же MEMORY_DB с разными AGENT_ID, и они будут использовать одну общую память. Хранилище работает в режиме WAL именно для этого.
Для Claude Code:
claude mcp add handoff-memory -e MEMORY_DB=$PWD/shared.db -e AGENT_ID=researcher \
-- node $PWD/dist/src/server.jsПроектные решения
Значения неизменяемы, мнения — нет. Запись существующего scope+key добавляет версию N+1 и помечает старую как заменённую. Уверенность и счётчики результатов изменяются в текущей версии — это мнения о факте, а не сам факт — и каждое изменение записывается в таблицу outcomes со значениями до/после. Таким образом, history остаётся историей того, во что верили, а не журналом изменений голосов.
Каждая версия хешируется и связывается в цепочку. Каждая строка содержит sha256 своего содержимого плюс хеш предыдущей версии. memory_stats { verify: true } пересчитывает всё; значение, отредактированное напрямую в файле базы данных, отображается как повреждённое. Один из тестов делает именно такое редактирование и проверяет, что это обнаружено.
Об устаревших ссылках сообщается, они никогда не заменяются молча. Пакет закрепляет версии. Если ситуация изменилась, принимающему агенту сообщается об этом — он может намеренно перечитать. Альтернатива (тихая выдача новейшей версии) заставляет агента действовать на основе данных, на которых его план никогда не строился.
Уверенность следует за результатами и остаётся в диапазоне 0..1. Успех закрывает часть разрыва до 1, неудача масштабирует вниз, так что повторяющиеся свидетельства приближаются к краям, не закрепляясь на них. Множители находятся в одной таблице в src/models.ts.
Нет сети, нет демона, нет нативных модулей. Хранилище — это node:sqlite, транспорт — stdio. Всё это — процесс node и файл.
SenseLab AMFS
Проект также работает на TypeScript SDK SenseLab AMFS. src/amfs/sqlite-adapter.ts реализует контракт AmfsAdapter SenseLab на SQLite — их AgentMemory занимается рассуждениями, этот — запоминанием — а demo/amfs-bridge.ts пересказывает пошаговое руководство по передаче через их API:
npm run demo:amfsSDK поставляется с адаптером в памяти (исчезает при завершении процесса) и HTTP-адаптером (требует хостируемой конечной точки и ключа); этот заполняет пробел между ними, а заодно заполняет contentHash / integrityChain и отвечает на commitLog(), который адаптер в памяти оставляет пустым. Тест на паритетность запускает один и тот же сеанс через оба адаптера и сравнивает результаты.
То, что я измерил во время его создания — включая то, почему commitOutcome(SUCCESS) снижает уверенность в версии 0.3.2 — описано в docs/senselab-amfs.md.
Тесты
npm test29 тестов, охватывающих хранилище, жизненный цикл передачи, поверхность MCP (реальный клиент и сервер, соединённые транспортом в памяти, так что схемы инструментов также проверяются) и адаптер AMFS. Группа AMFS пропускает себя, если опциональный SDK не установлен.
Структура
src/models.ts types and the outcome table
src/store.ts versioned SQLite store: memory, handoffs, outcomes
src/server.ts the MCP server and its seven tools
src/amfs/types.ts structural mirror of the AMFS SDK shapes
src/amfs/sqlite-adapter.ts durable adapter for SenseLab's AMFS SDK
demo/scout.ts session 1: crawl, write, correct, hand over
demo/executor.ts session 2: resume, act, report outcomes, hand back
demo/amfs-bridge.ts the same story through @senselab-ai/amfsТребования
Node 24 или новее, где node:sqlite стабилен и не требует флага; разработано и протестировано на версии 25.9. На Node 22.5–23.x тот же код работает с --experimental-sqlite. npm install собирает проект (через prepare), так что dist/ готов после этого.
Опциональная зависимость @senselab-ai/amfs публикуется SenseLab под лицензией BSL-1.1; собственный код этого репозитория распространяется под лицензией MIT.
Лицензия
MIT — см. LICENSE.
Available Tools
7 toolshandoffHand work to the next agentA
Write a handoff packet: what was done, what is left, what is still unclear, and which exact record versions the next agent must read. With no refs given, everything this session touched is pinned.
| Name | Required | Description | Default |
|---|---|---|---|
| refs | No | ||
| title | Yes | ||
| summary | Yes | State of play in a few sentences | |
| to_agent | No | Leave empty for whoever picks it up | |
| next_steps | No | ||
| open_questions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does reveal a key behavior: 'With no refs given, everything this session touched is pinned.' This adds context beyond the schema. However, it does not state whether the tool persists data, requires permissions, or has any side effects, leaving some behavioral gaps for a write-oriented tool.
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 exactly two sentences, front-loaded with the primary action ('Write a handoff packet') and then elaborating with specifics. Every sentence contributes meaningful information 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 the tool's moderate complexity (6 parameters, no output schema, no annotations), the description provides a solid high-level understanding: what the handoff packet contains and the default behavior when refs are omitted. It does not describe return values or side effects, but for a simple handoff tool this is a reasonable level of 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?
Schema description coverage is only 33% (summary and to_agent have descriptions). The tool description compensates somewhat by referencing 'what was done, what is left, what is still unclear' and 'exact record versions,' which map to summary, next_steps, open_questions, and refs. However, it does not directly explain each parameter's syntax or constraints, and the mapping is implicit rather than explicit.
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's function with a specific verb ('Write') and resource ('handoff packet'), and enumerates the packet's contents: what was done, what is left, what is unclear, and exact record versions. This distinguishes it from sibling memory/recall tools, which focus on past interactions rather than forward-looking handoff.
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 clear context: it is for writing a handoff packet for the next agent. It does not explicitly mention alternatives or exclusions, but the 'next agent' framing makes the intended use case unambiguous. A 5 would require explicit when-not-to-use guidance, which is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
historyVersion historyBRead-only
Every version of one key, oldest first: who wrote it, when, with what confidence, and the hash chain that ties the versions together.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| scope | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint:true, the annotation already signals safety. The description adds meaningful behavioral detail: the result is ordered oldest first, includes authorship/confidence metadata, and describes the hash chain linking versions. This goes beyond the annotation and gives the agent an accurate model of the tool's output behavior.
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 a single, tightly packed sentence that front-loads the most important idea ('Every version of one key, oldest first') and then adds specific useful detail. No wasted words; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the tool has only two parameters and no output schema, the description still leaves a critical gap: 'scope' is undefined. The return contents are described in terms of metadata and hash chain, but no structure is given, and the parameter semantics are incomplete. For an agent to invoke this tool correctly, it needs more context on what 'scope' represents.
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 schema has zero description coverage, so the description must explain both parameters. It refers to 'one key' but never clarifies the 'scope' parameter, which is required. The meaning of 'scope' remains ambiguous from both schema and description, leaving the agent without enough information to correctly construct parameters.
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 provides every version of a specified key, ordered oldest first, and lists the included details (author, timestamp, confidence, hash chain). It is not a tautology and effectively distinguishes itself from sibling tools like 'remember' and 'recall' by focusing on version history, though it lacks an explicit verb like 'get' or 'list'.
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 when to use the tool: when you need to see the full version history of a key, including metadata. However, it provides no explicit guidance on when not to use it, no mention of alternatives like 'recall', and no exclusions, so usage context is only inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_statsMemory statisticsARead-only
Counts per agent and scope, average confidence, handoff states, and an integrity check of the hash chain.
| Name | Required | Description | Default |
|---|---|---|---|
| verify | No | Also re-walk every hash |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, confirming no destructive side effects. The description adds valuable behavioral context beyond annotations, such as the specific computations it performs (counts, average confidence, handoff states) and the integrity check of the hash chain. This informs the agent about the tool's analytical nature and potential complexity (e.g., re-walking hashes).
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 a single sentence that efficiently lists the tool's capabilities without redundant words. It is front-loaded with the main action ('counts') and covers all key outputs. However, the list-like structure could be slightly more readable (e.g., separating distinct items with commas or formatting), but it remains concise and informative.
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 tool with one optional parameter, no output schema, and a read-only annotation, the description adequately conveys what the tool returns (counts, averages, states, integrity check result). It does not explicitly state the return format or confirm that it returns a summary object, but the implied items give sufficient context for an agent to understand the output nature.
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 optional parameter 'verify', which already explains its meaning ('Also re-walk every hash'). The description does not add any additional parameter semantics beyond what the schema provides, so the baseline score 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?
The description clearly states the tool's purpose with a specific verb ('counts') and lists the exact resources and metrics it covers: per agent and scope, average confidence, handoff states, and an integrity check. This distinguishes it well from sibling tools like 'remember' and 'recall' which are about recording or retrieving memories, not summarizing statistics.
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 this tool is used for obtaining aggregate statistics and performing integrity checks, but it does not explicitly state when to use it versus alternatives (e.g., 'history' for chronological sequences, 'handoff' for state transitions). No exclusions or prerequisites are mentioned, so the guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallRecall factsARead-only
Read the current version of a key (scope+key), or search current records by scope prefix, tag, free text and minimum confidence.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Exact key - returns one record | |
| tag | No | ||
| limit | No | ||
| query | No | Free-text match on value, key or scope | |
| scope | No | Exact scope, or a prefix when searching | |
| min_confidence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint: true, so the read-only nature is already covered. The description adds context by specifying 'current version' and 'current records', indicating it returns latest state, not historical. It doesn't mention pagination but for a read tool with annotation, this is adequate.
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 a single concise sentence that covers the dual functionality without fluff. It's front-loaded with the main action 'Read' and then enumerates search criteria efficiently.
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 it's a read-only tool with readOnlyHint already in annotations, the description covers key behaviors: exact key retrieval, search modes, and what is searched (scope, tag, free text, min confidence). It doesn't mention limit parameter in description, but schema covers min/max. For a tool of this complexity, it's adequately 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?
Description explains key (scope+key), scope prefix, tag, free text, and minimum confidence, giving meaning to params like tag, query, scope, and min_confidence that have no schema description. Limit is not mentioned, but overall it compensates for the 50% 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?
The description clearly states the tool's function: reading a specific key or searching current records. It distinguishes between exact key lookup and search modes, and differentiates from siblings like remember (write) and history (past versions).
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 explains the two usage modes (exact key vs search) but does not explicitly contrast with alternatives like history for past versions or memory_stats. There's implied guidance by showing search parameters, but no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_outcomeReport what actually happenedB
Close the loop: report success or failure against the records that drove the decision. Their confidence moves accordingly, and the before/after values are kept as an audit trail. Pass handoff_id to close the packet in the same call.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| refs | No | Defaults to every record this session touched | |
| outcome | Yes | ||
| handoff_id | No | ||
| outcome_ref | Yes | External reference, e.g. "RUN-42" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. It mentions 'confidence moves' and 'audit trail', which suggests mutation, but does not state whether the action is reversible, what happens on conflicting outcomes, or any rate limits or permissions required. This is insufficient for a tool with 5 parameters.
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 with clear, imperative language and front-loaded purpose. It efficiently covers outcome, audit, and handoff without excess. Could be slightly more structured but is mostly effective.
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, the description should explain return values or confirmation behavior, which it does not. With 5 parameters including nested objects, it omits details on how 'refs' defaults work and what the audit trail returns. Adequate but not complete for complex interactions.
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 40%, and the description adds value by explaining 'outcome_ref' as an external reference and mentioning 'handoff_id' for closing packets. However, it does not clarify defaults for 'refs' or constraints like 'version' minimum beyond schema. Baseline adjusted for partial 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 tool reports success or failure against records, using verbs like 'report' and 'close the loop'. It distinguishes from siblings like 'remember' (likely creation) and 'history' (likely retrieval) by emphasizing outcome tracking and audit trails.
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 when finalizing a decision, but does not explicitly state when not to use it or suggest alternatives among siblings like 'handoff' or 'resume'. It mentions passing 'handoff_id' but no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rememberRemember a factA
Store a fact under scope+key. Writing an existing key appends a new version instead of overwriting, so nothing is ever silently lost.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Name inside the scope, e.g. "assessment" | |
| tags | No | Labels for later filtering | |
| scope | Yes | Namespace, e.g. "listing/482" or "source/boards-io" | |
| value | No | Any JSON value | |
| confidence | No | How much you trust this, 0..1 (default 0.7) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since annotations only state readOnlyHint=false and idempotentHint=false, the description adds critical behavioral context by disclosing that writing an existing key appends a new version rather than overwriting, ensuring no data loss. It also implies that the tool mutates state (non-read-only) consistent with annotations. It does not mention potential side effects like storage limits or the need for specific permissions, but the key versioning behavior is well covered.
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 a single, clear sentence that is front-loaded with the purpose ('Store a fact') and then efficiently conveys the critical behavioral nuance about versioning. No wasted words, ideal length for an agent to parse quickly.
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 tool has 5 parameters, 2 required, and no output schema, so the description needs to cover mutation behavior and parameter usage. It does so adequately by explaining the versioning behavior and clarifying the scope+key structure. However, it does not specify return values or any potential errors, but with no output schema and high schema coverage, the description is reasonably complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage, with descriptions for all parameters (e.g., 'Name inside the scope' for key, 'Labels for later filtering' for tags). The description adds meaning by framing the parameters as 'scope+key' and explaining that value can be any JSON, but it does not go beyond schema for individual parameters. Since schema coverage is high, the baseline is 3, but the description's emphasis on the scope+key pairing and the versioning behavior adds practical semantics that elevate it slightly.
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 'Store a fact under scope+key', using a specific verb (store) and resource (fact with scope and key). It distinguishes from siblings like 'recall' (which presumably retrieves) and 'history' (which shows versions). The mention of versioning behavior further differentiates it from a simple write operation.
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 when to use this tool (to store facts) and implicitly when not (it appends rather than overwrites, so users must be aware). It does not explicitly name alternative tools like 'recall' for retrieval, but the context signals include sibling tools that suggest the use case. The versioning guideline helps clarify a key decision point for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resumePick up a handoffA
Claim the oldest open packet addressed to this agent (or a specific one by id) and get back the packet together with the pinned records. Refs whose version has moved on are reported as stale rather than silently swapped for the newer version.
| Name | Required | Description | Default |
|---|---|---|---|
| handoff_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 transparency. It discloses that refs with moved versions are reported as stale rather than silently swapped, which is a valuable behavioral detail. However, it does not disclose whether claiming is idempotent, whether it removes the packet from the queue, or what happens if the handoff_id is invalid. A 3 is appropriate because while it adds some behavior context, significant gaps remain for a mutation-like tool.
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, using two sentences to convey purpose, usage nuance, and a critical behavioral quirk (stale refs). No waste, front-loaded with the key action. The behavioral detail is earned and non-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?
Given the tool's action (claiming a packet, likely a mutation) with no annotations, output schema, or parameter descriptions, the description is reasonably complete for its complexity but falls short. It explains the core behavior and a trick (stale refs), but omits return format details, error cases (e.g., no open packets), and whether claiming is mutable or reads the state. For a single-param tool with no output schema, a 3 reflects adequate but not robust 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?
Schema description coverage is 0%, meaning the description must compensate. The description implies handoff_id is optional ('or a specific one by id') and suggests default behavior is to claim the oldest open packet. However, it does not document the handoff_id parameter's format, semantics, or constraints. Given the low coverage and single parameter, this is a notable 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?
The description uses a specific verb 'Claim' and clearly identifies the resource as 'the oldest open packet addressed to this agent (or a specific one by id)' and states the return of both the packet and pinned records. It distinguishes from siblings like 'handoff' (likely a related tool) and 'remember'/'recall' by emphasizing a claim/retrieve action on open packets.
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 clarifies when to use this tool: to claim an open packet addressed to the agent, with an optional specific id. It implicitly excludes use for packets not addressed to the agent or not open. However, it does not explicitly state when not to use it (e.g., if the agent already has a claimed packet) or provide explicit alternatives among siblings.
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.
7 tool updates
v0.1.0- First observed
handoff - First observed
history - First observed
memory_stats - First observed
recall - First observed
record_outcome - First observed
remember - First observed
resume
TDQS
Scored across 7 tools
Each tool targets a distinct action: storing, reading, versioning, handoff creation, handoff retrieval, outcome recording, and statistics. No two tools overlap in purpose, making misselection unlikely.
All tool names use lowercase snake_case with a verb-first or clear noun pattern (remember, recall, history, handoff, resume, record_outcome, memory_stats). The style is uniform and predictable.
Seven tools is well-scoped for a memory and handoff system. Each tool fills a necessary role without redundancy or excessive granularity.
The set covers the full lifecycle: writing memories, reading (current and historical), creating handoff packets, claiming and resuming them, recording outcomes, and monitoring integrity. There are no obvious gaps for the stated purpose.
Maintenance
Related MCP Connectors
An MCP memory server. One memory your agents share — across models, devices and apps.
Persistent memory for AI agents to retain, retrieve, and recall conversation context through MCP.
Cross-session memory for AI agents with a Source Receipt for every memory, over MCP.
Shared memory for AI agents, with a receipt for every write. Hosted MCP at agentics.you/mcp.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceAn MCP server that extends AI agents' context window by providing tools to store, retrieve, and search memories, allowing agents to maintain history and context across long interactions.MIT
- AlicenseNot gradedqualityBmaintenanceA shared memory and coordination server for multiple AI coding agents, built on the Model Context Protocol (MCP).5MIT
- AlicenseNot gradedqualityDmaintenanceA shared memory MCP server for AI agents that provides persistent, semantic memory across sessions and tools, enabling long-term recall and context sharing.8 npm12MIT
- AlicenseNot gradedqualityAmaintenanceA local-first MCP server for AI coding agents that shares structured execution state, routes context deltas, and provides preflight nudges to prevent conflicts and stale decisions.MIT