mcpField
R
Recall

Recall

ローカル
github.comメモリ・ナレッジ63 日前に更新

Recall について

Recallは、エージェント向けの永続メモリと実行状態を提供するGoライブラリ、コマンドラインサーバー、Pythonクライアントです。事実の訂正履歴や時点指定の読み取りに対応し、中断したエージェントは記録から再開できます。データは運用者が用意するデータベースに保存されます。

主な機能

  1. 01事実の訂正と履歴を保持
  2. 02時点指定の読み取りと根拠の説明
  3. 03作業状態、ターン、ツール呼び出しを記録
  4. 04記録から中断したエージェントを再開
  5. 05ローカル、PostgreSQL、MongoDB、Qdrantなどに対応

活用シーン

  1. 01会話をまたいでユーザーの好みを保存・訂正
  2. 02過去の時点でエージェントが認識していた事実を確認
  3. 03クラッシュや移行後にタスクの進捗を再開
  4. 04複数エージェントに分離された名前空間を提供

MCP 対応

メモリと状態を操作するMCPツールを提供します。ローカルではstdioで接続でき、streamable HTTP対応サーバー経由でも利用できます。

設定

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

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ

ツール

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

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

詳細

Polign Recall

Recall は、会話やプロセスが終わっても保持されるメモリと状態をエージェントに提供します。メモリとは、エージェントが知っていることです。ユーザーが述べた事実と、その訂正がすべて保持されるため、エージェントは現在信じていること、以前信じていたこと、そしてその理由を説明できます。状態とは、エージェントが置かれている状況です。進捗、次のインスタンスに向けたメモ、実行中だったツール呼び出しが保持されるため、クラッシュしたり別のマシンに移動したりしても、自身の記録から実行を再開できます。

Recall は Go ライブラリであり、MCP ツールと HTTP で同じ操作を提供する recall バイナリ、そして Python クライアントも含まれています。データは、ユーザーが運用する polign_db、PostgreSQL、MongoDB、Qdrant のいずれかに保存されます。Apache 2.0 ライセンスです。

9 か月間で事実が変化したユーザーについての質問に答える Recall、mem0、Zep

9 か月間にわたる 1 人のユーザー、3 軒の住居、3 社の勤務先、3 つの仕事用メールアドレス、6 つの質問。Claude Opus 5.5 が 3 つのシステムすべてで抽出、回答、評価を行いました。Recall は 18/18、mem0 は 18/18、Zep は 12/18 でした。1 件のメッセージを保存するためのトークン数は、Recall が 3.0k、mem0 が 12.7k、Zep が 14.7k です。

インストール

pip install polign-recall          # the Python client, the recall binary, and the database it runs
brew install polign/tap/recall     # the same for Homebrew
go install github.com/Polign/recall/cmd/recall@latest   # the binary alone; it fetches the database on first use

次に、お使いのエージェントに設定します。

claude mcp add recall -- recall mcp -write      # Claude Code

Cursor に追加 · VS Code に追加 · その他の MCP ホストの場合:コマンドは recall、引数は mcp -write です(詳細)。

何も設定しない場合、メモリは ~/.local/share/recall 内のローカルデータベースに保存されます。このデータベースは初回使用時に起動し、マシン上のすべてのエージェントで共有されます。始めるにあたって、モデルや API キーは必要ありません。すでに運用しているデータベースにメモリを保存する方法については、バックエンドをご覧ください。

訂正の例

変更はすべて保持されます。記録を読み取るコマンドは 3 つあります。

$ recall history "which editor do I use"
user preferred editor
  believed now: user preferred editor: zed
  2026-09-01 10:00  stated, user_stated
      + user preferred editor: vim
  2026-09-20 10:00  replaced, user_stated
      - user preferred editor: vim
      + user preferred editor: emacs
  2026-10-05 10:00  replaced, user_stated
      - user preferred editor: emacs
      + user preferred editor: zed

$ recall ask -as-of 2026-09-25 "which editor do I use"
Believed as of 2026-09-25 00:00:
user preferred editor: emacs  (since 2026-09-20)
  replaced: vim  (since 2026-09-01)

$ recall diff -from 2026-09-15 -to 2026-10-31
Changed between 2026-09-15 00:00 and 2026-10-31 00:00:
- user home city: Lisbon
+ user home city: Porto
- user preferred editor: vim
+ user preferred editor: zed

Recall を選ぶ理由

  • 訂正は上書きではなく、記録として残ります。 新しい値は、内容を確認できるルールに従って古い値に置き換わり、回答には置き換えられた内容も常に含まれます。
  • どの時点の情報も読み取れます。 as_of、history、diff により、エージェントがその時点で何を信じていたか、いつ変わったかを確認できます。
  • すべての回答に情報源があります。 recall explain を使うと、事実の出どころとなったメッセージ、適用されたルール、その履歴を確認できます。
  • エージェントは記録から再開できます。 クラッシュしたエージェントや別の場所に移動したエージェントは、スナップショットではなく、作業状態、直近のやり取り、未完了のツール呼び出しを復元できます。
  • 保存先もルールも自分で決められます。 メモリは、すでに運用しているデータベースに保存され、何を記憶するかの語彙は自分で定義することも、制限なく使えるようにすることもできます。

クイックスタート

Python 3.10 以降が必要です。好みを保存してから、訂正してみましょう。

pip install polign-recall
python - <<'PY'
from polign_recall import Client

with Client(local_dir="./recall-data") as memory:
    memory.remember("user", "prefers_editor", "vim")
    memory.remember("user", "prefers_editor", "neovim")
PY

別のプロセスから、現在の値、履歴、訂正前に信じられていた内容を読み取ります。

python - <<'PY'
from polign_recall import Client

with Client(local_dir="./recall-data") as memory:
    print(memory.recall("user", "prefers_editor")[0].value)   # neovim

    events = memory.history("user", "prefers_editor")
    print([e.value for e in events])                           # ['vim', 'neovim']

    before = memory.recall("user", "prefers_editor", as_of=events[0].observed_at)
    print(before[0].value)                                      # vim
PY

./recall-data を最初に開いたクライアントが、その場所にローカルデータベースを起動し、後続のクライアントはそれを共有します。プログラムの終了後もメモリはそこに残ります。引数なしの Client() は ~/.local/share/recall を使い、マシン上のすべてのエージェントでメモリを共有します。Python クライアントガイドでは、モデルを使ったプレーンテキストのメモリ、忘却、履歴、エージェントの再開について説明しています。

メモリの仕組み

メモリは、対象、述語、型付きの値で構成されます。例:user、 prefers_editor、neovim。述語はレジストリに登録されており、値の型、 述語が単一の値を持つか複数の値を持つか、どの述語と矛盾するかが定義されています。例: dislikes は likes を、gave_away は owns を除外します。単一値の述語は新たな 記述があると値を置き換えますが、複数値の述語は値を蓄積します。忘却は撤回として記録され、 削除は行われません。Recall には、コーディング、パーソナルアシスタント、サポート、営業、音声エージェント向けの スターターレジストリが用意されています。また、 すでに記憶された内容に手を加えることなく、後からレジストリを変更できます。

述語を定義する必要はありません。 オープンボキャブラリーでは、述語を初めて使うときに その述語が定義されます。また、モデルを設定すれば、MCP ツールはプレーンテキストを受け取り、 述語はどこにも現れません。

recall setup -extract-model anthropic:claude-haiku-4-5-20251001
remember("I switched from helix to zed last week")
recall("which editor do I use?")  ->  "user prefers editor: zed" (before: helix)
forget("my editor")

モデルが各記述の分類方法を決定します。分類後は述語のルールに従って置き換えが行われ、 分類はすべて記録されます。誤った分類は、以降のすべての回答に反映される1つのイベントで修正されます。 モデルが独自にメモリを照合することはありません。Recall がレジストリのルールを適用し、 矛盾している可能性のある内容を示したうえで、残りの内容をエージェントが確認できるようにします。 そのため、すべての修正は、それを生じさせたルールまたは記述までさかのぼって確認できます。recall mcp -typed では、 代わりに型付きツール(remember(subject, predicate, value))が提供されます。 詳細は開発者向けリファレンスを参照してください。 Memory APIが仕様です。

状態

Recall のもう一方の機能で、独自の仕様は docs/state-api-v1.mdにあります。エージェントは作業中に現在の状態を 書き残し、新しいプロセスはスナップショットではなく、その記録から作業を再開します。

  • 作業状態:目標、計画、進捗、注目点、決定事項、未解決の質問。
  • ターン(原文のまま)と、参照形式で保存される大きなツールの出力。
  • 作業場所を示すポインター:ブランチ、オブジェクトキー、プロセス。
  • アクション:世界に影響を与える各ツール呼び出しは、実行前に記録され、結果とともに完了として記録されます。そのため、 その間にクラッシュが発生した場合も確認でき、次回の再開時には、呼び出しが繰り返されるのではなく未確認として表示されます。

Resume はエージェント ID のリースを取得するため、同時にエージェントとして動作するプロセスは1つだけです。 トークン予算内でコンテキストを再構築し、モデル向けの1つのブリーフィングとして表示します。

agent, err := client.Resume(ctx, recall.ResumeRequest{AgentID: "coder-1", TokenBudget: 8000})
if err != nil {
    return err
}
defer agent.Release(context.Background())

briefing := agent.Resumed().Briefing // hand this to the model

同じ操作は MCP ツール(agent_resume、update_working_state、 record_turn、begin_action、...)としても利用でき、recall serve では POST /v1/agent/<verb> の HTTP ルートとしても利用できます。HTTP ではサーバーがリクエスト間のリースを保持します。 resume はエポックを返し、書き込みには毎回そのエポックを指定します。そのため、古いプロセスが後継プロセスの記録を 上書きすることはありません。State API はベータ版ですが、書き込まれる記録は安定しています (STABILITY.md)。再開のサンプルでは、タスクの途中でエージェントを終了し、 新しいプロセスで作業を続ける様子を示しています。

多数のエージェントへの提供

recall mcp は、1 つのエージェントに対して 1 つのプロセスです。recall serve は、同じメモリと状態を HTTP 経由で多数のエージェントに提供し、それぞれのキー名に対応する名前空間内で動作します。データベースの認証情報はサーバーが保持し、エージェントは Recall キーを保持します。

recall serve -backend polign -url http://polign:23000 -bootstrap-key-file admin.key
recall key create -backend polign -url http://polign:23000 -namespace acme:agent-7 -expires 168h

各名前空間には独自のコレクションが割り当てられるため、呼び出し元が送信した内容によって、別の名前空間のレコードにアクセスすることはできません。POST /mcp はストリーミング可能な HTTP 経由の MCP です。POST /v1/<tool> はメモリツールの引数を本文として受け取り、POST /v1/agent/<verb> は状態ツールの引数を受け取ります。RECALL_URL と RECALL_API_KEY を設定すれば、stdio MCP クライアントは recall connect 経由でサーバーに接続できます。

Kubernetes では、Pod にキーは不要です。recall serve -kubernetes を使うと、投影されたサービスアカウントトークンを送信して、自身のエージェント ID に固定された短命のキーを取得できます。このキーの取得と更新は、recall connect と Python クライアントが自動で行います。Helm チャートは Polign/polign の charts/recall にあります。agent-sandbox デモでは、kind 上でこれを実行します。

バックエンド

ローカル(デフォルト)polign_dbPostgreSQL + pgvectorMongoDBQdrant
RECALL_BACKENDlocalpolignpgvectormongodbqdrant
RECALL_BACKEND_URLディレクトリhttp://host:23000postgres://user:pw@host/dbmongodb://user:pw@host/dbhttp://host:6333
メモリ、履歴、as-ofはいはいはいはいはい
キーワード検索はいはいはいはいいいえ
キャッシュされた読み取りはいはいはいはいいいえ
状態 API(リース)はいはいはいはいいいえ
export RECALL_BACKEND=pgvector RECALL_BACKEND_URL=postgres://user:password@localhost:5432/mydb
recall mcp -write

すべてのコマンドでデータベースを指定する設定は、-backend、-url、-key の 3 つ、または上記の環境変数です。各バックエンドの要件や追加方法を含むその他すべての情報は、docs/backends.md をご覧ください。

ベンチマーク

LongMemEval のユーザーファクトのサブセットを使用しています。ユーザー自身の事実、好み、更新、日付に関する 267 個の質問を対象に、読み手と判定者に Claude Sonnet 5.5 を使用し、上流のプロンプトを用いています。

読み手に与える情報スコア
なし6.0
チャット履歴全体88.0
セッションに対する BM25、上位 10 件89.9
Recall の組み込み単語検索88.8
モデル埋め込み器を使った Recall(OpenAI text-embedding-3-small、512 次元)92.9
回答が含まれるセッションのみ96.6

単語検索を使った Recall は全体では BM25 と同等ですが、好みに関する質問では劣ります(70.0 対 83.3)。モデル埋め込み器を使うと、Recall が上回ります。Recall が読み手に渡したトークン数は質問あたり約 28k で、BM25 は 44k、履歴全体では 168k でした。評価ハーネスは eval/longmemeval にあります。

インテグレーション

Pythonpip install polign-recall を実行し、クライアントガイドをご覧ください。
Gogo get github.com/Polign/recall を実行し、Go ライブラリガイドをご覧ください。
MCP任意のエージェントを接続して、記憶、想起、忘却を行えます。
Claude CodeRecall プラグイン:コーディングセッションをまたいだメモリ。
LangGraphpip install recall-langgraph を実行して、LangGraph エージェントを再開できます。
LiveKit、Vapirecall-livekit と recall-vapi を使って、音声エージェントで通話相手のメモリを利用できます。
Pydantic AIpip install recall-pydantic-ai を実行すると、Pydantic AI エージェントでメモリツールを利用できます。
Vercel AI SDKワンクリックでデプロイできる Next.js チャットの例。
OpenClawnpm の @polign/openclaw-recall、OpenClaw プラグイン。

ドキュメント

開発者向けリファレンス · Memory API の仕様 · State API の仕様 · バックエンド · MCP 経由での接続 · メモリ読み取りのキャッシュ · 履歴のエクスポートと再生 · 安定版とベータ版について · 開発ガイド

プロジェクトを支援する

Recall によってエージェントが古い事実に基づいて動作するのを防げた場合は、この リポジトリにスターを付けると、ほかの人にも見つけてもらいやすくなります。バグ、質問、アイデアは issueにお寄せください。

ライセンス

Apache 2.0。

コメント

MCP は初めてですか?

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

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