mcp-knowledge-graph
The mcp-knowledge-graph server functions as a persistent memory system for AI models by managing a local knowledge graph with customizable memory paths. You can:
Create entities: Add nodes to the graph with unique names, types, and observations
Create relations: Define directed connections between entities using active voice descriptions
Add observations: Attach atomic facts to existing entities
Delete entities: Remove nodes and their associated relations
Delete observations: Remove specific information from entities
Delete relations: Remove connections between entities
Read the graph: Retrieve the complete knowledge graph structure
Search nodes: Find entities based on names, types, or observation content
Open nodes: Retrieve specific entities by name
Click on "Install 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., "@mcp-knowledge-graphremember that I prefer dark mode in all my apps"
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.
MCP Knowledge Graph
Persistent memory for AI models through a local knowledge graph.
Store and retrieve information across conversations using entities, relations, and observations. Works with Claude Code/Desktop and any MCP-compatible AI platform.
Why ".aim" and "aim_" prefixes?
AIM stands for AI Memory - the core concept of this system. The three AIM elements provide clear organization and safety:
.aimdirectories: Keep AI memory files organized and easily identifiableaim_tool prefixes: Group related memory functions together in multi-tool setups_aimsafety markers: Each memory file starts with{"type":"_aim","source":"mcp-knowledge-graph"}to prevent accidental overwrites of unrelated JSONL files
This consistent AIM naming makes it obvious which directories, tools, and files belong to the AI memory system.
Related MCP server: Knowledge Graph Memory Server
CRITICAL: Understanding .aim dir vs _aim file marker
Two different things with similar names:
.aim= Project-local directory name (MUST be named exactly.aimfor project detection to work)_aim= File safety marker (appears inside JSONL files:{"type":"_aim","source":"mcp-knowledge-graph"})
For project-local storage:
Directory MUST be named
.aimin your project rootExample:
my-project/.aim/memory.jsonlThe system specifically looks for this exact name
For global storage (--memory-path):
Can be ANY directory you want
Examples:
~/yourusername/.aim/,~/memories/,~/Dropbox/ai-memory/,~/Documents/ai-data/Complete flexibility - choose whatever location works for you
Storage Logic
File Location Priority:
Project with
.aim- Uses.aim/memory.jsonl(project-local)No project/no .aim - Uses configured global directory
Contexts - Adds suffix:
memory-work.jsonl,memory-personal.jsonl
Safety System:
Every memory file starts with
{"type":"_aim","source":"mcp-knowledge-graph"}System refuses to write to files without this marker
Prevents accidental overwrite of unrelated JSONL files
Master Database Concept
The master database is your primary memory store - used by default when no specific database is requested. It's always named default in listings and stored as memory.jsonl.
Default Behavior: All memory operations use the master database unless you specify a different one
Always Available: Exists in both project-local and global locations
Primary Storage: Your main knowledge graph that persists across all conversations
Named Databases: Optional additional databases (
work,personal,health) for organizing specific topics
Key Features
Master Database: Primary memory store used by default for all operations
Multiple Databases: Optional named databases for organizing memories by topic
Project Detection: Automatic project-local memory using
.aimdirectoriesLocation Override: Force operations to use project or global storage
Safe Operations: Built-in protection against overwriting unrelated files
Database Discovery: List all available databases in both locations
Quick Start
Global Memory (Recommended)
Add to your claude_desktop_config.json or .claude.json. Two common approaches:
Option 1: Default .aim directory (simple)
{
"mcpServers": {
"Aim-Memory-Bank": {
"command": "npx",
"args": [
"-y",
"mcp-knowledge-graph",
"--memory-path",
"/Users/yourusername/.aim"
]
}
}
}Option 2: Dropbox/cloud sync (portable)
For accessing memories across multiple machines, use a synced folder. This is how the author of this MCP server keeps his own memories:
{
"mcpServers": {
"Aim-Memory-Bank": {
"command": "npx",
"args": [
"-y",
"mcp-knowledge-graph",
"--memory-path",
"/Users/yourusername/Dropbox/ai-memory"
]
}
}
}This creates memory files in your specified directory:
memory.jsonl- Master Database (default for all operations)memory-work.jsonl- Work databasememory-personal.jsonl- Personal databaseetc.
Project-Local Memory
In any project, create a .aim directory:
mkdir .aimNow memory tools automatically use .aim/memory.jsonl (project-local master database) instead of global storage when run from this project.
How AI Uses Databases
Once configured, AI models use the master database by default or can specify named databases with a context parameter. New databases are created automatically - no setup required:
// Master Database (default - no context needed)
aim_memory_store({
entities: [{
name: "John_Doe",
entityType: "person",
observations: ["Met at conference"]
}]
})
// Work database
aim_memory_store({
context: "work",
entities: [{
name: "Q4_Project",
entityType: "project",
observations: ["Due December 2024"]
}]
})
// Personal database
aim_memory_store({
context: "personal",
entities: [{
name: "Mom",
entityType: "person",
observations: ["Birthday March 15th"]
}]
})
// Master database in specific location
aim_memory_store({
location: "global",
entities: [{
name: "Important_Info",
entityType: "reference",
observations: ["Stored in global master database"]
}]
})File Organization
Global Setup:
/Users/yourusername/.aim/
├── memory.jsonl # Master Database (default)
├── memory-work.jsonl # Work database
├── memory-personal.jsonl # Personal database
└── memory-health.jsonl # Health databaseProject Setup:
my-project/
├── .aim/
│ ├── memory.jsonl # Project Master Database (default)
│ └── memory-work.jsonl # Project Work database
└── src/Available Tools
aim_memory_store- Store new memories (people, projects, concepts)aim_memory_add_facts- Add facts to existing memoriesaim_memory_link- Link two memories togetheraim_memory_search- Search memories by keywordaim_memory_get- Retrieve specific memories by exact nameaim_memory_read_all- Read all memories in a databaseaim_memory_list_stores- List available databasesaim_memory_forget- Forget memoriesaim_memory_remove_facts- Remove specific facts from a memoryaim_memory_unlink- Remove links between memories
Parameters
context(optional) - Specify named database (work,personal, etc.). Defaults to master databaselocation(optional) - Forceprojectorglobalstorage location. Defaults to auto-detection
Database Discovery
Use aim_memory_list_stores to see all available databases:
{
"project_databases": [
"default", // Master Database (project-local)
"project-work" // Named database
],
"global_databases": [
"default", // Master Database (global)
"work",
"personal",
"health"
],
"current_location": "project (.aim directory detected)"
}Key Points:
"default" = Master Database in both locations
Current location shows whether you're using project or global storage
Master database exists everywhere - it's your primary memory store
Named databases are optional additions for specific topics
Configuration Examples
Important: Always specify --memory-path to control where your memory files are stored.
Auto-approve read operations (recommended):
{
"mcpServers": {
"Aim-Memory-Bank": {
"command": "npx",
"args": [
"-y",
"mcp-knowledge-graph",
"--memory-path",
"/Users/yourusername/.aim"
],
"autoapprove": [
"aim_memory_search",
"aim_memory_get",
"aim_memory_read_all",
"aim_memory_list_stores"
]
}
}
}Troubleshooting
"File does not contain required _aim safety marker" error:
The file may not belong to this system
Manual JSONL files need
{"type":"_aim","source":"mcp-knowledge-graph"}as first lineIf you created the file manually, add the
_aimmarker or delete and let the system recreate it
Memories going to unexpected locations:
Check if you're in a project directory with
.aimfolder (uses project-local storage)Otherwise uses the configured global
--memory-pathdirectoryUse
aim_memory_list_storesto see all available databases and current locationUse
ls .aim/orls /Users/yourusername/.aim/to see your memory files
Too many similar databases:
AI models try to use consistent names, but may create variations
Manually delete unwanted database files if needed
Encourage AI to use simple, consistent database names
Remember: Master database is always available as the default - named databases are optional
Requirements
Node.js 22+
MCP-compatible AI platform
License
MIT
Available Tools
10 toolsaim_memory_add_factsA
Add new facts to an existing memory. Use this to append information to something already stored.
IMPORTANT: Memory must already exist - use aim_memory_store first. Throws error if not found.
RETURNS: Array of {entityName, addedObservations} showing what was added (duplicates are ignored).
DATABASE: Adds to entities in the specified 'context' database, or master database if not specified.
EXAMPLES:
aim_memory_add_facts({observations: [{entityName: "John", contents: ["Lives in Seattle", "Works in tech"]}]})
aim_memory_add_facts({context: "work", observations: [{entityName: "Q4_Project", contents: ["Behind schedule", "Need more resources"]}]})
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional memory context. Observations will be added to entities in the specified context's knowledge graph. | |
| location | No | Optional storage location override. 'project' forces project-local .aim directory, 'global' forces global directory. If not specified, uses automatic detection. | |
| observations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description discloses key behaviors: duplicates are ignored, returns an array of {entityName, addedObservations}, and database context (adds to specified or master database). No contradictions.
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?
Description is concise with a clear structure: purpose, important note, return value, database context, and examples. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately explains return format and behavior. It covers error handling, database context, and duplicate handling. Sufficient for correct invocation.
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 67% with descriptions, but the description adds value by explaining the return format for observations and providing examples that clarify parameter usage. The baseline is 3 due to schema coverage, but examples elevate it to 4.
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 adds new facts to an existing memory, distinguishing it from sibling tools like aim_memory_store (creates new memory) and aim_memory_remove_facts (removes facts). The verb 'add' and resource 'facts' are specific.
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 states that memory must already exist and to use aim_memory_store first, plus that it throws an error if not found. Provides clear when-to-use and preconditions. Examples further guide usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aim_memory_forgetA
Forget memories. Removes memories and their associated links.
DATABASE SELECTION: Entities are deleted from the specified database's knowledge graph.
LOCATION OVERRIDE: Use the 'location' parameter to force deletion from 'project' (.aim directory) or 'global' (configured directory). Leave blank for auto-detection.
EXAMPLES:
Master database (default): aim_memory_forget({entityNames: ["OldProject"]})
Work database: aim_memory_forget({context: "work", entityNames: ["CompletedTask", "CancelledMeeting"]})
Master database in global location: aim_memory_forget({location: "global", entityNames: ["OldProject"]})
Personal database in project location: aim_memory_forget({context: "personal", location: "project", entityNames: ["ExpiredReminder"]})
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional memory context. Entities will be deleted from the specified context's knowledge graph. | |
| location | No | Optional storage location override. 'project' forces project-local .aim directory, 'global' forces global directory. If not specified, uses automatic detection. | |
| entityNames | Yes | An array of entity names to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must cover behavioral traits. It explains that entities are deleted from the knowledge graph and that associated links are also removed. It discusses location override and auto-detection. However, it does not mention irreversibility or return status, which would enhance transparency.
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 for database selection and location override, and includes four examples. While it is a bit lengthy, the information is organized and front-loaded, making it easy to parse.
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 description covers the operation and parameter details thoroughly but lacks information about the return value or what happens after deletion (e.g., success/failure reporting). Given no output schema, additional context on the outcome would improve completeness for an agent.
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?
All three parameters are described in the schema, and the description adds significant value: context usage is clarified (optional, for specific contexts), location parameter includes explanation of enum values and override behavior, and entityNames is shown in examples with appropriate syntax. The description goes beyond schema definitions.
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 'forget' and resource 'memories', clearly indicating deletion. It differentiates from siblings like aim_memory_store, aim_memory_get, and aim_memory_remove_facts by specifying that it removes both memories and their associated links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool with database selection methods (context, location override) and provides multiple examples covering different scenarios (default, work database, global location, etc.). It does not explicitly mention when not to use, but the context and examples sufficiently guide usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aim_memory_getA
Retrieve specific memories by exact name. Use this when you know exactly what you're looking for.
VS aim_memory_search: Use aim_memory_get for exact name lookup. Use aim_memory_search for fuzzy matching or when you don't know exact names.
RETURNS: Requested entities and relations between them. Non-existent names are silently ignored.
FORMAT OPTIONS:
"json" (default): Structured JSON for programmatic use
"pretty": Human-readable text format
EXAMPLES:
aim_memory_get({names: ["John", "TechConf2024"]}) - JSON format
aim_memory_get({names: ["Shane"], format: "pretty"}) - Human-readable
aim_memory_get({context: "work", names: ["Q4_Project"], format: "pretty"})
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional memory context. Retrieves entities from the specified context's knowledge graph or master database if not specified. | |
| location | No | Optional storage location override. 'project' for .aim directory, 'global' for configured directory. | |
| names | Yes | An array of entity names to retrieve | |
| format | No | Output format. 'json' (default) for structured data, 'pretty' for human-readable text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries burden. Discloses silent ignoring of missing names and format options. For a read-only tool, this is sufficient, though could mention safety or auth.
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-structured with clear sections, examples, and sibling differentiation. No wasted words.
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?
Covers all parameters, format, examples, sibling comparison, and return values (entities and relations). Complete for a retrieval tool with no output 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 coverage is 100%. Description adds value with examples and explanation of format options and context parameter, going beyond 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?
Clearly states it retrieves specific memories by exact name. Distinguishes from sibling aim_memory_search by specifying exact vs fuzzy matching.
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 says when to use (exact name known) and when not (use aim_memory_search for fuzzy). Also notes non-existent names are silently ignored.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aim_memory_linkA
Link two memories together with a relationship. Use this to connect related information.
RELATION STRUCTURE: Each link has 'from' (subject), 'relationType' (verb), and 'to' (object).
Use active voice verbs: "manages", "works_at", "knows", "attended", "created"
Read as: "from relationType to" (e.g., "Alice manages Q4_Project")
Avoid passive: use "manages" not "is_managed_by"
IMPORTANT: Both 'from' and 'to' entities must already exist in the same database.
RETURNS: Array of created relations (duplicates are ignored).
DATABASE: Relations are created in the specified 'context' database, or master database if not specified.
EXAMPLES:
aim_memory_link({relations: [{from: "John", to: "TechConf2024", relationType: "attended"}]})
aim_memory_link({context: "work", relations: [{from: "Alice", to: "Q4_Project", relationType: "manages"}]})
Multiple: aim_memory_link({relations: [{from: "John", to: "Alice", relationType: "knows"}, {from: "John", to: "Acme_Corp", relationType: "works_at"}]})
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional memory context. Relations will be created in the specified context's knowledge graph. | |
| location | No | Optional storage location override. 'project' forces project-local .aim directory, 'global' forces global directory. If not specified, uses automatic detection. | |
| relations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It discloses key behaviors: duplicates are ignored, returns an array of created relations, requires existing entities, and uses active voice. It does not cover error handling or side effects, but the described behaviors are sufficient for safe invocation.
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-organized with clear sections: purpose, relation structure, important note, returns, database info, and examples. Every sentence adds value, though it is slightly verbose in places. It is front-loaded with key 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?
Given no output schema and moderate complexity, the description covers preconditions (entities must exist), return type (array of relations), and includes multiple examples. It does not explicitly tie into sibling tools, but it is complete enough for an agent to use correctly. Minor omissions like error behavior on missing entities are acceptable given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, placing the burden on the description to add meaning. The description enhances parameter semantics by providing example values for relationType, explaining the relation structure (from-relationType-to), and recommending active voice. This goes 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 explicitly states the tool's purpose: 'Link two memories together with a relationship.' and 'Use this to connect related information.' It clearly differentiates from sibling tools like aim_memory_add_facts (which adds facts) and aim_memory_unlink (which removes links) by focusing on creating associations. Examples further clarify the intended use.
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 clear usage context: how to structure relations with active voice, required preconditions (entities must exist), and where relations are stored (context database or master). It does not explicitly compare to alternatives or state when not to use, but the examples and structure guide usage effectively.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aim_memory_list_storesA
List all available memory databases and show current storage location.
DATABASE TYPES:
"default": The master database (memory.jsonl) - used when no context is specified
Named databases: Created via context parameter (e.g., "work" -> memory-work.jsonl)
RETURNS: {project_databases: [...], global_databases: [...], current_location: "..."}
project_databases: Databases in .aim directory (if project detected)
global_databases: Databases in global --memory-path directory
current_location: Where operations will default to
Use this to discover what databases exist before querying them.
EXAMPLES:
aim_memory_list_stores() - Shows all available databases and current storage location
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses database types, naming conventions, and the structure of the return object. No behavioral traits like side effects or permissions are mentioned, but the tool appears read-only and harmless.
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 (DATABASE TYPES, RETURNS, EXAMPLES). Every sentence adds meaningful information, and the format is easily scannable. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and no output schema, the description fully covers what the tool does, what it returns, and provides an example usage. It is sufficient for an agent to invoke correctly without additional context.
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 zero parameters, so the baseline is 4. Description adds value by explaining database types and the return format, which helps the agent understand the output without needing explicit parameter documentation.
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?
Description uses specific verb 'list' and clearly identifies the resource as 'available memory databases and show current storage location'. It distinguishes itself from sibling tools that perform mutations or queries on individual memories.
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 states 'Use this to discover what databases exist before querying them', providing clear context for when to invoke this tool. No exclusions or alternatives are given, but the single use case is well-defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aim_memory_read_allA
Read all memories in a database. Returns every stored memory and their links.
FORMAT OPTIONS:
"json" (default): Structured JSON for programmatic use
"pretty": Human-readable text format
DATABASE: Reads from the specified 'context' database, or master database if not specified.
EXAMPLES:
aim_memory_read_all({}) - JSON format
aim_memory_read_all({format: "pretty"}) - Human-readable
aim_memory_read_all({context: "work", format: "pretty"}) - Work database, pretty
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional memory context. Reads from the specified context's knowledge graph or master database if not specified. | |
| location | No | Optional storage location override. 'project' for .aim directory, 'global' for configured directory. | |
| format | No | Output format. 'json' (default) for structured data, 'pretty' for human-readable text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided. The description does not disclose potential performance impacts for large databases or that this is a read-only operation (though implied by name). It adds some context via format options but misses behavioral traits like rate limits or idempotency.
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 sections for format options, database info, and examples. It is concise with no redundant sentences; every part adds value.
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 description explains what is returned (memories and links) and provides format options. Without an output schema, it is somewhat vague about the structure, but the examples and format choices compensate. It is sufficient for a read-all tool.
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% coverage, but the description enhances understanding by explaining the format parameter with examples and clarifying the context parameter's effect. It goes beyond the schema by providing usage examples.
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 reads all memories and returns them with their links. The verb 'Read' and resource 'all memories' are specific. It distinguishes from sibling tools like aim_memory_get (likely single memory) and aim_memory_search.
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 on database selection (context) and format options (json/pretty) with examples. It implies when to use: when you need all memories. However, it does not explicitly state when not to use or compare with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aim_memory_remove_factsA
Remove specific facts from a memory. Keeps the memory but removes selected observations.
DATABASE SELECTION: Observations are deleted from entities within the specified database's knowledge graph.
LOCATION OVERRIDE: Use the 'location' parameter to force deletion from 'project' (.aim directory) or 'global' (configured directory). Leave blank for auto-detection.
EXAMPLES:
Master database (default): aim_memory_remove_facts({deletions: [{entityName: "John", observations: ["Outdated info"]}]})
Work database: aim_memory_remove_facts({context: "work", deletions: [{entityName: "Project", observations: ["Old deadline"]}]})
Master database in global location: aim_memory_remove_facts({location: "global", deletions: [{entityName: "John", observations: ["Outdated info"]}]})
Health database in project location: aim_memory_remove_facts({context: "health", location: "project", deletions: [{entityName: "Exercise", observations: ["Injured knee"]}]})
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional memory context. Observations will be deleted from entities in the specified context's knowledge graph. | |
| location | No | Optional storage location override. 'project' forces project-local .aim directory, 'global' forces global directory. If not specified, uses automatic detection. | |
| deletions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It clearly states that the memory is kept while only selected observations are removed. It explains the database selection behavior and location override logic. However, it does not mention error handling (e.g., if observations don't exist) or permissions, but the core behavior is well disclosed.
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 sections (DATABASE SELECTION, LOCATION OVERRIDE, EXAMPLES) and uses bullet-like formatting. It avoids tautology and provides necessary context. While slightly lengthy due to examples, each part adds value. Could be more concise, but it's organized and 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?
Given the tool has 3 parameters, no output schema, and no annotations, the description covers the main behaviors: what the tool does, database/location selection, and multiple examples. It lacks explicit details on error cases or return values, but it is sufficient for an agent to invoke the tool correctly in most 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 67% (context and location have descriptions, deletions does not at top level). The description adds value by explaining the deletions parameter through examples and stating that it removes selected observations. It clarifies the structure (array of objects with entityName and observations) and provides multiple usage patterns, enhancing understanding 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 clearly states 'Remove specific facts from a memory. Keeps the memory but removes selected observations.' This distinguishes it from siblings like aim_memory_forget (which likely removes entire memory) and aim_memory_add_facts (adds). The verb 'remove' and resource 'facts from a memory' are specific and 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?
The description provides explicit guidance on when to use the location override and includes examples for different contexts (master, work, health) and locations (project, global). It implies the tool is for selective deletion without removing the entire memory, but does not explicitly state when not to use it compared to siblings like aim_memory_forget. The database selection section also adds context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aim_memory_searchA
Search memories by keyword. Use this when you don't know the exact name of what you're looking for.
WHAT IT SEARCHES: Matches query (case-insensitive) against:
Memory names (e.g., "John" matches "John_Smith")
Memory types (e.g., "person" matches all person memories)
Facts/observations (e.g., "Seattle" matches memories mentioning Seattle)
VS aim_memory_get: Use aim_memory_search for fuzzy matching. Use aim_memory_get when you know exact names.
FORMAT OPTIONS:
"json" (default): Structured JSON for programmatic use
"pretty": Human-readable text format
EXAMPLES:
aim_memory_search({query: "John"}) - JSON format
aim_memory_search({query: "project", format: "pretty"}) - Human-readable
aim_memory_search({context: "work", query: "Shane", format: "pretty"})
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional database name. Searches within this database or master database if not specified. | |
| location | No | Optional storage location override. 'project' for .aim directory, 'global' for configured directory. | |
| query | Yes | Search text to match against entity names, entity types, and observation content (case-insensitive) | |
| format | No | Output format. 'json' (default) for structured data, 'pretty' for human-readable text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description fully covers behavioral traits: case-insensitive matching, fields searched, format options. No destructive hints needed.
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-structured with headings (WHAT IT SEARCHES, VS, FORMAT OPTIONS, EXAMPLES). Informative but could be slightly more concise; however, organization is excellent.
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?
No output schema, but description covers purpose, usage, parameter semantics, and examples adequately. For a search tool with 4 parameters (100% schema coverage), it is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds examples and clarifies search behavior beyond schema, e.g., how context and location work. Adds significant value.
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 it searches memories by keyword, specifies what it matches (names, types, facts), and distinguishes from sibling tool aim_memory_get for exact name matching.
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 states when to use ('when you don't know the exact name') and contrasts with aim_memory_get. Provides examples and format options 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.
aim_memory_storeA
Store new memories. Use this to remember people, projects, concepts, or any information worth persisting.
AIM (AI Memory) provides persistent memory for AI assistants. The 'aim_memory_' prefix groups all memory tools together.
WHAT'S STORED: Memories have a name, type (person/project/concept/etc.), and observations (facts about them).
DATABASES: Use the 'context' parameter to organize memories into separate graphs:
Leave blank: Uses the master database (default for general information)
Any name: Creates/uses a named database ('work', 'personal', 'health', 'research', etc.)
New databases are created automatically - no setup required
IMPORTANT: Use consistent, simple names - prefer 'work' over 'work-stuff'
STORAGE LOCATIONS: Files are stored as JSONL (e.g., memory.jsonl, memory-work.jsonl):
Project-local: .aim directory in project root (auto-detected if exists)
Global: User's configured --memory-path directory
Use 'location' parameter to override: 'project' or 'global'
RETURNS: Array of created entities.
EXAMPLES:
Master database (default): aim_memory_store({entities: [{name: "John", entityType: "person", observations: ["Met at conference"]}]})
Work database: aim_memory_store({context: "work", entities: [{name: "Q4_Project", entityType: "project", observations: ["Due December 2024"]}]})
Master database in global location: aim_memory_store({location: "global", entities: [{name: "John", entityType: "person", observations: ["Met at conference"]}]})
Work database in project location: aim_memory_store({context: "work", location: "project", entities: [{name: "Q4_Project", entityType: "project", observations: ["Due December 2024"]}]})
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional memory context. Defaults to master database if not specified. Use any descriptive name ('work', 'personal', 'health', 'basket-weaving', etc.) - new contexts created automatically. | |
| location | No | Optional storage location override. 'project' forces project-local .aim directory, 'global' forces global directory. If not specified, uses automatic detection. | |
| entities | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description thoroughly discloses behavioral traits: it explains the structure of memories (name, type, observations), the use of 'context' for databases, storage mechanisms (JSONL files, .aim directory, global), and return value (array of created entities). Since no annotations are provided, the description fully covers transparency.
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 (WHAT'S STORED, DATABASES, etc.) and front-loaded with the core purpose. While concise for the complexity, it could be slightly trimmed without losing 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?
Given the tool's complexity (3 parameters, nested array) and absence of output schema, the description covers all necessary aspects: purpose, parameters, usage patterns, storage details, return values, and examples. It is complete and self-contained.
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 description adds significant meaning beyond the input schema. For 'context', it explains master database and naming conventions. For 'location', it clarifies project/global and automatic detection. For 'entities', it details the nested object structure. Schema coverage is high, but the description enhances understanding with practical guidance.
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: 'Store new memories... remember people, projects, concepts, or any information worth persisting.' It specifies the verb (store) and resource (memories), and the sibling tools (like aim_memory_add_facts or aim_memory_forget) have different purposes, making it distinguishable.
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 guidance on when to use the tool (to remember information) and includes examples for different scenarios (master database, named context, location). However, it does not explicitly state when not to use it or directly reference sibling tools for alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aim_memory_unlinkA
Remove links between memories. Keeps the memories but removes their connections.
DATABASE SELECTION: Relations are deleted from the specified database's knowledge graph.
LOCATION OVERRIDE: Use the 'location' parameter to force deletion from 'project' (.aim directory) or 'global' (configured directory). Leave blank for auto-detection.
EXAMPLES:
Master database (default): aim_memory_unlink({relations: [{from: "John", to: "OldCompany", relationType: "worked_at"}]})
Work database: aim_memory_unlink({context: "work", relations: [{from: "Alice", to: "CancelledProject", relationType: "manages"}]})
Master database in global location: aim_memory_unlink({location: "global", relations: [{from: "John", to: "OldCompany", relationType: "worked_at"}]})
Personal database in project location: aim_memory_unlink({context: "personal", location: "project", relations: [{from: "Me", to: "OldHobby", relationType: "enjoys"}]})
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional memory context. Relations will be deleted from the specified context's knowledge graph. | |
| location | No | Optional storage location override. 'project' forces project-local .aim directory, 'global' forces global directory. If not specified, uses automatic detection. | |
| relations | Yes | An array of relations to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It states the behavioral effect (removes links, keeps memories) and covers parameter behavior via examples. However, it lacks details on reversibility, error cases (e.g., non-existent relations), or permission requirements, leaving some transparency gaps.
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 sections for database selection, location override, and examples. It is front-loaded with the main purpose. While it is somewhat verbose, all content adds clarity, and the examples are particularly helpful.
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 output schema, no annotations), the description covers the main function, parameter usage, and key scenarios. It lacks details on return values or error handling, but the provided information is sufficient for correct invocation in typical cases.
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 baseline is 3. The description adds value by explaining the location parameter with a 'LOCATION OVERRIDE' section and illustrating context and location usage through multiple examples, providing more context than the schema alone.
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 explicitly states 'Remove links between memories' and clarifies that it keeps the memories but removes connections. This clearly differentiates it from siblings like aim_memory_add_facts and aim_memory_remove_facts, which add or remove facts rather than links.
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 database selection guidance and location override details, with examples showing different contexts. However, it does not explicitly state when not to use this tool or directly name alternative tools for comparison, leaving some ambiguity for agents unfamiliar with the domain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a distinct action—store, retrieve, search, list, link, unlink, etc.—with no overlapping purposes. The descriptions clearly differentiate similar tools like get vs search and read_all vs list_stores.
All tools use the consistent prefix 'aim_memory_' followed by a clear snake_case action verb (store, add_facts, get, search, read_all, list_stores, forget, remove_facts, link, unlink). No mixing of styles.
10 tools cover the essential operations for a knowledge graph memory system—CRUD for entities and relations, plus search and listing. This is well-scoped without being excessive or sparse.
The tool set covers creation, retrieval, search, listing, linking, and deletion of entities and facts. Missing is a direct update for entity names or types (requires forget+re-store), but this is a minor gap given the add/remove facts functionality.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Persistent, outcome-grounded episodic memory for Claude. 14ms CPU retrieval, no GPU, no vector DB.
Persistent memory for Claude Code and Cursor. Stop re-explaining your project every session.
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
Persistent memory for AI agents across Claude, ChatGPT and any MCP client.
Related MCP Servers
- AlicenseBqualityAmaintenanceA basic implementation of persistent memory using a local knowledge graph. This lets Claude remember information about the user across chats.973,64690,006Unlicense - libtelnet variant
- AlicenseBqualityFmaintenanceA persistent memory implementation using a local knowledge graph that lets Claude remember information about users across conversations.96MIT
- AlicenseAqualityDmaintenanceAn implementation of persistent memory for Claude using a local knowledge graph, allowing the AI to remember information about users across conversations with customizable storage location.111,41861JavaScriptMIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude to remember information about users across chats using a persistent local knowledge graph that stores entities, relationships, and observations.73,646Unlicense - libtelnet variant
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/shaneholloman/mcp-knowledge-graph'
If you have feedback or need assistance with the MCP directory API, please join our Discord server