Memstate AI - Agent Memory System
OfficialMemstate AI - MCP
AI 에이전트를 위한 버전 관리 메모리. 사실 저장, 충돌 감지, 의사결정 변경 이력 추적 기능을 호스팅된 MCP 서버로 제공합니다.
왜 Memstate인가?
RAG (대부분의 다른 메모리 시스템) | Memstate AI | |
대화당 토큰 사용량 | ~7,500 | ~1,500 |
에이전트 가시성 | 블랙박스 | 완전한 투명성 |
메모리 버전 관리 | 없음 | 전체 이력 |
메모리 규모에 따른 토큰 증가 | O(n) | O(1) |
필요한 인프라 | 있음 | 없음 — 호스팅된 SaaS |
다른 메모리 시스템은 모든 것을 컨텍스트 창에 덤프하고 잘 작동하기를 바랍니다. Memstate는 에이전트에게 구조화되고 버전이 관리되는 지식 베이스를 제공하여 정밀하게 탐색할 수 있게 합니다. 필요한 것만 로드하고, 무엇이 변경되었는지, 사실이 언제 충돌하는지 파악하세요.
Related MCP server: BuildAutomata Memory MCP Server
벤치마크
우리는 에이전트 메모리에서 실제로 중요한 것, 즉 시스템이 사실을 저장하고, 세션 간에 정확하게 회상하며, 변경 사항 발생 시 충돌을 감지하고, 프로젝트가 진화함에 따라 컨텍스트를 유지할 수 있는지 테스트하는 오픈 소스 벤치마크 제품군을 구축했습니다.
1대1 비교: Memstate AI vs Mem0
두 시스템 모두 동일한 에이전트(Claude Sonnet 4.6, temperature 0), 동일한 시나리오, 동일한 채점 기준을 사용하여 동일한 조건에서 테스트되었습니다.
지표 | Memstate AI | Mem0 | 승자 |
종합 점수 | 69.1 | 15.4 | Memstate |
정확도 (사실 회상) | 74.1 | 12.6 | Memstate |
충돌 감지 | 85.5 | 19.0 | Memstate |
컨텍스트 연속성 | 63.7 | 10.1 | Memstate |
토큰 효율성 | 22.3 | 30.6 | Mem0 |
채점 가중치: 정확도 40%, 충돌 감지 25%, 컨텍스트 연속성 25%, 토큰 효율성 10%.
시나리오별 분석
벤치마크는 다중 세션 에이전트 워크플로우를 시뮬레이션하는 5가지 실제 시나리오를 실행합니다:
시나리오 | Memstate AI | Mem0 |
웹 앱 아키텍처 진화 | 43.2 | 55.6 |
인증 시스템 마이그레이션 | 66.2 | 10.2 |
데이터베이스 스키마 진화 | 72.7 | 7.0 |
API 버전 관리 충돌 | 86.5 | 0.9 |
팀 의사결정 번복 | 77.2 | 3.3 |
Mem0은 첫 번째 시나리오(단순 아키텍처 추적)에서는 승리했지만, 모순 처리, 세션 간 컨텍스트, 의사결정 번복 추적이 필요한 시나리오에서는 심각하게 고전했으며, 5개 시나리오 중 3개에서 거의 0점에 가까운 점수를 기록했습니다.
Memstate가 승리하는 이유
벤치마크는 근본적인 아키텍처 차이를 보여줍니다:
Mem0은 임베딩 기반 의미론적 검색을 사용합니다. 사실은 청크로 나뉘고, 임베딩되며, 유사성에 의해 검색됩니다. 이는 단순 조회에는 효과적이지만 다음과 같은 경우 실패합니다:
사실이 이전 사실과 모순될 때 (시스템이 현재와 과거를 구분할 수 없음)
정밀한 회상이 필요할 때 (임베딩은 정확한 결과가 아닌 "유사한" 결과를 반환함)
쓰기-읽기 지연 시간이 중요할 때 (새로운 메모리가 검색 가능해지기까지 수 초가 걸림)
Memstate는 구조화되고 버전이 관리되는 키-값 스토리지를 사용합니다. 모든 사실은 전체 버전 이력이 포함된 명시적 키 경로에 존재합니다. 이는 다음을 의미합니다:
충돌 감지가 내장됨 — 새로운 사실이 이전 사실과 모순될 때, 시스템은 이를 인지하고 두 버전을 모두 보존합니다.
회상이 결정론적임 — 근사치가 아닌 저장된 그대로의 정확한 값을 반환합니다.
세션 간 연속성이 신뢰할 수 있음 — 에이전트가 의미론적 검색이 올바른 컨텍스트를 찾아주길 바라는 대신 구조화된 트리를 탐색합니다.
토큰 비용이 O(1)로 유지됨 — 에이전트는 모든 잠재적 관련 임베딩을 컨텍스트 창에 덤프하는 대신, 요약을 먼저 로드하고 필요할 때만 세부 사항을 파고듭니다.
공정성 참고 사항
두 시스템 모두 동일한 에이전트 모델, temperature, 평가 기준을 사용했습니다.
Mem0은 비동기 임베딩 파이프라인을 고려하여 쓰기와 읽기 사이에 10초의 수집 지연 시간을 부여받았습니다.
Mem0은 토큰 효율성에서 더 높은 점수를 받았지만, 이 지표는 맥락에 맞게 읽어야 합니다. 낮은 토큰 사용량은 단순히 더 적은 정보가 반환됨을 의미할 수 있습니다. 불완전하거나 부정확한 사실을 검색하는 시스템은 응답당 토큰은 적게 사용하지만, 동일한 답변에 도달하기 위해 더 많은 후속 호출이 필요하여 결과적으로 더 많은 토큰 비용이 발생할 수 있습니다.
벤치마크 소스 코드는 완전한 재현성을 위해 이 저장소에 포함되어 있습니다.
Mem0은 사용자 지정 구성이나 다른 임베딩 모델을 사용할 경우 다르게 작동할 수 있습니다.
빠른 시작
memstate.ai/dashboard에서 API 키를 발급받은 후, MCP 클라이언트 구성에 추가하세요:
{
"mcpServers": {
"memstate": {
"command": "npx",
"args": ["-y", "@memstate/mcp"],
"env": {
"MEMSTATE_API_KEY": "YOUR_API_KEY_HERE"
}
}
}
}Docker도, 데이터베이스도, 인프라도 필요 없습니다. 60초 안에 실행됩니다.
클라이언트 설정
Claude Desktop
구성 위치:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"memstate": {
"command": "npx",
"args": ["-y", "@memstate/mcp"],
"env": { "MEMSTATE_API_KEY": "YOUR_API_KEY_HERE" }
}
}
}Claude Code
claude mcp add memstate npx @memstate/mcp -e MEMSTATE_API_KEY=YOUR_API_KEY_HERECursor
Cursor 설정 → MCP → 서버 추가 — 위와 동일한 JSON 형식.
Cline / Windsurf / Kilo Code / Roo Code
모두 동일한 stdio MCP 구성 형식을 지원합니다. 클라이언트의 MCP 설정 파일에 추가하세요.
핵심 도구
도구 | 사용 시기 |
| 마크다운, 작업 요약, 의사결정을 저장합니다. 서버가 자동으로 키 경로를 추출하고 충돌을 감지합니다. 대부분의 쓰기 작업에 사용하세요. |
| 단일 키 경로를 짧은 값으로 설정합니다 (예: |
| 프로젝트나 하위 트리의 모든 메모리를 탐색합니다. 모든 작업 시작 시 사용하세요. |
| 정확한 키 경로를 모를 때 의미론적 검색을 수행합니다. |
| 지식이 시간이 지남에 따라 어떻게 변경되었는지 확인합니다 (전체 버전 체인). |
| 키 경로를 소프트 삭제합니다. 툼스톤(tombstone)을 생성하며 전체 이력은 보존됩니다. |
| 전체 프로젝트와 모든 메모리를 소프트 삭제합니다. |
키 경로 작동 방식
메모리는 계층적 점 표기법으로 구성됩니다:
project.my_app.database.schema
project.my_app.auth.provider
project.my_app.deploy.environment키 경로는 자동으로 접두사가 붙습니다: project_id="my_app"인 상태에서 keypath="database" → project.my_app.database. 에이전트는 전체 컨텍스트 덤프 없이 필요한 정확한 정보만 파고들 수 있습니다.
작동 원리
Agent: memstate_remember(project_id="my_app", content="## Auth\nUsing SuperTokens...")
↓
Server extracts keypaths: [project.my_app.auth.provider, ...]
↓
Conflict detection: compare against existing memories at those keypaths
↓
New version stored — old version preserved in history chain
↓
Next session: memstate_get(project_id="my_app") → structured summaries only
↓
Agent drills into project.my_app.auth only when it needs auth details토큰 비용은 총 메모리 개수와 관계없이 일정하게 유지됩니다.
에이전트 지침에 추가
AGENTS.md 또는 시스템 프롬프트에 복사하세요:
## Memory (Memstate MCP)
### Before each task
- memstate_get(project_id="my_project") — browse existing knowledge
- memstate_search(query="topic", project_id="my_project") — find by meaning
### After each task
- memstate_remember(project_id="my_project", content="## Summary\n- ...", source="agent")
### Tool guide
- memstate_remember — markdown summaries, decisions, task results (preferred)
- memstate_set — single short values only (config flags, status)
- memstate_get — browse/retrieve before tasks
- memstate_search — semantic lookup when keypath unknown
- memstate_history — audit how knowledge evolved
- memstate_delete — remove outdated memories (history preserved)환경 변수
변수 | 기본값 | 설명 |
| (필수) | memstate.ai/dashboard에서 발급받은 API 키 |
|
| 자체 호스팅 배포를 위한 재정의 |
연결 확인
MEMSTATE_API_KEY=your_key npx @memstate/mcp --test사용 가능한 모든 도구를 출력하고 API 키가 작동하는지 확인합니다.
자신이 무엇을 알고 있는지 알 자격이 있는 AI 에이전트를 위해 구축되었습니다.
Available Tools
7 toolsmemstate_deleteA
Soft-delete a memory by keypath. Creates a tombstone version preserving full history. The memory can be un-deleted by setting a new value at the same keypath.
USE THIS WHEN: You need to remove outdated or incorrect memories, clean up a keypath subtree, or mark memories as no longer relevant. NOT FOR: Updating content (use memstate_set or memstate_remember to overwrite with new content instead).
memstate_delete(project_id="myapp", keypath="config.old_setting") memstate_delete(project_id="myapp", keypath="config", recursive=true) → deletes config and all children
History is preserved. Use memstate_history to see the deletion in the version chain. Keypath is auto-prefixed.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Required. Project containing the memory. | |
| keypath | Yes | Required. Keypath to delete (auto-prefixed with 'project.{project_id}.'). | |
| recursive | No | If true, delete the entire keypath subtree. Default: false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes key behavioral traits: soft-deletion (not permanent), tombstone creation, history preservation, undeletion capability, and auto-prefixing behavior. It also references memstate_history for viewing deletions. The only minor gap is lack of explicit mention about permissions or error conditions.
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 well-structured with clear sections, uses bold headings for emphasis, includes practical examples, and every sentence adds value. It's appropriately sized for a tool with important behavioral nuances and sibling distinctions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (soft-deletion with history preservation), the description provides comprehensive context. With no annotations but an output schema present, it covers behavioral aspects thoroughly while appropriately deferring return value details to the output schema. It addresses key sibling relationships and usage scenarios.
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 some value by providing concrete examples with project_id='myapp' and showing recursive behavior, but doesn't significantly enhance the parameter understanding beyond what the schema already documents clearly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('soft-delete a memory by keypath') and distinguishes it from siblings by explaining it creates tombstone versions and preserves history. It explicitly contrasts with memstate_set and memstate_remember for updating content.
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 includes explicit 'USE THIS WHEN' and 'NOT FOR' sections that provide clear guidance on when to use this tool versus alternatives. It mentions specific scenarios (removing outdated memories, cleaning up subtrees) and names alternative tools for different use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memstate_delete_projectA
Soft-delete an entire project and all its memories. Creates tombstone versions for every memory, preserving full history. The project is hidden from listings but can be restored by creating a new project with the same ID.
USE THIS WHEN: You want to remove all memories for a project, e.g. cleaning up test data or decommissioning a project.
memstate_delete_project(project_id="old-project")
All memories get individual tombstone versions. History is preserved via memstate_history.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Required. Project ID to soft-delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well. It discloses key behavioral traits: it's a soft-delete (not permanent), creates tombstone versions for all memories, preserves history, hides the project from listings, and can be restored by creating a new project with the same ID. It doesn't mention rate limits or auth needs, but covers the essential destructive nature and recovery mechanism adequately.
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 appropriately sized and front-loaded with the core action. The 'USE THIS WHEN' section is helpful but slightly repetitive of the purpose. The example usage is concise and adds clarity. Minor improvements could tighten it, but overall it's efficient with minimal waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (destructive operation with recovery), no annotations, and an output schema (which handles return values), the description is complete. It covers purpose, usage, behavior, and parameters adequately, providing all necessary context for an agent to invoke it correctly without over-explaining.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so the baseline is 3. The description adds value by providing an example usage (memstate_delete_project(project_id='old-project')) which clarifies the parameter's role in context, though it doesn't add deep semantic details beyond what the schema already states ('Required. Project ID to soft-delete.').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('soft-delete an entire project and all its memories') and distinguishes it from siblings like memstate_delete (which likely deletes individual memories) by specifying it affects the entire project. It explains the outcome (creates tombstone versions, preserves history, hides from listings) which clarifies the scope beyond just the name.
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 includes an explicit 'USE THIS WHEN' section that provides clear guidance: 'You want to remove all memories for a project, e.g. cleaning up test data or decommissioning a project.' This directly tells the agent when to use this tool versus alternatives, with practical examples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memstate_getA
Browse and retrieve memories. Use BEFORE starting tasks to fetch existing knowledge.
USE THIS WHEN: You need to read what's already stored — list projects, browse a project tree, or get content at a keypath. NOT FOR: Saving new content (use memstate_remember for markdown/summaries, memstate_set for one keypath value).
memstate_get() → list all projects memstate_get(project_id="myapp") → full project tree memstate_get(project_id="myapp", keypath="database") → subtree memstate_get(project_id="myapp", keypath="db", include_content=true) → with full content memstate_get(memory_id="mem_abc123") → single memory by ID
Keypath is auto-prefixed. Default recursive=true.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | Project to retrieve from. If omitted, lists all projects. | |
| keypath | No | Subkeypath within project. If omitted with project_id, returns the full project tree. | |
| memory_id | No | Alternative: get a single memory by its UUID | |
| recursive | No | Include subtree (default: true) | |
| include_content | No | If true, include full memory content in response (not just keypaths) | |
| at_revision | No | Optional revision number for time-travel queries | |
| content_limit | No | Max memories to hydrate when include_content=true (default: 200, max: 1000) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and adds valuable behavioral context. It explains that 'Keypath is auto-prefixed' and 'Default recursive=true', which are important behavioral traits not evident from the schema alone. It also provides example usage patterns showing different parameter combinations and their effects.
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 well-structured with clear sections, bullet points for examples, and zero wasted text. Every sentence serves a purpose: establishing context, providing usage guidelines, showing examples, and noting important defaults. It's appropriately sized for a tool with 7 parameters and complex usage patterns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, multiple usage patterns) and the presence of an output schema, the description is complete. It covers purpose, guidelines, behavioral traits, and provides concrete examples. The output schema existence means the description doesn't need to explain return values, and it adequately addresses the tool's scope and limitations.
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 some value through the usage examples that show how parameters combine (e.g., project_id alone vs. with keypath, include_content=true), but doesn't provide significant additional semantic meaning beyond what's already documented in the schema 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 clearly states the tool's purpose: 'Browse and retrieve memories' with specific verbs and resources. It distinguishes from siblings by explicitly contrasting with memstate_remember (for saving markdown/summaries) and memstate_set (for one keypath value), making the distinction clear.
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 provides explicit guidance: 'Use BEFORE starting tasks to fetch existing knowledge' and includes dedicated 'USE THIS WHEN:' and 'NOT FOR:' sections. It names specific alternatives (memstate_remember, memstate_set) and gives concrete scenarios for when to use this tool (list projects, browse project tree, get content at keypath).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memstate_historyA
View version history for a keypath or memory chain. Use when you need to see how a value changed over time.
USE THIS WHEN: Debugging past state, auditing changes, or recovering a previous value. NOT FOR: Reading current content (use memstate_get) or saving (use memstate_remember or memstate_set).
memstate_history(project_id="myapp", keypath="config.database.port") memstate_history(memory_id="mem_abc123")
Returns all versions with timestamps; latest is marked is_latest=true.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | Required with keypath | |
| keypath | No | Get history for this keypath | |
| memory_id | No | Or get history for a specific memory chain by ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes the tool's behavior: it returns 'all versions with timestamps' and marks the latest with 'is_latest=true.' However, it lacks details on potential limitations like rate limits, pagination, or error conditions, which would be helpful for a read operation with historical data.
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 well-structured and front-loaded: it starts with the core purpose, followed by usage guidelines, examples, and return details. Every sentence adds value—no waste. The use of bold headers and code examples improves readability without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 parameters, no annotations, but with an output schema), the description is complete enough. It covers purpose, usage, parameters, and return values. Since an output schema exists, the description doesn't need to explain return values in detail, and it adequately addresses the context provided by sibling tools and schema coverage.
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 has 100% description coverage, so the baseline is 3. The description adds value by clarifying parameter semantics: it explains that 'project_id' is 'Required with keypath' (though this is also in the schema) and provides example usage with both 'keypath' and 'memory_id', showing how they are used alternatively. This enhances understanding beyond the schema's basic 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 clearly states the tool's purpose: 'View version history for a keypath or memory chain.' It specifies the verb ('view') and resource ('version history'), and distinguishes it from siblings by explicitly naming alternatives (memstate_get for current content, memstate_remember/memstate_set for saving). This is specific and avoids tautology.
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 provides explicit usage guidelines with dedicated sections: 'USE THIS WHEN:' lists debugging, auditing, and recovery scenarios, and 'NOT FOR:' explicitly names when not to use it (reading current content or saving) and specifies alternative tools (memstate_get, memstate_remember, memstate_set). This gives clear context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memstate_rememberA
Save markdown, task summaries, or any text. Server extracts keypaths and creates structured memories automatically. This is the PREFERRED way to save information.
USE THIS WHEN: Saving task summaries, meeting notes, docs, or any text with multiple facts. The server handles organization, conflict detection, and versioning. NOT FOR: Setting one specific keypath to a short value (e.g. config.port = "8080") — use memstate_set for that.
memstate_remember(project_id="myapp", content="## Task Summary\n- Added OAuth\n- Files: auth.go, middleware.go", source="agent") memstate_remember(project_id="myapp", content="Architecture decision: migrated to JWT tokens for session management")
Content limit: 100,000 chars. Processing is async (~15-18s); returns job_id immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Required. Project to store in (e.g. 'myapp'). Auto-creates if new. | |
| content | Yes | Markdown or text to remember (max 100,000 chars). Server extracts keypaths and creates structured memories automatically. | |
| source | No | Source type: agent, readme, docs, meeting, code | |
| context | No | Optional hint to guide keypath extraction |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and does well by disclosing key behavioral traits: content limit (100,000 chars), async processing with timing (~15-18s), immediate job_id return, automatic project creation, and server-side organization/conflict detection/versioning. It doesn't mention error conditions or retry behavior, keeping it from a perfect score.
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 efficiently structured with clear sections, front-loaded key information, and every sentence adds value. It uses bold headings for guidance, includes practical examples, and provides critical constraints without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (async processing, automatic extraction), 100% schema coverage, and presence of an output schema, the description provides excellent context. It covers purpose, usage guidelines, behavioral traits, constraints, and examples, making it complete enough for an agent to understand when and how to use this tool effectively.
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 minimal parameter semantics beyond the schema: it reinforces content limits and provides example values in the code snippets, but doesn't significantly enhance understanding of parameters beyond what the schema already documents well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Save markdown, task summaries, or any text' with server-side extraction of keypaths and structured memory creation. It explicitly distinguishes from sibling tools by stating this is the 'PREFERRED way to save information' and contrasting with memstate_set for specific keypath assignments.
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 provides explicit guidance with dedicated 'USE THIS WHEN:' and 'NOT FOR:' sections, listing specific use cases (task summaries, meeting notes, docs) and clear exclusions (setting one specific keypath to short values). It names the alternative tool (memstate_set) for excluded scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memstate_searchA
Find memories by meaning (semantic search). Use BEFORE starting tasks when you don't know the exact keypath.
USE THIS WHEN: You want to find relevant memories by topic or meaning, not by exact keypath. NOT FOR: Saving content (use memstate_remember for markdown/summaries, memstate_set for one keypath value).
memstate_search(query="how is authentication configured", project_id="myapp") memstate_search(query="database connection settings", project_id="myapp")
Returns summaries with similarity scores. Use memstate_get(memory_id="...") to fetch full content of a result.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural language search query. Leave empty to explore/list all memories ordered by keypath. | |
| project_id | No | Filter by project | |
| limit | No | Maximum results (default: 20, max: 100) | |
| categories | No | Filter by categories | |
| keypath_prefix | No | Filter by keypath prefix | |
| include_superseded | No | Include old versions |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes key behaviors: it's a search tool (implied read-only), returns summaries with similarity scores, and requires memstate_get to fetch full content. However, it doesn't mention potential limitations like rate limits or authentication needs, which could be relevant for a search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose. Every sentence adds value: the initial statement, usage guidelines, examples, and instructions for fetching full content. It uses bold formatting effectively without being verbose, and there's no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (semantic search with 6 parameters), no annotations, but with a rich input schema (100% coverage) and output schema (confirmed present), the description is mostly complete. It explains the tool's purpose, usage, and result handling well. The main gap is lack of explicit behavioral details like error conditions or performance characteristics, but the output schema likely covers return values.
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 schema already documents all 6 parameters thoroughly. The description adds minimal parameter semantics beyond the schema—it only mentions 'query' and 'project_id' in examples. This meets the baseline of 3 for high schema coverage, but doesn't provide additional meaningful context about parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Find memories by meaning (semantic search).' It specifies the verb ('Find'), resource ('memories'), and method ('semantic search'), and distinguishes it from siblings by contrasting with exact keypath searches. The title being null doesn't detract from this clarity.
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 provides explicit guidance with 'USE THIS WHEN:' and 'NOT FOR:' sections, clearly stating when to use this tool (for semantic search when exact keypath is unknown) and when to use alternatives (memstate_remember for saving content, memstate_set for one keypath value). It also mentions using it 'BEFORE starting tasks' for context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memstate_setA
Set one keypath to a short value. Only for simple key=value facts like config, status, or version numbers.
USE THIS WHEN: You need to store ONE specific value at a known keypath (e.g. a port number, a status flag, a version string). NOT FOR: Task summaries, markdown, or text with multiple facts — use memstate_remember instead.
memstate_set(project_id="myapp", keypath="config.database.port", value="5432") memstate_set(project_id="myapp", keypath="status.deployment", value="production") memstate_set(project_id="myapp", keypath="version.current", value="2.1.0")
Value limit: 2,000 chars. If longer, use memstate_remember instead. Keypath is auto-prefixed.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Required. Project to store in (e.g. 'myapp'). Auto-creates if new. | |
| keypath | Yes | Required. Hierarchical path like 'config.port' or 'status'. Auto-prefixed with 'project.{project_id}.' | |
| value | Yes | The value to store (max 2,000 chars). Short, simple values only — not markdown. | |
| category | No | Category: decision, preference, fact, task, context, requirement, note, code, learning | |
| topics | No | Optional additional topics/tags |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and delivers well. It discloses key behavioral traits: value limit (2,000 chars), auto-prefixing of keypath, and that it's for storage/mutation (implied by 'set'). It doesn't mention error conditions, permissions, or rate limits, but provides substantial operational context beyond basic function.
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 perfectly structured and concise. It opens with the core purpose, provides clear usage guidelines in dedicated sections, includes practical examples, and adds important constraints. Every sentence earns its place with no wasted words, and information is front-loaded appropriately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (storage operation with 5 parameters), 100% schema coverage, and presence of an output schema, the description is complete. It covers purpose, usage guidelines, constraints, and provides examples. The output schema means return values don't need explanation in the description.
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 minimal parameter semantics beyond the schema: it reinforces that value should be 'short, simple values only' and provides concrete examples of keypath usage. However, it doesn't explain the optional 'category' parameter's purpose or provide guidance on when to use topics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Set one keypath to a short value' with specific examples of what to store (config, status, version numbers). It explicitly distinguishes from sibling memstate_remember by stating 'Only for simple key=value facts' and 'NOT FOR: Task summaries, markdown, or text with multiple facts.'
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 provides explicit usage guidance with dedicated sections: 'USE THIS WHEN:' for appropriate scenarios (storing one specific value at known keypath) and 'NOT FOR:' for exclusions (task summaries, markdown, multi-fact text). It names the alternative tool (memstate_remember) and includes a value length threshold (2,000 chars) for when to switch tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.0.2- Changed
memstate_search1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Natural language search query"New value: +"Natural language search query. Leave empty to explore/list all memories ordered by keypath."
7 tool updates
v1.0.1- First observed
memstate_delete - First observed
memstate_delete_project - First observed
memstate_get - First observed
memstate_history - First observed
memstate_remember - First observed
memstate_search - First observed
memstate_set
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose with minimal overlap. The descriptions explicitly differentiate tools (e.g., memstate_remember vs. memstate_set, memstate_get vs. memstate_search) and include 'USE THIS WHEN' and 'NOT FOR' sections that prevent confusion. The tools cover different aspects of memory management without redundancy.
All tools follow a consistent 'memstate_verb' naming pattern (e.g., memstate_delete, memstate_get, memstate_search). This uniformity makes it easy to identify the server's tools and their functions at a glance, with no deviations in style or structure across the set.
With 7 tools, the server is well-scoped for an agent memory system. Each tool serves a specific, necessary function (e.g., create, read, update, delete, search, history, project management), and there are no extraneous tools. The count aligns with the domain's complexity without being overwhelming or insufficient.
The tool set provides comprehensive coverage for memory management, including CRUD operations (memstate_remember/set for create/update, memstate_get for read, memstate_delete for delete), search (memstate_search), version history (memstate_history), and project-level management (memstate_delete_project). There are no obvious gaps; agents can handle full memory lifecycles and workflows effectively.
Maintenance
Related MCP Connectors
Persistent memory for AI agents. EU-hosted, privacy-first, hybrid recall, contradiction detection.
Hosted persistent memory with semantic search, importance and TTL for AI agents.
Persistent knowledge graph for AI-augmented teams. Store decisions, findings, and standing rules across agent sessions with semantic search and typed connections. Includes cross-session memory, audit trail, workspace isolation, and secret detection. Built for teams running agents that need to remember. Free until launch with team tier as default, anon trial available.
Patent-pending semantic memory for AI agents: quality-gated writes, conflict tracking. Free trial.
Related MCP Servers
AlicenseAqualityFmaintenanceAn MCP server that integrates with mem0.ai to help users store, retrieve, and search coding preferences for more consistent programming practices.9662Apache 2.0- FlicenseNot gradedqualityDmaintenanceProvides AI agents with persistent, searchable memory that survives across conversations using semantic search, temporal versioning, and smart organization. Enables long-term context retention and cross-session continuity for AI assistants.14-
- FlicenseNot gradedqualityNot gradedmaintenanceEnables ChatGPT Desktop to save and manage conversation memories locally in SQLite, providing memory search, summarization, and markdown export capabilities to replace the built-in memory feature when in developer mode.-
- AlicenseNot gradedqualityCmaintenanceA local, persistent memory system for AI coding assistants that stores decisions, patterns, and session context via MCP tools. It enables cross-session memory management using SQLite and optional vector search without external dependencies or cloud storage.36 npm3MIT