mcpField
K
knock

knock

ローカル
github.com開発ツール31 日前に更新

knock について

knockはリポジトリをインデックス化し、コーディングエージェントに簡潔なコードマップ、正確な行番号、ソース変更時に古い情報として示される記録を提供します。未知のコードの調査や設計判断の追跡、セッションをまたぐ知見の保持に役立ちます。

主な機能

  1. 01行番号付きで関連コードをマップ
  2. 02呼び出し元と呼び出し先を含むシンボル表示
  3. 03後のセッション向けに知見を保存
  4. 04ソース変更時に記録を古い情報として表示
  5. 05変更ファイルを段階的にインデックス化

活用シーン

  1. 01変更前に大規模なコードベースを調査
  2. 02実装の判断に至った経緯を追跡
  3. 03以前のデバッグで得た知見を再利用
  4. 04ファイル全体を読まずに関連関数を特定

MCP 対応

knockはMCPサーバーとして動作し、コーディングエージェントにコードマップ、ソース読み取り、記憶用のツールを提供します。コンパクトな`map`ツールセットには`map`、`open`、`remember`が含まれます。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"hasangilani-knock": {
"command": "uvx",
"args": [
"knock-mcp"
]
}
}
}
起動コマンドuvx knock-mcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypiknock-mcp0.2.0

ツール

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

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

詳細

🚪 knock

AI コーディングエージェントに、コードベースの記憶を与えます。

毎回のセッションで同じファイルを読み直すために、エージェントに料金を払うのはやめましょう。まず knock を使い、重要なものだけを読み込みます。

PyPI tests License: Apache-2.0 Python 3.10+ MCP server 100% local No API key needed

Saleor(4,776 ファイル)で同じ調査を並べて比較。Claude Code のみの場合:サブエージェントがツールを 30 回呼び出し、モデル処理時間は 3 分 22 秒、費用は $0.49。knock と Claude Code を併用した場合:ツールを 13 回呼び出し、1 分 16 秒、$0.25。どちらも正しい回答。

Saleor で実施した Claude Code の実際のセッション 2 件を抜粋:各側で 3 回実行したうち、費用の中央値となった実行結果です。結果は実行やリポジトリによって異なります。小規模でよく知られたリポジトリでは、差は誤差の範囲内でした。全数値:docs/benchmark.md。

📝 数値の背景:Claude Code のセッションを 87 件記録して、費用の使い道を調べました


🤔 問題をひと目で

コーディングエージェントとの新しいチャットは、毎回記憶がリセットされた状態で始まります。 「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 . --yesknock がこのプロジェクトについて保存した内容をすべて削除します

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
  1. インデックス作成: knock はリポジトリ内で何も実行せずに読み取ります。各モジュールで定義されている内容、セットアップとデプロイに関するドキュメントの記述、使用しているツールと依存関係、判断の理由、バグを修正した最近のコミットについて、短いメモを作成します。
  2. 質問: エージェントが質問すると、ファイル全体を読む代わりに、file:line の参照先付きで、ランキングされた簡潔な回答が返されます。
  3. 確認: 編集する前に、エージェントは必要な行だけを読み取ります。元のファイルが常に信頼できる唯一の情報源です。
  4. 記憶: エージェントは学んだ内容を保存します。その後、それらのファイルが変更されると、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 で署名されたセッションが拒否される」。

  1. get_context は約7.7 KBの情報を返します。その内容は次のとおりです。
    • src/flask/sessions.py:317:SecureCookieSessionInterface.get_signing_serializer
    • tests/test_basic.py:374:test_session_secret_key_fallbacks
    • 関連コミット fb54159861 secret key rotation: fix key list ordering と e13373f838 enable secret key rotation
    • セッションとシークレットキーに関するドキュメントのセクション
  2. get_source("src/flask/sessions.py", symbol="get_signing_serializer") は、ファイル全体ではなく、関連する約80行を返します。
  3. 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 / 121,215,57072
🐇 対象を絞った grep + スニペットを読む7 / 12328,20660
🚪 knock10 / 1288,96217
その他の数値と注記
  • 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

詳細なドキュメント:アーキテクチャ · セキュリティ · エージェント · ベンチマーク · トラブルシューティング

📜 ライセンス

Apache-2.0

コメント

MCP は初めてですか?

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

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