MemoryMesh
Health Pass
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Community trust — 354 GitHub stars
Code Warn
- process.env — Environment variable access in src/config.ts
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
A knowledge graph server that uses the Model Context Protocol (MCP) to provide structured memory persistence for AI models.
MemoryMesh
MemoryMesh is a knowledge graph server designed for AI models, with a focus on text-based RPGs and interactive storytelling. It helps AI maintain consistent, structured memory across conversations, enabling richer and more dynamic interactions.
The project is based on the Knowledge Graph Memory Server from the MCP servers repository and retains its core functionality.
IMPORTANT
v0.4.0 Update: The internals were rewritten to be much smaller and more reliable. Tool names, schemas and the memory file format are unchanged, so your existing setup and data keep working. Notable fixes: rebuilding or running npm install no longer erases dist/data/memory.json, and a failed tool call no longer leaves half-saved data behind. See the changelog for details.
Schemas live in dist/data/schemas and memory in dist/data/memory.json by default. Both locations can be changed with environment variables.
Quick Links
Overview
MemoryMesh is a local knowledge graph server that empowers you to build and manage structured information for AI models. While particularly well-suited for text-based RPGs, its adaptable design makes it useful for various applications, including social network simulations, organizational planning, or any scenario involving structured data.
Key Features
- Dynamic Schema-Based Tools: Define your data structure with schemas, and MemoryMesh automatically generates tools for adding, updating, and deleting data.
- Intuitive Schema Design: Create schemas that guide the AI in generating and connecting nodes, using required fields, enumerated types, and relationship definitions.
- Metadata for AI Guidance: Use metadata to provide context and structure, helping the AI understand the meaning and relationships within your data.
- Relationship Handling: Define relationships within your schemas to encourage the AI to create connections (edges) between related data points (nodes).
- Informative Feedback: Provides error feedback to the AI, enabling it to learn from mistakes and improve its interactions with the knowledge graph.
- Event Support: An event system tracks operations, providing insights into how the knowledge graph is being modified.
Nodes
Nodes represent entities or concepts within the knowledge graph. Each node has:
name: A unique identifier.nodeType: The type of the node (e.g.,npc,artifact,location), defined by your schemas.metadata: An array of strings providing descriptive details about the node.
Example Node:
{
"name": "Aragorn",
"nodeType": "player_character",
"metadata": [
"Race: Human",
"Class: Ranger",
"Skills: Tracking, Swordsmanship",
"Affiliation: Fellowship of the Ring"
]
}
Edges
Edges represent relationships between nodes. Each edge has:
from: The name of the source node.to: The name of the target node.edgeType: The type of relationship (e.g.,owns,located_in).weight: (Optional) A number between 0 and 1 representing the strength or confidence of the relationship. Treated as 1 when not set.
{
"from": "Aragorn",
"to": "Andúril",
"edgeType": "owns"
}
Schemas
Schemas are the heart of MemoryMesh. They define the structure of your data and drive the automatic generation of tools.
Schema File Location
Place your schema files (.schema.json) in the dist/data/schemas directory of your built MemoryMesh project. MemoryMesh will automatically detect and process these files on startup.
Schema Structure
File name: any name ending in .schema.json, for example npc.schema.json. The tool names come from the name field inside the file, not from the file name.
name- Identifier for the schema and node type within the memory. IMPORTANT: The schema’s name must start withadd_to be recognized.description- Used as the description for theadd_<name>tool, providing context for the AI. (Thedeleteandupdatetools have a generic description)properties- Each property includes its type, description, and additional constraints.propertytype- Supported values arestringorarray.description- Helps guide the AI on the entity’s purpose.required- Boolean. Iftrue, the AI is forced to provide this property when creating a node.enum- An array of strings. If present, the AI must choose one of the given options.relationship- Defines a connection to another node. The AI provides one or more node names, and MemoryMesh creates an edge to each of them. If a property is required and has a relationship, the AI will always create both the node and the corresponding edge.edgeType- Type of the relationship to be created.description- Helps guide the AI on the relationship’s purpose.- The target nodes must already exist. If one doesn't, the whole call fails with an explanation and nothing is saved, so the AI can create the missing node and try again.
additionalProperties- Boolean. Iftrue(or left out), allows the AI to add extra attributes beyond those defined inproperties. Iffalse, extra attributes are rejected.
If a schema file is invalid, MemoryMesh skips it, logs the reason, and still starts with the other schemas.
Example Schema (add_npc.schema.json):
{
"name": "add_npc",
"description": "Schema for adding an NPC to the memory" ,
"properties": {
"name": {
"type": "string",
"description": "A unique identifier for the NPC",
"required": true
},
"race": {
"type": "string",
"description": "The species or race of the NPC",
"required": true,
"enum": [
"Human",
"Elf",
"Dwarf",
"Orc",
"Goblin"
]
},
"currentLocation": {
"type": "string",
"description": "The current location of the NPC",
"required": true,
"relationship": {
"edgeType": "located_in",
"description": "The current location of the NPC"
}
}
},
"additionalProperties": true
}
Based on this schema, MemoryMesh automatically creates:
- add_npc: To add new NPC nodes.
- update_npc: To modify existing NPC nodes. Each field you pass replaces that field's entry in the node's metadata; other entries are kept. Passing
metadatareplaces the whole list. - delete_npc: To remove NPC nodes (and their edges).
MemoryMesh includes 11 pre-built schemas designed for text-based RPGs, providing a ready-to-use foundation for game development.
SchemaManager Tool
MemoryMesh includes a SchemaManager tool to simplify schema creation and editing. It provides a visual interface, making it easy to define your data structures without writing JSON directly.
Dynamic Tools
MemoryMesh simplifies interaction with your knowledge graph through dynamic tools. These tools are not manually coded but are automatically generated directly from your schema definitions. This means that when you define the structure of your data using schemas, MemoryMesh intelligently creates a set of tools tailored to work with that specific data structure.
Think of it like this: You provide a blueprint (the schema), and MemoryMesh automatically constructs the necessary tools to build, modify, and remove elements based on that blueprint.
How does it work behind the scenes?
MemoryMesh has an intelligent system that reads your schema definitions. It analyzes the structure you've defined, including the properties of your entities and their relationships. Based on this analysis, it automatically creates a set of tools for each entity type:
add_<entity>: A tool for creating new instances of an entity.update_<entity>: A tool for modifying existing entities.delete_<entity>: A tool for removing entities.
These tools are then made available through a central hub within MemoryMesh, ensuring they can be easily accessed and used by any connected client or AI.
In essence, MemoryMesh's dynamic tool system provides a powerful and efficient way to manage your knowledge graph, freeing you to focus on the content and logic of your application rather than the underlying mechanics of data manipulation.
Memory file
By default, data is stored in dist/data/memory.json (one JSON object per line). You can move it anywhere with the MEMORYMESH_MEMORY_FILE environment variable, which is a good idea if you want it outside the build folder.
Memory Viewer
The Memory Viewer is a separate tool designed to help you visualize and inspect the contents of the knowledge graph managed by MemoryMesh. It provides a user-friendly interface for exploring nodes, edges, and their properties.
Key Features:
- Graph Visualization: View the knowledge graph as an interactive node-link diagram.
- Node Inspection: Select nodes to see their nodeType, metadata, and connected edges.
- Edge Exploration: Examine relationships between nodes, including edgeType and direction.
- Search and Filtering: Quickly find specific nodes or filter them by type.
- Table View: Allows you to easily find and inspect specific nodes and edges, or all of them at once.
- Raw JSON View: Allows you to view the raw JSON data from the memory file.
- Stats Panel: Provides key metrics and information about the knowledge graph: total nodes, total edges, node types, and edge types.
- Search and Filter: Allows you to filter by node type or edge type and filter whether to show nodes, edges, or both.
Accessing the Memory Viewer
The Memory Viewer is a standalone web application. Memory Viewer discussion
Using the Memory Viewer
- Select Memory File: In the Memory Viewer, click the "Select Memory File" button.
- Choose File: Navigate to your MemoryMesh project directory and select the
memory.jsonfile (located indist/data/memory.jsonby default). - Explore: The Memory Viewer will load and display the contents of your knowledge graph.
Memory Flow
Prompt
For optimal results, use Claude's "Projects" feature with custom instructions. Here's an example of a prompt you can start with:
You are a helpful AI assistant managing a knowledge graph for a text-based RPG. You have access to the following tools: add_npc, update_npc, delete_npc, add_location, update_location, delete_location, and other tools for managing the game world.
When the user provides input, first process it using your available tools to update the knowledge graph. Then, respond in a way that is appropriate for a text-based RPG.
You can also instruct the AI to perform specific actions directly in the chat.
Experiment with different prompts to find what works best for your use case!
Example
- A simple example with custom instructions.
- An example for the sake of example, with visualization (NOT part of the functionality)
Add a couple of cities, some npcs, couple locations around the city to explore, hide an artifact or two somewhere
Installation
Prerequisites
- Node.js: Version 18 or higher (a current LTS version is recommended). You can download it from nodejs.org.
- npm: Usually included with Node.js.
- Claude for Desktop: Make sure you have the latest version installed from claude.ai/download.
Installation Steps
Clone the Repository:
git clone https://github.com/CheMiguel23/memorymesh.git cd memorymeshInstall Dependencies:
npm installBuild the Project:
npm run buildThis command compiles the TypeScript code into JavaScript in the
distdirectory and copies the example schemas todist/data/schemas. Schemas that already exist there are not overwritten, so your edits survive rebuilds.Verify the Build (Optional):
- Check that
dist/index.jsexists and thatdist/data/schemascontains.schema.jsonfiles.
- Check that
Configure Claude Desktop:
Open your Claude Desktop configuration file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Add an entry for
memorymeshto themcpServerssection. You can choose one of the following configuration options:
"mcpServers": { "memorymesh": { "command": "node", "args": ["/ABSOLUTE/PATH/TO/YOUR/PROJECT/memorymesh/dist/index.js"] } }- Replace
/ABSOLUTE/PATH/TO/YOUR/PROJECT/with the actual absolute path to yourmemorymeshproject directory. - Example (macOS):
"command": "node", "args": ["/Users/yourusername/Projects/memorymesh/dist/index.js"] - Example (Windows):
"command": "node", "args": ["C:\\Projects\\memorymesh\\dist\\index.js"]
- macOS:
Restart Claude Desktop: Completely restart Claude Desktop for the changes to take effect.
Verify Installation
- Start Claude Desktop.
- Open a new chat.
- Look for the MCP plugin icon
in the top-right corner. If it's there, your configuration is likely correct.
- Click the
icon. You should see "memorymesh" in the list of connected servers.
- Click the
icon. If you see tools listed (e.g.,
add_npc,update_npc, etc.), your server is working and exposing tools correctly.
Updating
git pull
npm install
Then restart your MCP client. Since v0.4.0, updating keeps your memory file and any schemas you edited in dist/data/schemas. Backing up dist/data first is still a good habit.
Troubleshooting
Server not appearing in Claude:
- Double-check the paths in your
claude_desktop_config.json. Make sure they are absolute paths and correct. - Verify that the
distdirectory exists and contains the compiled JavaScript files, includingindex.js. - Check the Claude Desktop logs for errors:
- macOS:
~/Library/Logs/Claude/mcp-server-memorymesh.log(andmcp.log) - Windows: (Likely in a
Logsfolder under%AppData%\Claude)
- macOS:
- Double-check the paths in your
Tools not showing up:
- Make sure your
npm run buildcommand completed without errors. - Verify that your schema files are in
dist/data/schemas(or yourMEMORYMESH_SCHEMAS_DIR), end in.schema.json, and have anamestarting withadd_. - Check the server log: on startup MemoryMesh prints which schemas it loaded, and the reason for any schema it skipped.
- Make sure your
Advanced Configuration
Environment Variables
| Variable | What it sets | Default |
|---|---|---|
MEMORYMESH_MEMORY_FILE |
Path of the memory file | dist/data/memory.json |
MEMORYMESH_SCHEMAS_DIR |
Directory containing .schema.json files |
dist/data/schemas |
Set them in your MCP client configuration, for example in Claude Desktop:
"mcpServers": {
"memorymesh": {
"command": "node",
"args": ["/ABSOLUTE/PATH/TO/memorymesh/dist/index.js"],
"env": {
"MEMORYMESH_MEMORY_FILE": "/ABSOLUTE/PATH/TO/my-campaign/memory.json",
"MEMORYMESH_SCHEMAS_DIR": "/ABSOLUTE/PATH/TO/my-campaign/schemas"
}
}
}
This also makes it easy to keep separate memories (for example, one per campaign) by configuring several servers with different files.
Docker
docker build -t memorymesh .
docker run -i --rm -v memorymesh-data:/data memorymesh
Inside the container the memory file is /data/memory.json, so mount a volume there to keep it.
Limitations
Node Deletion: The AI may be hesitant to delete nodes from the knowledge graph. Encourage it through prompts if needed.
Conflicting Knowledge: MemoryMesh currently uses a "last write wins" approach for handling data. If conflicting information is provided about the same entity, the most recent update will overwrite previous values. Here are strategies for managing conflicting information:
Current Approaches:
- Use metadata to track sources: Add metadata entries like
"Source: Character testimony"or"Source: Official records"to track where information came from. - Use temporal metadata: Include timestamps or narrative time markers (e.g.,
"As of Chapter 3") in metadata to track when information was valid. - Create separate nodes for perspectives: For subjective or disputed information, create separate nodes representing different viewpoints (e.g.,
rumor_about_villainvstruth_about_villain). - Use edge weights: Leverage the optional
weightproperty on edges (0-1 range) to indicate confidence or reliability of relationships.
Example - Tracking uncertain information:
{ "name": "VillainOrigin_Rumor", "nodeType": "information", "metadata": [ "Source: Tavern gossip", "Reliability: Low", "Claims: Villain came from the northern mountains" ] }Future Considerations:
For applications requiring sophisticated conflict resolution, consider implementing a custom layer that:- Maintains version history of node changes
- Tracks provenance (source) of each piece of information
- Implements confidence scores for assertions
- Supports temporal validity periods for facts
- Use metadata to track sources: Add metadata entries like
Development
npm install # also builds
npm test # runs the test suite
npm run watch # recompiles on change
The source is small:
| File | Purpose |
|---|---|
src/index.ts |
Entry point: loads schemas and starts the server on stdio |
src/server.ts |
Lists tools and routes each tool call to its handler |
src/tools.ts |
Definitions of the built-in tools (add_nodes, search_nodes, ...) |
src/schemas.ts |
Loads schema files and implements the generated add_/update_/delete_ tools |
src/graph.ts |
The graph operations themselves, with input validation |
src/store.ts |
Reads and writes the memory file (safely, one change at a time) |
src/config.ts |
Paths and version |
src/types.ts |
Shared types (Node, Edge, ...) |
Contribution
Contributions, feedback, and ideas are welcome!
This project is a personal exploration into integrating structured data with AI reasoning capabilities. Contributions, feedback, and ideas are welcome to push it further or inspire new projects.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found
