MemorySync Cursor Starter
OfficialMemorySync Cursor Starter Template
Stop Cursor from forgetting your project architecture across chat restarts.
This repository is a production-ready starter template configured with MemorySync and the Model Context Protocol (MCP). It gives Cursor persistent, scoped memory across conversations, so you never have to re-explain your framework choices, database patterns, or pinned library versions.
What's Included
server.py: Runnable, zero-dependency standard MCP stdio server implementing the full Model Context Protocol (MCP 2024-11-05) for Cursor, Claude Desktop, and AI agents.Dockerfile&docker-compose.yml: Containerized deployment running the MCP server over stdio..cursor/mcp.json: Preconfigured with MemorySync remote MCP endpoints (both memory and live zero-signup docs)..cursorrules: Strict developer instructions instructing Cursor when to save decisions and how to recall them with zero context bloat.setup.sh&setup.ps1: Automated 1-click cross-platform setup scripts for macOS, Linux, and Windows.tools/inspect_memory.sh&tools/inspect_memory.ps1: Single-file, zero-dependency terminal memory inspector.examples/minimal_mcp_client.py: Minimal Python example demonstrating how to interact with MCP programmatically.
Related MCP server: ContextFS
Running the MCP Server (stdio)
Run the server directly with Python 3:
python3 server.pyOr connect it to Claude Desktop / Cursor using stdio configuration:
{
"mcpServers": {
"memorysync": {
"command": "python3",
"args": ["/path/to/memorysync-cursor-starter/server.py"],
"env": {
"MEMORYSYNC_API_KEY": "your_api_key_here"
}
}
}
}Supported MCP Tools:
memorysync_search: Semantic search over persistent long-term memories with sub-50ms latency.memorysync_add: Save a new durable memory, preference, or architectural decision.memorysync_read_docs: Query official MemorySync API, SDK, and integration documentation on demand.
60-Second Setup
1. Clone this template
git clone https://github.com/memorysyncio/memorysync-cursor-starter.git my-agent-project
cd my-agent-project2. Run Automated Setup
Option A: Local Terminal (macOS / Linux / Windows)
macOS / Linux:
chmod +x setup.sh && ./setup.shWindows (PowerShell):
powershell -ExecutionPolicy Bypass -File .\setup.ps1
Option B: Docker (Containerized Testing)
# Verify connection inside container
docker compose run --rm memorysync-starter
# Run programmatic Python client test
docker compose run --rm test3. Open in Cursor
Open this folder in Cursor IDE:
cursor .4. Verify MCP Connection
Open Cursor Settings (
Cmd + ,orCtrl + ,) > Features > MCP.You will see two active servers:
memorysync(https://mcp.memorysync.io/mcp) — For persistent memory storage & semantic search.memorysync-docs(https://docs.memorysync.io/mcp) — Instant live documentation search without sign-up.
Terminal Memory Inspector
Inspect and verify saved memories directly from your terminal without opening a browser:
# macOS / Linux
./tools/inspect_memory.sh ping
./tools/inspect_memory.sh stats -k "ms_live_..."
./tools/inspect_memory.sh query "PostgreSQL configuration" -k "ms_live_..."
# Windows PowerShell
.\tools\inspect_memory.ps1 -Command ping
.\tools\inspect_memory.ps1 -Command stats -ApiKey "ms_live_..."
.\tools\inspect_memory.ps1 -Command query -Query "PostgreSQL configuration" -ApiKey "ms_live_..."How It Works
+-------------------------------------------------------------+
| Cursor Composer |
+------------------------------+------------------------------+
| 1. Store Decision (e.g. "We use FastAPI async")
v
+-------------------------------------------------------------+
| MemorySync Remote MCP Server |
| (https://mcp.memorysync.io) |
+------------------------------+------------------------------+
| 2. Sub-50ms Hybrid Recall
v
+-------------------------------------------------------------+
| Fresh Chat Session: Automatically applies past rule |
+-------------------------------------------------------------+Zero Context Bloat: Injects ~45 tokens of exact recalled facts instead of 8,000+ tokens of raw chat history.
Multi-Project Isolation: Memories are strictly scoped by project so your backend rules never leak into your frontend.
Inspectability: Every recalled fact references a verifiable memory ID.
Documentation & Resources
Cursor Guide: https://docs.memorysync.io/guides/cursor
MCP Integration Docs: https://docs.memorysync.io/mcp/overview
Live Zero-Signup Docs MCP: https://docs.memorysync.io/mcp
Available Tools
7 toolsmemorysync_addSave a durable project memoryA
Persist one fact so it survives after this conversation ends: an architectural decision, a convention the user asked you to follow, or a constraint that will still be true next session. Call this when the user states a lasting preference or you settle a design question. Do not call it for transient chat, for content already returned by memorysync_search, or for anything a later session would be misled by. Save one discrete fact per call rather than a conversation summary.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | One self-contained fact, written so it still makes sense with no surrounding conversation. Write 'This project uses Postgres with SQLAlchemy 2.x', not 'we decided to use that one'. Pronouns and references to the current chat will not resolve in a later session. | |
| source | No | Which client or agent observed this fact, used for attribution when two memories conflict. Defaults to 'cursor' if omitted. | cursor |
| metadata | No | Optional flat key-value tags used to narrow later searches, for example {"area": "database"}. Values should be short strings. Omit rather than passing an empty object. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Identifier of the stored memory. |
| status | Yes | Result of the write, for example 'created'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false (write operation), destructiveHint=false, and idempotentHint=false. The description adds valuable context: the fact persists across sessions and must be self-contained to avoid misleading later sessions. It also emphasizes durability without contradicting any annotation. The bar is lower due to annotations, but the description adds meaningful behavioral detail beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is about 80 words and every sentence serves a purpose: it states the core function, provides trigger conditions, lists exclusions, and gives a structural guideline (one fact per call). It is front-loaded with the primary purpose and avoids fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values are defined elsewhere. The description fully specifies when to use it, what to persist, and how to structure the call. It covers all necessary operational guidance for an agent to invoke it correctly, leaving no critical information 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 coverage is 100% with thorough descriptions for all three parameters, including examples for text and metadata. The description reinforces the text parameter's requirement for self-contained facts but does not add parameter-specific semantics beyond what the schema already provides. Baseline 3 is appropriate given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Persist') and a clear resource ('one fact') that survives conversation end, with concrete examples of valid facts (architectural decision, convention, constraint). It explicitly distinguishes itself from siblings by stating not to call for content already returned by memorysync_search, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit call conditions ('Call this when the user states a lasting preference or you settle a design question') and clear exclusions ('Do not call it for transient chat, for content already returned by memorysync_search, or for anything a later session would be misled by'). It also instructs to save one discrete fact per call, fully covering when and when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memorysync_decisionsList recorded decisions and contradictionsARead-only
Return memories that record decisions, along with any that contradict each other, so a superseded choice is visible rather than silently competing with the current one. Call this before proposing an architectural change, to check whether the question was already settled and why. This surfaces conflict between stored facts; memorysync_search returns matches without telling you when two of them disagree.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Maximum decisions to return. Defaults to 10 if omitted. | |
| query | No | Optional topic filter, for example 'caching'. Omit to list recent decisions across all areas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| decisions | No | Recorded decisions, newest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context: it surfaces contradictions and intentionally makes superseded choices visible. It does not go into output details, but an output schema exists, so those details are not required here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no waste: the first states the core function, the second gives the use case, and the third differentiates from the sibling. The most important guidance is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with zero required parameters, a full output schema, and a clear choice-when condition, the description is complete. Nothing an agent needs to decide whether and when to call it 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?
Input schema description coverage is 100%: both k and query already have meaningful descriptions. The description's 'caching' example adds a minor illustration but no real semantic lift beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Return') and resource ('memories that record decisions, along with contradictions'), and clearly differentiates from memorysync_search by noting that search does not surface disagreements. An agent can distinguish this tool from its siblings immediately.
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 timing: 'Call this before proposing an architectural change, to check whether the question was already settled and why.' It also names the alternative tool and the deciding condition, making the selection rule unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memorysync_forgetDelete memories (previews by default)ADestructiveIdempotent
Permanently delete one or more memories by id. Use this when a stored fact is wrong or the user asks you to forget something - not to tidy up, because a deleted memory cannot be recovered. This previews by default: it reports what would be deleted and deletes nothing until dry_run is explicitly set to false. Confirm with the user before that second call. To find the ids to pass, use memorysync_search.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Short note recorded in the audit log explaining why these memories were removed. | |
| dry_run | No | Defaults to true, which previews the deletion without performing it. Pass false only after the user has confirmed. | |
| memory_ids | Yes | Identifiers of the memories to delete, from memorysync_search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| dry_run | Yes | Whether this call only previewed. |
| deleted_ids | No | Identifiers affected. |
| deleted_count | Yes | Number deleted, or number that would be deleted when previewing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true. The description adds critical behavioral context beyond those annotations: deletion is permanent and unrecoverable, the tool previews by default and deletes nothing until dry_run is explicitly false, and a second call is required to actually delete. It also discloses that a reason is recorded in an audit log. This is exactly the kind of behavioral disclosure that helps an agent avoid irreversible mistakes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first states the action and when to use it, the second explains the preview default and irreversibility, the third routes to the sibling for finding ids. The critical safety information (permanent, previews by default, confirm before second call) is front-loaded and prominent.
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 destructive mutation tool with an output schema and full schema coverage, the description covers everything an agent needs: what to delete, when to delete, how to find ids, the preview behavior, the confirmation requirement, and the irreversibility. The output schema handles return-value details, and annotations handle the safety profile. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining the dry_run default behavior in plain language ('previews by default... deletes nothing until dry_run is explicitly set to false') and by clarifying that memory_ids come from memorysync_search results. It also explains the purpose of the reason parameter (audit log). This goes beyond the schema's field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Permanently delete') and resource ('one or more memories by id'), and immediately distinguishes the intended use case from a sibling ('not to tidy up'). It also names the sibling to use for finding ids (memorysync_search), so an agent can tell this tool apart from the other memory tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('when a stored fact is wrong or the user asks you to forget something'), an explicit when-not-to-use ('not to tidy up'), and names the alternative for finding ids (memorysync_search). It also instructs the agent to confirm with the user before the second call with dry_run=false, which is clear operational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memorysync_getRead one memory in fullARead-only
Fetch the complete stored record for a single memory id, including its text, tags, importance and timestamps. Use this after memorysync_search when a result looks relevant but the snippet is not enough to act on, or when you need the creation date to judge whether a fact is stale. Takes an id, not a search phrase - to find a memory by topic, call memorysync_search first and pass an id from its results.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes | Identifier of the memory to read, taken from the id field of a memorysync_search result. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Identifier of the memory. |
| tags | No | Tags attached to this memory. |
| text | Yes | The stored fact in full. |
| created_at | No | When the fact was first observed, for judging staleness. |
| importance | No | Importance score used in ranking. |
| updated_at | No | When the record last changed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey readOnlyHint and openWorldHint, lowering the bar. The description adds useful behavioral context by stating it returns the complete record with specific fields, and clarifies that it does not perform search. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: first states what the tool does, second gives concrete use cases, third clarifies the id requirement and routing to the sibling. Every sentence earns its place and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with a rich schema, annotations, and an output schema, the description covers purpose, usage timing, alternative routing, and parameter semantics. Nothing essential for correct invocation 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 coverage is 100%, so the schema already documents memory_id thoroughly. The description reinforces that the id comes from memorysync_search and must not be a search phrase, which adds operational nuance but no new format or syntax details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') and names the exact resource ('complete stored record for a single memory id'), then lists the fields returned. It clearly distinguishes itself from memorysync_search by emphasizing this takes an id, not a search phrase.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: after memorysync_search when a snippet is insufficient, or when needing creation date to assess staleness. It also gives a clear exclusion, directing users to memorysync_search for topic-based lookup, and names the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memorysync_read_docsRead MemorySync product documentationARead-only
Look up MemorySync's own public documentation: REST endpoints, SDK usage, MCP configuration, and integration guides. Call this before writing MemorySync integration code, so method names and parameters come from current docs rather than recall. Returns documentation text for the requested topic. This reads MemorySync product documentation only - to retrieve facts about the user's own project, use memorysync_search instead.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Documentation topic or page slug, for example 'cursor', 'claude-code', 'langgraph', 'n8n', 'multi-tenant', or 'quickstart'. An unrecognised topic returns the closest matching page rather than an error, so check the returned url before relying on the content. Pass one topic per call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | Canonical documentation URL for the topic. |
| topic | Yes | Topic that was resolved. |
| content | Yes | Documentation text as Markdown. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and open-world, and the description adds meaningful context beyond those annotations: it limits the scope to vendor product documentation, states that documentation text is returned, and the schema adds that unrecognized topics resolve to the closest-matching page. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with the purpose and content scope front-loaded, usage timing in the middle, and sibling disambiguation at the end. Every sentence earns its place; there is no filler or redundant restating of the title.
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 one-parameter, read-only documentation lookup with an output schema and safe annotations, the definition fully covers scope, timing, return behavior, and sibling routing. Nothing an agent needs to invoke 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?
The top-level description only refers to a 'requested topic,' but the schema covers the single topic parameter 100%, including examples, slug format, closest-match behavior, and a one-topic-per-call instruction. Per the baseline rule, high schema coverage makes the description's lack of additional parameter detail sufficient.
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?
Uses a specific verb ('look up') plus a precise resource ('MemorySync's own public documentation') and enumerates the content areas covered. It also explicitly contrasts with memorysync_search, so the agent can disambiguate the two read tools without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent to call this before writing MemorySync integration code and names memorysync_search as the alternative for retrieving facts about the user's own project. This is an explicit when-and-when-not rule rather than leaving the choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memorysync_searchSearch saved project memoriesARead-only
Retrieve facts previously saved about THIS project and user: architectural decisions, naming conventions, pinned dependency versions, and stated preferences. Call this before answering questions about how the project is built, and before re-asking the user something they may have already told you. Returns ranked matches with an id and a relevance score. This searches the user's own stored memories only - to look up how MemorySync itself works, use memorysync_read_docs instead.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Maximum number of memories to return. Defaults to 5 if omitted. Ranked results degrade after the top few, so raise this only when surveying everything known about an area rather than answering one question. | |
| query | Yes | Natural language description of the fact you are looking for, for example 'which ORM does this project use' or 'deployment target'. Phrase it as the topic you need, not as a question to the user. Matching is semantic, so exact wording from the original memory is not required. An empty or single-word query returns weak matches; prefer a short phrase. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of memories returned. |
| results | Yes | Matching memories, most relevant first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint and openWorldHint already establish the operation's safety and open-world nature, lowering the burden. The description adds return-shape detail ('Returns ranked matches with an id and a relevance score') and a scope restriction ('searches the user's own stored memories only'), which are behavioral facts not present in the annotations. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a distinct job: what it retrieves, when to invoke it, and how results, scope, and alternatives behave. The most important scoping information is front-loaded, and there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety/open-world, the description supplies the remaining decision-relevant context: when to call, what scope is searched, and which sibling to use for MemorySync documentation. For a two-parameter, read-only search tool, nothing needed to invoke 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?
The input schema already covers 100% of parameters with rich descriptions—query includes examples and phrasing advice, k includes default, max/min, and degradation guidance—so the baseline of 3 applies. The tool description does not add parameter-level detail beyond the schema; its relevance mention pertains to output, not parameter semantics.
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 opens with 'Retrieve facts previously saved about THIS project and user', which specifies a precise action and resource, and enumerates concrete memory types (architectural decisions, naming conventions, pinned dependency versions). It also draws an explicit boundary against a sibling: 'to look up how MemorySync itself works, use memorysync_read_docs instead.' This fully distinguishes the tool from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives direct when-to-use guidance: 'Call this before answering questions about how the project is built, and before re-asking the user something they may have already told you.' It also defines the exclusion territory by stating 'This searches the user's own stored memories only' and routes to memorysync_read_docs for the alternative case. 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v1.0.3- Added
memorysync_decisions - Added
memorysync_forget - Added
memorysync_get - Added
memorysync_related
3 tool updates
v1.0.2- Changed
memorysync_add7 fields changed- changed
Input schema / properties / metadata / descriptionPrevious value: -"Optional key-value tags, for example {\"area\": \"database\"}, to narrow later searches."New value: +"Optional flat key-value tags used to narrow later searches, for example {\"area\": \"database\"}. Values should be short strings. Omit rather than passing an empty object." - added
Input schema / properties / metadata / examplesAdded value: +[ + { + "area": "database" + }, + { + "area": "api", + "scope": "public" + } +] - changed
Input schema / properties / source / descriptionPrevious value: -"Which client or agent observed this, used for attribution when memories conflict."New value: +"Which client or agent observed this fact, used for attribution when two memories conflict. Defaults to 'cursor' if omitted." - added
Input schema / properties / source / examplesAdded value: +[ + "cursor", + "claude-code", + "ci" +] - changed
Input schema / properties / text / descriptionPrevious value: -"One self-contained fact, written so it still makes sense with no surrounding conversation."New value: +"One self-contained fact, written so it still makes sense with no surrounding conversation. Write 'This project uses Postgres with SQLAlchemy 2.x', not 'we decided to use that one'. Pronouns and references to the current chat will not resolve in a later session." - added
Input schema / properties / text / examplesAdded value: +[ + "This project uses Postgres with SQLAlchemy 2.x", + "All API errors must return RFC 7807 problem details" +] - added
Input schema / properties / text / minLengthAdded value: +1
- Changed
memorysync_read_docs3 fields changed- changed
Input schema / properties / topic / descriptionPrevious value: -"Documentation topic or page slug, for example 'cursor', 'claude-code', 'langgraph', 'n8n', 'multi-tenant', or 'quickstart'."New value: +"Documentation topic or page slug, for example 'cursor', 'claude-code', 'langgraph', 'n8n', 'multi-tenant', or 'quickstart'. An unrecognised topic returns the closest matching page rather than an error, so check the returned url before relying on the content. Pass one topic per call." - added
Input schema / properties / topic / examplesAdded value: +[ + "cursor", + "multi-tenant", + "quickstart" +] - added
Input schema / properties / topic / minLengthAdded value: +1
- Changed
memorysync_search4 fields changed- changed
Input schema / properties / k / descriptionPrevious value: -"Maximum number of memories to return. Use a small value; ranked results degrade after the top few."New value: +"Maximum number of memories to return. Defaults to 5 if omitted. Ranked results degrade after the top few, so raise this only when surveying everything known about an area rather than answering one question." - changed
Input schema / properties / query / descriptionPrevious value: -"Natural language description of the fact you are looking for, for example 'which ORM does this project use'."New value: +"Natural language description of the fact you are looking for, for example 'which ORM does this project use' or 'deployment target'. Phrase it as the topic you need, not as a question to the user. Matching is semantic, so exact wording from the original memory is not required. An empty or single-word query returns weak matches; prefer a short phrase." - added
Input schema / properties / query / examplesAdded value: +[ + "which ORM does this project use", + "API error handling convention" +] - added
Input schema / properties / query / minLengthAdded value: +1
3 tool updates
- Changed
memorysync_add6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / metadata / additionalPropertiesAdded value: +true - changed
Input schema / properties / metadata / descriptionPrevious value: -"Optional key-value metadata dictionary."New value: +"Optional key-value tags, for example {\"area\": \"database\"}, to narrow later searches." - changed
Input schema / properties / source / descriptionPrevious value: -"Origin of the memory (default: cursor)."New value: +"Which client or agent observed this, used for attribution when memories conflict." - changed
Input schema / properties / text / descriptionPrevious value: -"The exact fact, convention, or architectural decision to persist."New value: +"One self-contained fact, written so it still makes sense with no surrounding conversation." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "id": { + "description": "Identifier of the stored memory.", + "type": "string" + }, + "status": { + "description": "Result of the write, for example 'created'.", + "type": "string" + } + }, + "required": [ + "id", + "status" + ], + "type": "object" +}
- Changed
memorysync_read_docs3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / topic / descriptionPrevious value: -"Topic to look up (e.g., 'cursor', 'mcp', 'langgraph', 'n8n', 'multitenancy')."New value: +"Documentation topic or page slug, for example 'cursor', 'claude-code', 'langgraph', 'n8n', 'multi-tenant', or 'quickstart'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "content": { + "description": "Documentation text as Markdown.", + "type": "string" + }, + "topic": { + "description": "Topic that was resolved.", + "type": "string" + }, + "url": { + "description": "Canonical documentation URL for the topic.", + "type": "string" + } + }, + "required": [ + "topic", + "content" + ], + "type": "object" +}
- Changed
memorysync_search6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / k / descriptionPrevious value: -"Maximum number of memories to return (default: 5)."New value: +"Maximum number of memories to return. Use a small value; ranked results degrade after the top few." - added
Input schema / properties / k / maximumAdded value: +50 - added
Input schema / properties / k / minimumAdded value: +1 - changed
Input schema / properties / query / descriptionPrevious value: -"Natural language query to retrieve relevant memories for."New value: +"Natural language description of the fact you are looking for, for example 'which ORM does this project use'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "count": { + "description": "Number of memories returned.", + "type": "integer" + }, + "results": { + "description": "Matching memories, most relevant first.", + "items": { + "properties": { + "created_at": { + "description": "When the memory was first observed, for judging staleness.", + "type": "string" + }, + "id": { + "description": "Stable identifier, usable with memorysync_add metadata or for later reference.", + "type": "string" + }, + "score": { + "description": "Relevance score for this query.", + "type": "number" + }, + "text": { + "description": "The stored fact.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "count", + "results" + ], + "type": "object" +}
3 tool updates
v1.0.0- First observed
memorysync_add - First observed
memorysync_read_docs - First observed
memorysync_search
TDQS
Scored across 7 tools
Each tool targets a distinct operation: id-based fetch, graph traversal, decision conflict search, deletion, addition, docs lookup, and relevance search. Descriptions explicitly contrast the overlapping retrieval tools (search vs related vs decisions), leaving no ambiguity.
All tools share the memorysync_ prefix and use snake_case, but verbs and nouns are mixed: get, add, forget, search, and read_docs are verb-led, while related and decisions are noun-led. This is a minor deviation from a fully consistent verb_noun pattern.
Seven tools is a well-scoped set for a memory server, covering creation, retrieval by id, search, related-fact traversal, decision conflict detection, deletion, and self-documentation. No tools feel redundant and none are missing from the core set.
The surface covers create, read (multiple modes), and delete, plus graph and decision-specific retrieval. The notable gap is a dedicated update tool, though the documented workflow of forget-then-add mitigates it.
Maintenance
Related MCP Connectors
Universal persistent memory and knowledge retrieval layer for AI agents and LLMs.
Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.
Hosted persistent memory with semantic search, importance and TTL for AI agents.
Universal memory for AI agents and tools. Save, organize and search context anywhere.
Related MCP Servers
- AlicenseAqualityBmaintenanceAn MCP server implementation that enables interaction with the Letta API for managing agents, memory blocks, and tools in the Letta system.36113 npm79MIT
- AlicenseNot gradedqualityCmaintenanceUniversal AI memory layer that provides cross-client, cross-repo context management with semantic search, automatic code indexing, and session management. Enables persistent developer memory across projects with typed memories, graph-based relationships, and RAG-powered retrieval.5MIT
- AlicenseNot gradedqualityAmaintenancePersistent memory layer for AI agents with entity resolution, PII detection, AES-256-GCM encryption at rest, and hybrid search. Self-hosted. 100% on LoCoMo benchmark.58 PyPI15MIT
- AlicenseNot gradedqualityAmaintenancePersistent knowledge memory layer for AI agents. Hybrid semantic + full-text search with pgvector, code dependency graph with blast-radius impact analysis, and incremental indexing for 7 languages. In-process ONNX embeddings, no external API required.24 npm35MIT