mcpField
E
engram-server

engram-server

ローカル
java-ai-memory.devメモリ・ナレッジ233 週間前に更新

engram-server について

Engram は AI エージェント向けの永続メモリサーバーです。会話から事実を抽出し、SQLite または PostgreSQL に支えられた時系列ナレッジグラフに保存します。Python サイドカーを必要としない単一バイナリで動作し、セルフホスト可能なメモリ層を求める開発者向けです。

主な機能

  1. 01会話からの事実抽出
  2. 02SQLite または PostgreSQL への保存
  3. 03ベクトルとキーワードのハイブリッド検索
  4. 04スコープ付きの時系列ナレッジグラフ
  5. 05複数の LLM バックエンドと command 拡張

活用シーン

  1. 01ローカルエージェントでセッションをまたぐユーザー設定を保持
  2. 02単一の SQLite ファイルによる軽量なメモリ層の構築
  3. 03マルチユーザーアプリで org、user、session ごとにメモリを分離

MCP 対応

本サーバーは stdio 経由で MCP インターフェースを提供し、memory_add、memory_recall、memory_search、memory_forget などメモリ用ツール七種と、メッセージ保存用ツール四種を公開します。REST モードも備えています。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"jamjet-labs-engram-server": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/jamjet-labs/engram-server:0.5.0"
]
}
}
}
起動コマンドdocker run -i --rm ghcr.io/jamjet-labs/engram-server:0.5.0

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocighcr.io/jamjet-labs/engram-server:0.5.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

⚡ Engram

AI エージェントのための永続メモリ — 時系列ナレッジグラフ、ハイブリッド検索、SQLite または PostgreSQL。

crates.io (lib) crates.io (server) Docker MCP Registry License

java-ai-memory.dev · メインリポジトリ · JamJet ドキュメント · Discord


Engram は、AI エージェントのための永続メモリレイヤーです。会話から事実を抽出し、時系列ナレッジグラフに保存して、セマンティック検索とキーワード検索を組み合わせたハイブリッド検索で取得します。単一の SQLite ファイルまたは PostgreSQL データベースを基盤とします。

次の 2 つの形態で提供されます。

  • jamjet-engram — 独自のアプリケーションに組み込める Rust ライブラリです。
  • jamjet-engram-server(このクレート)— stdio 経由の MCP と HTTP 経由の REST に対応するスタンドアロンバイナリです。コードを書かずに Claude Desktop、Cursor、あらゆる HTTP クライアントから利用できます。

Engram はプロバイダーに依存しません。5 種類の LLM バックエンドがすぐに使える状態で組み込まれており、さらに 6 つ目の command を使えば、任意の外部スクリプトをシェルから実行できます。Rust コードに手を加えずに、Engram が標準で対応していないプロバイダーを接続できます。

ENGRAM_LLM_PROVIDER=機能
ollama(デフォルト)/api/chat 経由でローカルの Ollama を利用します。無料で、API キーは不要です。ノート PC で実行できます。
openai-compatibleOpenAI のチャット補完プロトコルに対応するあらゆるエンドポイント — 詳細は以下の一覧をご覧ください。
anthropicMessages API 経由で Anthropic Claude を利用します。
googleネイティブ JSON モードを備えた generateContent 経由で Google Gemini を利用します。
commandユーザー指定のスクリプトをシェルから実行します。再コンパイル不要で、拡張性は無限です。
mockテスト専用の決定的なバックエンドです — 空の事実を返します。

ENGRAM_LLM_PROVIDER=… で 1 つ選択します。同じバイナリですべてのプロバイダーを利用できます。

プロジェクトの状況、2026 年 4 月時点。 Engram は新しいプロジェクトです — v0.3.2 で、コミュニティは小規模であり、LongMemEval / DMR の公開数値はまだありません。以下のアーキテクチャは動作し、テストは合格し、Docker イメージも実行できます。今すぐ本番規模のメモリが必要な場合は、Mem0 Cloud や Zep Cloud のほうが成熟しています。Python、Postgres、Qdrant、Neo4j を必要とせず、試用できてセルフホスト可能な単一バイナリのメモリレイヤーをお探しなら、Engram はそのために作られています。

なぜEngramなのか?

課題Engramの回答
どのエージェントメモリライブラリもPythonが中心ですRustコアにネイティブのPython、Java、MCPクライアントを搭載 — サイドカーは不要です
試すだけなのにPostgres + Qdrant + Neo4jが必要です単一のSQLiteファイル(インフラ不要)、または必要に応じてPostgresを利用できます
会話履歴はナレッジメモリではありません事実抽出パイプライン — メッセージから構造化された事実を取り出します
古い事実はずれたり、互いに矛盾したりします矛盾検出 + 統合 — 減衰、昇格、重複排除、要約、振り返りを行います
メモリの想起はセマンティック検索かキーワード検索のどちらかですハイブリッド検索 — ベクトル検索 + SQLite FTS5を1つのクエリで実行します
エージェントはプロセス間でメモリを失いますデフォルトで永続化 — SQLiteまたはPostgresを使用し、クラッシュに強く、持ち運び可能です
MCPへの対応は後回しにされていますMCPネイティブ — 単一のバイナリで7つのツールを公開します
エージェントが何を知っていたかを遡れません時間的ナレッジグラフ — すべての事実にスコープとタイムスタンプが設定されます
ユーザーやテナントごとにメモリを分離できません第一級のスコープ — org / user / sessionがすべてのクエリに組み込まれています

クイックスタート — 30秒

Engramは、Ollama(デフォルト — 無料、ローカル)、OpenAI、Anthropic Claude、Google Geminiの4つのLLMプロバイダーに標準で対応しています。いずれかを選択してください。

オプションA — Ollama(無料、ローカル、APIキー不要)

要件: llama3.2とnomic-embed-textを取得済みのOllama:

ollama pull llama3.2
ollama pull nomic-embed-text

Docker(最も簡単):

docker run --rm -i \
  -v engram-data:/data \
  ghcr.io/jamjet-labs/engram-server:0.3.2

コンテナはデフォルトでhost.docker.internal:11434のOllamaに接続します — MacとWindowsのDocker Desktopではそのまま動作します。Linuxユーザーは--add-host=host.docker.internal:host-gatewayが必要です。

オプションB — Anthropic Claude(ホステッド、最高品質)
docker run --rm -i \
  -e ENGRAM_LLM_PROVIDER=anthropic \
  -e ANTHROPIC_API_KEY=sk-ant-... \
  -v engram-data:/data \
  ghcr.io/jamjet-labs/engram-server:0.3.2

デフォルトはclaude-haiku-4-5-20251001です。-e ENGRAM_ANTHROPIC_MODEL=claude-sonnet-4-6で変更できます。

注:AnthropicにはネイティブのJSONモードがないため、Engramはテキスト応答からJSONを解析します。llm_util::extract_json_payloadヘルパーは、Claudeがときどき出力するMarkdownのフェンスを取り除きます。

オプションC — Google Gemini
docker run --rm -i \
  -e ENGRAM_LLM_PROVIDER=google \
  -e GOOGLE_API_KEY=AIza... \
  -v engram-data:/data \
  ghcr.io/jamjet-labs/engram-server:0.3.2

デフォルトはgemini-flash-latestです。-e ENGRAM_GOOGLE_MODEL=gemini-2.5-flashで変更できます。

オプションD — 任意のOpenAI互換エンドポイント
docker run --rm -i \
  -e ENGRAM_LLM_PROVIDER=openai-compatible \
  -e OPENAI_API_KEY=sk-... \
  -v engram-data:/data \
  ghcr.io/jamjet-labs/engram-server:0.3.2

デフォルトではOpenAI自体(https://api.openai.com/v1、gpt-4o-mini)を使用します。再コンパイルせずに、環境変数を1つ変更するだけで以下のプロバイダーを指定できます:

プロバイダーENGRAM_OPENAI_BASE_URL=注記
OpenAIhttps://api.openai.com/v1デフォルト
Azure OpenAIhttps://<resource>.openai.azure.com/openai/deployments/<deployment>
Groqhttps://api.groq.com/openai/v1推論が非常に高速
Together.aihttps://api.together.xyz/v1
Mistralhttps://api.mistral.ai/v1
DeepSeekhttps://api.deepseek.com/v1
Perplexityhttps://api.perplexity.ai
OpenRouterhttps://openrouter.ai/api/v11つのキーで多数のモデルを利用
Fireworkshttps://api.fireworks.ai/inference/v1
vLLM(セルフホスト)http://your-host:8000/v1
LM Studiohttp://localhost:1234/v1ローカルのデスクトップアプリ
LocalAIhttp://localhost:8080/v1セルフホスト
Ollama /v1互換レイヤーhttp://localhost:11434/v1Ollamaの代替パス
社内のLLMゲートウェイインフラチームが公開する任意のURL

openaiは後方互換性のためのopenai-compatibleのエイリアスとして使用できます。

オプション E — command(シェルから任意のコマンドを実行)

Engram に標準で組み込まれていないプロバイダー(カスタム RPC の背後にある社内モデル、生の SOAP エンドポイント、ローカルの推論バイナリ、Python SDK の簡易ラッパー、あるいは今後登場する新しいプロバイダー)には、command バックエンドを使用します。Engram は抽出呼び出しごとにスクリプトを起動し、JSON リクエストを標準入力に渡して、標準出力から JSON レスポンスを読み取ります。

仕様。 スクリプトは標準入力から 1 つの JSON オブジェクトを読み取ります。

{"system": "<extraction prompt>", "user": "<conversation text>", "structured": true}

次に、標準出力へ 1 つの JSON 値を書き込みます。単独の値を返す方法:

{"facts": [{"text": "...", "entities": [...], "confidence": 0.95, "category": "..."}]}

または、エラーを表面化するのに便利なエンベロープを返す方法:

{"content": {"facts": [...]}}
{"error": "rate limited, try again"}

成功時は終了コード 0、失敗時はゼロ以外の終了コード(標準エラー出力を伴います)を返します。

Python ラッパーの例(約 15 行):

#!/usr/bin/env python3
# my-llm.py — wraps any Python SDK for Engram.
import json, sys
from my_llm_sdk import chat  # your SDK

req = json.loads(sys.stdin.read())
resp = chat(
    system=req["system"],
    user=req["user"],
    json_mode=req.get("structured", False),
)
sys.stdout.write(json.dumps(resp))

Engram から指定します:

docker run --rm -i \
  -e ENGRAM_LLM_PROVIDER=command \
  -e ENGRAM_LLM_COMMAND="python /scripts/my-llm.py" \
  -v $(pwd)/scripts:/scripts \
  -v engram-data:/data \
  ghcr.io/jamjet-labs/engram-server:0.3.2

タイムアウトのデフォルトは 120 秒です。ENGRAM_LLM_COMMAND_TIMEOUT=30 で変更できます。

セキュリティ: command プロバイダーは、Engram プロセスのユーザーとして任意のコマンドを実行します。信頼できないユーザーが ENGRAM_LLM_COMMAND を設定できるマルチテナント環境では、絶対に使用しないでください。これはローカルかつシングルテナント向けの機能です。

オプション F — cargo install(すべてのプロバイダーで同じバイナリ)
cargo install jamjet-engram-server
engram serve                                            # ollama (default)
ENGRAM_LLM_PROVIDER=anthropic ANTHROPIC_API_KEY=... engram serve
ENGRAM_LLM_PROVIDER=command ENGRAM_LLM_COMMAND="python /path/to/wrapper.py" engram serve
オプション G — テスト用の REST モード
engram serve --mode rest --port 9090
curl -X POST http://localhost:9090/v1/memory \
  -H 'content-type: application/json' \
  -d '{
    "user_id": "alice",
    "messages": [
      {"role": "user", "content": "I am allergic to peanuts and I love sourdough."}
    ]
  }'

curl 'http://localhost:9090/v1/memory/recall?q=food%20allergies&user_id=alice'

サーバーも設定も Python サイドカーも不要です。バイナリ 1 つで動作します。


MCP クライアントの設定

Claude Desktop(~/Library/Application Support/Claude/claude_desktop_config.json)
{
  "mcpServers": {
    "engram": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "engram-data:/data",
        "ghcr.io/jamjet-labs/engram-server:0.3.2"
      ]
    }
  }
}
Cursor/MCP 対応 IDE

同じ docker run コマンド、またはローカルにインストールした engram serve バイナリを指定します。再起動すると、モデルで 11 個のツール(memory_* が 7 個、messages_* が 4 個)を利用できるようになります。


MCP ツール

メモリツール(7 個)
ツール機能
memory_add会話メッセージから事実を抽出して保存します(抽出には LLM を呼び出します)
memory_recall保存された事実を意味検索します。user_id/org_id でスコープを指定できます
memory_contextティアを考慮して選択し、トークン予算に合わせたコンテキストブロックを LLM プロンプト用に組み立てます
memory_search事実をキーワード検索します(SQLite FTS5/Postgres 全文検索)
memory_forgetID を指定して事実を論理削除します。理由は任意です
memory_stats事実の総数、有効な事実、エンティティ、関係の集計数を表示します
memory_consolidate統合サイクルを実行します。古くなった事実を減衰させ、価値の高い事実を昇格させ、重複に近い事実を重複排除します

すべて (org_id, user_id, session_id) でスコープ指定されます。org が最も広く、session が最も限定的です。

メッセージストアツール(4 個)
ツール機能
messages_save会話のチャットメッセージを保存します(任意で事実抽出を実行します)
messages_getID で指定した会話のすべてのメッセージを取得します
messages_listすべての会話 ID を一覧表示します
messages_delete会話のすべてのメッセージを削除します

REST API

13 個のエンドポイントが /v1/memory をルートとして提供されます。OpenAPI 形式の全エンドポイント:

メソッドパスハンドラー
GET/health稼働状態の確認
POST/v1/memoryメッセージを追加します(事実抽出)
GET/v1/memory/recall?q=…&user_id=…意味検索
POST/v1/memory/contextトークン予算に合わせたコンテキストの組み立て
GET/v1/memory/search?q=…&user_id=…キーワード検索
GET/v1/memory/stats統計情報の集計
POST/v1/memory/consolidate統合を実行
DELETE/v1/memory/facts/:id事実を忘却
DELETE/v1/memory/users/:idGDPR に基づくユーザーデータの削除
POST/v1/memory/messages会話のメッセージを保存
GET/v1/memory/messages会話 ID を一覧表示
GET/v1/memory/messages/:id会話のメッセージを取得
DELETE/v1/memory/messages/:id会話を削除

設定

すべての設定は CLI フラグまたは環境変数で指定します。Docker イメージの設定には、環境変数を使用することを推奨します。

コア
CLI フラグ環境変数デフォルト備考
--dbENGRAM_DB_PATHengram.dbSQLite ファイルのパス、または postgres://… 接続 URL
--extract-on-saveENGRAM_EXTRACT_ON_SAVEtrueチャットメッセージの保存時に事実の抽出を有効にします
--modeENGRAM_MODEmcpmcp(stdio)または rest(HTTP)
--portENGRAM_PORT9090REST モードでの HTTP ポート
--llm-providerENGRAM_LLM_PROVIDERollamaollama、openai-compatible(別名 openai)、anthropic、google、command、mock
--embedding-providerENGRAM_EMBEDDING_PROVIDERollamaollama または mock(クラウド埋め込みプロバイダーは今後対応予定です)
--embedding-modelENGRAM_EMBEDDING_MODELnomic-embed-textOllama の埋め込みモデル
--embedding-dimsENGRAM_EMBEDDING_DIMS768埋め込みモデルの出力と一致している必要があります
Ollama
CLI フラグ環境変数デフォルト
--ollama-urlENGRAM_OLLAMA_URLhttp://localhost:11434(Docker イメージの場合:http://host.docker.internal:11434)
--ollama-llm-modelENGRAM_OLLAMA_LLM_MODELllama3.2
OpenAI 互換(OpenAI、Groq、Together、Mistral、DeepSeek、Azure、vLLM、…)
CLI フラグ環境変数デフォルト
--openai-api-keyOPENAI_API_KEY(プロバイダーが openai-compatible の場合は必須)
--openai-base-urlENGRAM_OPENAI_BASE_URLhttps://api.openai.com/v1 — プロバイダーを切り替えるには、ここを変更してください。上の大きな表を参照してください
--openai-modelENGRAM_OPENAI_MODELgpt-4o-mini
Anthropic
CLI フラグ環境変数デフォルト
--anthropic-api-keyANTHROPIC_API_KEY(プロバイダーが anthropic の場合は必須)
--anthropic-base-urlENGRAM_ANTHROPIC_BASE_URLhttps://api.anthropic.com
--anthropic-modelENGRAM_ANTHROPIC_MODELclaude-haiku-4-5-20251001
Google Gemini
CLI フラグ環境変数デフォルト
--google-api-keyGOOGLE_API_KEY(プロバイダーが google の場合は必須)
--google-base-urlENGRAM_GOOGLE_BASE_URLhttps://generativelanguage.googleapis.com/v1beta
--google-modelENGRAM_GOOGLE_MODELgemini-flash-latest
Command(シェル経由で実行)
CLI フラグ環境変数デフォルト
--llm-commandENGRAM_LLM_COMMAND(プロバイダーが command の場合は必須) — sh -c 経由で実行
--llm-command-timeoutENGRAM_LLM_COMMAND_TIMEOUT120 — 子プロセスを終了するまでの秒数

mock バックエンドは、空の事実と決定論的なバイト循環ベクトルを返します。これはテストと CI 用です。サーバーは起動時に、モックモードが使用されていることを検出すると、明確な警告を表示します。API キーとコマンドの内容が標準出力やログに出力されることはありません。サーバーが表示するのは provider model at base_url または command \<first 60 chars>`` のみです。


データベースバックエンド

Engram は SQLite(デフォルト)と PostgreSQL のバックエンドに対応しています。バックエンドは --db URL で選択します。

# SQLite (default)
engram serve --mode rest --db engram.db

# PostgreSQL
engram serve --mode rest --db postgres://user:pass@localhost:5432/engram

PostgreSQL を使用する場合、テーブルは初回起動時に自動作成されます。


チャットメッセージストア

Engram は、抽出した事実とともに未加工のチャットメッセージを保存できます。これにより、Spring AI の ChatMemoryRepository との統合が可能になります。

REST エンドポイント:

メソッドエンドポイント説明
POST/v1/memory/messages会話のメッセージを保存します
GET/v1/memory/messages会話 ID の一覧を取得します
GET/v1/memory/messages/{id}会話のメッセージを取得します
DELETE/v1/memory/messages/{id}会話を削除します

MCP ツール: messages_save、messages_get、messages_list、messages_delete

メッセージ保存時の事実抽出は、--extract-on-save で制御します(デフォルト:true)。


ライブラリの組み込み

別プロセスを実行したくない場合は、jamjet-engram に直接依存関係を追加します。

[dependencies]
jamjet-engram = "0.3.2"
use engram::{Memory, OllamaEmbeddingProvider, OllamaLlmClient, Scope, ExtractionConfig, Message};

let embedding = Box::new(OllamaEmbeddingProvider::new());
let memory = Memory::open("sqlite:engram.db?mode=rwc", embedding).await?;

let scope = Scope::user("default", "alice");
let messages = vec![Message {
    role: "user".into(),
    content: "I am allergic to peanuts.".into(),
}];

let llm = Box::new(OllamaLlmClient::new());
let fact_ids = memory
    .add_messages(&messages, scope.clone(), llm, ExtractionConfig::default())
    .await?;

// Later, recall
let facts = memory.recall(&engram::memory::RecallQuery {
    query: "food allergies".into(),
    scope: Some(scope),
    max_results: 5,
    as_of: None,
    min_score: None,
}).await?;

その他の言語

Engram は JamJet エコシステムの一部です。これらのクライアントは REST 経由で engram-server と通信します。

言語パッケージインストール
Pythonjamjet(EngramClient を含む)pip install jamjet
Javadev.jamjet:jamjet-sdk(EngramClient を含む)Maven Central
Spring Bootdev.jamjet:engram-spring-boot-starterMaven Central — 設定不要の @Bean EngramMemory
Rustjamjet-engram(直接組み込み)cargo add jamjet-engram

Engram と LangChain4j ChatMemory、Spring AI ChatMemory、Koog、Embabel、Google ADK Memory Bank、Mem0 のコミュニティラッパー、Zep との比較については、java-ai-memory.dev をご覧ください。Engram が適している用途と、代替製品のほうが成熟している領域についても、率直に説明しています。


アーキテクチャ

┌──────────────────────────────────────────────────────────┐
│           Clients: Claude Desktop, Cursor, JamJet,        │
│           Python SDK, Java SDK, Spring Boot, cURL         │
├─────────────────┬────────────────────────────────────────┤
│   MCP (stdio)   │           REST (HTTP + JSON)            │
├─────────────────┴────────────────────────────────────────┤
│                     engram-server                         │
│                 (jamjet-engram-server)                    │
├──────────────────────────────────────────────────────────┤
│                       engram (lib)                        │
│   Extraction pipeline  │  Hybrid retrieval  │  Scopes     │
│   Conflict detection   │  Consolidation     │  Context    │
├──────────────────────────────────────────────────────────┤
│    LlmClient trait        │    EmbeddingProvider trait    │
│    Ollama · Mock          │    Ollama · Mock              │
├──────────────────────────────────────────────────────────┤
│                       Storage                             │
│   SQLite or PostgreSQL (facts, entities, FTS, vectors)   │
└──────────────────────────────────────────────────────────┘

Engram が該当しないもの

  • 単なるチャット履歴ストアではありません。 Engram にはメッセージストアが含まれるようになりました(チャットメッセージストアを参照)が、主な価値は、その上に構築される事実抽出とナレッジグラフのレイヤーにあります。会話の直近 N 件のメッセージだけが必要な場合は、フレームワークに組み込まれたウィンドウ機能のほうがシンプルかもしれません。
  • 状態チェックポインターではありません。 エージェントの実行状態をスナップショット化して再開やリプレイを行う必要がある場合は、LangGraph、Koog の永続化機能、または JamJet 独自の永続ランタイムを使います。Engram と組み合わせてください。これらはそれぞれ異なる問題を解決します。
  • マネージドサービスではありません。 ホストされたコントロールプレーンはなく、スコープ以外の認証レイヤーもなく、SLA もありません。プロセスマネージャーはご自身で用意してください。
  • ベンチマークはまだ実施していません。 LongMemEval と DMR の数値はロードマップに含まれています。公開されるまでは、比較に関する主張を適切な懐疑心を持って受け止めてください。

ロードマップ

ステータス項目
✅事実抽出パイプライン + SQLite ストレージ
✅ハイブリッド検索(ベクトル + プレフィックスマッチングを備えた FTS5)
✅統合エンジン(減衰、昇格、重複排除、要約、内省)
✅MCP stdio サーバー(7 個のツール)
✅REST API(9 個のエンドポイント)
✅複数プロバイダーに対応する LLM バックエンド:Ollama、OpenAI 互換(OpenAI/Azure/Groq/Together/Mistral/vLLM/LM Studio/…)、Anthropic、Google、command によるシェル呼び出し
✅Python、Java、Spring Boot クライアント
✅Docker イメージ、MCP Registry への公開
✅Postgres バックエンド(SQLite と並行して利用可能)
✅チャットメッセージストア + Spring AI ChatMemoryRepository 統合
📋LongMemEval + DMR ベンチマークスコア
📋Quarkus 拡張機能
📋クラウド埋め込みプロバイダー(OpenAI text-embedding-3、Google text-embedding-004)

ライセンス

Apache 2.0 — LICENSE をご覧ください。


JamJet の一部 · Sunil Prakash が開発 · © 2026 JamJet Labs

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。