Vectr について
Vectrは、AIコードエディター向けのローカルデーモンで、セマンティックなコード検索と永続的な作業メモリーを組み合わせます。コード構造を踏まえた検索に加え、セッションフック対応環境では関連メモリーを自動配信します。
主な機能
- 01AST対応のコードインデックス
- 02セマンティック検索とBM25の併用
- 03シンボルと呼び出しグラフの探索
- 04永続的な作業メモリー
- 05セッションフックによるメモリー自動注入
- 06APIキー不要のローカル埋め込み
活用シーン
- 01不慣れなコードベースで処理を探す
- 02コンテキストのリセット後に実装を再開する
- 03複数のコーディングセッションで調査結果を再利用する
MCP 対応
VectrはHTTPまたはstdio経由で、MCPクライアントにコード検索とメモリーのツールを提供します。`vectr start`はエディターのMCP設定を書き込み、セッションフック対応ホストではメモリーを自動配信できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Vectr
保存ではなく、届けること。 AI コードエディターにコードベースのセマンティック検索を提供し、関連するタイミングで自動的に表示される作業メモリも備えたローカルデーモンです。
バージョン 1.12.0 · 最終更新日 2026-09-03 · 変更履歴
30 秒でわかる概要
AI コードエディターは、同じ知識に対して二度コストを払っています。昨日読んだファイルをまた読み、すでに見つけたシンボルを grep し直し、会話が圧縮された瞬間に、5 ターン目で見つけた正確なシグネチャを失います。Vectr は、こうしたコストの両方を解消するローカルプロセスです。
- コードを理解した検索。 AST 対応チャンク、シンボルと呼び出しのグラフ、セマンティック検索と BM25 によるハイブリッドランキングを備えています。動作を説明すれば、grep を繰り返し、見当をつけずにファイルを 3 つ読む代わりに、1 回の呼び出しで関数全体を取得できます。
- 届けられる作業メモリ。 調査結果を一度保存すれば、50 ミリ秒以内にそのまま再取得できます。セッションフックを公開するエディターでは、エージェントが取得を求めなくても、必要なタイミングで自動的に届きます。
- ローカル、キー不要、設定不要。
pip installを 1 回実行し、vectr startを実行するだけです。埋め込みモデルはお使いのマシン上で動作します。データが外部に送信されることはなく、API キーも不要です。
pip install vectr && cd /path/to/your/project && vectr start
設定はこれだけです。Vectr がエディター用の MCP 設定を書き込み、その後バックグラウンドでインデックスを作成します。
vectr が他の AI エージェント向けメモリツールと異なる点
AI エージェント向けの汎用メモリレイヤーは健全なカテゴリを形成しており、優れたものは実際の問題をうまく解決しています。Vectr はこうしたツールと比較されることが最も多いため、違いを率直に説明します。左側の列は、これらのツールに共通する傾向のある設計を示したもので、特定の製品について述べたものではありません。ツールごとに違いがあるため、検討中のツールについては個別にご確認ください。
| 一般的なメモリレイヤー | Vectr | |
|---|---|---|
| メモリがモデルに届く仕組み | エージェントまたは開発者が、明示的な保存・取得 API(add() や search()、または同等の API)を呼び出します。メモリが届くのは、何かが取得を求めると判断したときだけです。 | すべてのメモには、{path, symbol, semantic, event, temporal} に対するトリガー条件が設定されています。セッションフックに対応したエディターでは、ハーネスが条件を決定論的に評価し、一致した内容を注入します。エージェントが取得を忘れないよう気を配る必要はありません。 |
| 対象領域 | アシスタントやアプリケーション全般を対象とした汎用の会話メモリであり、ソースコード向けではありません。メモはユーザーやセッションに関する文字列です。 | コードネイティブです。シンボルグラフ、AST によるチャンク分割、セマンティックなコード検索、作業メモリが 1 つのデーモンに統合されているため、メモを文字列ではなく実在するシンボルやパスに紐づけられます。 |
| 推論 | メモの抽出に LLM を使い、プロバイダー API 経由で埋め込みを生成することが一般的です。そのため、API キーとプロバイダーアカウントがセットアップに必要です。 | 設計上、内部での LLM 呼び出しはゼロです。ローカルの埋め込みモデルを使い、プロバイダーアカウントも API キーも必要ありません。 |
| デプロイ | 多くの場合、ライブラリまたはセルフホスト型サーバーとして提供され、マネージドクラウドのプランも併設されていることがよくあります。 | 127.0.0.1 にバインドされたローカルデーモンをワークスペースごとに 1 つ起動します。チームモードも利用できますが、オプトインが必要です。 |
最初の行が重要な理由。 ボトルネックは保存ではありません。エージェントが自ら呼び出す必要のある検索です。実際、エージェントはほとんど検索を呼び出さないからです。管理された評価では、タスクに直接関係する知識をあらかじめ保存しておいたにもかかわらず、エージェントは 114 ターンを通じてメモリ操作を一度も行いませんでした。一方、注入対応の実行ではすべて決定論的な注入が行われ、監査ログに記録されたトリガー評価で誤作動は一度もありませんでした。コンパクションを繰り返すテストでは、会話内にのみ保持された 10 個の事実は、強制コンパクション 108 回のうち 106 回で失われました。それに対し、ハーネス管理のストアから注入された同じ 10 個の事実は、コンパクション後の再開 138 回すべてで完全な状態で届きました。
手法と結果の全文:保存ではなく配信:コーディングエージェントのハーネス機能としての手がかりに基づく作業メモリ(arXiv:2607.20972)。
コストと節約できるもの
仮定ではなく、実測値です。 vectr_recall で保存済みのメモを 3 件取得する場合、ツール呼び出し 1 回で 360 トークンかかります。同じ 182 ファイルの Python リポジトリで、grep と Read を使って同じ 3 つの事実を再導出すると、ツール呼び出し 6 回で約 2,060 トークンかかります。これは 50ms 未満で、トークン数を約 5.7 分の 1、ツール呼び出し回数を 6 分の 1 に削減できます(文字数を 4 で割ってトークン数を算出。詳細は実測コストの内訳をご覧ください)。
メモは会話内ではなくディスクに保存されるため、/compact を実行しても、新しいセッションを開始しても、同じように保持されます。セッションの境界は関係ありません。5 ターン目に保存した内容を 15 ターン目に取得する場合も、3 日後に取得する場合も、仕組みは同じです。
効果を発揮する場面: 不慣れなコードベースや大規模なコードベース、再開する作業、ターン数の多い長時間セッション。 効果を発揮しない場面: 熟知しているコードに対する一度きりの grep。代わりに grep を使い、vectr が逆効果になる場合をご覧ください。
ベンチマーク
公開結果は benchmarks/ にあります。以下のコーパスは、規模が大きく、モデルにとって未知のものとして選ばれた検証用データであり、それ以上の意味はありません。
大規模で未知の C コードベースを使った6タスクのスプリントは、1週間分の機能開発をシミュレートします。1回の調査セッションで、vectr_remember を使って調査結果を保存します。実装セッションはそれぞれ独立しており、6回とも初期状態から開始して vectr_recall を呼び出します。
実装セッションのみ、6タスクの合計:
| 指標 | Vanilla | Vectr | 差 |
|---|---|---|---|
| コスト | $2.50 | $1.97 | -21% |
| 経過時間 | 17.6 min | 13.5 min | -24% |
| ターン数 | 123 | 94 | -24% |
| Read + Bash 呼び出し数 | 102 | 62 | -39% |
タスクごとの再調査(最初の書き込みまでの Read と Bash の呼び出し数):
| タスク | Vanilla | Vectr | 差 |
|---|---|---|---|
debug_gc_finalizer | 16 | 6 | -62% |
feature_dict_pop_last | 13 | 3 | -77% |
cross_session_set_cartesian | 23 | 9 | -61% |
debug_descriptor_priority | 6 | 6 | 0% |
cross_session_bytes_find_all | 13 | 2 | -85% |
cross_session_list_rotate | 21 | 16 | -24% |
0%の行は実際の結果であり、意図的に残しています。このタスクは、モデルが訓練時の知識だけですでに調査できたものです。
調査と実装について、ありのままに説明します。 調査フェーズは一度だけ実行され、vectr を使うとコストが高くなります(+94%)。コードスタブやシグネチャを豊富に保存すると、出力トークンが増えるためです。実装フェーズはタスクごとに繰り返されますが、再調査をリコールで置き換えられるため、コストは下がります。ノートを約8タスク再利用すると、オーバーヘッドを回収できます。
| フェーズ | Vanilla | Vectr | 理由 |
|---|---|---|---|
| 調査(1セッション、一度だけ) | $1.36 | $2.63 | ノートの保存に出力トークンが必要 |
| 実装(6セッション、繰り返し) | $2.50 | $1.97 | ノートによって再調査を置き換え |
| スプリント合計 | $3.86 | $4.60 | 約8タスク後に純利益へと逆転 |
以前、5,856ファイルの Java コーパスで実行した測定では、**実装コストが-58%、実装時のツール呼び出し数が-72%、経過時間が-39%**でした。
測定コストについて、ありのままに
呼び出しごとのトークンコスト(中央値、182ファイルの Python リポジトリ、文字数/4でトークン化):
| ツール | トークン数(中央値) | 範囲 |
|---|---|---|
vectr_search | 約2,320 | 1,437~3,091(n=8) |
vectr_locate | 約192 | |
vectr_trace | 約720 | |
vectr_recall(インデックス層) | 約180 |
トレードオフを率直に述べると、小規模で内容をよく把握しているリポジトリに対する、単一の明確な検索では grep のほうが低コストです。単一の事実を探す5タスクで、Vectr のコスト中央値はトークン数で60%増でした。また、vectr_search の往復には1.7~3.6秒かかる一方、grep は約28msのため、速度も劣ります。Vectr は呼び出しあたりのコストでは優位ではありません。ツール呼び出し数(複数回ではなく1回の往復で済む)、回答の網羅性(ファイルの一部を読むのではなく、シンボル全体を取得できる)、そして作業メモリ内のあらゆる情報で優位です。作業を再開するたびに、5.7倍のリコールによる節約が積み重なります。
補足:ツールの応答に付随する自動削除やリマインダーのバナーもトークンを消費します。常時表示される再取得フッターは約27トークン、軽い通知は約89トークンです。また、チャンクとトークンの両方のしきい値を超えても保存されなかった場合にのみ表示される、エスカレーションされた対応必須バナーは、約480~535トークンから始まり、その後は一定になります。
クイックスタート
ローカル(推奨)
python3.14 -m venv ~/.vectr-env
source ~/.vectr-env/bin/activate # Windows: ~/.vectr-env/Scripts/activate
pip install vectr
cd /path/to/your/project
vectr start
Python 3.14 以降が必要です。 インストール方法:
- macOS:
brew install [email protected] - Ubuntu/Debian:
sudo add-apt-repository ppa:deadsnakes/ppa && sudo apt install python3.14 python3.14-venv - Windows:python.org/downloads
vectr start はすぐに戻ります。インデックス作成はバックグラウンドで実行されるため、進行状況を確認するには vectr status を実行してください。初回実行時には、埋め込みモデルが一度ダウンロードされます(約290 MB)。新しい MCP 設定を読み込むため、AI コードエディターを一度再起動してください。
Docker(CI とサーバー)
git clone https://github.com/swapnanil/vectr
cd vectr
docker-compose up api
ポート8765を公開します。Docker は IDE の設定ファイルを自動作成しないため、IDE との統合にはローカルインストールを使用してください。
AI コードエディターに接続する
vectr start は、エディターの MCP 設定を自動的に書き込みます。エディターを一度再起動してください。
| エディター | 設定 | ステータス |
|---|---|---|
| Claude Code | 自動:.claude/settings.json、ガイダンスファイル、セッションフック(セッション開始時、プロンプトごと、ファイルの読み取りまたは編集前にメモリを自動注入) | 検証済み |
| Cursor | 自動:.cursor/mcp.json | 実験的 |
| VS Code / GitHub Copilot | 自動:.vscode/mcp.json | 実験的 |
| Windsurf | 手動。以下を参照してください | 実験的 |
| Cline | 手動。以下を参照してください | 実験的 |
| Continue | 手動。以下を参照してください | 実験的 |
| Codex CLI | 自動:.codex/config.toml、AGENTS.md のガイダンス、.codex/hooks.json(vectr init --hooks) | 実験的 |
「検証済み」とは、完全な統合(設定、ガイダンス、フック)がエンドツーエンドで動作確認されていることを意味します。「実験的」とは、MCP 設定は書き込まれて動作するものの、同じ検証プロセスを経ていないことを意味します。
メモリの自動配信は、ホストがセッションフックを公開しているかどうかに依存します。公開していない場合でも、以下のすべてのツールを MCP 経由で必要に応じて利用できます。
手動セットアップ
Claude Code、.claude/settings.json:
{ "mcpServers": { "vectr": { "type": "http", "url": "http://localhost:8765/mcp" } } }
Cursor、.cursor/mcp.json:
{ "mcpServers": { "vectr": { "url": "http://localhost:8765/mcp" } } }
VS Code / GitHub Copilot(1.99 以降)、.vscode/mcp.json:
{ "servers": { "vectr": { "type": "http", "url": "http://localhost:8765/mcp" } } }
Windsurf、~/.codeium/windsurf/mcp_settings.json:
{ "mcpServers": { "vectr": { "serverUrl": "http://localhost:8765/mcp" } } }
Continue.dev、.continue/config.json:
{ "mcpServers": [{ "name": "vectr", "transport": { "type": "http", "url": "http://localhost:8765/mcp" } }] }
Codex CLI、プロジェクトスコープの .codex/config.toml(vectr start によって自動的に書き込まれます):
[mcp_servers.vectr]
url = "http://localhost:8765/mcp"
ワークスペースで初めて実行するとき、Codex はプロジェクトスコープの設定を読み込む前に、プロジェクトを信頼するかどうかを尋ねる一度限りの対話型プロンプトを表示します。vectr init --hooks も実行した場合、Codex はフックコマンドを信頼するかどうかを尋ねる、二度目の一度限りのプロンプトを表示します。一度承認すれば、どちらもその後は有効なままです。セキュリティを弱めずに、設定書き込みツールがこれらを解除することはできません。
Stdio トランスポート
上記のエディターは HTTP 経由で接続します(vectr start と POST /mcp)。HTTP 接続を開く代わりに、サーバーをサブプロセスとして起動し、標準入力と標準出力経由で MCP をやり取りする MCP クライアントやホスティングプラットフォームでは、次を実行してください。
vectr mcp-stdio [WORKSPACE]
ポートもデーモンも不要です。改行区切りの JSON-RPC 2.0 を使う単一のフォアグラウンドプロセスです(標準入力と標準出力のそれぞれで、1 行につき 1 つの JSON オブジェクトを送受信し、Content-Length ヘッダーは使用しません)。initialize と tools/list はすぐに応答します。一方、埋め込みモデルの読み込みと初期インデックス作成はバックグラウンドスレッドで行われます。これらが完了する前に tools/call を実行すると、停止する代わりに「起動中」の応答が返されます。標準出力にはプロトコルの JSON のみが出力され、すべてのログは標準エラー出力に送られます。標準入力が EOF になると、プロセスは正常に終了します。--memory-only と --search-only の動作は vectr start と同じです。
動作の仕組み
- AST を考慮したチャンク分割。 tree-sitter が各ファイルを解析し、関数、クラス、メソッドの境界で分割します。ロジックの途中でチャンクが途切れることはありません。
- コードの埋め込み。
ibm-granite/granite-embedding-english-r2(ローカルで動作し、CPU で高速、変更可能)が自然言語のクエリをコードのシンボルに対応付けるため、「JWT validation」でverify_jwt_tokenが見つかります。シンボル名の完全一致には BM25 を使用します。 - ハイブリッド検索。 ベクトル類似度と BM25 を組み合わせ、コードベースの特性に応じて重み付けします。大規模で不慣れなコードベースではセマンティック検索を、小規模でドキュメントが充実しているコードベースでは BM25 を重視します。
- シンボルグラフ。 呼び出しエッジ、インポートチェーン、HTTP ルート(Flask、FastAPI、Express、Spring)を抽出して保存します。
vectr_locateは 6 段階の検索戦略(完全一致、サフィックス、同一モジュール、インポートチェーン、部分一致、ファジー検索)を順に適用して名前を解決します。ファジー検索の結果は、確実な一致として提示せず、必ず明示的に不確かなものとして表示します。自信を持って誤ったシンボルを示すより、見つからないと伝えるほうがよいためです。 - 作業メモリ。
vectr_rememberは構造化されたメモを SQLite と ChromaDB に保存します。vectr_recallは SQL の LIKE 検索ではなく、メモを対象にセマンティック検索を行うため、複数の単語を含むクエリでも関連するコンテキストを見つけられます。 - トリガーの評価。 各メモの条件は、ライフサイクルの節目にデーモンによって決定論的にチェックされます。セッションごとの発火記録と挿入予算により、メモは適用されるタイミングで正確に再表示され、同じ期間内に二度表示されることはありません。
- MCP プロトコル。 23 個のツールを HTTP 経由で提供します。MCP 対応の AI コードエディターであれば、プラグインなしで接続できます。
23 個の MCP ツール
vectr start は、この表を含むガイダンスファイルをワークスペースに書き込みます。これにより、AI コードエディターは指示を受けなくても、状況に応じて使うツールがわかります。
検索ツール:インデックスからコードを取得します。
| 状況 | ツール |
|---|---|
| 概念や動作はわかっているが、名前がわからない | vectr_search("description") |
| シンボル名はわかっているが、ファイルがわからない | vectr_locate("SymbolName")。複数の検索戦略によるフォールバックと、任意指定の caller_file に対応 |
| シンボルの呼び出し元または呼び出し先が必要 | vectr_trace("symbol_name") |
| アーキテクチャの概要が必要 | vectr_map() |
| 作成したマップの要約を保存したい | vectr_map_save(summary) |
| 取り込みたい実行時の呼び出しデータがある | vectr_ingest_traces([{caller, callee}]) |
| インデックスの健全性またはメモの件数を確認したい | vectr_status() |
メモリツール:セッションをまたいで情報を保存し、呼び出します。
| 状況 | ツール |
|---|---|
| 前回のセッションのメモがある | vectr_recall(query)。部分文字列ではなく意味ベクトル検索を行います。2 層構成で、デフォルトでは簡潔なインデックスを返し、note_id=N で 1 件のメモを展開するか、detail='full' ですべての本文を展開します |
| クエリに関係なく、毎回の再呼び出しで必ず表示させたいメモがある | vectr_pin(note_id=N)。メモを Tier 0 に配置し、vectr_recall(query=...) を呼び出すたびに挿入します。上限があるため、ピン留めは控えめにしてください。vectr_remember(..., pin=true) を使うと、書き込み時に同じことができます |
| 保存しておきたい情報が見つかった | vectr_remember(content, tags, priority, kind, title, agent)。kind で表示方法が決まります。directive は毎回のセッションで無条件に表示され、task は現在の作業状況を保持し、gotcha は該当するファイルに触れたときに再表示され、operational はビルドや環境に関する情報を扱い、finding(デフォルト)は関連度順に表示され、reference は参照先を示し、decision はアーキテクチャ上の決定を記録します。vectr_recall(kind="decision", sort_by="chronological") を使うと、ADR 形式の時系列として再呼び出せます。title はインデックス出力でメモに付けるラベルで、agent はサブエージェントまたはオーケストレーターを記録します |
| 保存済みのメモが、宣言していないファイルに関するものだった | vectr_anchor(note_id=N, anchors=[...])。再保存せずに、既存のメモにファイルアンカーを追加します。冪等で、書き込み時にハッシュ化され、ライフサイクルイベントも発生しないため、メモの履歴をクリーンに保てます(CLI では vectr anchor --id N PATH... も使用できます) |
| 保存済みのメモが誤ったファイルに紐付けられていた、または紐付けたファイルとの関連性がなくなった | vectr_unanchor(note_id=N, anchors=[...])。vectr_anchor の逆の操作です。メモのアンカーセットからファイルパスを削除します。削除したアンカーは古さの判定対象から外れるだけで、そのメモが誤りだと主張するものではありません。冪等で、メモに一度も紐付けられていないパスは失敗として扱わず、結果として報告します |
| セッションを開始し、中断したところから再開したい | vectr_resume()。最新のタスクメモ、直近のスナップショット、ファイルアンカー付きの未解決の注意事項を 1 回の呼び出しで返します(CLI では vectr resume も使用できます) |
| コンテキストがいっぱいになってきた | vectr_evict_hint()。vectr が再取得できるチャンクと、再取得に使う正確な ID を示します |
| 以前に表示されたチャンクがコンテキストからなくなった | vectr_fetch(ids=[...])。再検索やファイルの再読み込みを行わず、ID を指定して決定論的にバイト単位で完全一致する内容を再取得します。インデックスに上限付きのチャンクが保存されていた場合は、切り捨てに関する警告を表示します |
| 長いセッションの終わりにチェックポイントを残したい | vectr_snapshot("label") |
| 以前のチェックポイントを探している | vectr_snapshot_list() |
| 大規模なリファクタリング後にメモが古くなった | メモごとに vectr_forget(note_id=N) を実行するか、すべて消去するには vectr_forget(all=true) を実行します |
| 自動取得されたメモを確認した結果、引き続き有効だった | vectr_promote(note_id=N)。信頼レベルを auto から agent へ 1 段階引き上げます。human への昇格はユーザー側の操作に限られ、エージェントは実行できません |
| 自動取得された失敗から成功への変化が保留中になっている | vectr_distill()。コマンドの失敗後に編集して成功した一連の記録を、確認用に表示します。vectr_remember(..., distilled_from=[arc_id]) で教訓を保存するか、vectr_distill(dismiss=[...], reason) で破棄します |
| 保存済みのメモが誤りだと判明した | vectr_revoke(note_id=N, reason)。メモを削除せず、「以前は……と考えていたが、取り消された……」という形で抑止情報として表示し続けるため、誤りが暗黙に再導出されることを防げます。vectr_remember(contradicts=N) を使うと、訂正と取り消しを一度に行えます |
| メモは誤りではなく、単に古くなった | vectr_supersede(note_id=N, successor_note_id=M)。revoke の「誤りだと証明された」という扱いをせず、新しいメモに置き換えて古いメモを退役させます。監査履歴では、事後的な退役と書き込み時の置き換えが区別して記録され、vectr_reinstate で元に戻せます |
| 取り消したメモが、実は正しかった | vectr_reinstate(note_id=N)。元の内容を復元します |
トリガー:配信レイヤー
これらのkind値には、妥当なデフォルトが設定されています。ノートでは、vectr_rememberに明示的なノートごとのtriggersを指定することもできます。
| 軸 | 発火条件 |
|---|---|
path | グロブが、現在のライフサイクル上のタイミングで対象となるファイルに一致する |
symbol | 対象のファイルがそのシンボルを定義または参照している。同じシンボルグラフに対してvectr_locateが使用するのと同じ方法で正確に解決し、曖昧一致は行わない |
semantic | プロンプトとの類似度が、kindごとに固定されたしきい値を超える |
event | セッション開始、プロンプト送信、編集前、実行前、コミット前、またはコンパクション後というライフサイクル上のタイミングが発生する |
command | 実行予定のシェルコマンドの正規化された動詞がグロブに一致する |
| temporal | 発火条件を変更するnot_before、expires_visibility、cooldownのガード。ただし、これらだけで発火することはない |
1つのエントリー内の条件はAND、エントリー間の条件はORで評価されます。発火するたびに、どのトリガーが一致したかを説明する1行の説明が付加されます。注入には予算が設定され(複数のサーフェスで共有する、ターンごとの厳格な上限)、ターン内のすべてのサーフェスでノートIDを基に重複排除され、出所情報が付与されます。そのため、未レビューの自動取得ノートが、あなたによる常設ルールと同等の権威を持つように表示されることはありません。ノートが途中で切り詰められることはありません。インデックス層の1行として丸ごと届くか、まったく届かないかのどちらかです。
ワークスペーススコープのノートは、マルチエージェントワークフローの共有バスとしても機能します。オーケストレーターとそのサブエージェントは、同じノートストアを読み書きするため、サブエージェントは完了前に、調査結果をvectr_remember(..., agent="coder-2")で記録できます。オーケストレーターはサブエージェントのトランスクリプト全体を読み直す代わりに、その結果を呼び出せます。agentパラメーターが推測されることはありません。明示的な帰属情報であり、vectr_recallのインデックス出力にタグとして表示されます。
CLIリファレンス
vectr start # index + start daemon for current dir
vectr start /project/api # positional workspace: a directory or .code-workspace file
vectr start --path /project/api # specific workspace (repeatable, multi-root)
vectr start --memory-only # working memory + hooks only, no code index, no watcher
vectr status # index health, chunk count, notes count
vectr status --all # all running instances
vectr stop /project/api # stop one instance (same positional as start)
vectr stop --path /project/api # stop one instance (equivalent --path form)
vectr stop --all # stop all instances
vectr index --path . # re-index without restarting daemon
vectr fetch src/auth.py:10-42 # re-fetch a chunk by exact id, verbatim
vectr resume # most recent task note, latest snapshot, open gotchas
vectr init --path . # write guidance file + MCP config without starting
vectr init --exclude vendor # exclude directories from indexing
vectr forget --path . # delete all working-memory notes
vectr memory export # render the working-memory store as a greppable, git-diffable markdown file (default MEMORY.md)
vectr memory export --path notes.md # write the export to a specific file
vectr memory export --disable # stop the auto-refresh that keeps the export file in sync
vectr memory edit # open the working-memory store in your $EDITOR, one block per note
vectr memory import # bring existing on-disk memory files into the working-memory store (see below)
vectr memory import --path NOTES.md # import a specific file instead of the default discovery list
vectr memory import --dry-run # preview what would be created (kind, title, source file, line range), change nothing
vectr cache prune # remove empty per-workspace cache dirs (live instances skipped)
vectr cache prune --dry-run # preview what would be removed, delete nothing
vectr proxy # experimental: localhost API proxy (see below)
vectr mcp-stdio # foreground stdio MCP transport, no port or daemon (see above)
既存のメモリをインポートする
vectr memory export と vectr memory edit は、それぞれ一方向にエクスポートする経路と、チェックアウト/チェックインする経路です。vectr memory import は一方向にインポートする経路です。既存のディスク上のメモリを、手作業で再入力することなく作業メモリストアに取り込みます。すでにメモリを書き留めている新しいユーザー向けの導入経路です。
検出。 --path を指定しない場合、インポーターはワークスペースのルートにあるデフォルト候補ファイルを限定リストに従って確認します。対象は MEMORY.md、CLAUDE.md、AGENTS.md、.cursorrules、.github/copilot-instructions.md です。ほかのファイルまたはディレクトリを指定するには、--path(複数回指定可能)を渡します。ディレクトリは再帰的に検索され、*.md と *.mdc のファイルが対象になります。存在しないファイルは報告されますが、エラーにはなりません。ほとんどのワークスペースには、デフォルトファイルがすべて揃っているとは限らないためです。
粒度。 ソースファイルは、1つのメモにも、1行ごとのメモにもなりません。人が MEMORY.md をざっと読むときと同様に、Markdown の見出し境界(^#{1,6}\s+)で分割されます。見出しのないファイルは1つのメモになります。フェンス付きコードブロックや HTML コメントブロック内の見出しはスキップされるため、コード例やエクスポートファイルのヘッダーコメントがセクション境界になることはありません。以前に vectr memory export でエクスポートされたファイルは、その `` ヘッダーで検出され、vectr memory edit が使用するものと同じブロック構文で解析されます。これにより、元の各ブロックがメモとして復元され、宣言されていた kind、priority、tags、provenance が引き継がれます。
ドライラン。 --dry-run は、作成される内容(kind、タイトル、ソースファイル、ソース行の範囲、provenance)を正確に表示し、変更は行いません。メモリはユーザーが簡単には再構築できない唯一のリソースなので、まずドライランを実行するのが最善です。
vectr memory import --dry-run
# + [finding/auto] 'Project conventions' (MEMORY.md:12-34)
# + [operational/agent] 'Test runner' (CLAUDE.md:5-9)
# DRY RUN: would create 2 note(s), skip 0 already-imported, ...
冪等性。 インポートされた各メモには、src:、src-sha:、src-lines: のタグが付与されます。変更されていないソースファイルに対して vectr memory import を再実行すると、これらのタグが認識され、新しいメモは作成されません。ソースファイルのセクションを編集すると、ハッシュが保存済みのものと一致しない新しい本文が生成されるため、新しいメモになります。以前のメモはそのまま残ります。以前にインポートしたメモをユーザーに知らせずに削除することは、エクスポート側の設計で防いでいる、気付かれないデータ損失そのものだからです。
Provenance。 インポートされたメモには、ソースファイルを示すタグ(imported と src:FILENAME。FILENAME はソースファイルのベース名)が付与されます。そのため、imported が付いたメモを一覧表示するリコールは、「これはこのセッションでの観察ではなく、ファイルから取り込まれたものです」とユーザーに伝えます。メモの provenance はデフォルトで auto です。これは、レビューによる判断を経ずに機械が取得した事実にすでに付与されている分類です。手書きの MEMORY.md は、パーサーにとっては生成ツールの出力と構造上区別できないためです。例外は限定的かつ構造的なもので、意味に基づくものではありません。本文に命令ルールを示すマーカー(限定されたキーワードセット MUST、MUST NOT、NEVER、ALWAYS、DO NOT、DON'T、REQUIRED、FORBIDDEN)が含まれるメモは、kind="directive" に分類され、provenance="agent" に引き上げられます。これは、remember() の書き込み時ガード auto + directive があるためです。レビューされていない常設ルールは、矛盾した概念であり、インポートされたルールはまさにその組み合わせです。agent への引き上げは、auto からの逸脱を必要最小限にとどめ、ガードを満たすのに十分な対応です。レビュー後、ユーザーは vectr_promote を使ってさらに昇格させます。
パスを除外する
プロジェクトのルートに .vectrignore を作成します(構文は .gitignore と同じです)。
vendor/
node_modules/
*.pb.go
dist/
または、初期化時に --exclude を渡します。
vectr init --exclude vendor --exclude dist
除外設定は、初回のインデックス作成時の走査とライブファイルウォッチャーの両方に適用されるため、.vectrignore にディレクトリを追加すると、実行中のインスタンスによる再インデックスが停止します。次回のインデックス作成では、除外対象になったファイルや削除されたファイルのチャンクも削除されるため、最初から再構築する必要はありません。たとえば埋め込みモデルを変更した後など、クリーンな再構築が必要な場合は、強制実行します。
vectr index --path . --force # ignore the incremental cache, re-embed everything
対応言語
| 言語 | 分割方式 | シンボルグラフ |
|---|---|---|
| Python | AST(関数、クラス) | はい |
| JavaScript | AST(関数、クラス、アロー関数) | はい |
| TypeScript | AST | はい |
| Go | AST | はい |
| Rust | AST | はい |
| Java | AST | はい |
| C | AST | はい |
| C++ | AST | はい |
| Zig | AST | はい |
| その他すべて | 200 行のウィンドウ、50 行の重複 | いいえ |
HTTP ルート(Flask および FastAPI のデコレーター、Express の app.get()、Spring の @GetMapping)はシンボルとして抽出され、vectr_locate("GET /api/users") で検索できます。
コスト
| コスト | |
|---|---|
| 埋め込みモデル | $0.00。約 290 MB を一度だけダウンロードし、~/.cache/vectr/ にキャッシュします |
| 再インデックス(10k ファイル、初回実行) | CPU で約 10 分、2 回目以降は 5 秒未満(mtime キャッシュ) |
| 変更されたファイルごとの増分再インデックス | 約 0.5 秒 |
| vectr_search / vectr_recall | $0.00。ローカル推論のみ |
セキュリティ
デフォルト設定は変わらず、引き続き最優先事項です。個人のマシンで使う個人開発者向けに、ローカルで動作し、API キー不要、設定不要です。初期状態では、デーモンは 127.0.0.1 のみにバインドされ、CORS は localhost オリジンに制限されます。各ワークスペースには、それぞれ独立した DB ディレクトリ、ポート、プロセスが割り当てられます(POSIX では所有者のみがアクセスできる 0700)。インデックスとノートは ~/.cache/vectr/ にローカル保存されます。
以下の設定はすべてオプトインです。何も有効にしなければ、何も変わりません。
認証。 VECTR_API_KEY を設定すると、/v1/* と /mcp へのすべてのリクエストにキーが必要になります(X-Api-Key: <key> または Authorization: Bearer <key>。比較には一定時間比較を使用し、死活監視用の /v1/health は認証不要です)。vectr key でキーを生成します。起動時にキーが設定されている場合、vectr が書き込むエディターの MCP 設定にはヘッダーが自動的に含まれます。これらのファイル(.mcp.json、.cursor/mcp.json、.vscode/mcp.json)にはキーが平文で保存されるため、シークレットとして扱い、共有または公開されているバージョン管理に含めないでください。
保存データの暗号化。 VECTR_ENCRYPT_KEY を設定するか、OS のキーチェーンにパスフレーズを保存すると(サービス vectr、ユーザー名 encrypt-key。pip install vectr[encryption] が必要です)、ノートの内容、ノートのタイトル、スナップショットのペイロードが Fernet と PBKDF2 から導出したキーで暗号化されます。正直なところ、コードインデックスは暗号化されません。検索エンジンには、読み取り可能なチャンクテキストとベクトルが必要だからです。OS のディスク全体暗号化で保護してください。ノートのタグとメタデータは平文のままです。また、ノートの埋め込みベクトル(ノートのテキストを損失ありで投影したもの)は、VECTR_ENCRYPT_DISABLE_NOTE_VECTORS=1 を設定しない限り、意味検索に備えて保持されます。
保持と監査。 ノートは削除するまで保持されます。VECTR_NOTES_TTL_DAYS を設定すると、起動時に指定日数より古いノートが自動的に削除されます。vectr_forget(all=true) と vectr forget --all は、ノート、スナップショット、ノートベクトルを削除します。つまり、すべてが削除されます。VECTR_AUDIT_LOG=<path> を設定すると、インデックス作成、検索、記憶、想起のイベントをローテーション付きのローカルログに記録します(デフォルトでは無効です。目的上、クエリテキストも記録しますが、送信されることはありません)。ポリシー全文:docs/data-handling.md。
チームモード(共有インスタンス)。 1 つの中央デーモンで、1 つのリポジトリを使うチームにサービスを提供できます。サーバーで VECTR_API_KEY=<key> vectr start --host 0.0.0.0 を実行します(ループバック以外へのバインドは、キーがないと起動を拒否します)。次に、各クライアントで vectr connect --url http://<host>:<port> --api-key <key> --label <you> を実行し、エディターの接続先を指定します。作業メモリは共有されます。あるエージェントが保存したノートは、接続しているすべてのエージェントが想起でき、--label はノートと監査ログの項目にラベルを付けます。ノート ID は書き込みが到着した順に中央ストアが割り当てるため、クライアントが同時に接続している場合、自分のノート ID が連続するとは限りません。他のクライアントのノート ID と交互に割り当てられます。書き込み時に返される Stored note #N の行が、そのノートを特定する正式な参照先です。次の ID も自分のものだと思い込まないでください。率直な制約として、共有キーを持つ人は全員、同等の信頼された相手です(ロールやユーザーごとの権限はありません)。サーバーの運用者はすべてを読み取れます。検索結果が参照するのはサーバー側のチェックアウトであり、ローカルのツリーとは異なる場合があります。また、vectr は平文の HTTP を使用するため、信頼できないネットワークでは、リバースプロキシまたはトンネルで TLS を設定してください。
プロアクティブなコンテキスト(実験的、localhost のみ)
プル型の想起では、エージェントが質問する必要があります。プロアクティブなコンテキストは、通信経路上に配置することで、セッションフックのないホストにも決定論的な配信を拡張します。これは実験的で、localhost のみを対象とします。1.6.0 以降、ローカルインスタンスではプロアクティブな配信がデフォルトで有効です(proactive.enabled。無効にするには VECTR_PROACTIVE=0 を設定します)。以下の通信経路はこの設定ではなく、起動時の同意によって制御されます。プロキシを起動し、エージェントをそこに向けることがオプトインとなり、プロキシを停止するかベース URL の設定を解除することがオプトアウトとなります。
vectr proxy コマンドは、エージェントとモデル API の間で動作する小さなローカルプロキシを実行します。
vectr proxy # starts a localhost proxy (default :8785)
export ANTHROPIC_BASE_URL=http://127.0.0.1:8785 # point your agent at it
何をするのか、何をしないのかを明確に説明します。
- デフォルトでは透過的です。 すべてのリクエストを実際の API に転送し、ストリーミングレスポンスとツール呼び出しはバイト単位でそのまま通過します。API キーは変更されずに転送され、保存もログへの記録もされません。
- 決定論的な注入です。 ワークスペースデーモンが実行中の場合、プロンプトキャッシュを無効化しないよう、最後のプロンプトキャッシュブレークポイントの後に、照合された作業メモリのノートをリクエストへ追加します。トリガーには類似度のしきい値と完全一致する構造のみを使用し、キーワードによる推測は行いません。また、リクエストごとに厳格な予算を設け、トークンを使う価値がある場合にのみヒントを追加します。
- フェイルオープンです。 インテリジェンスレイヤーの応答が遅い場合やエラーが発生した場合でも、リクエストは変更されずに送信されます。プロキシを完全に迂回するには、ベース URL の設定を解除します。
unset ANTHROPIC_BASE_URL。プロキシはリクエスト経路上にあるため、停止している場合は変数の設定を解除して API に直接接続してください。 - 単独利用かつ localhost のみです。 コンテキストを計算するために会話を読み取るため、ループバック以外へのバインドを拒否し、チームモードとは併用できません。
- ファーストパーティ以外のベース URL に関する注意点は、ホスト独自のドキュメントに記載されています。
ENABLE_TOOL_SEARCH=trueを設定し、プロキシがツール参照ブロックを転送しない限り、MCP ツール検索は無効になります。また、api.anthropic.com以外のベース URL では Remote Control が無効になります。
組織全体のキャッシュ(チームモード)。 中央の共有インスタンスでは、vectr はセマンティック検索や想起結果など、コストの高い自身の処理結果を、完全一致する ID と現在のインデックス状態をキーとしてキャッシュできます。そのため、再インデックスやノートの変更によって自動的にキャッシュが無効になり、接続しているすべての開発者がその恩恵を受けられます。これはデフォルトで無効です(proactive.cache)。vectr status はヒット率と推定節約トークン数を報告するため、効果を主張ではなく測定によって確認できます。Vectr は、類似したリクエスト間で LLM のレスポンスをキャッシュすることはありません。ローカルでの、バイト単位で完全に同一なレスポンスのみを対象とし、明示的にオプトインした場合に限ります。誤ったキャッシュヒットが会話を気付かれないまま破損させるおそれがあるためです。
vectr が悪影響を及ぼす場合
コードベースの大幅な変更後にノートが古くなる場合。 ノートには、書き込んだ時点のファイルパスが保存されます。大規模なリファクタリングの後、vectr_recall は参照先の変更されたファイルに [STALE] のフラグを付けます。操作する前に再確認するか、vectr_forget(note_id=N) で古いノートを削除するか、vectr_forget(all=true) ですべてを消去してください。
よく知られた API に対して過剰に検索する場合。 モデルがトレーニングからフレームワークをすでに深く理解している場合、vectr の調査にかかるオーバーヘッドが節約分を上回ることがあります。上記のベンチマークでは、トレーニングで得た知識だけで十分に対処できたタスク debug_descriptor_priority で、その点が明確に示されています。
古くなったアーキテクチャ概要。 vectr_map_save で保存したパスポートは、インデックス作成時点のアーキテクチャを説明します。モジュール名の変更やエントリーポイントの再構成後は、確信を持って誤った情報になっている可能性があります。そのため、vectr_map が古さの警告を表示した場合は、vectr_map_save を再実行してください。
広範な想起はトークンを消費します。 クエリを指定せずに vectr_recall() を実行すると、すべてが返されます。対象を絞ったクエリを渡し、そもそも想起が必要かどうか判断できない場合は、まず vectr_status() を確認してください。
使用技術
Python 3.14 · FastAPI · sentence-transformers · tree-sitter · ChromaDB · BM25 · Docker
作者
Swapnanil Saha · swapnanilsaha.com
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。