Skip to main content
Glama
j3k0

Elasticsearch Knowledge Graph for MCP

by j3k0

mcp-brain-tools

An MCP server that gives AI agents persistent memory with built-in freshness tracking and spaced repetition. Backed by Elasticsearch.

Unlike simple key-value memory stores, mcp-brain-tools tracks how old each piece of knowledge is, flags what needs review, and lets agents verify information to keep it fresh — inspired by how spaced repetition helps humans retain knowledge.

Features

  • Spaced repetition freshness — each entity has a review interval that doubles on verification (capped at 365 days). Confidence labels (fresh/normal/aging/stale/archival) tell agents what to trust.

  • Progressive search — queries return fresh results first, automatically widening to include older data only when needed.

  • Observations as entities — each observation gets its own freshness lifecycle, so "build is broken" (1-day review) and "founded in 2015" (365-day review) age independently.

  • Memory zones — isolate knowledge by project, team, or domain.

  • AI-powered filtering — optional Groq integration scores search results by relevance.

  • DRY by design — tool descriptions guide agents not to store what's already in code, git, or docs.

Related MCP server: Logseq MCP Tools

Setup

Prerequisites

  • Node.js >= 18

  • Docker (for Elasticsearch) or a remote Elasticsearch instance

Install and build

npm install
npm run build

Start Elasticsearch

npm run es:start

Or point to your own instance via ES_NODE environment variable.

Configure your MCP client

Add to your Claude Code, Claude Desktop, or other MCP client config:

{
  "mcpServers": {
    "memory": {
      "command": "node",
      "args": ["/path/to/mcp-brain-tools/dist/index.js"],
      "env": {
        "ES_NODE": "http://localhost:9200",
        "GROQ_API_KEY": "your-key-here"
      }
    }
  }
}

GROQ_API_KEY is optional — enables AI-powered search filtering and zone relevance scoring.

Install the auto-memory hook (Claude Code only)

The memory hook runs on every user message and automatically injects relevant context — no agent cooperation needed.

Add to ~/.claude/settings.json:

{
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "node /path/to/mcp-brain-tools/dist/memory-hook.js"
          }
        ]
      }
    ]
  }
}

The hook uses the same ES_NODE, AI_API_KEY/GROQ_API_KEY, AI_API_BASE, and AI_MODEL env vars (set them in the env block of your settings, or export them in your shell profile).

AI_API_BASE defaults to Groq's endpoint but accepts any OpenAI-compatible API URL.

How it works

Entities and observations

Entities represent anything worth remembering — people, projects, decisions, facts. Each entity has:

  • A name and type

  • Spaced repetition fields: verifiedAt, reviewInterval, nextReviewAt

  • A confidence label computed from freshness: 1 - (daysSinceVerified / reviewInterval)

Observations are stored as separate entities linked via is_observation_of relations. Each observation has its own review cadence:

Entity: "iaptic-server" (type: Project, reviewInterval: 30 days)
  <- "iaptic-server: uses TypeScript" (reviewInterval: 180 days)
  <- "iaptic-server: migration in progress" (reviewInterval: 7 days)

Freshness lifecycle

  1. Entity createdconfidence: "fresh", default review in 7 days

  2. Review date passesconfidence: "aging", needsReview: true

  3. Agent verifies (via verify_entity) — interval doubles, confidence resets to fresh

  4. Long overdueconfidence: "stale" then "archival", excluded from default search

When searching, the server uses three passes:

  1. freshness >= 0 — fresh and normal entities

  2. freshness >= -2 — adds aging and stale

  3. No filter — adds archival

This keeps results clean while ensuring nothing is permanently lost.

MCP Tools

Tool

Description

create_entities

Create entities with optional observations and reviewInterval

update_entities

Update existing entities

delete_entities

Delete entities (with optional cascade)

add_observations

Add observations as separate entities with own freshness

verify_entity

Confirm entity is still accurate, extend review interval

search_nodes

Search with progressive freshness filtering

open_nodes

Get specific entities by name with freshness metadata

get_recent

Get recently accessed entities

create_relations

Create relationships between entities

delete_relations

Remove relationships

inspect_knowledge_graph

AI-powered entity retrieval with tentative answers

inspect_files

AI-powered file content inspection

list_zones

List memory zones (with AI relevance scoring)

create_zone / delete_zone

Manage memory zones

copy_entities / move_entities

Transfer entities between zones

merge_zones

Merge zones with conflict resolution

zone_stats

Get entity/relation counts for a zone

mark_important

Boost entity relevance score

get_time_utc

Get current UTC time

Environment variables

Variable

Default

Description

ES_NODE

http://localhost:9200

Elasticsearch URL

ES_USERNAME

Elasticsearch username

ES_PASSWORD

Elasticsearch password

GROQ_API_KEY

Groq API key for AI filtering

GROQ_MODELS

openai/gpt-oss-120b,llama-3.3-70b-versatile

Comma-separated model list

KG_INDEX_PREFIX

knowledge-graph

Elasticsearch index prefix

KG_DEFAULT_ZONE

default

Default memory zone

DEBUG

false

Enable debug logging

For agents to actively use the memory server, add something like this to your CLAUDE.md (or equivalent instructions file):

## Memory

Use MCP Memory (`mcp__memory__*` tools) — a shared knowledge graph across all agents, projects, and computers.

**When to SAVE (immediately, before moving on):**
- Something you tried didn't work (non-transient) → save what failed and why, so no agent repeats it
- A decision was made (architectural, design, workflow) → save the decision and the reason
- The user corrects you or gives explicit instructions → save the rule
- You learn something non-obvious that took effort to discover → save it

**When to SEARCH (before starting, not after failing):**
- **At the start of every non-trivial task** — search before thinking, not after hitting a wall
- About to try an approach that might have been attempted before → search first
- User references something from a past session → search before asking

**Rules:**
- Skip anything easy to find in code, git log, or docs
- Use the project name as the zone for project-specific knowledge; `default` for general knowledge
- Keep entries short — the AI filters server-side, so be generous rather than selective
- Short `reviewInterval` (e.g. 3–7 days) for volatile facts; longer (30–180) for stable ones

The key insight: agents need explicit trigger-based instructions ("when X, do Y"), not just descriptions of what the tool does.

Development

npm run build          # Compile TypeScript
npm run dev            # Watch mode
npm run test:jest      # Run Jest tests
npm run es:start       # Start Elasticsearch
npm run es:stop        # Stop Elasticsearch
npm run es:reset       # Wipe data and restart
npm run import         # Import from JSON
npm run export         # Export to JSON

License

MIT

Install Server
A
license - permissive license
B
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Issues opened vs closed

Latest Blog Posts

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/j3k0/mcp-brain-tools'

If you have feedback or need assistance with the MCP directory API, please join our Discord server