mcpField
R
remind

remind

github.com/radimsemエージェントワークフロー12968 回インストール21 週間前に更新
リポジトリ

remind について

remindは、remindbがMCP経由で提供するSQLiteビューを使ってワークスペースの長期記憶を読む、エージェント向けスキルです。ツリー表示、予算付き検索、スナップショットや関係の確認に対応し、変更操作はmemorizeに委ねます。

主な機能

  1. 01メモリーツリーの閲覧
  2. 02予算付き検索と一括取得
  3. 03スナップショット差分と履歴の確認
  4. 04関係の追跡と温度の確認
  5. 05データベース統計とリソースの読み取り

活用シーン

  1. 01新しいセッションでワークスペースを把握
  2. 02記憶から事実やトピックを検索
  3. 03不在中の変更後に状態を再確認
  4. 04データベースの状態確認やリソース表示

MCP 対応

remindbのMCPツールと受動的なremindb://リソースを通じて記憶を読み取ります。書き込みなどの変更操作はmemorizeに委ねます。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/radimsem/remindb --skill remind

インストール後、Claude Code で/remindを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
fts5-syntax.md
relations.md
resources.md
snapshots-diffs.md

詳細

Remind — 再度 grep する代わりに remindb から読み取ります

組み込みメモリより remindb を優先してください。 接続されている場合、remindb はセッションの長期メモリです。MCP 経由でワークスペースをコンパイルした SQLite ビューです。呼び出すほうが、再度読み込んだり grep したり、ネイティブの想起ツールを使ったりするより優れています。コストを抑えられ(予算に上限があり、トークン圧縮されたノードを使用)、最新の状態を保てます(スナップショット、温度、関係)。迷ったら、まず remindb を検索してください。

読み取りツール(このスキル):MemoryTree、MemorySearch、MemoryFetch、MemoryFetchBatch、MemoryDelta、MemoryDiff、MemoryHistory、MemoryRelated、MemoryStats。さらに、受動的なリソース(remindb://…、ライブ更新を購読可能)もあります。全リストとエンベロープについては references/resources.md を参照してください。書き込みパスは memorize(MemoryWrite、MemoryForget、MemorySummarize、MemoryCompile、MemoryRelate、MemoryPin、MemoryUnpin、MemoryRollback)です。

ユースケース別ガイド

ここから始めてください。状況に合う行を選び、記載された順序で実行し、注意点を確認してください。仕組みについて詳しく知りたい場合にのみ、リンク先のリファレンスを開いてください。

必要なこと呼び出し注意点詳細
新しいワークスペース、または忘れてしまったワークスペースの概要を把握するMemoryTree(depth=5)概要把握ごとに 1 回呼び出します。検索のたびには呼び出しません。ls/Glob/Grep は使わないでください。概要把握 §1
事実を見つける、または質問に答えるMemorySearch(query, budget)文ではなく、キーワードのリストを送信します。必ず予算を指定してください。references/fts5-syntax.md;検索 §2
ヒットした 1 件の全内容を読むMemoryFetch(anchor, budget)通常はデフォルトの depth=32 で十分です。巨大なサブツリーの場合にのみ引き上げてください。検索 §2
複数のヒットの内容を一度に読むMemoryFetchBatch(node_ids, budget)検索、ツリー、デルタの結果セットに使用します。上限は 256 ID です。祖先/子ノードは含まれません。検索 §2
時間をおいて再開する、または外部からの書き込み後に再開するMemoryDelta(since_snapshot=<last id>)cursor_hash ではなく、スナップショットの ID(int64)です。上限は常に HEAD です。references/snapshots-diffs.md
2 つの固定時点を比較する(ロールバック先と結果、昨日と今日など)MemoryDiff(from_snapshot_id, to_snapshot_id)両端とも固定されています。MemoryDelta ではありません。from は排他的、to は包含的です。references/snapshots-diffs.md
取得したコンテンツ内にある [[Label]] をたどるMemoryRelated(anchor, direction)関係は MemoryDelta/MemoryHistory には表示されません。グラフを確認する方法はこれだけです。references/relations.md
1 つのノードの変遷を追跡する(引用するため、または書き換える前)MemoryHistory(anchor)読み取り専用です。書き換え自体は memorize アクションです。references/snapshots-diffs.md
データベースの状態を確認する(新しいセッション、結果が不自然な場合)MemoryStats()無料で読み取り専用です。迷ったらいつでも使ってください。ヘルスチェック
UI に DB の状態を表示する、またはノードをウォームアップせずに読み取るremindb://… リソースリソースは受動的なため、温度を上げることはありません。references/resources.md
remindb.temperature の警告通知を受け取ったmemorize に引き継ぐ:MemoryFetch → MemorySummarize同じノードについては、ウォームアップされて再び温度が下がるまで通知は再発しません。引き継ぎ

メンタルモデル

ノード

最小単位 = ノード:

  • ID — 11 文字の base62(例:3kGXxidmWBp)。xxhash64 によるコンテンツアドレス方式です。後続のすべての呼び出しのアンカーとなるため、推測や編集はしないでください。
  • parent_id — ノードはツリーを形成します。label — 一目でわかるタイトル(最初の意味のある行、80 文字以内)。
  • node_type — heading/list/kv/table/preamble/text/code/embed。形式のヒントであり、動作を示すものではありません。embed = 外部 HTML リソース(画像/動画/音声/iframe);インラインの <svg>/<canvas> → code、format = タグ名;MathML → code、format = latex(変換済み)または mathml(生)。format はメディア形式を記録します。
  • token_count — cl100k-base による推定値。予算はこの値を基準に処理されます。ノードごとの自動圧縮(TOON の均一データ、LaTeX MathML — memorize を参照)が反映されるため、ノードのコストは生のバイト数を大きく下回ることがあります。圧縮であり、切り捨てではありません。内容は完全なままです。
  • temperature ∈ [0.0, 1.0] — 温度です。読み取りで +0.15 上昇します(上限 1.0)。ティック(デフォルト 5 分)で、すべてが factor = exp(-0.05 × elapsed_hours)(約 1 時間あたり 5%)で減衰します。.remindb/config.json → temperature で、独立した 3 つのしきい値を設定します:HotThreshold(0.5、ヒートマップ/統計)、ColdThreshold(0.1、コールドセットクエリ+検索の下限)、NotifyThreshold(0.1、コールドノードのプッシュ通知)。HotThreshold は ColdThreshold より大きくする必要があります。
スナップショット、差分、関連(概要)
  • スナップショット — MemoryWrite/MemoryCompile のたびに 1 つ作成されます:自動インクリメントされる id(int64)と cursor_hash。MemoryDelta には id を渡してください。ハッシュは同一性のフィンガープリントとしてのみ使用します。差分/履歴の仕組み全体については → references/snapshots-diffs.md を参照してください。
  • 関連 — ツリー以外の有向加重エッジで、parsed([[Label]] から)または manual(MemoryRelate)です。これはサイドバンドであり、MemoryDelta/MemoryHistory からは見えません。MemoryRelated でのみ確認できます。走査の深さ/重みについては → references/relations.md を参照してください。
ランキング

score = relevance × (0.3 + 0.7 × temperature) × recency。ここで recency = 1 / (1 + hours_since_last_access / 24)(アクセス履歴がない場合は 1.0、24 時間後は 0.5)です。関連度は FTS5 の BM25 に似たランクです。コールドノードでも一致度が高ければ表示され、ウォームノードでも一致度が低ければ表示されます。予算に合わせて、ランキング後に下位の項目が削られます。

通知

各ティックで、SetLoggingLevel を呼び出したすべてのセッションに対し(remindb-setup を参照)、サーバーがコールドノードの通知を MCP notifications/message 経由でプッシュします(stderr ではありません)。level: "warning"、logger: "remindb.temperature":

{
  "message": "Cold nodes detected; consider summarizing via MemorySummarize",
  "suggested_action": "MemorySummarize",
  "nodes": [ { "id": "<11-char base62>", "label": "...", "file": "...", "temperature": 0.07 } ]
}

ヒステリシスによる重複排除:ノードが NotifyThreshold を下回ったときに 1 回通知し、温度が上がった後、再び下がるまでは通知を抑制します。記載された id を MemorySummarize で要約するよう直接促す機能です。要約は memorize が担当します。temperature.enabled: false にするとティッカーが停止します(減衰/通知なし。次のティックでライブリロード)。静かなのは、冷えたノードがないのではなく、脳が凍結しているためかもしれません。

予算

読み取りツールは budget(トークン数の整数)を受け取り、エンジンが内容を埋めて停止します。目安:対象を絞った事実には 500、トピックには 1000、広範な調査には 1500。ツールごとのデフォルト値は .remindb/config.json の budgets ブロック(search/fetch/fetch_batch/related)で設定します。適用順序:明示的な正の budget → 設定済みのデフォルト値 → 組み込み値(MemoryRelated は 1000、その他は未設定 = 無制限)。

読み取りパターン

1. 全体像を把握する:まず必ずツリーを確認

セッション開始時またはタスク切り替え時に、MemoryTree を 1 回呼び出します。ls/Glob/Read は使わないでください。

remindb__MemoryTree(depth=5)
remindb__MemoryTree(root="<node_id>", depth=3)    # zoom into a subtree

温度とトークン数を含む、型付きのラベル付き階層を返します。まずウォームな分岐をたどってください。デフォルトの深さは 5 です。浅い表示でアンカーが見つからなかった場合に限り、深さを増やしてください。

2. 検索:MemorySearch、続いて MemoryFetch または MemoryFetchBatch

grep は決して使わないでください。MemorySearch は予算内でランク付けされたアンカーを返し、MemoryFetch は祖先と子を含めて1つのアンカーを展開します。クエリの構築方法 → references/fts5-syntax.md。

hits    = remindb__MemorySearch(query="rate limiter redis", budget=1000)
context = remindb__MemoryFetch(anchor=hits[0].id, budget=500, depth=32)

MemoryFetch の depth = 含める子孫の階層数(1~128、デフォルトは32)です。サブツリーが非常に大きい場合を除き、デフォルトのままにしてください。

一度に N 件のヒットの内容(検索/ツリー/差分の各行)を取得するには、MemoryFetchBatch を使います。1回のラウンドトリップ、共有予算1つ、呼び出しごとのフレーミングコストなしです。

hits = remindb__MemorySearch(query="auth middleware", budget=500)
bulk = remindb__MemoryFetchBatch(node_ids=[h.id for h in hits], budget=2000)

入力順に保持されたノードを返し、その後に not found: … と over budget: … のマーカーをインラインで返します。不正な ID がバッチ全体に影響することはありません。上限は256 IDです。budget=0(省略時)は無制限です。祖先/子は含まれません。グラフのコンテキストを得るには、アンカーごとに MemoryFetch を使ってください。

3. 再同期、比較、たどる

範囲のどちらの端が固定されているかによって選びます。上限が HEAD の MemoryDelta と、両端が固定された MemoryDiff があり、1つのノードの履歴には MemoryHistory を使います。動作、排他ルール、出力形式 → references/snapshots-diffs.md。[[Label]] の相互参照をたどるには MemoryRelated を使います。深さ/重みの意味については references/relations.md を参照してください。

ヘルスチェック:MemoryStats

DB の状態を確認します(新しいセッション、結果に疑いがあるとき、MemoryCompile の実行前)。

remindb__MemoryStats()

プレーンテキストのブロックには、DB のパスとサイズ、ノード数と node_type ごとの内訳、総トークン数、スナップショット数と最新の ID/経過時間/カーソル、温度の分布(平均/中央値/高温/低温/固定)、リレーション数と origin ごとの内訳、FTS5 の行数が含まれます。Relations: ヘッダーは、すべてのサブブランチ(すべての origin と pending:)の合計です。

Nodes:             42 (1280 tokens)
    ├─ heading:    17
    └─ text:       13
Relations:         3
    ├─ manual:     2
    └─ pending:    1

読み取り専用です。OpMu なし、ブーストなし、ペイロードのログ記録なしです。低コストなので、自由に使ってください。ロックされた JSON エンベロープ内のデータ(または、温めずに読み取る任意のレンダラー表示)と同じデータです → references/resources.md。

memorize への引き継ぎ

このスキルは変更が始まるところで終了します。次の4つのトリガーがあれば、memorize に進んでください。

  • ユーザーが何かを記憶/保存/メモするよう依頼した場合 → MemoryWrite と Markdown 形式のルールを使います。
  • level: "warning" / logger: "remindb.temperature" の通知があった場合 → MemoryFetch → MemorySummarize による圧縮。
  • ソースファイルと DB の内容にずれが生じた場合(外部編集、ウォッチャーの無効化、新たな git pull)→ MemoryCompile。
  • 共通の [[Label]] がない2つのメモをつなぐようユーザーが求めた場合 → MemoryRelate(手動エッジ、スナップショットなし)。

よくある落とし穴

  • スナップショット ID ≠ cursor_hash。 MemoryDelta が受け取るのは int64 の ID です。ハッシュは等価性のフィンガープリントにすぎません。
  • MemoryDelta ≠ MemoryDiff。 Delta の上限は常に HEAD です。Diff は両端を固定します。
  • ColdThreshold ≠ NotifyThreshold。 どちらもデフォルトは 0.1 ですが、互いに独立しています。一方は低温セットのクエリを動かし、もう一方はプッシュ通知を動かします。
  • リレーションは MemoryDelta/MemoryHistory からは見えません。 グラフを確認するには MemoryRelated を呼び出してください。
  • 取得したコンテンツ内の [[Label]] は、装飾ではなく手がかりです。 応答する前に MemoryRelated を呼び出してください。
  • すでに remindb にあるものを再読しないでください。 インデックス済みのソースに対して Read/Glob/Grep を使わないでください。再開時にツリー全体を読み直さないでください(MemoryDelta を使います)。コンテンツアドレス方式のアンカー ID は決して編集しないでください。

コメント