PLUR について
PLUR は、AI エージェント向けのオープンソースで、ローカル優先の永続メモリです。Claude Code、Codex、Cursor などの MCP ツール間で共有できます。メモリはプレーンテキストの engrams としてディスクに保存され、ユーザーが読み取り、修正、削除できます。
主な機能
- 01セッションとツールをまたぐ永続メモリ
- 02ローカルに保存されるプレーン YAML の engrams
- 03グローバル、プロジェクト、チーム単位の scope 設定
- 04BM25 と埋め込みを組み合わせたハイブリッド検索
活用シーン
- 01コーディングスタイルや修正内容をエージェントに記憶させる
- 02Claude Code と Cursor の間でプロジェクト文脈を共有する
- 03複数プロジェクトの知識を分けて管理する
MCP 対応
PLUR は @plur-ai/mcp による MCP サーバーを提供し、plur init で Claude Code、Codex、Cursor などのクライアントにサーバーとフックを登録します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
14掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| statement | string | はい | その場にいなかった人も行動に移せるように、主張を 1 つ記述します。残りは役割に応じたフィールドに振り分けてください。成立する仕組みは `rationale`、由来は `source`、適用時期は `tags`/`domain` に記録します。「さらに」という内容がある場合は、2 つ目の engram にします。例:「ユーザーが先に顧客名を挙げない限り、顧客名を決して口にしない。」通常は 100~300 文字です。約 600 文字を超えると、別フィールドに属する内容まで含んでいることになります。長さは兆候であり、ルールではありません。 |
| type | enum | いいえ | engram のカテゴリbehavioral | terminological | procedural | architectural |
| scope | string | いいえ | 名前空間。例:global、project:myapp |
| domain | string | いいえ | ドメインタグ。例:software.deployment |
| tags | array | いいえ | 検索可能なキーワードタグ。BM25/埋め込みによる再検索に役立つため、具体的なキーワードが有効です |
| rationale | string | いいえ | その記述を成立させる仕組みと、したがってそれが成立しなくなる条件です。1 文で記述してください。「ユーザーが <date> にそう言ったから」は引用であり、仕組みではありません。`source` に記載してください。このテキストはインデックス化されるため、実際の仕組みには将来のクエリと照合できる具体的な名詞も含めてください。注意:制約は rationale なしで表示されます(plur-ai/plur#1144)。そのため、禁止事項の判断にモデルが考慮する必要のある仕組みは、記述自体に含めてください。 |
| source | string | いいえ | この知識の出典(URL、会話の参照など) |
| pinned | boolean | いいえ | 常時ロードフラグ。true の場合、この engram は注入時にキーワード関連性のしきい値を回避します。使用は慎重にしてください。メタルール、安全上の規約、コアとなる運用原則に限ります。 |
| commitment | enum | いいえ | ユーザーがこの信念をどの程度確信しているか(デフォルト:傾いている)。`draft` は engram を人間の承認待ちとしてマークします。core は通常どおり保存して RECALLS しますが、注入は決して行わないため(#1141)、未承認のルールがエージェントの振る舞いに影響することはありません。レビューには内容の読み取りが必要なため、検索は引き続き可能です。exploring | leaning | decided | locked | draft |
| locked_reason | string | いいえ | この engram がロックされている理由(commitment=locked の場合のみ意味があります) |
| valid_from | string | いいえ | 知識が有効になる ISO 日付(YYYY-MM-DD)。この日付より前は、注入/想起時にこの engram がスキップされます(#347) |
| valid_until | string | いいえ | 知識の有効期限となる ISO 日付(YYYY-MM-DD)。この日付より後は、注入/想起時にこの engram がスキップされます。期間限定の事実(オファー、期限、一時的なエンドポイント)には必ず設定してください。省略した場合、記述内の明示的な期限表現("valid until 31 May 2026")が自動解析され、返されます(#347) |
| supersedes | array | いいえ | この記述が意図的に置き換える Engram ID(#240)。新しい engram に relations.supersedes を書き込み、各ローカルターゲットには逆向きの superseded_by エッジを書き込みます。supersedes で結ばれたペアは緊張スキャンでスキップされます。意図的な更新は矛盾ではありません。既存の事実(新バージョン、ルール変更)を更新するときに使い、矛盾させる場合には使いません。 |
| session_id | string | いいえ | この書き込みが属するセッション(plur_session_start 由来)。明示的な scope が渡されない場合、セッションのデフォルト scope(セッション中の plur_session_scope 変更を含む)を解決します。セッションが 1 つ開いている場合は任意です。開いているセッションがない、または複数あり、session_id も指定されていない場合、セッションのデフォルトは適用されず、書き込みは scope なしの経路を取ります(#243, E7)。 |
| measured_under | object | いいえ | 数値またはベンチマーク由来の主張の測定コンテキスト(#869)。主張された値の測定条件(モデル、source_type、ハードウェア、データセット、日付)を記録します。設定されている場合、同じストア内で異なる構成で行われた 2 つの測定は、緊張スキャナーによって矛盾として扱われません(スキップされたペアはスキャン結果に報告されます)。数値以外の engram では省略してください。 |
| measured_under.model | string | いいえ | モデルまたはシステムのバリアント(例:"claude-opus-4"、"gpt-4o") |
| measured_under.source_type | string | いいえ | ソース環境の種類(例:"local-git"、"gitlab"、"bench"、"production") |
| measured_under.hardware | string | いいえ | ハードウェアまたはランタイムのティア(例:"M3-Pro-36GB"、"A100"、"CI-runner") |
| measured_under.dataset | string | いいえ | データセットまたはワークロードの識別子(例:"LongMemEval-S"、"plur-bench-2026-Q2") |
| measured_under.date | string | いいえ | 測定を行った ISO 日付(YYYY-MM-DD) |
| attribution | object | いいえ | このメモリーの責任者(#961)。すべてのサブフィールドは任意です。推測せず省略してください。エージェントが記録されていないメモリーは正直ですが、架空のエージェントを記録するくらいなら、何も記録しないほうがましです。特定できる人がいない場合は asserted_by に "unidentified" を設定し、省略しないでください。省略すると、特定できないのか、この機能が存在する前に書かれたメモリーなのかを区別できません。 |
| attribution.asserted_by | string | いいえ | 誰または何が主張したか。ローカル名、分散型識別子、"unidentified" など、任意のアドレスを指定できます。 |
| attribution.runtime | object | いいえ | これを書き込むソフトウェア。通常は既知なので、設定する価値があります。 |
| attribution.runtime.name | string | いいえ | |
| attribution.runtime.version | string | いいえ | |
| attribution.model | object | いいえ | 関与したモデルがある場合は、そのモデルを指定します。プロンプトの TEXT は保存されず、ハッシュのみが保存されます。 |
| attribution.model.name | string | いいえ | |
| attribution.model.prompt_id | string | いいえ | |
| attribution.model.prompt_version | string | いいえ | |
| attribution.model.prompt_sha256 | string | いいえ | |
| attribution.tool | object | いいえ | 抽出ツールまたはインポーターとそのバージョン。 |
| attribution.tool.name | string | いいえ | |
| attribution.tool.version | string | いいえ | |
| attribution.on_behalf_of | string | いいえ | ランタイムが代理した当事者。 |
| claim_class | enum | いいえ | この主張がどの KIND に属するか(#963)、また後から信頼度を判断する人にとって最も有用な単一フィールドです。PERSON が明言した場合は "asserted"、YOU が推論した場合は "inferred"、誰かが書いた文章から取得した場合は "documented"、発生した事象の記録には "observed"、成果物の形状から読み取った場合は "structural"、書き換えには "revised" を使います。本当に判定できない場合のみ省略してください。observed | documented | structural | asserted | inferred | revised |
| license | string | いいえ | このメモリーの再利用を規定するライセンスを、"cc-by-4.0" や "apache-2.0" のような SPDX 形式の識別子で指定します。ユーザーが適用するライセンスを実際に述べた場合にのみ設定してください。推測してはいけません。未設定の場合は誰も選んでいないデフォルトが適用され、来歴記録では決定事項としてではなく、未選択として報告されます。 |
| visibility | enum | いいえ | このメモリーを共有する相手の範囲です。デフォルトは "private" で、すべてのエクスポートパックおよび共有 Git 同期から除外されます。このデフォルトは、このマシン上でのチームスコープへの書き込みを防ぎません。visibility を省略した場合、scope がチームストア(例:group:acme/eng)の書き込みは引き続きそのチームストアに送られます。明示的に "private" を設定した場合に限り、その書き込みはローカルに保持されます(ここに保存され、警告が表示されますが、チームストアには送信されません)。ユーザーが他者との共有可能と述べた場合にのみ "public" を設定してください。これはユーザーが決めることであり、あなたが決めることではありません。"public" がなければ、エージェントが書き込んだ内容がパックに含まれることはありません。private | public | template |
詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
PLUR — エージェントが同じメモリを共有
AI エージェントのための永続的なオープンメモリです。ローカルファーストで、コストゼロ。MCP ツール(Claude Code、Codex、Cursor、OpenCode、Hermes、OpenClaw)間で共有できます。エージェントのメモリは、読み取り、修正、削除が可能なプレーンテキストのエングラムであり、変更できない重みではありません。
plur.ai · ベンチマーク · エングラム仕様 · npm · 比較
ベンチマーク
PLUR は単なる検索ではなくメモリです。そのため、複数の観点から全コーパスを対象に測定し、すべての数値を再現できるよう、ハーネスを公開しています。
検索再現率 — LongMemEval-S 全体(N=500)、R@5、完全ローカル:
| スタック | R@5 | 備考 |
|---|---|---|
| BM25 のみ | 92.2% | 埋め込みモデル不要 — 完全にエアギャップ化 |
| ハイブリッド(BGE-small、標準設定) | 95.6% | ローカル埋め込みモデル。一度だけモデルをダウンロード |
| + BGE-reranker-v2-m3 | 97.6% | ローカルのクロスエンコーダー、最高品質 — オプトイン、CPU で p50 約 5 秒 |
数値は plur-ai/plur-bench に基づいています。 PLUR が公開するすべてのベンチマーク数値の正本です。リポジトリ内の数値と plur-bench の数値が異なる場合は、再現可能なハーネスであり、CI で回帰チェックされている plur-bench の数値を優先します。
チャンクの粒度、正規ドキュメントのスコアリング、固定されたコーパス SHA256 — plur-ai/plur-bench で再現できます。これらの数値を得るためにクラウドへの呼び出しは不要です(オプションのクラウド埋め込みモデル openai-3-large を使うと、ハイブリッドで 97.0% に達します)。より高速なリランカー ms-marco-minilm-l6(CPU で p50 約 245 ミリ秒、BGE は約 5 秒)は、再現率が少し下がる代わりに、1 秒未満のレイテンシーを実現します。
ご自身で実行して、結果をお聞かせください。 ハーネスは plur-ai/plur-bench にあります。CPU で実行でき、ローカルでの実行には API キーは不要です。コーパスは自動取得され、SHA による検証も行われます。実行したら、ぜひ結果をお知らせください。結果がこちらと一致しない場合は、特に歓迎します。結果を添えて issue またはディスカッションを作成してください。独立した再現結果は、私たちが公開するどの数値よりも価値があります。ぜひクレジットを記載させてください。
検索結果の再現率 ≠ 回答精度 — 両者は混同せず、別々に報告しています。 リランカースタックでのエンドツーエンド(LLM による判定)の回答精度は 60.5% です。プロンプトにコンテキスト全体を投入した場合は 52.0%、メモリをまったく使わない場合は 5.5% です。
エージェントタスクへの影響 — 同じタスクを、メモリありとなしで比較:Haiku + PLUR は、メモリなしの Opus を上回り、コストはおよそ 10 分の 1 です。ハウスルールでは、Haiku、Sonnet、Opus を通じて 12 対 0 でした。
運用面 — ローカルファースト、検索コストゼロ、設計上データを自分で管理できます。
現在も進行中:LoCoMo、エージェントタスクスイート、ツール間の移植性、減衰/矛盾の正確性。 評価方法の詳細 →
アイデア
月曜日にエージェントのコーディングスタイルを修正します。火曜日には、同じ間違いをします。Cursor でアーキテクチャを説明しても、その夜には Claude Code は何も把握していません。
PLUR はこれを解決します。一度インストールすれば、修正、好み、規約がセッション、ツール、マシンをまたいで保持されます。メモリはディスク上にプレーンな YAML として保存されます。クラウドも、API 呼び出しも、ブラックボックスもありません。
興味深いことに、ツールルーティングとローカルナレッジのベンチマークでは、PLUR のメモリを使った Haiku は、メモリなしの Opus を上回りました。ツールルーティングの性能は 2.6 倍向上し、コストは約 10 分の 1 でした。ボトルネックはモデルの知能ではなく、コンテキストだったのです。
モデルは借り物、メモリは自分のものです。 Haiku を Opus に、あるいは来月リリースされるモデルに切り替えても、推論は自分では制御できないコモディティです。自分のものである部分、つまりエージェントがあなたの仕事について学んだこと、あなたの修正や規約は、他人のクラウドに置いたり、読めない重みに焼き込んだりすべきではありません。PLUR はそれをディスク上のプレーンなファイルに、確認、修正、削除できるオープンな形式で保存します。それこそが、自分の知性を所有するということです。
インストール
Node.js 20 以降が必要です。エディターの設定からインストール済みの MCP サーバーを使用できるよう、両方のパッケージをインストールしてください:
npm install -g @plur-ai/cli@latest @plur-ai/mcp@latest
plur init
plur doctor
セットアップ後、エディターを再起動してください。plur doctor は設定と MCP のハンドシェイクを確認し、検索モデルが見つからず、ダウンロードが許可されている場合はダウンロードします。ダウンロード後、検索はローカルで実行されます。モデルがない場合はキーワード検索に切り替わります。
エージェントに伝える
Set up PLUR memory for me: install @plur-ai/cli@latest and @plur-ai/mcp@latest globally, run `plur init`, then `plur doctor`. Show me any checks that fail.
Claude Code
plur init は ~/.plur/ にローカルストアを作成し、~/.claude.json にユーザースコープの MCP サーバーを登録して、~/.claude/settings.json にグローバルフックを書き込みます。プロジェクトの .mcp.json は別個のプロジェクトスコープ設定です。~/.claude/mcp.json はユーザースコープの登録先ではありません。このフックは、Claude Code が SessionEnd を出力するとメモリを挿入し、セッション状態を閉じます。PLUR をアップグレードした後は、設定を更新するために再度 init を実行してください。
複数プロジェクトのセットアップでは、ドメイン/スコープを使ってナレッジを分けます:
cd ~/projects/my-app
plur init --domain myapp --scope project:my-app
これにより、フックが自動的に適用するデフォルト値を設定した .plur.yaml がプロジェクト内に作成されます。そのプロジェクトで学習したエングラムにはタグが付けられ、想起時にはスコープで絞り込まれますが、グローバルな知識は常に含まれます。
エングラムごとに、内容に応じてスコープを設定してください。 スコープはセッションごとに一度だけ設定するものではありません。各 plur_learn 呼び出しで、そのエングラムの内容に応じて選んだ scope を指定します。チームで共有する知識はチームスコープ(例:PLUR Enterprise が使用する group:<org>/<team>)に、プロジェクトの詳細は project:<name> に、個人の好みはローカルに保存します。スコープを省略して、チームに関係する知識が global に戻ることがないようにしてください。global はすべてのプロジェクトに漏れ、チームストアを設定している場合はチームに届きません。plur_session_start は、トークンが書き込み可能なリモートスコープを一覧表示します。
アップグレード
npm install -g @plur-ai/cli@latest @plur-ai/mcp@latest
plur init
plur doctor
エディターを再起動して、更新された MCP サーバーが起動するようにしてください。
Cursor
プロジェクトのルートから実行します:
plur init --cursor
これにより .cursor/mcp.json、.cursor/hooks.json、.cursor/rules/plur-memory.mdc が書き込まれます。Cursor では縮小版の cursor ツールプロファイルが使用されます。コアツールは直接利用でき、それ以外の操作は plur_admin から利用できます。現在の名前と引数を確認するには、{ "action": "help" } を指定して plur_admin を呼び出してください。
Codex
plur init --codex
~/.codex/config.toml で codex mcp add を使って新しい MCP サーバーを登録し、ライフサイクルフックを ~/.codex/hooks.json に書き込みます(CODEX_HOME でディレクトリを上書きできます)。また、AGENTS.md に PLUR セクションを追加します。~/.codex/ が存在する場合、自動検出されます。
既存の Codex インストールをアップグレードするには、次のコマンドを実行します。
npm install -g @plur-ai/cli@latest @plur-ai/mcp@latest
plur init --codex
plur doctor --codex
Init は、認識された古い PLUR 起動ピンをその場で更新し、環境設定、タイムアウト、ツールポリシー、コメントを保持します。新しいピンとカスタムサーバーまたは HTTP サーバーは保持します。意図的に古い起動エントリを維持するには、--keep-codex-mcp を使用します。設定を変更した後は、Codex を再起動してください。
plur remote --token-env NAME を使用するリモートストアでは、remote と init --codex の両方が、必要な変数名を Codex の env_vars に追加します。トークン値が設定にコピーされることはありません。また、その変数は Codex を起動するプロセスからも利用できる必要があります。PowerShell でエクスポートした変数が、別に起動したデスクトップアプリに引き継がれているとは限りません。
plur doctor --codex は Codex のユーザー設定から MCP コマンドを起動し、Codex 形式の環境フィルタリングを適用して、報告されたバージョンと CLI のバージョンを照合し、トークンの転送漏れや値の不足を報告します。プロジェクトやプロファイルによる上書き、別の実行中アプリケーションの環境、フックの信頼設定、リモートへの書き込みは確認しません。--no-handshake を指定すると、ランタイムは未検証として報告され、ゼロ以外の終了コードが返されます。デスクトップのセットアップを完了とみなす前に、実際の Codex セッションでテストメモリの保存と呼び出しを確認してください。ネイティブ Windows と WSL2 ではホームディレクトリと登録先が異なります。使用する各環境でセットアップを実行してください。
インジェクションではハイブリッド検索(BM25 + 埋め込み)を使用し、埋め込みモデルが遅い場合や利用できない場合は自動的に BM25 にフォールバックします。BM25 を強制するには PLUR_HOOK_HYBRID=0 を設定します(Antigravity のフックにも適用されます。PLUR_CODEX_HYBRID は別名として認識されます)。PLUR_HOOK_HYBRID_DEADLINE_MS でフォールバックまでの期限を調整できます。ハーネスのフックタイムアウト(Codex は 25s、Antigravity は 20s)より短く設定してください。
インストール後に必要な手動の手順が 1 つあります: Codex を開いて /hooks を実行し、PLUR のエントリを信頼してください。Codex は各フックにフィンガープリントを付け、信頼されていないフックを実行しません。しかも、警告もなく、終了コードはゼロのまま黙って拒否します。信頼するまでは、メモリは読み込まれません。plur doctor でもその旨が表示されます。
OpenCode
plur init --opencode
plur doctor
メモリプラグインと MCP ツールを ~/.config/opencode/opencode.json に追加します。ただし、.json が存在しない場合は、既存の opencode.jsonc に追加します。OPENCODE_CONFIG_DIR が優先されます。設定されていない場合は、XDG_CONFIG_HOME/opencode がデフォルトのディレクトリを上書きします。
MCP コマンドは Node と、利用可能な場合はインストール済みの @plur-ai/mcp エントリを使用します。Init は、古い完全一致の @plur-ai/opencode ピンを CLI に同梱されたプラグインのバージョンに更新し、コメント、書式、無関係な設定を保持します。新しいピン、タグ、バージョン指定のないエントリは変更しません。意図的に古いピンを維持するには、--keep-opencode-plugin を使用します。変更した設定を読み込むには、OpenCode を再起動してください。プラグインの詳細。
利用できる連携
すべての MCP クライアントから PLUR のツールを呼び出せます。アダプターがあるのは一部のみです。アダプターには、エージェントが思い出すのを待たずにメモリを自動的に読み込むためのフックと、常時有効なコンテキストが含まれます。アダプターがない場合、想起と学習はモデルがツールを呼び出すと判断するかどうかに完全に依存するため、コンテキストの圧迫が進むと大きく劣化します。
| ハーネス | ツール | 自動挿入+強制適用 |
|---|---|---|
| Claude Code | ✅ | ✅ フック+CLAUDE.md |
| Codex | ✅ | ✅ フック+AGENTS.md(/hooksを一度信頼してください) |
| Cursor | ✅ | ✅ フック+ルール |
| OpenCode | ✅ | ✅ メモリプラグイン+MCP ツール |
| OpenClaw | ✅ | ✅ ContextEngine プラグイン |
| Hermes | ✅ | ✅ プラグイン |
Antigravity CLI(agy) | ✅ | ✅ フック+AGENTS.md |
| Windsurf、Gemini CLI、その他の MCP クライアント | ✅ | ❌ ツールのみ |
お使いのハーネスが最後の行にある場合は、暫定策としてCLAUDE.mdの PLUR セクションを専用のコンテキストファイル(AGENTS.md、GEMINI.mdなど)に貼り付けてください。これにより指示レイヤーは復元されますが、自動挿入は行われません。
Antigravity CLI(agy)
plur init --antigravity
フックと MCP サーバーを agy のグローバル設定(~/.gemini/config/)に書き込み、AGENTS.mdに PLUR セクションを追加します。~/.gemini/antigravity-cli/が存在する場合は自動検出されます。信頼する手順は不要です。agy は初回の呼び出し時に設定済みのフックを実行します。agy を再起動するだけで使えます。
Antigravity にはセッション開始イベントもプロンプトごとのフックもないため、PLUR はすべてをPreInvocationから実行します。プロンプトごとの想起には会話のトランスクリプトが読み込まれ、ツール呼び出しをまたいでもメモリを維持しつつ履歴に蓄積しないよう、そのターンのメモリがモデルの呼び出しごとに一時メッセージとして再挿入されます。
Gemini CLI ユーザーの方へ:Google は Gemini CLI から Antigravity への移行を進めています。agyをインストールし、上記のコマンドを実行してください。Gemini CLI 自体は引き続きツールのみを利用できます。
OpenClaw
openclaw plugins install @plur-ai/claw
openclaw config set plur.enabled true
これで完了です。以降、PLUR はバックグラウンドで動作します。ワークフローを変更する必要はありません。いつもどおりツールを使うだけです。修正内容は自動的に蓄積されます。
DeepSeek Harness
dsh plugin add @plur-ai/dsh
MCP ブリッジではなく、ネイティブに動作します。PLUR は Cordis プラグインとしてマウントされ、エングラムをシステムプロンプトに直接書き込みます。そのため、モデルは自分自身への指示と同じようにエングラムを読み取れます。ツール呼び出しも、ラウンドトリップも、参照するかどうかを判断するためにターンを費やすこともありません。セッション中にメモリがコンテキストへ蓄積されないよう、このセクションは追加されるのではなく、各アセンブリのたびに再生成されます。
エージェントが意図的にメモリを参照する場合に備えて、5 つのツール(plur_recall、plur_learn、plur_forget、plur_feedback、plur_status)も登録されています。スコープはデフォルトで閉じられており、各ワークスペースには、.plur.yamlから解決される独自のスコープが設定されます。
/plurでステータスを確認できます。/plur-memoryで以下のメモリビューアーを開けます。
Hermes Agent
pip install plur-hermes
npm install -g @plur-ai/cli
このプラグインは Hermes のプラグインシステムを通じて自動的に登録されます。各 LLM 呼び出しの前に関連するメモリを挿入し、エージェントの応答から学習内容を抽出して、すべての PLUR ツールをエージェントに公開します。Hermes は PLUR CLI をシェルから呼び出します。
Python SDK(LangChain、llama.cpp、スクリプト)
Hermes 以外の Python 環境の場合:
pip install "plur-ai @ git+https://github.com/plur-ai/plur.git#subdirectory=packages/python"
npm install -g @plur-ai/cli # bridge (required)
注:
plur-aiはまだ PyPI に登録されていません。#915が解決するまでは、上記の Git インストールを使用してください。
from plur_ai import Plur
plur = Plur()
plur.learn("always use async generators for streaming LLM output")
results = plur.recall("streaming patterns")
context = plur.inject("write a streaming endpoint", limit=10)
plur-aiは Claude Code や OpenClaw と同じディスク上のストアに接続します。Python から書き込んだメモリは、すべてのツールからすぐに参照できます。LangChain および llama.cpp の連携例については、packages/python/examples/を参照してください。
動作確認
plur doctorを実行してから、エージェントにplur_statusを呼び出し、エングラム数とストレージのパスを表示するよう依頼してください。デフォルトの軽量 MCP プロファイルでは、コアツールが直接公開されます。残りの操作とそのスキーマを確認するには、{ "action": "help" }を指定してplur_adminを使用してください。
メモリを確認する
plur dashboard
すべてのエングラムを一覧表示するローカルページを開きます。学習した内容、実際に想起された内容、想起された頻度を確認できます。読み取り専用で、ループバック接続のみで利用でき、お使いのマシン上で提供されるため、何もアップロードされません。--port でポートを変更し、--no-open でブラウザーを開かないようにできます。DeepSeek Harness 内では、同じページを /plur-memory で開けます。
英語と中文に対応しており、ブラウザーの設定に従います。または ?lang=zh を指定できます。
動作を確認する
起動したら、エージェントに一度だけ教えてみましょう。
「このプロジェクトでは必ず
pnpmを使ってください。npm installは CI でロックファイルを壊します。」
翌日に新しいセッションを開始して、次のように尋ねてみましょう。
You: How do I run the tests?
<plur-memory> 1 engram · project:my-api </plur-memory>
Agent: Use pnpm — you mentioned npm breaks the lockfile in CI:
pnpm test # full suite
pnpm test -- src/auth.test.ts # single file
新しいセッションです。念押しはありません。それでも訂正内容は覚えられていました。
これこそ PLUR の効果が発揮される瞬間です。エージェントは、読み取り可能なファイルに記載されていなくても、一度伝えただけのプロジェクト規約を記憶しています。
仕組み
PLUR には、2 つのストレージプリミティブがあります。
エングラム — セッションをまたいで保持される学習済み知識です。各エングラムは、「ブルーグリーンデプロイを必ず使う」「main に強制プッシュしない」といった、型付きのアサーションです。次の要素があります。
- 活性化 — 時間の経過とともに減衰し(ACT-R モデル)、アクセスするたびに強まる検索強度です。古くなった事実は、手動で整理しなくても、注入される頻度が自然に下がります。
- フィードバックシグナル — 注入の品質を時間とともに高める、肯定的または否定的な評価です。
- スコープ — エングラムが適用される範囲を制御する、階層型の名前空間(
global、project:myapp、cluster:prod、service:api)です。 - 極性 — 「すべき」ルールと「してはならない」ルールを自動的に分類し、制約を指示とは分けて注入します。
- 関連付け — 他のエングラムへのリンクです。エングラムが一緒に想起されると、自動的に共アクセスのエッジが形成されます。
エピソード — 「いつ何が起きたか」を記録した、タイムスタンプ付きのイベント記録です。各エピソードには、概要、タイムスタンプ、エージェントの識別情報、チャネルが記録されます。インシデントの時系列、セッションログ、運用履歴にエピソードを使用できます。時間範囲、エージェント、チャネルで検索できます。
You correct your agent → engram created → YAML on your disk
Agent fixes an incident → episode captured → timeline searchable
Next session starts → relevant engrams injected → agent remembers
You rate the result → engram strengthens or decays → quality improves
Unused engrams → activation decays → naturally fade from injection
検索は完全にローカルで実行されます。BM25(IDF 重み付け、TF 飽和、長さの正規化)+ BGE エンベディング + Reciprocal Rank Fusion を使用します。API 呼び出しはゼロで、クエリごとのコストもかかりません。ベンチマークの方法 →
プラグイン(OpenClaw、Hermes)が、エージェントとの会話から学習内容を自動的に取り込みます。手動で保存する必要はありません。何もしなくても、エージェントの訂正内容がエングラムになります。
スキーマの詳細、活性化モデル、注入アルゴリズムについては、エングラムの完全な仕様をご覧ください。
オープンフォーマット
エングラムはオープンで、バージョン管理されたフォーマットであり、ブラックボックスではありません。すべてのエングラムは、公開されている JSON Schema に照らして検証されるプレーンな YAML です。このスキーマは、エンジンが使用するものと同じ Zod ソースから生成されています(スキーマは spec/ にあります)。読み取ったり、Git で差分を確認したり、独自のツールを作成したり、同じフォーマットで別のエンジンを構築したりできます。メモリが PLUR に縛られることはありません。
使い方
import { Plur } from '@plur-ai/core'
const plur = new Plur()
// Learn from a correction. The engine's read and write methods are async —
// they return promises so a `Plur` can be backed by a network store as well
// as by the default local YAML one.
await plur.learn('toEqual() in Vitest is strict — use toMatchObject() for partial matching', {
type: 'behavioral',
scope: 'project:my-app',
domain: 'dev/testing'
})
// Recall (hybrid: BM25 + embeddings, zero cost)
const results = await plur.recallHybrid('vitest assertion matching')
// Inject relevant engrams into agent context. You get context blocks ready to
// paste into a prompt plus the IDs that went into them — not the engrams
// themselves. `budget` is the ceiling in tokens; selection fills it by relevance.
const injection = await plur.inject('Write tests for the user service', {
scope: 'project:my-app',
budget: 2000
})
console.log(injection.directives) // also .constraints, .consider
console.log(`${injection.count} engrams, ${injection.tokens_used} tokens`)
// Feedback trains the system — rate anything you have an ID for, whether it came
// back from recall or went out in an injection (injection.injected_ids).
if (results[0]) await plur.feedback(results[0].id, 'positive')
// Capture an event (episode). Episode operations stay synchronous — they are
// backed by episodes.yaml, not the engram primary store.
plur.capture('Fixed CrashLoopBackOff on bee-3-4 by increasing memory limits', {
agent: 'claude-code',
channel: 'terminal'
})
// Query timeline
const incidents = plur.timeline({ agent: 'claude-code' })
// Sync across machines (use a private git remote — all engrams including private-visibility ones are pushed)
await plur.sync('[email protected]:you/plur-memory.git')
ツール
| ツール | 機能 |
|---|---|
plur_learn | 修正、好み、または規約を保存します |
plur_learn_batch | 1 回の呼び出しで複数のエングラムを保存します(一括重複排除+項目ごとの障害分離) |
plur_recall | 関連する記憶を取得します。デフォルトではハイブリッド(BM25 + 埋め込み)です。BM25 のみを使うには mode:"keyword" を指定します |
plur_inject_hybrid | トークン予算内で現在のタスクに適したエングラムを選択します |
plur_feedback | 関連性を評価します(評価を重ねることで品質が向上します) |
plur_forget | 記憶を廃止します(有効度は低下し、最終的に整理されます) |
plur_rescope | 既存のエングラムを別のスコープに移動します。個人用からチーム用へ、またはその逆に移動できます |
plur_session_scope | セッション中に、セッションのデフォルト書き込みスコープを変更します |
plur_capture | インシデント、解決策、セッションの節目などのイベントを記録します |
plur_timeline | 時刻、エージェント、またはチャネルでエピソード履歴を検索します |
plur_ingest | テキストからエングラムを自動的に抽出します |
plur_sync | git 経由で同期します。personal リモートはすべてをミラーリングします(非公開リポジトリを使用してください)。shared リモートには、共有スコープの非公開ではないエングラムのみが送信されます |
plur_status | システムの健全性とエングラム数を確認します |
plur_receipt | 記憶が取得した内容をローカルで集計して報告します |
plur_outbox | ストアに接続できなかった間にキューに追加されたチーム向けの書き込みを確認(および再試行)します |
outbox
チームスコープへの書き込みは、そのチームのリモートストアに送られます。ストアに接続できない場合(VPN がオフ、サーバーがダウン、トークンの期限切れなど)でも、エングラムが失われたり、通知なく破棄されたりすることはありません。キューメタデータとともにローカルに書き込まれ、次のセッション開始時、plur sync 実行時、または要求時に再試行されます。
キューはディレクトリではありません。影響を受けるエングラムの engrams.yaml 内にある structured_data._outbox として保存されるため、確認するにはコマンドが必要です。
plur outbox # what is queued, for which scope, how long, last error
plur outbox --flush # retry now
エージェントでは plur_outbox(再試行するには {flush: true})からも同じ機能を利用でき、plur status は保留中の件数を報告します。どちらの方法でも、対象 URL やトークンは表示されません。
メモリレシート
plur receipt(および plur_receipt MCP ツール)は、メモリが実際に行った処理を表示します。推定ではなく、PLUR 独自の取得履歴から集計します。
Your Memory Receipt
===================
2026-07-03 .. 2026-07-22 (71 sessions)
423 times a memory you taught PLUR
was put in front of the model.
(plus 45 times an installed-pack memory)
across 71 retrievals in 71 sessions
drawing on 162 distinct engrams
MOST-RELIED-ON
34x PLUR positioning thesis across every vertical: PLUR layers …
28x Datacore app CoS architecture: reasoning layer added on to…
...
STORE HEALTH
4,517 engrams stored (you: 3,746, packs: 771)
162 retrieved at least once (4% of store)
4,355 not retrieved since 2026-07-03 (96%)
Over a short logging window a low rate is expected, not a fault —
memory is meant to be selective, and much of the store predates logging.
(REUSE の統計とカバレッジに関する注意事項も表示されますが、ここでは長さの都合で省略しています。)
これはローカルで読み取り専用であり、設計上、金額やトークン数は表示しません。サブスクリプションでは追加のトークンコストはゼロであり、再発見を回避できた価値はこのデータから測定できないためです。レシートには集計可能な内容だけが報告されます。アクティベーション率は品質スコアではなく、ログ記録期間におけるストアのカバレッジです。元々低く、エングラムを追加するほど低下します。--days N は期間を絞り込み、--json は未加工の形式で出力します。(plur_receipt MCP ツールは同じ数値に加えて、この位置付けをエージェントに伝える 1 行の summary も返します。)
デバイス間で同期する
plur.sync(remote) は内部で git を使用します。エングラムストアをコミットし、指定したリモートにプッシュします。プッシュされる内容は、リモートに宣言されたタイプ(config.yaml の sync.remote_type、または remote_type 引数)によって異なります。
personal(デフォルト)— ご自身のマシン間で使用するバックアップ/ミラーです。リモートには、プッシュされたすべての内容が届きます。visibility: privateのエングラムも含まれます。private の可視性は「パックで共有しない」という意味であり、「自分のデバイスにはミラーしない」という意味ではありません。そのため、private のエングラムは意図的にマシン間で引き継がれます。したがって、必ずプライベートな git リモート(非公開の GitHub/GitLab リポジトリ、またはご自身のサーバー)を使用してください。private のエングラムが存在する場合、PLUR は同期結果にwarningを表示します。personal 同期の接続先に公開リポジトリを指定しないでください。shared— チームで閲覧できるリモートです。shared 系のスコープ(group:/project:/space:/team:/org:/public)かつ private ではない可視性のエングラムだけがプッシュされます。personal 系のエングラム(local、global、user:*、agent:*)と private の可視性を持つエングラムは、設計上リモートに届きません。デフォルトの可視性はprivateなので、shared リモートが受け取るのは、意図的に可視性を設定したエングラムだけです。チームメイトに届くのは、共有すると選んだ内容のみです。同じ保証は関連するストアファイルにも適用されます(#686)。エピソード、候補、緊張の記録がプッシュされるのは、それが参照するすべてのエングラムがプッシュ対象に含まれる場合のみです。personal または private のエングラムから派生した記録(緊張のステートメントのスナップショットや失敗レポートのエピソードなど)はローカルに留まり、フィルターで解決できないエングラムを参照する記録も同様です。
どちらのモードでも、scope: local のエングラムは設計上マシン固有(パス、ローカルポート、ホストごとの固有設定など)なので、すべてのコミットから除外され、リモートには届きません。除外はステージングされた blob に対して行われます。ローカルの作業コピーには、すべてのエングラムが常に保持されます。
ベンチマークの詳細
カテゴリ別の検索再現率。以前にリポジトリ内で実行した結果です。LongMemEval-S 全体(N=500)を、完全ローカル環境(BGE-small + BGE-reranker-v2-m3、チャンク単位)で測定しました。全体の値(98.0%)は、同じスタックで現在の plur-bench が測定した値(97.6%)より前のものであり、カテゴリ別の再測定は行われていません。傾向の参考として扱い、現在の値としては上記の概要表を参照してください。
| カテゴリ | R@5 | R@10 |
|---|---|---|
| 単一セッションのアシスタント | 100.0% | 100.0% |
| ナレッジの更新 | 100.0% | 100.0% |
| 単一セッションのユーザー | 98.6% | 100.0% |
| 複数セッション | 98.5% | 100.0% |
| 時間的推論 | 97.7% | 98.5% |
| 単一セッションの好み | 86.7% | 90.0% |
| 全体 | 98.0% | 99.0% |
検索再現率(適切な記憶を見つけること)と、エンドツーエンドの回答精度(その後モデルが正しく回答するかどうか)は異なる指標です。PLUR はこれらを別々に測定・報告し、混同することはありません。上記のエージェントへの影響を示す数値は、同一タスクでメモリあり/なしを比較した A/B テストによるものです。
PLUR と他のエージェントメモリツールの比較
Mem0、Letta(MemGPT)、Zep はそれぞれ実際の課題を解決します。プラグイン可能なメモリ API(Mem0)、自己管理型エージェント OS(Letta)、時間軸を持つナレッジグラフ(Zep)です。PLUR が目指すのは、これらのどれもが単独では提供していない次の組み合わせです。
- 自分で所有できるプレーンテキスト — エングラムは人間が読める YAML なので、読んだり、
git diffで確認したり、編集したり、確実に削除したりできます。内容を確認するためにツールが必要な、不透明なベクトル、エージェント状態のブロック、グラフノードではありません。 - ローカル優先、無料 — BM25 とローカル埋め込みのハイブリッド検索により、完全にオフラインで動作し、API の利用料金もかかりません(クラウドへの呼び出しなしで、LongMemEval-S コーパス全体に対して R@5 98%を達成。詳細は上記をご覧ください)。
- Git を介してチームで共有可能 —
plur syncは内部で git を使用するため、同じメモリを複数のマシン間だけでなく、チーム内でも共有できます。ほとんどのツールは単一ユーザーのローカル利用かクラウドでのチーム利用のどちらかですが、PLUR は両方に対応し、データも自分で保持できます。 - ツールをまたいで使える — 同じ
~/.plur/ストアを Claude Code、Cursor、Windsurf、OpenClaw、Hermes で使用できます。メモリが特定のベンダーに閉じ込められることはありません。 - 学習し、忘れる — フィードバックを用いて学習する検索機能に、ACT-R に基づく減衰とオンデマンドの矛盾スキャンを組み合わせており、際限なく増え続けるストアではありません。
ホスト型メモリ API や時間軸を持つナレッジグラフが必要なら、その用途向けに作られたツールをお使いください。読み、所有し、チームで共有し、ツール間で移行できるメモリが必要なら、それが PLUR です。詳細な比較については、comparisons/ をご覧ください。
PLUR とは何か、何ではないか
PLUR はエージェントメモリです。AI エージェントが作業セッション中に学習した修正、好み、規約、アーキテクチャ上の決定を保存し、それらが関連する場面で呼び戻します。
PLUR は汎用検索エンジン、コードベースのインデクサー、コードインテリジェンスツールの代替ではありません。AST の解析、クラス階層のナビゲーション、ソースファイルの検索は行いません。コードを理解した検索(tree-sitter、言語サーバー機能、シンボル検索)が必要なら、claude-mem のようなツールや IDE に組み込まれた検索が適しています。
この 2 種類のツールは相互に補完し合います。
| PLUR | コードインテリジェンスツール | |
|---|---|---|
| 保存する内容 | 学習した知識(エングラム)+イベントのタイムライン(エピソード) | コード構造、シンボル、定義 |
| 検索 | エングラムの呼び出し(メモリに対する BM25+埋め込み検索) | AST の走査、シンボル検索、セマンティックコード検索 |
| 学習方法 | エージェントへの修正、フィードバック、使用パターンから学習 | ソースコードの静的解析から学習 |
| 取り込み | 会話から学習内容を自動抽出(プラグイン経由) | 該当なし |
| 減衰 | あり — 使用されないメモリは薄れていきます(ACT-R モデル) | なし — コードインデックスは現在の状態を反映します |
| タイムライン | エピソードが、何がいつ起きたか(インシデント、修正、決定)を記録します | Git ログのみ |
| ツール間の対応 | あらゆる MCP クライアント(Claude Code、Cursor、Windsurf、OpenClaw、Hermes) | 通常は単一のツールに限定 |
検索は PLUR の中核機能の 1 つですが(呼び出すべきエングラムを見つけるため)、検索対象は常にエングラムであり、ファイル、コード、ドキュメントではありません。PLUR のハイブリッド検索(BM25+埋め込み+RRF)は、ソースコードではなく、短い自然言語の断定文に最適化されています。
パッケージ
| パッケージ | 説明 |
|---|---|
@plur-ai/core | Engram エンジン — 学習、想起、注入、検索、減衰 |
@plur-ai/mcp | Claude Code、Cursor、Windsurf 用 MCP サーバー |
@plur-ai/claw | OpenClaw ContextEngine プラグイン |
@plur-ai/cli | CLI — plur learn / recall / inject / status |
@plur-ai/dsh | DeepSeek Harness プラグイン — プロンプト内のエングラム、ツール呼び出し不要 |
@plur-ai/opencode | opencode プラグイン — プロンプト内のエングラム、ツール呼び出し不要 |
@plur-ai/migrate | ストアのマイグレーション。移行先のリリースに同梱 |
plur-hermes | Hermes Agent プラグイン(Python、CLI ブリッジ経由) |
plur-ai | Python SDK — LangChain、llama.cpp、スクリプト用の学習/想起/注入 |
plur-langchain | LangChain BaseMemory + BaseChatMessageHistory アダプター |
packages/ui は内部用です。メモリビューアーのページで、公開されずに CLI と
DeepSeek Harness プラグインにバンドルされています。npm にはありません。
アーキテクチャ
@plur-ai/core
├── engrams.ts Engram CRUD + YAML persistence
├── episodes.ts Episode capture + timeline queries
├── fts.ts BM25 with IDF, TF saturation (k1/b), length normalization
├── embeddings.ts BGE-small-en-v1.5, 384-dim, local ONNX
├── hybrid-search.ts Reciprocal Rank Fusion
├── inject.ts Context-aware selection + spreading activation
├── decay.ts ACT-R activation decay
├── secrets.ts Secret detection (API keys, passwords, tokens)
├── sync.ts Git-based sync + file locking (O_EXCL)
├── storage.ts Path detection + YAML I/O
└── storage-indexed.ts Optional SQLite read index
@plur-ai/mcp Wraps core as MCP tools
@plur-ai/claw OpenClaw ContextEngine hooks (assemble/compact/afterTurn)
plur-hermes Python plugin for Hermes Agent (auto inject/learn)
plur-ai Python SDK — direct learn/recall/inject for scripts and frameworks
ストレージ
すべてプレーンな YAML です。開いて、読んで、編集できます。
~/.plur/
├── engrams.yaml # learned knowledge (source of truth)
├── episodes.yaml # session timeline
├── config.yaml # settings
└── engrams.db # optional SQLite read index (auto-generated)
PLUR_PATH でデフォルトの場所を上書きできます。
インデックス作成はデフォルトで有効(index: true)で、ストアのサイズに応じて
バックエンドが選択されるため、通常は設定不要です。
| ストアのサイズ | バックエンド | クエリに応答するもの |
|---|---|---|
| 5,000 エングラム未満 | yaml | メモリ内 BM25 + 正確なコサイン類似度 |
| 5,000 以上 | pglite | 組み込み Postgres + pgvector |
| 50,000 以上 | postgres | 接続先に指定した Postgres サーバー — SQL 内の BM25、メモリ内でのセマンティック想起スコア計算(下記参照) |
postgres(ADR-0001、ADR-0005)を除くすべての階層で、YAML が信頼できる唯一の情報源です。
インデックスは自動的に再構築されるキャッシュで、いつでも削除できます。
特定の階層を明示的に指定するには、config.yaml で backend: を設定してください。
postgres 階層には注意点があります。この表の見出しにあたる行なので、ここで説明します。
core は埋め込みベクトルを Postgres のプライマリストアに書き込みません
(ADR-0005 の修正)。キーワード/BM25 による想起は SQL で実行されますが、
デプロイ環境でデータが投入されない限り engram_embeddings は空のままです。
そのため、セマンティック想起とハイブリッド想起ではエングラムを読み込んでメモリ内で
スコアを計算します。結果は正確ですが、この階層で本来回避できる O(N) のコストが
かかります。アダプターはスキーマ初期化時に一度だけこの旨を通知します。
vectorIndex: 'exact' を設定すると、この通知が抑制されます。
sqlite(better-sqlite3 経由の engrams.db)は従来のインデックスであり、
自動選択されなくなりました。
要件
- Node.js 18 以降
- 最低 2GB の RAM — 埋め込みモデル(ONNX runtime)のインストールには約 1GB 必要です。RAM がそれより少ないサーバーでは埋め込み処理がスキップされ、検索は BM25 キーワードマッチングにフォールバックします。
開発
git clone https://github.com/plur-ai/plur.git
cd plur
pnpm install && pnpm build && pnpm test
約 200 ファイルにわたる約 3,500 件のテストがあります。開発時は pnpm test:watch を使用してください。
コントリビューション
- バグ報告 — 再現手順を記載した issue
- 機能リクエスト — ユースケースを説明した issue
- コード — フォークし、ブランチを作成して PR を送ってください。テストが必須です。
- インテグレーション — 他のツール向けに PLUR サポートを構築してください
提出前に、pnpm test が成功し、pnpm build が完了することを確認してください。相談なしに core へ外部依存関係を追加しないでください。
規約:TypeScript、Zod による検証、Vitest、core では外部 API を使用しない、YAML ストレージ、デフォルトでは検索コストゼロ。
ライセンス
Apache-2.0
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
