slowave
OfficialThis server is a living-memory MCP layer that lets agents open memory-grounded sessions, store and retrieve durable knowledge across tasks, assess what helped, and close sessions with outcomes that feed offline consolidation.
Activate: start a task session, load scoped relevant memories/procedures, and get retrieval/session IDs plus optional task context and continuity.
Remember: save durable typed claims (facts, decisions, preferences, constraints, instructions, lessons, warnings, etc.) individually or in batches.
Recall: perform mid-task semantic search over memories and procedures, with optional evidence references/full detail and continuation paging.
Feedback: record whether retrieved memories helped, were irrelevant, or became stale; mark procedure use/effect and missing knowledge.
Commit: close a session with outcome, verification, optional reusable procedure, and task trajectory, triggering offline memory consolidation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@slowaveRemember that we pin all dependencies to exact versions."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AI agents have large context windows, but that context ends with your current session. Open a new session, switch from Claude Code to Codex, and you have to restate the same decisions, constraints, over and over.
Slowave gives your agents one local, shared memory, without requiring a separate LLM for memory maintenance.
At the core Slowave is built around a simple concept:
Reasoning and memory feed each other in a continuous loop.
graph LR
LLM["Reasoning<br/>(Claude, Codex, Copilot, etc.)"]
MEM["Memory<br/>(Slowave)"]
LLM -->|Feedback| MEM
MEM -->|Retrieve| LLM
MEM -->|Adapt| MEMSlowave retains what helps agents achieve their goals, weakens what does not, and continuously adapts based on use. It does this through a continuous feedback loop between your agent and its memory:
remember → recall → use → feedback → reinforce / weaken → decay
Memory is continuously reshaped by use rather than a static collection of facts waiting to be retrieved.
Keep context across tasks: Your agents can reuse recorded decisions, preferences, constraints, and lessons.
Evolves through feedback: Useful memories grow stronger, irrelevant ones lose priority, stale knowledge can be superseded.
Learns from experience: Decisions, outcomes, and multi-step solutions can become reusable context your agents can act on.
Runs locally: Slowave stores memory in SQLite and does not send it to a hosted memory service.
No LLM API key: The memory core performs maintenance and retrieval without LLM calls or an LLM API key.
Inspectable and measurable: Review memories, retrievals, feedback, procedures, and system performance in the local dashboard.
The first useful payoff is simply not having to repeat the same constraint in the next task.
Over time, the way you work becomes reusable context for your agent.
Installation
Quick start
pipx install slowave
slowave setup --dry-run
slowave setupThe quick start configures every detected client. To configure just one client at a time, see the installation reference.
No LLM API key required.
For upgrades and service management, see Install, upgrade, run, and remove Slowave.
Use slowave start, slowave stop, and slowave restart for installed services;
use slowave status --services and slowave doctor to diagnose problems.
See Troubleshooting for recovery and logs, or run
slowave docs troubleshooting to open it from your terminal.
Related MCP server: ClawMem MCP Server
Workflow
You keep working with your agent as usual.
You can switch agents or start new sessions.
Slowave enriches your agents context with relevant memories and procedures. Your agent feedbacks Slowave on what was useful. Slowave keeps building relevant context for your agents in the background.
sequenceDiagram
actor User as You
participant Agent as Your Agent<br/>(Claude Code, Codex, etc.)
participant Slowave
participant Worker as Slowave Worker
User->>Agent: Prompt
Agent->>Slowave: Activate: Start task (set goal)
Slowave-->>Agent: Relevant memories and procedures
opt
Agent->>Slowave: Remember: Save new knowledge
end
opt
Agent->>Slowave: Recall: Look up more context
Slowave-->>Agent: Matching memories and procedures
end
Agent->>Agent: Reason upon enriched context, work on the task
Agent->>Slowave: Feedback: Assess retrieved context
Agent->>Slowave: Commit: Record outcome
Slowave-->>Agent: Task outcome saved, session closed
Agent-->>User: Deliver the result
Worker->>Slowave: Consolidate, reinforce, decay memoriesDashboard
The local dashboard shows what Slowave is actually doing with your agent's memory over time: what it remembers, what it retrieves, and what your agent reports using.
As your history grows, you can follow a memory from where it came from to the tasks where it was later retrieved and used. You can inspect learned procedures, see when retrieved context was useful or irrelevant, and understand whether Slowave is helping your agent reuse past work rather than simply accumulating memories.
Start the dashboard with:
slowave dashboardFrom the dashboard you can:
Inspect memories: see what was saved, where it came from, its current state, and when it was later retrieved or used.
Inspect procedures: review reusable methods captured from previous work and see when they are retrieved and reused.
Trace retrievals: see the request, the context Slowave actually returned, and the feedback reported by the agent.
Follow activity: inspect tasks, retrievals, feedback, memory updates, and their links to each other.
Explore memory connections: browse relationships and associations between memories.
Check system health: inspect the database, background maintenance, backups, and local services.
The overview also helps answer whether the memory loop is working: how many memories and procedures exist, how often retrieved context is reported as used, how much is marked irrelevant, whether feedback is being recorded, and how creation, retrieval, and use change over time.
Slowave also shows a rough estimate of the context returned through all MCP endpoints, so you can keep an eye on memory overhead.
Supported clients
Client coverage is actively expanding. Suggest more integrations or report broken ones with setup details.
✅ = supported. Copilot validation limits are listed below.
Client | macOS | Linux | Windows | Setup |
Claude Code | ✅ | ✅ | ✅ |
|
Copilot CLI | ✅ | ✅ | ✅ |
|
Codex | ✅ | ✅ | ✅ |
|
Cursor | ✅ | ✅ | ✅ |
|
OpenCode | ✅ | ✅ | ✅ |
|
Windsurf | ✅ | ✅ | ✅ |
|
Cline | ✅ | ✅ | ✅ |
|
Claude Desktop | ✅ | ✅ | ✅ |
|
All the above |
|
¹ requires one manual paste after setup
Copilot support targets local CLI execution. Automated integration tests pass, and native configuration discovery is verified on macOS. A user also confirmed memory reads and writes through Copilot CLI on macOS. Full model-driven lifecycle and native Windows/Linux qualification remain pending. IDE, desktop, and hosted/cloud Copilot support is deferred.
The default embedding model downloads from Hugging Face on first use (~45 MB, cached locally). Subsequent runs work offline.
Memory is stored in plaintext in the current OS user's application-data directory. Slowave does not send it to a hosted memory service. See runtime data location.
How Slowave memory works
Slowave works through 5 simple MCP tools:
Activate: start a task and load relevant memory.Remember: save a fact, decision, preference, or instruction.Recall: search memory during a task.Feedback: assess retrieved memories asused,not_used,unassessable,irrelevant,already_known, orstale.Commit: save the task outcome and any reusable procedure.
A background worker consolidates relevant memories and procedures.
Slowave MCP lifecycle
flowchart LR
A[Agent task] --> B[1. <i>activate</i><br/>start session]
B --> C[Scoped retrieval<br/>and session]
C --> D[Agent reasoning]
D --> E[2. <i>remember</i><br/>durable claims]
D --> F[3. <i>recall</i><br/>mid-task lookup]
C --> G[4. <i>feedback</i><br/>target assessments]
F --> G
E --> H[5. <i>commit</i><br/>outcome and verification]
G --> H
H --> I[(Local SQLite<br/>raw events and evidence)]
I --> J[Offline consolidation]
J --> K[(Episodes, prototypes,<br/>schemas, relations)]
K --> CSee architecture.md and design.md for details.
Boundaries
Slowave is a memory layer, not a reasoning engine.
It cannot recall information that was never recorded.
Memory quality depends on the client agent and the feedback it provides.
Slowave adds token overhead from tool calls and retrieved context.
The local SQLite database is plaintext by default; protect it with OS permissions or full-disk encryption.
Slowave is public beta software. APIs, configuration, and storage schema may change, and migrations are not guaranteed before stable release.
Evaluation
The current evaluation notes report preliminary retrieval-evidence results, methodology, limitations, and commands for running new evaluations. They do not claim end-to-end agent accuracy or a comparison against other memory systems. See benchmarks.md before treating any result as a production-quality claim.
Documentation
Mintlify documentation: full auto-generated documentation
design.md: design rationale, boundaries, and positioning
architecture.md: brain-inspired memory model and lifecycle
install.md: installation, setup, lifecycle instructions, modified files, and removal
benchmarks.md: benchmark results, methodology, and reproduction
troubleshooting.md: daemon, worker, dashboard, client integration, database, backup/restore
Contributing
Slowave is open source under the AGPL-3.0-or-later license.
Contributions are welcome, especially in:
installation and setup quality
client integrations
performance optimization
See CONTRIBUTING.md before submitting a pull request.
License
Slowave is open source under the GNU AGPL-3.0-or-later license.
Available Tools
5 toolsslowave_activateA
Prime working memory with relevant context. Opens an implicit session.
Call this once at the beginning of every task. Spreading activation surfaces
relevant memories and procedures, and opens a server-side session so you
never need to call session_start manually.
Retrieval considers meaning and specific terms, then selects context
applicable to the task. The bounded result is not a complete inventory
or a verification of the returned claims; assess their actual use.
A user message establishing or changing durable guidance is also a
task, even without another action request. Save the durable claim
and complete feedback and commit before acknowledging completion;
saving guidance is part of completing the task.
Answer-only tasks also require retrieval feedback and commit before
the final response; remember and recall are conditional.
Procedures include complete steps, applicability context, outcomes,
and caveats. Inspect these against current evidence before adapting
a method. Recall only when needed history or details are absent;
name the original goal and relevant conditions in that query.
The cognitive cycle:
1. slowave_activate(task, initial_goal, scope) <- start here
2. slowave_remember(session_id, scope, content, type)
<- when you discover new knowledge worth retaining as durable memory
because it could help you with future tasks
3. slowave_recall(session_id, scope, query) <- mid-task lookup
4. slowave_feedback(retrieval_id, memory_feedback, procedure_feedback, coverage) <- after using memories
5. slowave_commit(session_id, final_goal, outcome, outcome_summary, verification) <- close the task
Args:
task: copy the user request exactly (required, nonblank); do not
rewrite or translate it. Put interpretation in initial_goal.
initial_goal: concise action-led provisional objective (required, nonblank).
scope: required retrieval boundary in ``kind:id`` form.
continuity_id: omit on the first client-conversation activation;
retain and resend the returned opaque token unchanged on later
activations in that conversation. Never invent it or reuse it across different client conversations.
page_size: optional strict integer 1–10; omitted values use the server default.
task_context: optional structured facts that condition retrieval.
Returns:
retrieval_id: pass to slowave_feedback.
session_id: required by recall and commit.
memory_state: cold_start or available for the resolved scope.
memories: canonical [{memory_id, content, pathway, provenance?}].
procedures: execution-ready methods with ID, goal, summary, steps,
context, outcome, outcome_summary, and safety caveats.
Deliberate recall additionally returns detailed reuse evidence.
warnings: stable structured safety warnings.
continuity_id: server-issued opaque client-conversation token.
continuity_state: started on omission, continued on valid reuse.
retrieval_policy_version: server-selected retrieval-policy identifier. relevant_total: number of discovered relevance-qualified declarative memories in a relevant-set response. catalog_truncated: true when the bounded candidate search could have omitted qualifying memories; false does not include procedure results. more_available: whether a frozen continuation page is available. continue_from: opaque continuation cursor, present only when more_available. accessible_field: bounded orientation for unreturned candidates; contains extra_candidates, kinds, and approx_extra_tokens, never content.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | Copy the user request verbatim. Do not rewrite, translate, or substitute the inferred goal. | |
| scope | Yes | ||
| page_size | No | Maximum memories per page (default 5); continuations inherit this bound. Procedures have a separate limit. | |
| initial_goal | Yes | Concise action-led interpretation; helps discovery but cannot independently justify admission. | |
| task_context | No | ||
| continuity_id | No | ||
| semantic_context | 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 behavioral burden and does disclose non-obvious traits: a server-side session side effect, bounded/non-exhaustive retrieval ('not a complete inventory or a verification of the returned claims'), catalog truncation, cold_start vs available states, and stable warnings. It does not state permissions, auth requirements, or rate limits, which keeps 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?
Well front-loaded and organized into purpose / cycle / args / returns, but substantially oversized: a long tail of agent-policy prose ('a user message establishing or changing durable guidance is also a task...') plus a full restatement of the cognitive cycle that repeats sibling-tool duties in prose. Several sentences could be trimmed without losing callable 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?
An output schema exists, so the detailed Returns block is arguably redundant, but the annotation-free status means the behavioral disclosure is necessary and is largely present for a multi-step memory system. The one genuine hole is semantic_context, absent from both description and schema.
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 43% across 7 params, so the description must compensate, and it does: the Args block adds real meaning beyond the schema for task ('copy verbatim, put interpretation in initial_goal'), continuity_id ('never invent it or reuse it across different client conversations'), and page_size bounds. It only misses semantic_context, which is undocumented in both places.
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?
Opens with a specific verb+resource ('Prime working memory with relevant context. Opens an implicit session.') and immediately states its role as step 1 of a named cycle. Siblings slowave_recall/remember/feedback/commit are placed explicitly in that cycle, so an agent can distinguish this entry-point tool from the mid-task and closing tools 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 an explicit when ('Call this once at the beginning of every task'), an explicit alternative it removes ('you never need to call session_start manually'), and conditional guidance for downstream tools ('Recall only when needed history or details are absent'). It also resolves an ambiguous case (guidance-only and answer-only tasks still count as tasks). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slowave_commitA
Close the current task and trigger offline memory consolidation.
Before calling, review whether the task revealed useful knowledge that a future task should retrieve directly. Store any such claims with slowave_remember; if none qualifies, commit normally. Commit records the task outcome and optional procedure, not a substitute for explicit claims. In particular, save a newly established requirement or decision that governs future tasks as a standalone claim before closing. Describing it in outcome_summary alone does not create that remembered claim. Call at the end of every task. If skipped, the idle-session reaper closes the session after SLOWAVE_SESSION_IDLE_TIMEOUT seconds (default 3600). Args: session_id: required active session from activate. final_goal: required confirmed goal. outcome: required success|partial|failure. outcome_summary: required standalone actual result. verification: required {status, summary, evidence_refs?}; status is verified|partially_verified|unverified. procedure: optional {version: 2, summary, context: {}, steps: [{summary}], caveats: []}; include only for a reusable method that was actually attempted. trajectory: optional executed-attempt trace of at most 32 action/observation entries, each {kind, summary, status?}. Must contain TASK actions/observations only. Do NOT include Slowave lifecycle bookkeeping (activate/recall/feedback/commit calls, "Activated the Slowave session." etc.) -- the server filters those out and reports the count as trajectory_lifecycle_filtered. If you have no task-level actions, omit the trajectory. Returns: session_id: the session that was closed. episodes_formed: number of episodic memories created. feedback_status: complete for normal closure. committed: true when the session outcome was recorded. outcome: confirmed success, partial, or failure outcome. verification_status: confirmed verification status. operation: closed for a new close or updated for an already-ended session. trajectory_lifecycle_filtered: number of lifecycle entries removed, when any were filtered. already_ended: true when the session had already been closed.
| Name | Required | Description | Default |
|---|---|---|---|
| outcome | Yes | ||
| procedure | No | ||
| final_goal | Yes | ||
| session_id | Yes | ||
| trajectory | No | ||
| verification | Yes | ||
| outcome_summary | 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 are provided, so the description must carry the full behavioral burden, and it does substantively: it discloses the memory-consolidation side effect, the idle-reaper timeout with default, lifecycle-entry filtering during trajectory capture, and non-idempotent-looking-but-tolerated re-commit behavior ('operation: closed for a new close or updated for an already-ended session'). It stops short of stating permission/auth requirements or whether closing is irreversible, which is why this is a 4 rather than a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the pre-call decision rule, then a structured Args list. It is long, and the Returns block largely restates fields already carried by the output schema, which is wasted space, but the prose itself is dense and each guidance sentence about the remember-vs-commit decision 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?
Given 7 parameters, 5 required, nested verification/procedure objects and 0% schema description coverage, the description supplies the missing semantics for every required and optional field plus omission guidance ('If you have no task-level actions, omit the trajectory'). The output schema covers return values, so the description need not explain them further.
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 has to compensate, and the Args block does: it labels session_id as the active session from activate, final_goal as the *confirmed* goal, explains outcome_summary as a 'standalone actual result', and details verification's status enum and procedure/trajectory content rules. The trajectory constraint (task-level only, max 32, no lifecycle bookkeeping) is genuinely additive beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Close the current task and trigger offline memory consolidation.' It also distinguishes itself from the sibling slowave_remember by stating what commit does *not* store (explicit claims). An agent can identify this as the terminal/close operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Call at the end of every task'), a when-to-use-alternative rule (store reusable knowledge with slowave_remember first, commit if nothing qualifies), and a when-not consequence (the idle-session reaper closes after SLOWAVE_SESSION_IDLE_TIMEOUT). It even handles the edge case of an already-ended session via the `operation`/`already_ended` semantics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slowave_feedbackA
Record append-only evidence about retrieved memories and procedures.
Task outcome does not belong here; slowave_commit owns it. Memory
feedback informs future retrieval; procedure use/effect informs future
ordering. Task mismatch does not establish that a claim is false.
When a retrieved claim is replaced, remember the corrected claim first,
then mark the old one stale/superseded with its replacement_memory_id.
Declarative assessments are used|not_used|unassessable|irrelevant|already_known|stale.
Report used only after observed influence on reasoning, an action, a check,
or an applied constraint; reading or topical similarity is insufficient.
not_used means no influence; irrelevant means task mismatch.
unassessable requires reason and records unknown usage, never guessed non-use.
Both not_used and unassessable are neutral and complete target accountability.
Complete all exposed targets after the relevant work, before commit.
Partial checkpoints may report observed use or stale evidence earlier.
Only returned targets need feedback; do not exhaust continuation pages.
You may batch multiple retrievals in items. A minimal memory entry is
{"memory_id":"","assessment":"not_used"}. A stale assessment must include
stale_reason (contradicted|superseded|outdated|unsupported|withdrawn)
and a concise reason; superseded additionally requires
replacement_memory_id. Procedure feedback keeps
use (used|not_used|unassessable) separate from effect
(helped|no_effect|harmed|unknown), with contribution required when used.
Memory feedback additionally accepts: relevance
(relevant|irrelevant|uncertain), effect for used marks
(helped|no_effect|harmed; absent means helped, unknown is invalid),
and the already_known assessment (dedup observation; no
reinforcement, no suppression). Relevance never gates the usage axis
and vice versa (decoupled axes).
For assessments other than used, omit effect or set unknown.
not_used/unassessable procedures require omitted/unknown effect and no contribution;
unassessable additionally requires reason.
Replacement memories must be active, different, and in the retrieval scope;
replacement IDs need not have been exposed by this retrieval.
Even an empty retrieval requires {"retrieval_id": "", "coverage": "complete"}.
Default coverage is partial. For batches put coverage inside each item,
never at top level. Outer ok=true can contain rejected targets or failed
batch items: inspect every results[i].ok, data.rejected and data.outstanding.
Correct rejected entries and outstanding targets, then declare complete.
Args: retrieval_id: opaque ID returned by activate/recall. memory_feedback: [{memory_id, assessment, relevance?, effect?, stale_reason?, replacement_memory_id?, reason?}]. procedure_feedback: [{procedure_id, use, effect, contribution?, reason?}]. retrieval_quality: optional whole-result quality assessment. missing: optional descriptions of expected but absent knowledge. coverage: partial or complete; silence under partial is not negative. items: batch of records with the same fields. Scalar feedback fields and items are mutually exclusive. Returns: retrieval_id: the assessed scalar retrieval. coverage: achieved partial or complete coverage. A rejected complete request reports partial. requested_coverage: the client's requested coverage. outstanding: memory_ids and procedure_ids still requiring assessment. accepted_event_ids: append-only feedback events accepted by the server. rejected: feedback targets or shapes the server did not apply, with reasons. applied: actual strengthened/weakened/unchanged numeric changes, plus neutral not_used/unassessable observations and stale transitions. results: for batch input, ordered item envelopes with independent ok/data or ok/error results.
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | Batch mode: send items alone. Put coverage inside each item; omit every scalar feedback field. | |
| missing | No | ||
| coverage | No | partial | |
| retrieval_id | No | ||
| memory_feedback | No | ||
| retrieval_quality | No | ||
| procedure_feedback | 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 entire burden and does so: append-only semantics, decoupled usage/relevance axes, neutral not_used/unassessable observations, and non-obvious server behavior ('Outer ok=true can contain rejected targets or failed batch items: inspect every results[i].ok, data.rejected and data.outstanding'). It also warns that 'A rejected complete request reports partial' and that 'silence under partial is not negative.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the commit boundary, and most sentences carry operational rules that cannot be inferred elsewhere. It is dense and occasionally repetitive (the reason-required rule is restated for memory vs. procedure contexts), and the running-prose layout makes the many constraints harder to scan than they need to be, but little is pure 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 and the Returns section already enumerates every response field, so the description is free to spend its words on the hard parts: assessment semantics, batching, rejection recovery, and coverage semantics. An agent has everything needed to shape a valid call and to react to partial rejection.
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?
Top-level schema coverage is only 14%, but the description compensates by explaining nearly every field: scalar feedback vs. items mutual exclusivity, coverage default of partial, batch coverage placement, stale_reason values with the superseded/replacement_memory_id dependency, and procedure use-vs-effect separation. Minor gap: retrieval_quality and missing are described only in one vague clause each, with no expected format.
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?
Opens with a specific verb+resource: 'Record append-only evidence about retrieved memories and procedures.' It also explicitly fences off the sibling: 'Task outcome does not belong here; slowave_commit owns it,' so an agent can distinguish this from slowave_commit without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-report rules for each assessment ('Report used only after observed influence on reasoning, an action, a check, or an applied constraint; reading or topical similarity is insufficient'), sequencing guidance ('Complete all exposed targets after the relevant work, before commit'), and an exclusion ('Only returned targets need feedback; do not exhaust continuation pages'). Alternatives and edge conditions are covered, not left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slowave_recallA
Semantic retrieval: bring relevant memories into working memory. Use for deliberate mid-task lookups when you need specific historical context beyond what activate surfaced. Recall is explicitly bound to the active session and matching scope. Retrieval considers semantic meaning and specific lexical matches, then selects context relevant to the current need. Ask a focused natural-language question naming the subject, goal, and relevant conditions; preserve exact project/service names, identifiers, and error text when known. Paraphrases can match; you do not need to reproduce the stored wording. Avoid keyword stuffing or assuming the answer in the query. For example, a stored claim "Atlas authentication credentials expire after 45 minutes" can be queried with "How long do Atlas login tokens remain valid?" State independent needs as separate sentences when asking several questions. Results are bounded suggestions, not proof of truth or a complete inventory. If needed history is missing, clarify the question or use a returned continuation when more context would help; an empty result does not prove absence. Inspect provenance/evidence and procedure outcomes/caveats before applying guidance; use evidence="full" when source content is needed, noting truncation. Args: page_size: optional strict integer 1–10; omitted values use the server default for a new query. Omit with continue_from. query: natural-language query; omit when continuing a frozen result. session_id: active session returned by slowave_activate. scope: required retrieval boundary; must match the session. task_context: optional context update for this sub-question. evidence: references (default) or full; budget and policy are server-owned. continue_from: opaque cursor returned by activate or recall. The cursor is bound to this session and scope and replays a frozen tail. Returns: retrieval_id: pass to slowave_feedback after using memories. memories: canonical direct/associated memories with stable pathways. procedures: canonical procedures, including their ID, goal, summary, context, steps, caveats, outcome, outcome_summary, created_at, aggregate evidence, and recent contributions; no ranking scores. evidence: bounded records with evidence_id, source_kind, recorded_at, occurred_at, and source_ref; full mode also returns content and per-record truncated. evidence_mode: the applied references or full mode. evidence_truncated: whether evidence records exceeded the response budget. retrieval_policy_version: server-selected retrieval-policy identifier. relevant_total: number of discovered relevance-qualified declarative memories in a relevant-set response. catalog_truncated: true when the bounded candidate search could have omitted qualifying memories. more_available: whether a frozen continuation page is available. continue_from: opaque continuation cursor, present only when more_available. accessible_field: bounded orientation for unreturned candidates; contains extra_candidates, kinds, and approx_extra_tokens, never content.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| scope | Yes | ||
| evidence | No | references | |
| page_size | No | ||
| session_id | Yes | ||
| task_context | No | ||
| continue_from | No | ||
| semantic_context | 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 does so well: it discloses session/scope binding, that results are 'bounded suggestions, not proof of truth', that an empty result does not prove absence, that evidence can be truncated, and that continuations replay a frozen tail. It omits any note on auth requirements or rate limits, but the behavioral profile for a read-lookup tool is otherwise thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the guidance is useful, but the long enumerated Returns block duplicates an output schema that already exists, making the description noticeably bloated. The query-crafting advice earns its place; the return-field catalogue largely does not.
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 an 8-parameter, session-bound retrieval tool with a separate output schema, the description covers usage, query construction, evidence modes, pagination/continuation and failure interpretation. The only real omission is the undocumented semantic_context 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 description coverage is 0%, so the description must compensate and largely does, documenting the semantics and interactions of query, scope, session_id, task_context, evidence, continue_from and page_size (including the 'omit when continuing' rule). The one gap is semantic_context, which exists in the schema but is never mentioned in the Args section.
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 ('Semantic retrieval: bring relevant memories into working memory') and immediately scopes it against a sibling ('beyond what activate surfaced'). An agent can distinguish it from slowave_activate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger ('deliberate mid-task lookups' needing 'specific historical context beyond what activate surfaced') and gives strong query-crafting guidance with a worked example. It does not explicitly say when NOT to use it versus slowave_remember/feedback/commit, so it stops short of a full routing rule set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slowave_rememberA
Record newly discovered knowledge worth retaining for future tasks in this scope. Scalar and batch forms inherit one explicitly verified session and scope. Proactively call this when you discover new knowledge worth retaining as durable memory because it could help you with future tasks: pursue a goal, avoid rework or a wrong assumption, or avoid asking the user again. Do not wait for the user to say “remember”. Good candidates are confirmed facts, user preferences, decisions, constraints, lessons, warnings, and open questions that affect future goals. Save the claim when it becomes clear; review for missed claims before commit. Use concise, standalone wording with enough context for a later session, and batch independent claims. Check activated memories and task context for duplicates; a matched claim is acceptable. Skip speculation, progress notes, pending steps, temporary task state, and details unlikely to matter again. A fact recorded elsewhere can still be worth saving when rediscovery would cost meaningful work.
Write for later retrieval: use one independent claim per entry and name its subject explicitly instead of "this" or "that approach". Preserve conditions, exceptions, and negation; include the reason for a decision when it explains when to apply it. Keep meaningful exact names, identifiers, commands, and error text alongside natural-language context. Retrieval considers meaning and specific terms, so avoid keyword lists, repeated synonyms, and unrelated claims in one entry. For example, prefer "Atlas authentication credentials expire after 45 minutes" to "Tokens: timeout, expiry, login, auth; same as discussed above." Include source/time context when it affects applicability, and use occurred_at only for the source-event time described below.
Args:
scope: required scope matching the active session.
session_id: required active session returned by slowave_activate.
content: one standalone durable claim; mutually exclusive with memories.
type: required scalar type. Reusable directions use instruction;
only verified commit procedures are execution-backed procedures.
occurred_at: optional RFC 3339 source-event time, such as
2026-08-26T09:30:00Z. Use only when the claim records
an event that happened at a different time from this MCP
call. Slowave always sets internal raw-event ts itself
to the write time; occurred_at never changes event order.
memories: strict batch of {content, type, occurred_at?} objects inheriting the
outer scope and session.
Returns: stored: true when the scalar claim was accepted. memory_id: canonical identifier for a scalar stored or matched memory. disposition: created or matched for a scalar claim. type: confirmed scalar memory type. scope: confirmed scalar memory scope. source_event_id: source provenance event for a scalar claim. results: for batch input, ordered item envelopes with index and independent ok/data or ok/error results.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| scope | Yes | ||
| content | No | ||
| memories | No | Batch mode: omit outer content, type and occurred_at; each entry supplies its own claim fields. | |
| session_id | Yes | ||
| occurred_at | 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 behavioral burden and does substantial work: it discloses duplicate matching ('a matched claim is acceptable'), that writes can resolve to created or matched, and that occurred_at is a source-event time that never changes internal event ordering because Slowave stamps ts itself. It does not discuss permissions, failure modes, or rate/volume limits.
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?
It is front-loaded with the purpose and invocation trigger, then args and returns, so an agent can stop reading early. It is nonetheless roughly four times a typical description and repeats the standalone-claim guidance in two places, but nearly every sentence carries operational content 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?
Given a 6-parameter schema with 17% coverage, a nested entry shape, an output schema, and no annotations, the definition still covers invocation trigger, exclusions, both scalar and batch forms, per-argument semantics, and return fields (stored, memory_id, disposition, source_event_id, batch envelopes). Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17%, so the description has to compensate, and it does: scope must match the active session, session_id must be an active session from slowave_activate, content is one standalone claim mutually exclusive with memories, memories is a strict batch inheriting outer scope/session, type is explained with the instruction/procedure distinction, and occurred_at gets an RFC 3339 example plus ordering semantics. This is meaningfully richer than the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource with scope: 'Record newly discovered knowledge worth retaining for future tasks in this scope.' It is unmistakably a write/memory-persistence tool and contrasts implicitly with recall/activate/commit by describing when to save rather than fetch. It stops short of naming a sibling as the alternative, so it is clear but not explicitly differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit invocation condition ('Proactively call this when you discover new knowledge... pursue a goal, avoid rework or a wrong assumption'), an explicit anti-pattern ('Do not wait for the user to say remember'), a positive candidate list, and a negative list ('Skip speculation, progress notes, pending steps, temporary task state'). It also states a prerequisite: the session and scope must come from slowave_activate.
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.
5 tool updates
v0.20.5- Changed
slowave_activate3 fields changed- added
Input schema / properties / initial_goal / descriptionAdded value: +"Concise action-led interpretation; helps discovery but cannot independently justify admission." - added
Input schema / properties / page_sizeAdded value: +{ + "default": 5, + "description": "Maximum memories per page (default 5); continuations inherit this bound. Procedures have a separate limit.", + "maximum": 10, + "minimum": 1, + "title": "Page Size", + "type": "integer" +} - added
Input schema / properties / task / descriptionAdded value: +"Copy the user request verbatim. Do not rewrite, translate, or substitute the inferred goal."
- Changed
slowave_commit1 field changed- added
Input schema / $defs / CommitProcedure / properties / deduplication_keyAdded value: +{ + "anyOf": [ + { + "pattern": "^[a-z][a-z0-9_.:-]{0,63}$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Deduplication Key" +}
- Changed
slowave_feedback18 fields changed- added
Input schema / $defs / MemoryFeedbackEntry / properties / assessment / descriptionAdded value: +"used requires observed influence on reasoning/action/check/constraint, not reading or topical similarity. not_used means no influence; irrelevant means task mismatch; unassessable means lost/uncertain usage evidence and requires reason. stale requires stale_reason and reason." - added
Input schema / $defs / MemoryFeedbackEntry / properties / assessment / enumAdded value: +[ + "used", + "not_used", + "unassessable", + "irrelevant", + "already_known", + "stale" +] - added
Input schema / $defs / MemoryFeedbackEntry / properties / effectAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "used: helped/no_effect/harmed; omitted means helped. Other assessments: omit or unknown.", + "enum": [ + "helped", + "no_effect", + "harmed", + "unknown", + null + ], + "title": "Effect" +} - added
Input schema / $defs / MemoryFeedbackEntry / properties / memory_id / descriptionAdded value: +"Assessed memory ID exposed by this retrieval." - added
Input schema / $defs / MemoryFeedbackEntry / properties / reason / descriptionAdded value: +"Nonblank explanation required for stale or unassessable." - added
Input schema / $defs / MemoryFeedbackEntry / properties / relevanceAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional relevance, independent of usage.", + "enum": [ + "relevant", + "irrelevant", + "uncertain", + null + ], + "title": "Relevance" +} - added
Input schema / $defs / MemoryFeedbackEntry / properties / replacement_memory_id / descriptionAdded value: +"For stale: different active memory in the retrieval scope; need not be exposed." - added
Input schema / $defs / MemoryFeedbackEntry / properties / stale_reason / descriptionAdded value: +"Only for stale. superseded also requires replacement_memory_id." - added
Input schema / $defs / MemoryFeedbackEntry / properties / stale_reason / enumAdded value: +[ + "contradicted", + "superseded", + "outdated", + "unsupported", + "withdrawn", + null +] - added
Input schema / $defs / ProcedureFeedbackEntry / properties / contribution / descriptionAdded value: +"Nonblank description of how the procedure contributed; required when used, omit when not_used." - added
Input schema / $defs / ProcedureFeedbackEntry / properties / effect / descriptionAdded value: +"Omitted means unknown. not_used permits only omitted or unknown." - added
Input schema / $defs / ProcedureFeedbackEntry / properties / effect / enumAdded value: +[ + "helped", + "no_effect", + "harmed", + "unknown", + null +] - added
Input schema / $defs / ProcedureFeedbackEntry / properties / procedure_id / descriptionAdded value: +"Procedure ID exposed by this retrieval." - added
Input schema / $defs / ProcedureFeedbackEntry / properties / use / descriptionAdded value: +"used requires nonblank contribution; not_used/unassessable forbid contribution; unassessable requires reason." - added
Input schema / $defs / ProcedureFeedbackEntry / properties / use / enumAdded value: +[ + "used", + "not_used", + "unassessable" +] - added
Input schema / examplesAdded value: +[ + { + "items": [ + { + "coverage": "complete", + "memory_feedback": [ + { + "assessment": "not_used", + "memory_id": "<returned>" + } + ], + "retrieval_id": "<returned>" + } + ] + } +] - added
Input schema / oneOfAdded value: +[ + { + "not": { + "required": [ + "items" + ] + }, + "required": [ + "retrieval_id" + ], + "title": "Scalar feedback" + }, + { + "not": { + "anyOf": [ + { + "required": [ + "retrieval_id" + ] + }, + { + "required": [ + "memory_feedback" + ] + }, + { + "required": [ + "procedure_feedback" + ] + }, + { + "required": [ + "retrieval_quality" + ] + }, + { + "required": [ + "missing" + ] + }, + { + "required": [ + "coverage" + ] + } + ] + }, + "required": [ + "items" + ], + "title": "Feedback batch" + } +] - added
Input schema / properties / items / descriptionAdded value: +"Batch mode: send items alone. Put coverage inside each item; omit every scalar feedback field."
- Changed
slowave_recall1 field changed- added
Input schema / properties / page_sizeAdded value: +{ + "anyOf": [ + { + "description": "Maximum memories per page (default 5); continuations inherit this bound. Procedures have a separate limit.", + "maximum": 10, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Page Size" +}
- Changed
slowave_remember3 fields changed- added
Input schema / examplesAdded value: +[ + { + "memories": [ + { + "content": "A standalone claim", + "type": "fact" + } + ], + "scope": "project:<repo>", + "session_id": "<active>" + } +] - added
Input schema / oneOfAdded value: +[ + { + "not": { + "required": [ + "memories" + ] + }, + "required": [ + "content", + "type" + ], + "title": "Scalar claim" + }, + { + "not": { + "anyOf": [ + { + "required": [ + "content" + ] + }, + { + "required": [ + "type" + ] + }, + { + "required": [ + "occurred_at" + ] + } + ] + }, + "required": [ + "memories" + ], + "title": "Batch claims" + } +] - added
Input schema / properties / memories / descriptionAdded value: +"Batch mode: omit outer content, type and occurred_at; each entry supplies its own claim fields."
5 tool updates
v0.20.3- First observed
slowave_activate - First observed
slowave_commit - First observed
slowave_feedback - First observed
slowave_recall - First observed
slowave_remember
TDQS
Scored across 5 tools
Each of the five tools occupies a distinct phase of an explicit cognitive cycle (open/prime, mid-task lookup, write, assess, close), and the descriptions repeatedly contrast them (e.g. activate 'once at the beginning of every task' vs recall 'deliberate mid-task lookups'). The only real overlap is that activate and recall both perform semantic retrieval, which an agent could conflate without careful reading of the lifecycle guidance.
All tools use the identical slowave_ prefix followed by a single snake_case verb (activate, recall, remember, feedback, commit). No mixed conventions, no camelCase, no redundant noun suffixes.
Five tools map cleanly onto one closed lifecycle loop, and each earns its place: retrieval is split into proactive (activate) and reactive (recall) only because the guidance distinguishes them. Nothing feels padded or vestigial.
The surface covers open, read, write, assess/correct, and close, with feedback even handling stale/superseded replacement, so core lifecycle is complete. The notable gap is explicit forgetting or deletion of memories, and browsing/listing a scope, which an agent can only approximate via stale feedback.
Maintenance
Related MCP Connectors
Persistent memory for AI agents. Search and store durable facts, preferences and decisions.
Persistent memory for AI agents. Search, store, and recall across sessions.
Universal persistent memory and knowledge retrieval layer for AI agents and LLMs.
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides persistent AI agent memory using a local vector database for long-term semantic storage and short-term session scratchpads. It enables low-latency memory operations including search, storage, and bulk management without external cloud dependencies.-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to maintain persistent, local memory with retrieval-augmented search, knowledge graphs, and context surfacing, without any cloud dependencies.103 npmMIT
- AlicenseAqualityAmaintenanceGives AI agents persistent, local-first memory using SQLite and on-device embeddings, enabling semantic search and recall across sessions with no cloud calls.89MIT
- FlicenseNot gradedqualityAmaintenanceProvides AI coding agents with a local-first persistent memory layer they can read and write during sessions, storing decisions, preferences, error patterns, and research per project or globally. Enables semantic and keyword search, formatted context recall, and cross-project guideline surfacing without API keys or cloud storage.-