MemKernel
MemKernel is a shared MCP memory kernel for coding agents: coordinate decisions, state, file leases, branches, rollbacks, and compaction.
Record and query durable architectural decisions and branch state, including tasks, facts, blockers, claims, leases, and recent events.
Acquire, heartbeat, release, and fence file leases with tokens to coordinate edits.
Append decisions only while holding a valid lease via fenced append.
Fork, checkout, diff, list, roll back, and inspect branch history.
Initialize tasks, log tool executions and facts, and add ephemeral notes.
Trigger garbage collection to compact noisy history into semantic snapshots.
Enables OpenAI Codex CLI agents to use MemKernel as shared project memory through MCP tools, including querying state, recording decisions, coordinating file leases, branching investigations, and rolling back hallucinations.
MemKernel
An event-sourced, branchable memory kernel for teams of coding agents, served over the Model Context Protocol.
Cursor, Claude Code, Codex and your own harnesses each keep their own chat history. None of them knows what the others decided, which files they are editing, or which "fact" was already disproven three turns ago. MemKernel gives all of them one shared memory with the following properties:
Deterministic. State is a pure fold over an append-only, hash-chained event log. Replaying the log reproduces the state exactly.
Branchable. Agents fork a timeline to investigate, diff it against
main, and roll it back when an experiment or a hallucination fails. Forks copy no rows.Coordinated. Leases coordinate cooperating agents. Fenced event appends reject expired, stale or foreign leases atomically; leases do not prevent direct filesystem edits.
Budgeted. An autonomous GC compacts noisy tool output into semantic snapshots. In the benchmarks it keeps each agent's context under a token budget while preserving every decision.
It is a plain Python package: SQLite (WAL) for storage, pydantic v2 for
schemas, and the official mcp SDK (FastMCP on 1.x, MCPServer on 2.x) for
the stdio server.
Runs on Linux, macOS and Windows with Python 3.11 through 3.14 (3.14 recommended). The test suite passes on Windows 11 and on Linux (Debian 13) under Python 3.14.7, and CI covers all three operating systems. It works with Claude Code, Codex CLI, Antigravity and Cursor.
Cursor Claude Code Codex CLI Antigravity your harness
| | | | |
| stdio/MCP | stdio/MCP | stdio/MCP | stdio/MCP | in-process
v v v v v
memkernel-server (one process per agent, own agent_id) --> MemKernel facade
|
+-------------------------------+-----------------------+
v v v
AsyncEventStore LockManager MemoryGCEngine
append-only, hash-chained log leases + snapshots within
+ copy-on-write branches fencing tokens a token budget
\_______________ one SQLite file (WAL) per project ______/Each agent runs its own server process. All of them share one database file,
and SQLite's BEGIN IMMEDIATE transactions serialize writers across processes.
Safety and trust boundary
Experimental software for testing agent capabilities. Use disposable projects and synthetic data first. Incorrect or sensitive memory can persist and affect other agents. Review what agents store and act on, redact secrets before logging, and keep backups.
One host, one trust domain. Keep the SQLite database on local disk. Network filesystems, distributed leases and cross-owner authentication are not supported. Agent IDs are self-asserted launch configuration, not proof of identity. Use distinct IDs for cooperating agents and OS permissions to control access to the database, its directory, backups and WAL/SHM files.
Observe without writing. Launch an observer with
memkernel-server --db /path/to/existing/memkernel.db --read-only, or setMEMKERNEL_READ_ONLY=truein that agent's MCP configuration. This blocks mutation tools and opens an existing database with SQLitemode=ro. SQL authorization also blocks database attachment and changes to the read-only query setting. It cannot initialize a missing database or run background GC. Reads may still need SQLite WAL/SHM sidecars. This limits that server process; it does not stop an agent with direct file access from launching another writable process. Restrict that access at the OS level.Fence resource-associated decisions. Acquire a lease, renew it while working, then use
memkernel_fenced_append_decisionwith its token. The session identity, token and expiry are checked in the same transaction as the memory append. Ordinary memory tools remain unfenced, and direct file writes are outside this protection.Treat memory as untrusted data. Stored text is never executed by MemKernel, but downstream agents can still follow injected instructions. Review consequential actions independently. The hash chain detects some tampering; it does not authenticate writers or protect against an attacker who controls the database file.
These controls are a local safety foundation, not an enterprise security certification. Deployments spanning owners or machines need authenticated access, authorization and operational validation before sharing a memory domain.
Quickstart: three commands
1. Install (Python 3.14 recommended; 3.11+ supported). uv tool install gives you a global memkernel command in its own isolated environment:
uv tool install memkernel-mcppipx install memkernel-mcp does the same. For an existing isolated environment, use pip install memkernel-mcp.
The distribution is named memkernel-mcp; the Python import and commands remain memkernel. The memkernel project on PyPI belongs to a different author. Do not use pip install memkernel for this repository, or install both projects into the same Python environment. To install from source instead, use uv tool install git+https://github.com/varadganjoo/MemKernel.git.
2. Attach it to your agents, from your project's root directory:
memkernel attach claude-code cursor codexUse all to include Antigravity too. attach merges a memkernel entry into each agent's own MCP config and leaves the other servers in those files alone. It creates .memkernel/ for the project's shared database and adds that directory to .gitignore. Global configs are backed up first. Re-running it is safe, and --dry-run shows the changes without writing them.
Agent | File written | Scope |
Claude Code |
| project |
Cursor |
| project |
Codex CLI |
| global: each project gets its own memory via discovery |
Antigravity |
| global: each project gets its own memory via discovery |
3. Verify:
memkernel doctordoctor opens the database, checks its hash chain, boots the MCP server over stdio exactly as an agent would, and checks every agent configuration. Then restart your agents. Each one now has memkernel_* tools, and they share one memory per project. To see what the agents currently remember:
memkernel statusSlow machine? Cold start is dominated by importing the MCP SDK. Claude Code gives MCP servers 30 s to start; raise it with
MCP_TIMEOUT=120000. The Codex config written byattachalready allows 120 s.
Full per-agent details, manual configuration and troubleshooting are in docs/integrations.md.
Try it without an agent
From a checkout:
pip install -e ".[dev]"pytestTwo simulations assert their invariants and exit non-zero on violation:
python examples/multi_agent_collaboration.pypython examples/rollback_on_hallucination.pyRelated MCP server: nuzo-memory
MCP tools
Tool | Purpose |
| Consolidated memory as JSON: tasks, decisions, workspace facts, deprecated assumptions, blockers, claims, leases, recent events. |
| Durable architectural decision. It survives compaction, and a new value supersedes the old one. |
| Exclusive lease with a TTL. Returns a fencing token, or the current holder. |
| Release. Returns |
| Extend a held lease. |
| Record a decision only while the session agent holds the current, unexpired lease. The lease is recorded in event metadata. |
| Fork the active branch at its head and switch to it. |
| Switch the session's active branch. |
| Revert the active branch's live timeline to an event. History stays auditable. |
| Recent live events, useful for picking rollback targets. |
| Merge base, divergent events, conflicting decisions and facts. |
| Compact now and report the token savings. |
| Record the agent's task and constraints. |
| Log tool output. A failure opens a blocker and a later success clears it. |
| Ephemeral scratchpad turn. |
| All branches, plus the session's active branch. |
Concepts in one page
Events. An event is an immutable EventEnvelope with fields event_id
(globally monotonic), sequence (position in the branch lineage), timestamp,
branch_id, agent_id, parent_event_id (lineage predecessor), event_type,
payload, metadata and hash = SHA-256(prev_hash ‖ canonical(event)). The
event types are AGENT_TASK_INIT, ARCHITECTURAL_DECISION,
FILE_CLAIM_ACQUIRED/RELEASED, TOOL_EXECUTION_LOG, AGENT_SCRATCHPAD,
SEMANTIC_SNAPSHOT, BRANCH_FORKED and ROLLBACK_TRIGGERED. SQLite triggers
reject every UPDATE and DELETE on the event table.
Branches. A branch is a pointer (parent, fork point, head). Its lineage is its parent's lineage up to the fork point, followed by its own events. Forking copies no rows.
Rollback. A rollback is a compensating ROLLBACK_TRIGGERED event. The
live timeline is a left fold in which a rollback truncates back to its
target. Nothing is deleted, so the reverted events stay auditable and forkable.
State. WorkspaceState = fold(live events). It holds tasks, decisions (with
rationale and provenance), active workspace facts, deprecated or overruled
assumptions, execution blockers, file claims, an execution digest, and insights.
GC. When [latest snapshot] + [delta] exceeds the token budget, older delta
events fold into a new SEMANTIC_SNAPSHOT, an exact serialization of the fold.
The invariant fold(snapshot, delta) == fold(full history) is tested. The
retained raw tail is bounded by both an event count and a token low-water mark,
and every automatic compaction must free at least a quarter of the budget, so
GC does not thrash.
Leases. Leases are time-bounded, and every grant carries a fencing token
that strictly increases per resource. fenced_append checks the token and
appends in one transaction, so an expired or foreign holder cannot commit
through that fenced event path. Ordinary memory appends and filesystem writes
remain outside the fence. Renewals require the configured holder identity.
Results
These numbers come from python benchmarks/run_benchmarks.py. The full
methodology is in the whitepaper.
Workflow | Events | Raw history tokens | MemKernel context tokens | Reduction | Snapshots | State equivalent |
single-agent-test-fix | 73 | 31,346 | 3,558 | 88.6% | 13 | yes |
multi-agent-refactor | 99 | 33,598 | 2,360 | 93.0% | 13 | yes |
lint-heavy-exploration | 73 | 42,445 | 3,459 | 91.9% | 19 | yes |
On a 50,000-event log, a warm (fast-path) context read takes 1.7 ms on Windows 11 and 1.1 ms on Linux, a fork at the head takes under 2 ms, and a cold open plus context read takes 21 ms on Windows 11 and 4.5 ms on Linux. Measured with Python 3.14.7 on Windows 11 (build 26200, SQLite 3.53.1) and in a Debian 13 container (SQLite 3.46.1) on the same workstation. The token results are the same on both platforms.
Live agents, with evidence
benchmarks/live_agents.py drives the real Claude Code, Codex CLI and Antigravity CLIs on a
small repository with two failing tests. They coordinate only through MemKernel: leases,
decisions, a fork with a rollback, and recall from shared memory. The script saves their
transcripts, the event database, the code diff and the test results. The recorded run is
in evidence/live-agents/20260928T161716Z/REPORT.md.
In that run, the concurrently started agents contended for the same file, one was refused
and took other work, both bugs were fixed, and the hash chain verified intact in an
independent Linux container.
Repository layout
memkernel/
├── core/events.py event taxonomy, envelope schema, hashing
├── core/store.py AsyncEventStore: WAL, lineage, fork, rollback, diff, verify
├── core/branch.py pure lineage algebra: live fold, rollback planning, diff, chain verification
├── core/locks.py LockManager: leases, heartbeats, fencing tokens
├── memory/state_view.py WorkspaceState fold, context split, rendering
├── memory/gc.py MemoryGCEngine, heuristic and LLM summarizers, daemon
├── memory/token_counter.py tiktoken with a conservative regex fallback
├── kernel.py MemKernel facade (atomic lease+claim, fenced appends)
├── server/mcp_server.py MCP server over stdio
├── clients/adapter.py MemKernelClient (in-process) and McpStdioClient
└── cli.py `memkernel` command: attach, doctor, status, serve
examples/ multi-agent and rollback simulations
benchmarks/ reproducible measurements and the live-agent harness
evidence/ recorded live-agent run (transcripts, database, report)
docs/ whitepaper and integration guide
tests/ store, branching, locks, GC, server and stdio e2eDevelopment
pytestThe suite runs offline and is deterministic. One opt-in test exercises
LLMSummarizer against a real OpenAI-compatible model:
MEMKERNEL_LIVE_LLM_TESTS=1 OPENAI_API_KEY=... OPENAI_LLM=<model> pytest -k liveLimitations
Single host. Coordination relies on SQLite file locking on one machine; network filesystems are not supported. A replicated log is future work (see the whitepaper).
Self-asserted identity.
agent_idcomes from the server's launch configuration. MemKernel records provenance but does not authenticate agents; see the threat model.O(lineage) operations. Rollback, arbitrary-point forks and full replay are linear in lineage length. Context reads and forks at the head are not.
No automatic merge.
diffreports conflicts. Reconciling them is an agent's (or a human's) decision, recorded as a newARCHITECTURAL_DECISION.
License
MIT. See LICENSE.
Available Tools
16 toolsmemkernel_acquire_leaseA
Acquire an exclusive, time-limited lease on a file before editing it.
timeout_seconds is the lease TTL; renew it with memkernel_heartbeat_lease. Returns acquired=true and a fencing_token on success; on contention returns acquired=false with the current holder and how long until it expires.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | ||
| timeout_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 mostly delivers: exclusivity, time-limitation, TTL semantics, renewal path, and the two outcome branches (acquired=true with fencing_token, or acquired=false with holder and remaining expiry). It omits permission/prerequisite requirements and whether contention should be retried.
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 tight sentences, front-loaded with the core action, then the parameter meaning, then the return contract. No filler or restatement of the tool name.
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 spelled out, yet the description usefully summarizes both outcome branches. Combined with the sibling naming, an agent has almost everything needed; only concurrency/retry guidance and prerequisites are 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 0%, so the description must compensate. It explains timeout_seconds as the lease TTL (not just a timeout) and ties renewal to it; file_path's meaning is conveyed by "a lease on a file." It does not document format constraints or edge values (e.g. minimum TTL).
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 precise verb (Acquire) and resource (exclusive, time-limited lease on a file), plus the intent behind it (before editing it). This is clearly distinguishable from siblings like memkernel_release_lease, memkernel_heartbeat_lease, and memkernel_checkout 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 the triggering context ("before editing it") and routes renewal to the sibling memkernel_heartbeat_lease. It does not explicitly state when-not to use it (e.g. read-only work) or contrast with memkernel_checkout, so it falls short of full alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_append_decisionA
Record a canonical architectural decision on the active branch.
Decisions are durable: they are never compacted away, and a new value for an existing key supersedes the old one (which is kept as a deprecated assumption). Example: decision_key="auth.method", decision_value="OAuth2 PKCE".
| Name | Required | Description | Default |
|---|---|---|---|
| rationale | Yes | ||
| decision_key | Yes | ||
| decision_value | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 add meaningful behavior: decisions are durable, never compacted away, and re-using a key supersedes the old value while retaining it as a deprecated assumption. It omits permissions, idempotency, and whether ordering matters, but the supersede/retention semantics are genuinely non-obvious value.
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, front-loaded with the core action, and the example earns its space by disambiguating key/value syntax. 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?
An output schema exists, so return values need no explanation, and the durability/supersede model is covered. The remaining gap is the undocumented rationale parameter and no explicit sibling routing, but otherwise the agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description compensates only partially: the example clarifies decision_key (dotted namespace, e.g. 'auth.method') and decision_value format. The required 'rationale' parameter is never explained, so one of three required inputs remains undocumented anywhere.
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 ('Record') and resource ('canonical architectural decision') scoped to 'the active branch'. It is clear what the tool does, though it never explicitly contrasts itself with close siblings like memkernel_note or memkernel_log_execution.
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 rather than stated: durable, never-compacted decisions suggest this is for canonical architecture choices rather than transient notes. There is no explicit 'use this instead of X when Y' routing, so the agent must infer the boundary with memkernel_note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_checkoutC
Switch this session's active branch (it must exist).
| Name | Required | Description | Default |
|---|---|---|---|
| branch_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies a session-scoped state mutation but does not say what happens on failure, whether uncommitted work is preserved or discarded, whether a lease is required, or whether the switch is reversible.
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 short sentence with the operation front-loaded and the precondition set off in parentheses. Efficient, though the brevity edges into under-specification.
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 explained, and the one-parameter surface is simple. Still, for a state-mutating session tool that interacts with fork/rollback/lease siblings, the description omits error behavior and session-scoping details an agent would want.
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 contributes only a name and type. The description adds one useful constraint (branch must already exist), but says nothing about format, source, or how to obtain a valid branch_id.
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 ('Switch') and resource ('this session's active branch'), which clearly separates it from read-oriented siblings like memkernel_list_branches or memkernel_diff_branches. It does not explicitly name a sibling to contrast against, but the effect of the call 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?
Only guidance is the parenthetical precondition 'it must exist'. There is no statement of when to use checkout rather than memkernel_fork_investigation or memkernel_rollback, nor how to discover a valid branch_id (e.g., via memkernel_list_branches).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_diff_branchesB
Compare two branches: merge base, events ahead on each side, and conflicting decisions and facts.
| Name | Required | Description | Default |
|---|---|---|---|
| branch_a | Yes | ||
| branch_b | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 it does disclose meaningful behavior: it computes a merge base and surfaces conflicts between sides, which tells the agent this is a non-mutating analytical operation. However, it says nothing about permissions, cost, or whether it writes anything (e.g., a diff artifact), leaving gaps for a no-annotation 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?
A single front-loaded sentence that states the action first and then the outputs, with no filler. Well sized for the operation.
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?
Because an output schema exists, the description need not explain return values, and it already previews the key result categories. For a two-parameter read tool that is close to adequate, but the missing parameter meaning and total absence of usage/behavioral context (no annotations to lean on) leave it only minimally 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?
Schema description coverage is 0%, so the description must compensate for the two undocumented parameters, and it largely does not. 'Two branches' plus 'each side' only loosely implies branch_a and branch_b are the compared endpoints; nothing clarifies whether these are names, IDs, or references.
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 gives a specific verb+resource ('Compare two branches') and even enumerates the comparison surface: merge base, events ahead on each side, conflicting decisions and facts. That is far more informative than the name alone and implicitly separates it from list_branches/history. It stops short of naming a sibling to differentiate against, so a 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?
There is no when-to-use guidance, no prerequisites, and no reference to alternatives such as history or query_state. The comparison intent is implied by the verb, but an agent gets no help deciding when a diff is warranted versus another inspection tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_fenced_append_decisionB
Record a decision only while this agent holds the current lease.
The holder, token and expiry check shares the append's transaction. This protects the memory event; it does not write or lock the file.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | ||
| rationale | Yes | ||
| decision_key | Yes | ||
| fencing_token | Yes | ||
| decision_value | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 it does disclose genuine behavioral traits: the holder/token/expiry check shares the append's transaction (atomicity), and it explicitly scopes the guarantee ('protects the memory event; it does not write or lock the file'). It omits failure behavior and auth requirements, but the atomicity and scope disclosure is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its precondition in the first sentence, then a compact explanation of the mechanism. It is short and wastes little, though the second sentence's phrasing ('it does not write or lock the file') is terse enough to be slightly cryptic.
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 explained, and the fencing/atomicity semantics are covered. But for a lease-fenced, transaction-scoped mutation with five undocumented parameters, the description leaves failure modes, parameter meanings, and the relationship to the lease lifecycle unaddressed.
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 0% with five required parameters, so the description must compensate and it largely does not. Only 'token' loosely maps to fencing_token via the 'holder, token and expiry check' phrase; file_path, decision_key, decision_value, and rationale are left entirely to their bare schema titles.
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 ('Record a decision') with an explicit precondition ('only while this agent holds the current lease'), which conceptually separates it from the sibling memkernel_append_decision. However, it never names the unfenced sibling or states the contrast explicitly, so the differentiation is inferential rather than stated.
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 precondition 'only while this agent holds the current lease' tells the agent when this tool is applicable, which is meaningful usage context. But it gives no guidance on the alternative (memkernel_append_decision) or what to do when no lease is held, leaving the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_fork_investigationB
Fork the active branch at its head into a new branch and switch this session to it. Use for speculative work you may want to discard.
| Name | Required | Description | Default |
|---|---|---|---|
| fork_branch_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 does disclose one important side effect – the session is switched to the new branch – and hints at disposability. It does not say whether the fork is reversible, how the branch is later discarded or merged, or whether the parent branch is affected.
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 tight sentences with the core action front-loaded and the usage cue following. No filler or restatement of the tool name.
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 explained, and the branch/session semantics are covered. Still missing are the fork-branch naming guidance and any lifecycle context (how to inspect, merge, or discard the fork) needed to use this confidently.
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 single parameter fork_branch_name has 0% schema description coverage and the description never mentions it, so no naming constraints, format, or collision behavior are conveyed. Only one parameter keeps this from being worse.
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 gives a specific verb ('Fork') and resource ('the active branch at its head'), plus the resulting state change of switching this session to the new branch. However, it never distinguishes itself from closely related siblings like memkernel_checkout or memkernel_rollback, so an agent must infer the difference.
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?
'Use for speculative work you may want to discard' supplies a genuine use-case cue, which is better than nothing. But it names no alternatives and no when-not condition, leaving the agent to guess why it would fork rather than check out an existing branch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_heartbeat_leaseB
Extend a lease you hold by its original TTL. False means the lease was lost: stop editing and re-acquire.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | ||
| fencing_token | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 usefully discloses the boolean failure semantic and the required agent reaction, which is real behavioral value beyond the schema. However, it omits prerequisites (is this call idempotent? does it require auth?), the recommended heartbeat interval, and whether extension can fail for reasons other than lease loss.
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 filler, front-loading the action and then the failure contract. Every clause earns its place and the guidance is actionable.
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 the description is not obligated to explain return values, and the boolean meaning it does give is a bonus. Still, with no annotations and 0% parameter coverage, the definition leaves an agent guessing about heartbeat cadence and about what file_path/fencing_token must contain.
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% and there are two required parameters, so the description must compensate and does not. Neither 'file_path' nor the non-obvious 'fencing_token' concept is mentioned; the phrase 'a lease you hold' never explains that identity is conveyed via these two fields. This is the weakest dimension for the definition.
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: 'Extend a lease you hold by its original TTL.' An agent can distinguish this from memkernel_acquire_lease and memkernel_release_lease by the 'extend an already-held lease' framing. It stops short of explicitly naming the siblings it is not.
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?
Implies the usage context ('a lease you hold') and gives a clear failure-path instruction: on False, 'stop editing and re-acquire,' which implicitly routes to memkernel_acquire_lease. It does not state when to heartbeat (cadence relative to TTL) or when not to call it, so guidance remains inferred rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_historyB
List the most recent live events on the active branch (ids for rollback).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 it does disclose two real behaviors: results are limited to the active branch, and only "live" (non-dead) events are returned, plus most-recent ordering. It omits any statement about the limit parameter's effect, ordering guarantees, or pagination behavior, which is a notable gap for a zero-annotation 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?
A single front-loaded sentence with zero waste; the scope constraint comes first and the parenthetical adds operational value rather than 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?
An output schema exists, so return values need not be explained, and the branch/recency scoping is covered. Still missing is any definition of "live events" versus the events written by memkernel_log_execution/memkernel_note, and any explanation of the limit parameter, leaving the agent to guess at result size and content boundaries.
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% and the single parameter ("limit", default 30) is never mentioned in the description, so the agent gets no explanation of what it bounds, its valid range, or what happens when it is exhausted. The schema's type and default are the only source of meaning.
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 ("List"), a specific resource ("live events"), and a scope ("most recent", "on the active branch"), so the agent can distinguish it from memkernel_rollback or memkernel_log_execution. It falls short of a 5 only because "live events" is internal jargon whose definition is never pinned down.
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 parenthetical "(ids for rollback)" implies this is the discovery step preceding memkernel_rollback, which is genuine usage signal. However, there is no explicit when-to-use/when-not framing and no guidance on how it relates to siblings like memkernel_log_execution, memkernel_note, or memkernel_query_state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_init_taskC
Record this agent's task directive and constraints on the active branch.
| Name | Required | Description | Default |
|---|---|---|---|
| directive | Yes | ||
| constraints | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden and falls well short. It does not say whether recording a task overwrites a prior directive, whether the call is idempotent, whether it requires an active branch to already exist, or what happens on the active branch when the task is later rolled 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?
A single front-loaded sentence with the action verb first and zero wasted words. It is efficient, though arguably too terse for a tool whose structured fields carry no descriptive text.
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 explained, but for a state-mutating memory-kernel tool with 0% parameter coverage and no annotations the description is under-specified. It omits the branch prerequisites and the interaction with rollback, checkout, and log_execution that a calling agent needs to sequence calls correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it partially does by naming both concepts: the "directive" and "constraints." It adds no format or semantic detail, however — for example whether directive is free-form prose and what kinds of items belong in the constraints array.
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 ("Record") with a specific resource ("task directive and constraints") and scopes it to "the active branch," which is more precise than a bare name restatement. It does not, however, distinguish itself from closely related siblings like memkernel_note or memkernel_append_decision, so an agent must infer the difference from the name alone.
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 when-to-use guidance and no stated prerequisites, e.g. whether a branch must be checked out first via memkernel_checkout or whether this is a one-time per-task call. No alternatives (memkernel_note, memkernel_append_decision) are referenced, so the invocation context must be guessed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_list_branchesA
List all branches and this session's active branch.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, but this is a zero-parameter listing tool, so the safety profile is largely self-evident. It does disclose one behavioral fact beyond the name — that the output includes the current session's active branch — but says nothing about read-only guarantees, auth, or ordering.
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 front-loaded sentence with zero filler. It states the resource and the notable output detail in the fewest words possible.
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-shape explanation is unnecessary, and there are no parameters to document. The description is adequate for this tool's complexity, though the absence of any hint about ordering or how branches are identified is a small residual gap.
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 and the schema has no properties, so there is nothing for the description to disambiguate. Baseline 4 applies for a parameterless tool.
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 ('List all branches') and adds the useful scope detail that the session's active branch is included. It does not, however, differentiate itself from adjacent siblings like memkernel_diff_branches or memkernel_history, which an agent might reasonably weigh against it.
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 when-to-use or when-not-to-use guidance, and no mention of alternatives. The description simply declares what it returns; an agent gets no routing signal for choosing this over diff_branches or history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_log_executionA
Log a tool/terminal execution. A non-zero exit_code opens a blocker for this command; a later zero exit clears it. Put verified environment facts (e.g. {"python_version": "3.14.0"}) in facts; changed values are tracked as deprecated assumptions.
| Name | Required | Description | Default |
|---|---|---|---|
| facts | No | ||
| output | No | ||
| command | Yes | ||
| exit_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries a heavy burden and delivers real behavioral detail: a non-zero exit_code opens a blocker that a later zero exit clears, and facts are tracked with changed values deprecated as assumptions. It does not state whether an active task/checkout/lease context is required, which is a notable gap given the leasing siblings.
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 tight sentences, no filler, with the core action front-loaded and the consequential blocker/facts behavior following immediately. Every sentence 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?
An output schema exists, so return values need no explanation, and the mutating behavior (blocker open/clear, assumption deprecation) is well covered. What remains missing is prerequisite context — whether this requires an init'd task or an acquired lease — and any mention of the 'output' parameter.
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 0%, so the description must compensate, and it substantially does: it explains the exit_code semantics, tells you what belongs in facts (verified environment facts, e.g. python version) and how changing facts are treated. Only the 'output' parameter is left entirely undefined.
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: 'Log a tool/terminal execution'. A reader immediately knows what the tool does. It does not explicitly distinguish itself from the many sibling memory tools (memkernel_note, memkernel_append_decision), which is why it falls short of a 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?
Usage context is implied (call after running a command) and the exit_code contract hints at when a blocker matters, but there is no explicit when-to-use/when-not guidance or routing to alternatives such as memkernel_note for unverified observations. Implied usage only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_noteA
Record an ephemeral scratchpad note (compacted by GC over time).
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden. It usefully discloses that notes are subject to garbage collection over time, which is a key behavioral trait beyond the schema. However, it omits return behavior, note size limits, whether notes are queryable, and interaction with memkernel_trigger_gc.
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?
Single front-loaded sentence with zero waste. Every word (Record, ephemeral, scratchpad, GC) adds meaning.
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 explained. For a one-parameter tool, the description covers the essential lifecycle trait (ephemeral, GC'd) that the schema cannot express. Minor gaps around size limits or queryability are acceptable given the tool's simplicity.
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. It clarifies the note is an ephemeral scratchpad, distinguishing the content from durable logs or decisions. The single required string parameter's semantics are adequately implied by the verb 'Record' plus the scratchpad context.
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: write an ephemeral scratchpad note. Clearly distinguishable from siblings like memkernel_append_decision or memkernel_log_execution by its ephemeral/scratchpad nature. Lacks explicit sibling differentiation but the 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?
No guidance on when to use this versus memkernel_append_decision (durable decisions) or memkernel_log_execution. The 'ephemeral' hint implies transient use cases but doesn't state exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_query_stateA
Return the consolidated memory of a branch as JSON: tasks, decisions, active workspace facts, deprecated assumptions, execution blockers, file claims, active leases and recent events. Set include_ephemeral=true to also see raw tool-execution logs and scratchpad notes not yet compacted.
| Name | Required | Description | Default |
|---|---|---|---|
| branch_id | No | main | |
| include_ephemeral | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose a meaningful behavioral trait: ephemeral tool-execution logs and scratchpad notes are excluded by default and only surfaced on opt-in. 'Return' strongly implies a read-only, non-mutating operation. It still omits permissions, cost, and whether the snapshot is consistent, keeping it short of 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?
Two sentences, front-loaded with what is returned and followed by the one opt-in behavior. The enumeration is dense but every listed category earns its place by telling the agent what the payload contains.
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-required, read-only query with an output schema, the description is nearly sufficient: it signals the payload shape and the ephemeral flag's effect. It would be complete with brief routing guidance against sibling tools and a note on branch_id.
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 for two parameters. It explains include_ephemeral well ('raw tool-execution logs and scratchpad notes not yet compacted'), but says nothing about branch_id beyond the schema's default of 'main'. Partial compensation warrants a 3.
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 ('Return') and resource ('consolidated memory of a branch'), then enumerates the categories returned (tasks, decisions, workspace facts, blockers, leases, events), which is unusually concrete. It does not, however, differentiate itself from siblings such as memkernel_history or memkernel_diff_branches, so an agent must still infer which read tool fits.
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 second sentence gives a clear conditional for one parameter ('Set include_ephemeral=true to also see...'), which is genuine usage guidance. But there is no statement of when to reach for this tool versus the many sibling read/query tools, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memkernel_release_leaseA
Release a lease you hold. Returns false if the token is stale (the lease expired and was granted to someone else) or not yours.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | ||
| fencing_token | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 does usefully disclose that the call can fail with 'false' when the token is stale or belongs to another holder, which is real behavioral detail, but it says nothing about permissions, whether a repeat call is harmless, or how non-stale errors surface.
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, no filler, and the core action is front-loaded ahead of the failure caveat. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter lease operation with an output schema to cover the return shape, the description covers purpose and the main failure mode adequately. It is thin only on permissions and idempotency, which are not strictly needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It partially does by explaining that the fencing_token can go stale when the lease is re-granted, which gives real meaning to that parameter, but file_path is never described and no format or expected-value guidance is offered.
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 ('Release a lease you hold') that is unambiguous and naturally separates it from the acquire_lease and heartbeat_lease siblings. It stops short of naming an alternative explicitly, so it is clear but not maximally differentiating.
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 phrase 'you hold' implies the precondition (you must currently own the lease) and the second sentence sketches the failure context, but there is no explicit when-to-use / when-not guidance or named alternative for edge cases. Usage 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.
memkernel_rollbackA
Roll the active branch's live timeline back to target_event_id.
Later events are reverted but kept in the audit log (fork from them to recover). Find event ids with memkernel_history.
| Name | Required | Description | Default |
|---|---|---|---|
| target_event_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 well: it discloses that later events are reverted but preserved in the audit log, and that recovery is possible by forking. It omits prerequisites such as lease/confirmation requirements and whether the rollback is atomic or interrupts in-flight work.
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, front-loaded with the action and target, followed by consequence and recovery. No filler or restatement of the tool name.
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 explained, and the description covers the mutation's effect and recovery path for a one-parameter destructive operation. Remaining gaps are prerequisites (permissions/lease state) that would fully close the loop for a mutation tool with no annotations.
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% and the single integer parameter is undocumented in the schema, so the description must compensate. It identifies what target_event_id means and directs the agent to memkernel_history to obtain valid values, which is meaningful guidance beyond the bare property name.
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 (roll back) plus the exact resource and scope (the active branch's live timeline) and the anchor (target_event_id). This cleanly distinguishes it from siblings like memkernel_checkout, memkernel_fork_investigation, and memkernel_history.
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 concrete operational guidance: obtain event ids via memkernel_history and explains the recovery route (fork from retained events). It does not state explicit when-not conditions (e.g., whether an active lease or an alternative branch operation is preferred instead), so it falls 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.
memkernel_trigger_gcA
Compact a branch's memory now, folding older tool logs and notes into a semantic snapshot. Reports token counts before/after.
| Name | Required | Description | Default |
|---|---|---|---|
| target_branch | No | main |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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. It discloses what happens (older tool logs and notes are folded into a semantic snapshot) and what is returned (token counts before/after), which is useful. But it omits whether the fold is reversible, whether detail is lost, whether a lease is required, or whether it affects other branches — material gaps for a mutating compaction 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?
Two tight sentences with zero filler: the operation is front-loaded, the mechanism follows, and the return value is stated last. 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?
An output schema exists, so the return contract is covered and needn't be explained. But for a mutating, potentially lossy compaction operation with no annotations and an undocumented parameter, the description is only adequate — it should state reversibility, scope of impact, and lease/permission requirements.
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% for the single 'target_branch' parameter. The description's phrase 'a branch's memory' implies the branch is selectable but never names or explains the parameter, nor mentions the 'main' default, so it only partially compensates for 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 action (compact a branch's memory) and the mechanism (folding older tool logs and notes into a semantic snapshot), which is a distinct operation no sibling tool performs. It clarifies the jargon-heavy name 'trigger_gc'. However, it does not explicitly contrast itself with sibling tools like memkernel_rollback or memkernel_history, so it falls short of the top band.
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 word 'now' implies this is an on-demand, manual trigger as opposed to an automatic compaction, which is implicit usage context. There is no explicit statement of when to invoke this versus waiting for automatic GC, 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.2.0- Added
memkernel_fenced_append_decision
15 tool updates
v0.1.0- First observed
memkernel_acquire_lease - First observed
memkernel_append_decision - First observed
memkernel_checkout - First observed
memkernel_diff_branches - First observed
memkernel_fork_investigation - First observed
memkernel_heartbeat_lease - First observed
memkernel_history - First observed
memkernel_init_task - First observed
memkernel_list_branches - First observed
memkernel_log_execution - First observed
memkernel_note - First observed
memkernel_query_state - First observed
memkernel_release_lease - First observed
memkernel_rollback - First observed
memkernel_trigger_gc
TDQS
Scored across 16 tools
Most tools target distinct resources and actions (lease acquire/release/heartbeat, branch fork/checkout/rollback, memory query/history/diff). The only real risk is memkernel_append_decision vs memkernel_fenced_append_decision, but the descriptions clearly distinguish the lease-guarded variant, keeping confusion low.
All names share a consistent memkernel_ prefix with snake_case and are mostly verb_noun (append_decision, acquire_lease, trigger_gc, log_execution). A few are bare nouns/verbs (checkout, rollback, note, history), a minor deviation but still readable and predictable.
16 tools is slightly on the heavy side but each maps to a distinct capability spanning leases, branches, decisions, execution logging, notes, and GC. Nothing looks redundant enough to be padding, so the count fits the scope.
The surface covers the full memory-kernel lifecycle: tasks, decisions, leases, branch management, history, diff, GC, execution logging, and notes. Minor gaps like no explicit decision deletion or separate fact-listing tool exist, but query_state and GC largely compensate.
Maintenance
Related MCP Connectors
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Hosted agent memory with provenance, contradiction surfacing, and snapshot rollback.
Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.
Hosted MCP memory for coding agents: persistent across sessions, editable markdown, team sharing.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA local-first MCP memory server providing persistent, searchable memory for AI agents, powered by SQLite.1 npm1Apache 2.0
- AlicenseNot gradedqualityFmaintenanceLocal-first, auditable memory for AI agents. Provides durable context for MCP hosts with SQLite storage, CLI, and MCP tools for memory management.2Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI coding agents to share a local-first, versioned memory of decisions, conventions, tasks, conflicts, and handoffs over MCP and REST.1 npmMIT
- AlicenseCqualityAmaintenanceLocal-first, governable long-term memory for AI agents. Provides SQLite-backed storage, cross-session recall, and traceable memory corrections through a standard MCP interface.401MIT