knock について
knockはリポジトリをインデックス化し、コーディングエージェントに簡潔なコードマップ、正確な行番号、ソース変更時に古い情報として示される記録を提供します。未知のコードの調査や設計判断の追跡、セッションをまたぐ知見の保持に役立ちます。
主な機能
- 01行番号付きで関連コードをマップ
- 02呼び出し元と呼び出し先を含むシンボル表示
- 03後のセッション向けに知見を保存
- 04ソース変更時に記録を古い情報として表示
- 05変更ファイルを段階的にインデックス化
活用シーン
- 01変更前に大規模なコードベースを調査
- 02実装の判断に至った経緯を追跡
- 03以前のデバッグで得た知見を再利用
- 04ファイル全体を読まずに関連関数を特定
MCP 対応
knockはMCPサーバーとして動作し、コーディングエージェントにコードマップ、ソース読み取り、記憶用のツールを提供します。コンパクトな`map`ツールセットには`map`、`open`、`remember`が含まれます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
🚪 knock
AI コーディングエージェントに、コードベースの記憶を与えます。
毎回のセッションで同じファイルを読み直すために、エージェントに料金を払うのはやめましょう。まず knock を使い、重要なものだけを読み込みます。
Saleor で実施した Claude Code の実際のセッション 2 件を抜粋:各側で 3 回実行したうち、費用の中央値となった実行結果です。結果は実行やリポジトリによって異なります。小規模でよく知られたリポジトリでは、差は誤差の範囲内でした。全数値:docs/benchmark.md。
🤔 問題をひと目で
コーディングエージェントとの新しいチャットは、毎回記憶がリセットされた状態で始まります。 「X はどこにありますか?」 や 「どのようにデプロイしますか?」 に答えるため、エージェントは grep で検索し、大きなファイルを開いて読み込みます……そして次のセッションで、また最初から同じことを繰り返します。
| 😩 knock なし | 😎 knock あり | |
|---|---|---|
| 最初の動き | grep で検索し、ファイル全体を開くか、調査のためにサブエージェントを起動 | map を 1 回呼び出すだけ:関連コードを、正確な行範囲付きの骨組みとして表示 |
| エージェントが読むテキスト量 | 質問ごとに約 27,000~118,000 文字 | 質問ごとに約 4,300 文字 |
| 「なぜこの方法にしたのか?」がわかる | 適切なドキュメントを開いた場合のみ | 判断とその根拠が回答とともに返ってくる |
| 昨日のバグ調査を記憶する | ❌ | ✅ エージェントは remember で調査結果を保存 |
| メモが古くなったことを把握する | — | ✅ すべての回答に fresh または stale と表示 |
保留ベンチマーク(対象を絞った grep、および grep と読み込みを組み合わせたベースラインと knock の比較)における、タスクごとの文字数中央値です。文字数が少なくなっても、請求額が同じ割合で減るとは限りません。FAQをご覧ください。
⚡ はじめに
**knock は一度セットアップするだけで、あとはいつもどおり AI エージェントを使い続けられます。**エージェントはバックグラウンドで knock と通信するため、日々 knock のコマンドを実行する必要はありません。
1️⃣ Claude Code に接続する(プロジェクトごとに一度)
作業するプロジェクト内から、次を実行します。
claude mcp add knock -- uvx knock-mcp serve --repo . --toolset map
これはuvを使って、knock をダウンロードして実行します。uv がない場合は、pipx install knock-mcp(または pip install knock-mcp)を実行し、その後 claude mcp add knock -- knock serve --repo . --toolset map を実行してください。
--toolset map を指定すると、エージェントに3つのツール(map、open、remember)が提供されます。以下の結果で測定されているのは、この構成です。指定を省略すると、従来の8つのツールが利用できます。
設定はこれだけです。次回そのプロジェクトで Claude Code を開くと、knock がプロジェクトを読み取り、メモを自動的に作成します。小規模なプロジェクトなら数秒、約5,000ファイルの場合は1〜2分かかります。その後は、変更されたファイルだけを再読み込みします。
ヒント
エージェントが必要に応じて knock を使えるよう、プロジェクトの
CLAUDE.mdに次の行を追加してください。 「リポジトリを調べる前に(方法や理由に関する質問、原因が明確でないバグ、複数のモジュールにまたがる変更、検索1回では見つからないコードなど)、タスクを指定して knock のmapツールを呼び出してください。grep 1回で場所を特定できる小さな編集では省略できます。自明でない発見はrememberで保存してください。」私たちの記録では、大規模なコードベースの調査では knock によってコストが削減されましたが、簡単な編集では多少コストが増えました。そのため、この行が重要です。
2️⃣ いつもどおり作業する
いつもどおり、エージェントに質問してください。裏側では次のような処理が行われます。
| 入力する内容 | エージェントが行うこと |
|---|---|
| 「ログインエンドポイントにレート制限を追加して」 | まず knock に問い合わせ、ログインハンドラーの file:line、ミドルウェアの規約、テストの設定を取得し、該当する行だけを開きます |
| 「なぜ Mongo ではなく Postgres を使っているの?」 | ドキュメントまたは ADR から、その決定と理由を取得し、出典へのリンクを提示します |
| 「Redis エラーでテストが失敗する。何か心当たりはある?」 | 前のセッションで保存された発見、*「ログインのテストには Redis の起動が必要」*を見つけます |
| (何かが分かった後) | remember で保存するため、翌日のセッションではすでにその内容が分かっています |
メンテナンスは不要です。コードが変更されると、knock がメモを更新し、古くなっている可能性のある内容にフラグを付けます。
🖥️ オプション:ターミナルから knock を自分で使う
これらを使う必要はありませんが、便利です。
| コマンド | 使用する場面 |
|---|---|
knock map "where are expired checkouts cleaned up?" | エージェントが取得するものと同じコードマップを確認します |
knock open SomeClass.method | シンボルのコードを、呼び出し元と呼び出し先とともに正確に確認します |
knock context "how do we deploy?" | たとえば不慣れなリポジトリに参加するときに、自分で質問します |
knock search "rate limit" | knock がトピックについて把握している内容を検索します |
knock status | メモがどれだけ新しいか、knock がどの程度把握しているかを確認します |
knock index . | メモをすぐに更新します。通常はエージェントが実行します |
knock index . --full | 大規模なリファクタリングの後に、すべてを最初から再構築します |
knock forget . --yes | knock がこのプロジェクトについて保存した内容をすべて削除します |
knock に無視させたいファイルがある場合は、.knockignore ファイルに列挙してください(.gitignore と同じ形式です)。
👥 チーム全体で設定する
.mcp.json ファイルをリポジトリにコミットすると、チームメンバー全員の Claude Code で knock が自動的に有効になります(各自が knock をインストールする必要があります)。
{
"mcpServers": {
"knock": { "command": "knock", "args": ["serve", "--repo", ".", "--toolset", "map"] }
}
}
メモは各自のマシンに保存されます。チーム内で発見を共有する機能は、まだサポートされていません(下記の「ステータス」を参照してください)。
flowchart LR
A["📁 Your repo<br/>code · docs · configs · git log"] -->|"knock index<br/>(only changed files)"| B["🗂️ Notes<br/>each one points to<br/>file + lines + hash"]
B --> C[("💾 SQLite<br/>on your machine")]
C -->|"map"| D["🤖 Your agent"]
D -->|"open / Read<br/>(verify the real lines)"| A
D -->|"remember<br/>(save what it learned)"| C
- インデックス作成: knock はリポジトリ内で何も実行せずに読み取ります。各モジュールで定義されている内容、セットアップとデプロイに関するドキュメントの記述、使用しているツールと依存関係、判断の理由、バグを修正した最近のコミットについて、短いメモを作成します。
- 質問: エージェントが質問すると、ファイル全体を読む代わりに、
file:lineの参照先付きで、ランキングされた簡潔な回答が返されます。 - 確認: 編集する前に、エージェントは必要な行だけを読み取ります。元のファイルが常に信頼できる唯一の情報源です。
- 記憶: エージェントは学んだ内容を保存します。その後、それらのファイルが変更されると、knock はメモに 古い情報 の印を付けるため、誰も古い情報を信頼せずに済みます。
🧰 エージェントが利用できるもの
--toolset map を使用する場合(推奨):
| ツール | 説明 | |
|---|---|---|
map | 🗺️ | 通常なら探索を始める場面で使用します。 タスクに関連するコードの骨格を示します。シグネチャ、正確な行範囲、各関数が使用・捕捉するもの、呼び出し元に加え、その背景にある履歴や関連するドキュメントを含みます。変更依頼の場合は、読むべき正確な範囲と、再利用できる既存コードを含む、より簡潔なバージョンを返します。 |
open | 📄 | 関数またはクラスの正確な行番号付きコードと、その呼び出し元・呼び出し先、行範囲、またはファイルの骨格を取得します |
remember | ✍️ | 今後のセッションのために調査結果を保存します。引用元のファイルが変更されると、自動的にフラグが付けられます |
従来の8ツールセット(--toolset map を指定しない場合のデフォルト)
| ツール | 説明 | |
|---|---|---|
get_context | 🔎 | 通常なら探索を始める場面で使用します。 タスクに関するランキング済みのパッケージを返します。メモ、file:line 付きの関数、開く価値のあるファイル、関連コミット、そして「X については何もわかっていない」という不足情報を含みます |
search_knowledge | 📚 | カテゴリ(アーキテクチャ、判断、ワークフローなど)またはフォルダーで絞り込んでメモを検索します |
get_knowledge | 🧾 | 情報源、取得時期、現在も有効かどうかを含む、来歴情報付きのメモを取得します |
get_source | 📄 | ファイルから実際の行を読み取り、シークレットを秘匿します。knock がインデックスを作成したファイルのみが対象です |
record_knowledge | ✍️ | 調査結果を保存します。重複は統合され、矛盾にはフラグが付けられます |
update_knowledge_status | ✅ | メモを確認済み、または誤りとしてマークします |
get_repository_status | 🩺 | インデックスの鮮度に加え、件数や統計情報を表示します |
refresh_repository | 🔄 | 変更されたファイルを再インデックス化します(数ミリ秒で完了し、AI 呼び出しはありません) |
👀 実際のセッション例を見る(8ツールセット、Flask)
Flask で、エージェントに次のように伝えます:「SECRET_KEY のローテーション後、古いキーを使って SECRET_KEY_FALLBACKS で署名されたセッションが拒否される」。
get_contextは約7.7 KBの情報を返します。その内容は次のとおりです。src/flask/sessions.py:317:SecureCookieSessionInterface.get_signing_serializertests/test_basic.py:374:test_session_secret_key_fallbacks- 関連コミット
fb54159861 secret key rotation: fix key list orderingとe13373f838 enable secret key rotation - セッションとシークレットキーに関するドキュメントのセクション
get_source("src/flask/sessions.py", symbol="get_signing_serializer")は、ファイル全体ではなく、関連する約80行を返します。record_knowledgeは調査結果を保存します。
次のセッションでは、すぐにこの情報を取得できます。{"category": "debugging", "content": "get_signing_serializer builds the key list as SECRET_KEY_FALLBACKS followed by SECRET_KEY; ordering was fixed in fb54159.", "sources": [{"path": "src/flask/sessions.py", "start_line": 317, "end_line": 335}]}sessions.pyが変更されると、メモに 古い情報 のフラグが付きます。
再現可能なベンチマークで測定しました。リポジトリごとに、アーキテクチャ、機能の検索、デプロイ、バグ調査、設計上の根拠、規約への準拠を網羅するエンジニアリングタスクを12件実施しています。
未使用のリポジトリ(full-stack-fastapi-template。knock の調整には一度も使用していません):
| アプローチ | 必要な情報を見つけた数 | 読み取った文字数 | ツール呼び出し数 |
|---|---|---|---|
| 🐢 grep + 3ファイルを読む | 9 / 12 | 1,215,570 | 72 |
| 🐇 対象を絞った grep + スニペットを読む | 7 / 12 | 328,206 | 60 |
| 🚪 knock | 10 / 12 | 88,962 | 17 |
その他の数値と注記
- Flask(開発中に使用したため、結果は楽観的です):knock は92K文字で12/12件、ベースラインは2.1M文字と247K文字でそれぞれ7/12件でした。
- **速度:**約200ファイルのリポジトリを0.3~0.6秒でインデックス化します。変更がない場合の再インデックス化は約30 msです。
- **測定内容:**情報がエージェントに届いたかどうかを測定しており、その後エージェントがタスクを解決できたかどうかではありません。ベースラインはエージェントの動作をシミュレーションしたものです。
- 実際の Claude Code セッション(各3回)では、結果はリポジトリとタスクによって異なります。
- Flask(小規模でよく知られている):バグ調査では knock と従来手法のコストは同程度でした。また、簡単な編集では、追加の手順が単一の検索を上回るため、knock のほうがわずかに高コストでした。
- コンパクトな
mapツールセットを使ったSaleor(4,776ファイル、テスト実施の数日前にリリース)では、複数モジュールにまたがる調査において、knock によりコストの中央値が**$0.49から$0.29**に、モデルの実行時間が170秒から78秒に減少し、knock を使った実行はすべて低コストでした。一方、正規表現検索1回で見つかったファイルを後から編集する場合、knock のコストは高くなりました($0.14 対 $0.08)。 - 最新版(編集モードと「簡単な編集では knock をスキップする」ためのガイダンスを追加)では、調査から編集までの一連のシナリオ全体で、Saleor の2日間のコスト中央値が**$0.70から$0.43(−39%)**に下がりました。Flask では$0.31対$0.27で、実行ごとのばらつきの範囲内でした。Claude はガイダンスに従い、すべての調査で knock を使い、Flask の編集ではすべてスキップしました。
- ばらつきの確認(Saleor の調査で各条件8回実施):コスト中央値は**$0.42 → $0.25(−40%)**となり、両条件とも8回すべてで正解し、ばらつきの幅は約半分になりました。knock を使わない場合、Claude は8回中5回でサブエージェントに処理を委任しましたが、knock を使った場合は一度も委任しませんでした。
- 成績が低かったバージョンも含む全体の記録:Claude Code のセッションを87回記録しました…。
- 詳細と注意事項はdocs/benchmark.mdをご覧ください。
- **未測定の項目:**ライブモデルで実際に請求されるトークン数。ハーネス(
benchmarks/agent_bench.py)は利用可能ですが、実行には API クレジットが必要です。 - knock が見つけられなかった情報:「linters」と「lint」のような表現の不一致、および現時点でまだインデックス化されないモジュールレベルの変数です。
手法の詳細:docs/benchmark.md。
🔒 コードはお客様の手元に残ります
- 💻 すべてローカルで処理:
~/.knock内の SQLite ファイル1つだけを使います。クラウドへの送信も、テレメトリも、ネットワーク通信もありません(テストでこれを検証しています)。 - 🙈 シークレットは除外:
.envファイル、キー、認証情報はインデックス化されず、コード内のトークンやパスワードはマスキングされます。 - 🧱 **何も実行されません:**knock はスクリプト、フック、テストを実行しません。読み取るだけです。
- 🚧 **読み取りはサンドボックス化:**エージェントが取得できるのは knock がインデックス化したファイルだけであり、
../../anythingは取得できません。
重要
knock を介してエージェントが取得した情報は、エージェントがファイル自体を読んだ場合と同様に、エージェントのコンテキストに入ります。機密情報は
.knockignoreファイルで除外してください。詳細:docs/security.md。
❓ よくある質問
トークンを節約できますか?
それが目標であり、ベンチマークではエージェントに届くテキストが大幅に減ることが示されています。ただし、料金にはシステムプロンプト、推論、出力も含まれます。また、プロンプトキャッシュを使えば、繰り返し入力する内容はすでに割引されます。大きな効果が期待できるのは、探索に時間がかかる質問(「X はどう動くのか?」「Y はどこにあるのか?」「どうデプロイするのか?」)で、コードを書くことだけが目的の場合は効果があまりありません。どちらの場合も、回答が速くなることと、セッションをまたいで記憶を保持できることはメリットです。
API キーや有料モデルは必要ですか?
いいえ。インデックス作成と検索は完全に決定論的で、ローカルで実行されます。API を使うのは、任意のベンチマークだけです。
どのエージェントで使えますか?
stdio 経由で MCP に対応するエージェントなら、どれでも使えます。動作確認済み:Claude Code(このページ上部のセッションは、Claude が knock のツールを使った実際の記録です)と公式 MCP Python SDK クライアント(テストスイート内の 8 つすべてのツール)。Cursor、Windsurf などでも動作するはずですが、未テストです。セットアップ方法:docs/agents.md。
どの言語やファイルを理解できますか?
Python(構文木を使って深く解析します)のほか、JavaScript/TypeScript、Go、Rust、Java、Kotlin、C#、Ruby、PHP、Swift、C/C++ などに対応しています。また、Markdown や reStructuredText のドキュメント、ADR、package.json、pyproject.toml、go.mod、Cargo.toml、Dockerfile、Makefile、GitHub Actions、リンターの設定、git の履歴も読み取ります。全リスト:docs/architecture.md。
ドキュメントが間違っていたり、古くなっていたりしたらどうなりますか?
各メモには、その情報の出所(extracted from docs、recorded by an agent、git history)と鮮度が表示されます。エージェントはメモを誤りとしてマークでき、その情報源が変更されるまで非表示になります。実際のファイルは、いつでも get_source で確認できます。
「リポジトリを対象にした RAG」とは何が違いますか?
埋め込みもベクトルデータベースも使いません。knock は正確な行を参照する、小さく構造化された事実を保存し、それらの行が変更されたときに追跡します。また、エージェントが学んだ内容を追加できます。検索インデックスというより、自動で維持されるチーム Wiki に近いものです。
🗺️ ステータス
knock は初期段階のMVP(v0.1)です。現在使える機能と今後の予定:
-
.gitignoreを尊重し、シークレットをスキップする、増分対応で再開可能なインデックス作成 - 情報源、鮮度、ライフサイクルを含む構造化されたナレッジ
- 8 つのツール、キャッシュ、ローカルメトリクスを備えた MCP サーバー
- 評価用に除外したリポジトリを使った、再現可能なベンチマーク
- モデルを組み込んだトークンとコストのベンチマーク(ハーネスは準備済み)
- コンパクトな 3 ツールの「コードマップ」(
--toolset map)。Flask と Saleor の実際の Claude Code セッションで測定済み - より多くの大規模リポジトリと、非公開のコードベースで測定
- 同義語のマッチング改善と、モジュールレベルの変数のインデックス作成
- 任意で利用できる AI 支援による抽出(オプトイン方式で、利用を明示)
- チーム内でのナレッジ共有
🤝 コントリビューション
Issue と PR を歓迎します。CONTRIBUTING.mdから始めてください。
.venv/bin/pip install -e '.[dev]' && .venv/bin/pytest
詳細なドキュメント:アーキテクチャ · セキュリティ · エージェント · ベンチマーク · トラブルシューティング
📜 ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。