Palinode について
Palinode は、Git で管理される Markdown ファイルをもとにしたプロジェクトメモリです。AI エージェントがセッション、エージェント、ワークツリーをまたいで決定事項を保存、検索、修正できます。ファイルが事実の正本であり、変更はすべて確認や巻き戻しが可能です。
主な機能
- 01YAML frontmatter 付きの Markdown ファイル
- 02差分、blame、ロールバックを行う Git 履歴
- 03BM25 とベクトルのハイブリッド検索
- 04REST API と CLI によるアクセス
- 05一部クライアント統合でのセッションフック
- 06週次の整理を Git コミットとして記録
活用シーン
- 01置き換えられた技術的決定の記録と参照
- 02新しいセッションのエージェントへのプロジェクト背景の提供
- 03複数のエディタ間でのメモリサービスの共有
MCP 対応
Palinode は、メモリの保存、検索、差分、blame、ロールバックを行うツールを MCP サーバーとして Streamable HTTP または stdio で公開します。Claude Code、Claude Desktop、Cursor などの対応クライアントに接続できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx palinodePALINODE_DIRPath to the markdown-memory directory (e.g. ~/.palinode). Created if missing.PALINODE_API_HOSTHost where the back-end palinode-api process is reachablePALINODE_API_PORTPort for palinode-apiPALINODE_API_TOKENシークレットOptional bearer token enforced on every palinode-api request other than /health. Required when PALINODE_API_BIND_INTENT=public. Generate with: python -c 'import secrets; print(secrets.token_urlsafe(32))'.PALINODE_API_TOKEN_FILEシークレットPath to a file containing the bearer token (alternative to PALINODE_API_TOKEN; for docker-secrets style deployments)PALINODE_MCP_HTTP_HOSTBind host for the MCP HTTP server. Defaults to loopback; set to 0.0.0.0 only with intentional network exposure (paired with PALINODE_API_BIND_INTENT=public on the back-end).PALINODE_MCP_HTTP_PORTPort for the MCP HTTP serverローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
39掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| cwd | string | いいえ | プロジェクト範囲の解決に使用する作業ディレクトリです。省略した場合、サーバープロセスの CWD がデフォルトで使用されます。 |
| project | string | いいえ | 明示的なプロジェクト slug またはエンティティ参照です。cwd の解決より優先されます。 |
詳細
┌─ palinode ─┐
│ ░░░░░░░░░░ │
│ ▓▓▓▓▓▓▓▓▓▓ │
│ ██████████ │
└────────────┘
セッション、エージェント、ワークツリーをまたいだ反復作業のための、確認・修正可能なプロジェクトメモリです。
先週、データベースの運用が不要になるため、チームはキャッシュに SQLite を選びました。今週、要件が変わり、PostgreSQL のほうが適切な選択肢になりました。判断とその理由が残っていなければ、新しいエージェントが以前の方法を繰り返す可能性があります。Palinode を使えば、変更後の内容を保存し、元の内容とその履歴を確認して、次のセッションに向けて記録を修正できます。
Palinode は、プロジェクトメモリを Markdown ファイルと Git の履歴として、ローカルの管理下に保持します。エージェントはそのツールを使って、メモリの保存、検索、確認ができます。一部の対応クライアント統合では、設定済みの記録や呼び出しも実行できますが、自動動作、範囲、制御方法はクライアントと設定によって異なります。印のないメモが、何の通知もなく事実として登録されることはありません。
パリノードとは、以前に述べたことを撤回し、より適切に述べ直す詩のことです。メモリの圧縮も同じように行われます。
phasespace-labs の Paul Kyle が開発しました。AUTHORS をご覧ください。
まずはこちら
公式クイックスタートに従って、一連の流れを最初から最後まで進めてください: インストール → 起動 → MCP クライアントへの接続 → 判断の保存 → 新しいセッションを開始 → Markdown と出所情報の確認 → 修正。プライベートメモリストアをコードのチェックアウトとは別に保ち、現行リリースとソースチェックアウトで利用できる機能を区別しています。
退役した判断を確認する

スクリーンショットは、PostgreSQL への置き換えを別途保存し、元の判断を退役させた後の、アーカイブ済みの初回 SQLite 判断を示しています。読み取り専用のインスペクターと修正のライフサイクル全体については、ローカル出所情報 UI ガイドをご覧ください。このガイドでは、画像が保存手順の前ではなく、退役後に撮影されたことを説明しています。
対応プラットフォーム
| プラットフォーム | セッションスキルのパス | MCP 設定 |
|---|---|---|
| Claude Code CLI | ~/.claude/skills/ | ~/.claude.json |
| Claude Desktop | ~/.claude/skills/ | claude_desktop_config.json |
| Cursor | .cursor/skills/ | .cursor/mcp.json |
| VS Code + Claude(Continue / Cline) | ~/.claude/skills/ | MCP-INSTALL-RECIPES.md を参照 |
| JetBrains + Claude | ~/.claude/skills/ | ~/.claude.json |
| Antigravity IDE | .agent/skills/ | ネイティブの 3 点メニューから MCP を設定 |
| Codex CLI | 該当なし(スキルなし) | ~/.codex/config.toml |
| Pi | 該当なし(ネイティブ拡張機能) | plugins/pi/ — ライフサイクルフックによるターンごとの呼び出し |
| Cline CLI / SDK | 該当なし(ネイティブプラグイン) | plugins/cline/ — AgentPlugin フックによるターンごとの呼び出し |
すべてのプラットフォームで同じ MCP サーバーを共有します。サーバーに一度インストールすれば、どの IDE からでも接続できます。docs/HARNESSES.md は、各ハーネスが利用できるもの(ネイティブフック、プラグイン、MCP)、各ティアの組み合わせ、最初に確認する場所をまとめた、ハーネス横断のガイドです。 クライアントごとの設定例:docs/MCP-SETUP.md および docs/MCP-INSTALL-RECIPES.md。
アイデア
Palinode は、プレーンファイルを信頼できる唯一の情報源として扱い、それらのファイルからインデックスとインターフェースを構築します。
Files (markdown + YAML frontmatter)
↓ watched
Index (SQLite-vec vectors + FTS5 keywords, single .db file)
↓ queried by
Interfaces (MCP server, REST API, CLI, OpenClaw plugin)
↓ compacted by
Consolidation (structured operations → validation and application → git commits)
アーキテクチャはこれだけです。.md ファイルのディレクトリが 1 つ、SQLite データベースが 1 つ、API サーバーが 1 つ。Postgres も Redis も、クラウドへの依存もありません。
1つのバックエンド、あらゆるインターフェース
Palinode は、どのような方法で接続するかを問いません。保存、検索、doctor、dedup-suggest、orphan-repair、diff、blame、rollback など、すべてのツールキットがあらゆるインターフェースで動作します。
| インターフェース | トランスポート | 最適な用途 |
|---|---|---|
| MCP サーバー | Streamable HTTP または stdio | Claude Code、Claude Desktop、Cursor、Windsurf、Zed、VS Code(Continue/Cline) |
| REST API | :6340 上の HTTP | スクリプト、Webhook、カスタム連携 |
| CLI | REST API をラップ | cron ジョブ、SSH、シェルスクリプト |
| プラグイン | OpenClaw ライフサイクルフック | インジェクト/抽出パターンを備えたエージェントフレームワーク |
サーバーで一度セットアップすれば、どのマシン、どの IDE、どのエージェントフレームワークからでも接続できます。MCP サーバーは純粋な HTTP クライアントで、状態もデータベース接続もエンベッダーも保持しません。API を指定するだけです。
{
"mcpServers": {
"palinode": { "type": "http", "url": "http://your-server:6341/mcp/" }
}
}
これがクライアント設定のすべてです。Claude Code、Claude Desktop、Cursor、Windsurf、Zed、VS Code(Continue/Cline)で動作します。palinode-mcp-http は /mcp/ でストリーム可能な HTTPを提供します。「type」には "sse" ではなく "http" を指定してください。URL の末尾には必ずスラッシュを付けてください。エディターごとのインストール手順については、docs/MCP-SETUP.md を参照してください。
仕組み
保存 — YAML フロントマターを含む、型付きの Markdown ファイル(人物、プロジェクト、決定事項、知見)です。Git でバージョン管理され、人が読みやすく、Obsidian、VS Code、vim などで編集できます。
インデックス作成 — ファイルウォッチャーが保存時に FTS5 でインデックスを作成します。コンテンツハッシュによる重複排除により、変更されていないファイルの再埋め込みをスキップします。インデックスはローカルの SQLite ファイルです。埋め込みには、ローカルの BGE-M3 エンドポイントまたは設定済みのリモートプロバイダーを使用できます。
検索 — Reciprocal Rank Fusion で統合した、ハイブリッド BM25+ベクトル検索です。2つの検索方式にはそれぞれ異なる役割があります。全文での質問では、ベクトル検索が意味的に一致する結果を取得し、BM25 が正確な用語や識別子を捉えます。評価の背景と制限については、ベンチマークを参照してください。オプションで、関連性のあるエンティティグラフと事前予測トリガーも利用できます。
圧縮 — 週次の統合処理では、LLM が構造化された操作を返し、Palinode が検証して適用します。圧縮のたびに Git コミットが作成されるため、内容を確認したり、blame で調べたり、元に戻したりできます。
Dream — これを「dreaming」という名称でご存じの場合、palinode dream は palinode consolidate の別名です。提案された操作を確認するには --dry-run を使用してください。完了した処理は毎回 Git コミットとして記録されるため、問題のある統合は差分を確認して、コミットを元に戻せます。
監査 — あらゆる事実に対して git blame を実行できます。あらゆる変更に対して git diff を実行できます。あらゆる誤りを rollback で元に戻せます。これらは単に Git 互換のファイルというだけではありません。palinode_diff、palinode_blame、palinode_rollback は、エージェントが呼び出せる第一級のツールです。
要件
- Python 3.11+
- Git
- Ollama と
bge-m3(ollama pull bge-m3、約1.2 GB)、または別の対応済み埋め込みエンドポイント — ハイブリッドなインデックス作成と検索に必要です。v0.21 以降は、明示的な字句モードも選択できます。これはキーワード/FTS による検索であり、ハイブリッド検索のエンドポイントが失敗したときのフォールバックではありません。エンベッダーがなくても保存は維持されますが、ハイブリッド検索はエンドポイントに接続できるようになるまで HTTP 503 を返します(palinode resolveはキーワードのみの検索に切り替わり、その旨を通知します)。インストールと確認方法については、Homebrew セットアップガイドを参照してください。
オプションの追加要件:週次統合用のチャットモデル(JSON を出力する任意の 7B 以上のモデル)、エージェントのプラグインフック用の OpenClaw。
インストール
初めてキャプチャする前に: Palinode は読み取り可能な Markdown と Git の履歴を保存します。private/restricted はスコープによる検出を制御しますが、API アクセス権を持つ呼び出し元は、既知のパスを指定して非表示のメモリを読み取ったり、ストア全体を対象とするメンテナンスツールを使用したりできます。これらのラベルは、暗号化やユーザー/エージェントごとの認証を提供するものではありません。ストア、バックアップ、API 認証情報を保護してください。より強い分離が必要な場合は、別々のインスタンスを使用するか、ファイルシステムの権限を設定してください。プライバシー契約を参照してください。
クイックスタートには、初回利用時の正式な手順が記載されています。 別個のプライベートストア、2 つ目のターミナルでの環境設定、サポートされている 語彙プレビューとハイブリッドモデルの各パス、エディター接続、新しいセッションでの確認、 インスペクター、修正ワークフローについて説明しています。コードのチェックアウトと メモリストアを組み合わせないでください。リリース済みの Homebrew インストールについては、 docs/HOMEBREW.mdから始めてください。自律型エージェントのブートストラップについては、 llms-install.mdを参照してください。
サービスとして実行する
長時間稼働する 3 つのプロセス(API、ウォッチャー、エンベッダー)をターミナルのタブで実行しないでください。いずれかを選択してください。
| プラットフォーム | 方法 | 詳細 |
|---|---|---|
| Docker が使える環境 | リポジトリのルートで docker compose up -d を実行 — API、ウォッチャー、Ollama が起動し、bge-m3 のダウンロードも自動的に処理されます(初回は約1.2 GB) | docker-compose.yml のヘッダーコメント |
| Linux | systemd ユニットを deploy/systemd/install.sh --enable でインストール | deploy/systemd/README.md |
| macOS | テンプレートから launchd LaunchAgents を使用 | deploy/launchd/README.md |
| Windows | Docker Compose を使用(PALINODE_DATA_DIR に Windows のパスを設定) | docker-compose.yml のヘッダーコメント |
Compose を使用すると、メモリはホスト上の ~/.palinode に保存されます(PALINODE_DATA_DIR で変更可能)。コンテナーからこのディレクトリをマウントし、ファイルを信頼できる情報源として扱います。ホスト上ですでに Ollama を実行していますか? OLLAMA_URL=http://host.docker.internal:11434 docker compose up -d palinode-api palinode-watcher を実行すると、同梱の Ollama を使用せずに済みます。3 つのいずれも、同じ方法で確認できます。palinode doctor(または curl http://127.0.0.1:6340/status)を実行してください。
エディターを接続する
Palinode は MCP に対応しています。クイックスタートの接続手順に従ってください。palinode mcp-config は選択したクライアント向けのネイティブな設定フラグメントを生成し、レシピにはサポート対象の手動設定が記載されています。これは読み取り専用で、クライアントの設定ファイルを編集することはありません。
別のマシン上のサーバーに HTTP で接続しますか?プロジェクトを渡してください。
palinode mcp-config --http --project <slug> を実行すると、X-Palinode-Project
ヘッダーが追加されます。v0.22 以降、リモートサーバーは自身の作業ディレクトリに
リコールのスコープを限定しなくなりました。そのため、ヘッダーのないクライアントには
スコープなしの結果が返され、Scope: none と報告されます。
v0.22.0 の互換性に関する注意事項を参照してください。ハーネスごとの詳細については、
docs/MCP-INSTALL-RECIPES.mdを参照してください。
生成された出力を既存の設定ファイルにリダイレクトすると上書きされるため、既存の設定には Palinode のエントリーを統合してください。
日常の使い方 — プロジェクトに導入する
すでにインストール済みで、palinode-api が実行中ですか? 次の1つのコマンドで、任意のプロジェクトにスキャフォールドを作成できます。
cd your-project
palinode init
このコマンドは、.claude/CLAUDE.md(メモリの指示。既存のファイルがあれば追記)、.claude/settings.json(SessionStart、SessionEnd、UserPromptSubmit のフック登録)、3つすべてのフックスクリプト、そして .mcp.json(Claude Code を palinode MCP サーバーに接続)を作成します。これにより、セッションは適切なコンテキストを得て開始し、進行中にメモリを呼び出し、終了時に内容を記録します。SessionStart フックは、すべての新しいセッション(起動時および /clear)に core: true のメモリを注入するため、最初のプロンプトを送る前に継続的なコンテキストを利用できます。UserPromptSubmit フックは、各プロンプトの前に関連するメモリを呼び出します。将来を見越したトリガーと厳格なしきい値の検索をコンパクトなスニペットとして注入し、一致するものがない場合は何も表示しません。また、SessionEnd フックは /clear、ログアウト、終了時に自動で内容を記録します。--dry-run を付けて再実行すると事前確認でき、--force で上書きできます。対象を限定するには --no-mcp / --no-hook を指定します。調整できる項目については examples/hooks/ をご覧ください。
ほかのハーネスを使うプロジェクトにも、同じメモリの指示が自動的に適用されます。AGENTS.md(または .agent/ ディレクトリ)がある場合、init はハーネスに依存しないメモリブロックを AGENTS.md に追記します(Codex、Antigravity、および AGENTS.md に対応するほかのエージェントが読み込みます)。.cursor/ ディレクトリがある場合は、Cursor 用に .cursor/rules/palinode.md を作成します。強制またはスキップするには、--agents / --no-agents と --cursor / --no-cursor を指定します。メモリの呼び出し/保存/セッション終了時の処理は同じですが、Claude Code 専用の仕組み(/clear、/wrap、フック)は含まれません。
使用例
よく使われるワークフローをいくつか紹介します。すべてのコマンドとオプションは docs/CLI.md をご覧ください。
決定事項を保存し、後で呼び出す
# During a session — save a decision
palinode save --type Decision "Chose SQLite over Postgres for the cache layer. \
Reason: no ops burden, single-file deployment, good enough for our scale."
# Next week — search for it
palinode search "database decision for cache"
セッション終了時の記録
# Agent calls at end of coding session
palinode session-end \
--summary "Migrated auth from JWT to session tokens" \
--decisions "Session tokens stored server-side, 24h expiry" \
--blockers "Need to update mobile client auth flow"
監査証跡 — 誰が、いつ、何を決定したか
# Trace a fact back to when it was recorded
palinode blame decisions/auth-migration.md
# Compose the full provenance lineage of a fact — sources, saved/changed
# commits, supersession trail, typed links, and recall — in one view
palinode trace decisions/auth-migration.md
# See what changed across all memory in the last week
palinode diff --days 7
# Retire a memory that turned out to be wrong — it leaves recall but stays
# on disk, in git, and in the index. Never a hard delete.
palinode archive insights/stale-finding.md --reason "superseded by the re-run" \
--superseded-by insights/corrected-finding.md
ツール
すべてのインターフェースで利用できるツール(パラメーターを含む全一覧はdocs/MCP-SETUP.mdに記載しています。ここで文章で件数を示すと、ずれが生じるためです):
| ツール | 機能 |
|---|---|
session_init | 解決済みのプロジェクト範囲に関する、セッション開始時のコンテキスト要約 |
search | カテゴリーフィルター付きのハイブリッド BM25 +ベクトル検索。resolve は各検索結果に、範囲を限定した根拠と解決内容を添付します |
resolve | 質問または1件のレコードについて、現時点でメモリが保持している内容を確認します。現在有効な内容、置き換えられた内容、両方をそのまま保持した競合、明示的に不明な内容を示します |
save | 型付きメモリ(人物、決定、洞察、プロジェクト)を保存します |
list | 種類別にメモリファイルを参照し、コアステータスで絞り込みます |
read | メモリファイルの全内容を読み込みます |
ingest | URL を取得し、調査情報として保存します |
status | ヘルスチェック — ファイル数、インデックス統計、サービスの状態 |
entities | エンティティグラフ — メモリ間の相互参照 |
consolidate | LLM による圧縮をプレビューまたは実行します |
archive | 誤りまたは古くなったメモリを1件整理します。アーカイブするか、名前を指定した内容で置き換えます |
restore | アーカイブされたメモリをデフォルトの想起対象に戻します。archive の逆操作です |
unretract | 1件のメモリから、ある好みへの言及レベルの撤回を取り消します |
forget_withdraw | 忘却リクエストを取り消します。アーカイブされた内容を復元し、撤回された内容の取り消し線を解除します |
archive_expired | TTL が期限切れになった一時的なメモリをアーカイブします |
diff | 過去 N 日間の変更内容 |
blame | 事実を記録したコミットまでさかのぼります |
trace | 事実の完全な来歴を構成します。ソース、保存/変更したコミット、置き換え、型付きリンク、想起を含みます |
history | 差分統計と名前変更の追跡を含む、ファイルの Git 履歴 |
rollback | ファイルを以前のコミットに戻します(安全に実行され、新しいコミットが作成されます) |
push | メモリをリモート Git リポジトリと同期します |
trigger | 先回りした想起 — 話題が出たときに自動で挿入します |
lint | ヘルススキャン — 孤立ファイル、古いファイル、欠落フィールド |
review | プロジェクトメモリを助言的にレビューし、書き込みを行わずに修正操作を提案します |
session_end | セッション終了時に要約、決定事項、ブロッカーを記録します |
prompt | バージョン管理された LLM プロンプトを一覧表示、表示、または有効化します |
dedup_suggest | 保存前に、下書きと重複する既存ファイルを提示します |
orphan_repair | 壊れた [[wikilinks]] に対する意味的な一致候補を検索します |
doctor | 高速な診断 — パス、サービス、設定、インデックスを対象とした18項目以上のチェック |
doctor_deep | カナリア書き込みテストを含む完全な診断(約10~15秒) |
cluster_neighbors | Wiki リンクでまだ結ばれていない、意味的に関連性の高いファイルを上位 K 件検索し、相互リンクの提案に向けて暗黙の関係を提示します |
topic_coverage | 短いトピックの語句を指定すると、既存の Wiki ページがその内容をすでに扱っているかどうかを返します(covered / best_match / similarity の二値判定) |
depends | ProjectSnapshots の frontmatter にある depends_on / blocks / parallel_with から、依存関係ツリー(またはブロックされていない項目の一覧)を表示します |
すべてのツールは、MCP では palinode_<name>、CLI では palinode <name>(ハイフン区切り:palinode archive-expired。session_init は palinode prime。doctor_deep に専用の CLI コマンドはありません)、REST API では POST/GET /<name> として利用できます。
CLI には、ツール一覧に含まれていないコマンドもあります。サービスの制御、移行、修復、Wiki メンテナンスの補助コマンドです。docs/CLI.md は全コマンドのリファレンスで、各コマンドのオプション、デフォルト値、出力動作を1項目ずつ記載しています。
技術スタック
| レイヤー | 選択肢 | 理由 |
|---|---|---|
| 信頼できる唯一の情報源 | Markdown + YAML frontmatter | 人が読みやすく、Git でバージョン管理でき、移植性があります |
| ベクトルインデックス | SQLite-vec(組み込み) | サーバー不要、単一ファイル、設定不要 |
| キーワードインデックス | SQLite FTS5(組み込み) | 正確な語句に対する BM25、依存関係なし |
| 埋め込み | Ollama 経由の BGE-M3、または OpenAI 互換の /v1/embeddings サーバー | ローカルでプライベート、API キー不要 |
| API | FastAPI | 軽量、非同期、単一プロセス |
| MCP | Python MCP SDK(Streamable HTTP) | ネットワーク経由ですべての IDE で動作 |
| CLI | Click(REST API をラップ) | シェルにネイティブで、TTY を認識した出力 |
| 動作 | PROGRAM.md | 何を記憶し、どう抽出し、どう圧縮するかを定義します。1 つのファイルを編集すれば、すべての動作を変更できます |
メモリファイル形式
---
id: project-palinode
category: project
name: Palinode
core: true
status: active
entities: [person/alice]
last_updated: 2026-04-05T00:00:00Z
summary: "Persistent memory for AI agents."
canonical_question: "What is Palinode and what does it do?"
---
# Palinode
Your content here. As detailed or brief as you want.
Files marked `core: true` are always in context.
Everything else is retrieved on demand via hybrid search.
The `canonical_question` field anchors the file to the question it answers, improving search relevance.
Obsidian で開く
Palinode はすべてのメモリをプレーンな Markdown ファイルとして保存するため、メモリディレクトリはすでに有効な Obsidian 保管庫です。Obsidian でフォルダーを指定すると、Palinode のハイブリッド検索や圧縮に加えて、グラフビュー、バックリンク、Bases を利用できます。同期ジョブも、インストールするプラグインも不要で、信頼できる情報源が二つになる問題もありません。
palinode init --obsidian --dir ~/palinode-vault
これにより、保管庫のディレクトリ構成、目次となる _index.md、案内ページとなる _README.md、および独自の方針に基づく .obsidian/ 設定(カテゴリごとに色分けしたグラフビュー、daily/ に接続されたデイリーノート)が作成されます。その後、Obsidian でディレクトリを開いてください。
LLM は Wiki メンテナンス規約に従います。新しいメモリが保存されても Obsidian のグラフが正確に保たれるよう、ノート本文の entities: frontmatter と [[wikilinks]] を同期します。エンティティ参照を含むメモリを保存すると、Palinode はそれらを Wiki リンクとして結ぶ冪等な ## See also ブロックを追加します。
Wiki の整合性を保つために、埋め込みに対応した 2 つのツールを利用できます。palinode_dedup_suggest は重複ファイルの作成前に下書きが既存ファイルと重複していないかを確認し、palinode_orphan_repair は壊れた [[wikilinks]] に対する意味的な一致を探します。どちらも MCP、CLI、REST 経由で呼び出せます。
包括的なガイド(クイックスタート、Wiki 規約の詳細、移行方法、FAQ)については、docs/OBSIDIAN.md を参照してください。
palinode doctor で診断する
db_path が誤ったファイルを指している、ウォッチャーが古いディレクトリをインデックスしている、実体のない DB ファイルがある、といった気づきにくい設定ミスは、アップグレードやサーバー移行後に Palinode が期待どおりに動作しない最も一般的な原因です。palinode doctor は、こうした種類の問題をすべて検出します。
palinode doctor
このコマンドは、パス、サービス、設定の整合性、インデックスの健全性、ディスクの状態に関する 18 項目以上のチェックを実行し、それぞれに合格・警告・失敗のステータスを付けた構造化レポートを出力します。--fix モードでは、安全な自動修復(不足しているディレクトリの作成、CLAUDE.md への Palinode ブロックの追記)を適用します。ユーザーデータを移動することはありません。実体のない DB ファイルや DB パスの不一致については、推奨する mv コマンドを表示しますが、実行はしません。
インストール、アップグレード、またはサーバー移行のたびに palinode doctor を実行してください。チェック項目の一覧と --fix の詳細については、docs/DOCTOR.md を参照してください。
設定
すべての動作は palinode.config.yaml で設定します。
memory_dir: "~/.palinode"
ollama_url: "http://localhost:11434"
embedding_model: "bge-m3"
search:
hybrid_enabled: true
hybrid_weight: 0.5 # 0.0 = vector only, 1.0 = BM25 only
consolidation:
llm_model: "llama3.1:8b" # any chat model that outputs JSON
llm_url: "http://localhost:11434"
llm_fallbacks: # tried in order if primary fails
- model: "qwen2.5:14b-instruct"
url: "http://localhost:11434"
すべてのモデルは入れ替え可能です。Ollama の任意の埋め込みモデルや、OpenAI 互換の任意のチャットエンドポイントを使用できます。デフォルトの検索しきい値(search.mcp_threshold=0.4 と search.api_threshold=0.5)は、実際の bge-m3 埋め込みを使って測定しました。埋め込みモデルを変更する場合は、これらのしきい値を再確認し、トリガーのしきい値も別途見直してください。トリガーのデフォルト値は、このキャリブレーションの対象ではありません。
検索結果を返すたびに、一致信頼度の判定(confident、weak、none)も receipt.retrieval で報告されます。この判定は、融合後の順位ではなく、各検索系統の融合前スコアから取得され、各系統の根拠も併記されます。デフォルトでは、この判定を理由に結果が保留されることはありません。search.abstain_on_no_confident_match: true を設定すると、MCP サーフェスで none の検索結果一式を保留します。詳しくはdocs/lexical-retrieval.mdをご覧ください。
設定済みの埋め込みエンドポイントに対して検索しきい値を再確認するには、python -m bench.abstention を実行してください。このコマンドは、各検索系統のしきい値を上げながら、回答がないクエリに対する誤検出と、回答がある対照クエリでの正しい結果の保持率を測定します。トリガーのしきい値はキャリブレーションしません。リファレンス全体については、palinode.config.yaml.exampleをご覧ください。
Ollama を使わない埋め込み。 llama.cpp(llama-server --embedding)、vLLM、LM Studio はいずれも OpenAI 互換の /v1/embeddings 形式を公開しています。dialect: openai を指定して選択してください(デフォルトは ollama なので、既存の設定には変更がありません)。リトライ、サーキットブレーカー、入力ごとのエラー処理は、Ollama の場合と同じです。Ollama のタグ bge-m3 は llama-server のモデル名ではありません。代わりに BGE-M3 の GGUF を llama-server に指定してください。
embeddings:
primary:
dialect: openai
url: "http://localhost:8080" # a trailing /v1 is fine too
model: "bge-m3" # llama-server ignores it; vLLM / LM Studio match it
dimensions: 1024
ホスト型の OpenAI 互換埋め込みプロバイダーでは、ベアラー認証とプロバイダー固有のエンドポイントパスも使用できます。認証情報は YAML に記載せず、PALINODE_EMBEDDING_API_KEY を設定するか、キーを含むファイルのパスを PALINODE_EMBEDDING_API_KEY_FILE に設定してください。
埋め込みエンドポイントが /v1/embeddings ではないプロバイダーでは、endpoint_path を設定してください。省略した場合、ホストのみ、および末尾に /v1 が付く場合の既存の動作が維持されます。
embeddings:
primary:
dialect: openai
url: "https://generativelanguage.googleapis.com/v1beta/openai"
endpoint_path: "/embeddings"
model: "gemini-embedding-001"
API をループバック以外に公開する場合(PALINODE_API_HOST が 127.0.0.1 以外の場合)、PALINODE_API_TOKEN を設定してください。明示的に PALINODE_API_ALLOW_UNAUTH=1 を設定して認証を無効化しない限り、サーバーはループバック以外のアドレスに未認証でバインドして起動することを拒否します。ベアラートークン認証の仕組みとバインド制限については、SECURITY.mdをご覧ください。
API リファレンス
| メソッド | パス | 説明 |
|---|---|---|
GET | /status | ヘルスチェックと統計情報 |
POST | /search | フィルター付きハイブリッド検索 |
POST | /search-associative | エンティティグラフのトラバーサル |
POST | /save | 型付きメモリファイルを作成します。スキーマ:{content, type, slug?, entities?, title?}。本文の上限は 5 MB です(PALINODE_MAX_REQUEST_BYTES で変更できます)。 |
POST | /ingest-url | URLを取得し、調査資料として保存します。URLと各リダイレクト先(最大5回)は、リクエスト前に検証されます。ホストはグローバルにルーティング可能なアドレスのみへ解決される必要があり、接続には名前ではなく検証済みのアドレスが使用されます。HTTP CONNECT プロキシ経由の HTTPS リクエストではアドレスの固定は省略されますが、アドレスの検証は引き続き行われます(CLI ガイドを参照)。 |
GET/POST | /triggers | 先回り型リコールのトリガー |
POST | /consolidate | 圧縮を実行またはプレビューします |
GET | /list | 種類別にファイルを閲覧します |
GET | /read?file_path=... | メモリファイルを読み取ります |
GET | /history/{file_path} | ファイルの Git ログ |
GET | /diff | 最近の変更 |
GET | /blame/{file_path} | Git blame |
GET | /trace/{file_path} | ファイルの構成済み来歴 |
POST | /rollback | ファイルを元に戻します |
POST | /push | Git リモートにプッシュします |
POST | /reindex | インデックスを再構築します |
POST | /session-end | セッションの要約を記録します |
POST | /lint | ヘルススキャン |
設計原則
-
ファイルが真実です。 データベースでも、ベクトルストアでもありません。人が読んで編集でき、Git でバージョン管理できる Markdown ファイルです。
-
フラットではなく、型付きです。 人物、プロジェクト、決定事項、知見など、それぞれに構造があります。これにより、信頼性の高い検索と統合が可能になります。
-
蓄積ではなく、統合です。 100回のセッションから生成されるのは、よく管理された20個のファイルであり、読まれないダンプ100個ではありません。
-
動作中は見えません。 人間はエージェントと会話します。Palinode は裏側で動作します。
-
段階的に機能を縮退できます。 ベクトルインデックスが停止しても、ファイルを直接読み取れます。埋め込みサービスが停止しても、grep を使えます。マシンが停止しても、これは Git リポジトリなので、どこにでもクローンできます。
-
分類体系の管理は不要です。 分類するのはシステムで、人間は確認します。人間が分類体系を管理しなければならないなら、システムは機能しなくなります。
独自の特長
- 自分のデータを、自分のファイルで管理 — アカウント不要、クラウドへの依存なし、ベンダーロックインなし。メモリは、自分で管理するディレクトリ内の Markdown ファイルです。エクスポートは
cp。バックアップはgit push。このエコシステムのどのツールに何が起きても、データはファイルシステム上のプレーンテキストです。 - IDE 間で共有できるメモリ — メモリは1か所に保存されます。Claude Code、Cursor、Windsurf、Zed、または MCP 対応エディターから接続できます。コンテキストを失わずに IDE を切り替えられます。
- エージェントツールとしての Git 操作 —
diff、blame、rollback、pushを MCP 経由で公開します。エージェントから Git 操作を呼び出せるシステムはほかにありません。 - 操作ベースの圧縮 — 構造化された操作はスキーマチェックされ、レビュー可能な Git コミットとして適用されます。
- 事実ごとのアドレス指定 — Markdown 内に埋め込まれる `` ID は、表示上は見えず、Git で保持され、圧縮の対象として指定できます。
- 4段階の注入 — コア(常時)+トピック(ターンごとの検索)+連想(エンティティグラフ)+トリガー型(先回り型リコール)。
- 複数の MCP トランスポート — ローカルでは stdio、リモートでは Streamable HTTP を使用します。1つのサーバーで、あらゆるマシン上のあらゆる IDE に対応します。
- すべてがクラッシュしても、
catは使えます。
主張ではなく、測定結果です。手法、コスト、損失を含む LongMemEval の結果は docs/BENCHMARKS.md を参照してください。メモリを通じてエージェントに届く、偽造・埋め込み・権威の借用を伴うコンテンツについて、Palinode が何を保証し、何を保証しないかは、SECURITY.md#memory-poisoning-and-trust-limitations を参照してください。
謝辞
Palinode は、Karpathy の LLM Knowledge Bases、Letta(階層型メモリ)、LangMem(型付きスキーマとバックグラウンドでの統合)のアイデアを基盤としています。すべての一覧はdocs/ACKNOWLEDGMENTS.mdをご覧ください。
Karpathy の gist のスレッドにある認識論的な完全性に関する議論もご覧ください。特に、「出典を引用せずに統合し、気づかないうちに出典から逸脱し、意見の相違があるところで誤った確実性を示す」LLM wiki の問題についてです。Git ベースの来歴管理は、この問題に対する Palinode の答えです。
見落としている先行事例をご存じの場合は、issue を作成してください。
ライセンス
MIT — プライバシーポリシー
Paul Kyle が、Palinode を構築する過程を記憶するために Palinode を使う AI エージェントの助けを借りて開発しました。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。