OpenGrok MCP Server について
OpenGrok MCP Serverは、AIコーディングクライアントからOpenGrokでインデックス化されたコードや履歴にアクセスするサーバーです。検索、ナビゲーション、変更者の確認、調査操作を備え、中間結果をモデルのコンテキストに含めないサンドボックス型Code Modeを提供します。
主な機能
- 01コード、シンボル、パスの検索
- 02ファイルの閲覧とディレクトリ参照
- 03変更者、履歴、差分の確認
- 04コールグラフと依存関係の追跡
- 05Code Modeでの複合調査
- 06VS Code拡張機能またはCLIでの設定
活用シーン
- 01シンボルを見つけて実装を確認
- 02リファクタリング前に呼び出し元や依存関係を追跡
- 03ファイル履歴を調べて行単位の変更者を確認
- 04大規模なOpenGrokインデックス済みコードベースを調査
MCP 対応
MCPサーバーはstdioまたはHTTPで互換クライアントをOpenGrokインスタンスに接続し、コード検索やリポジトリ調査のツールを提供します。サンドボックスモードではJavaScriptで複数の操作を組み合わせられます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y opengrok-mcp-serverOPENGROK_BASE_URLOpenGrok server base URL (e.g. https://opengrok.example.com/source/)OPENGROK_USERNAMEOpenGrok authentication username. Leave unset for anonymous access.OPENGROK_PASSWORDシークレットOpenGrok authentication password. Prefer storing via OS keychain using 'npx opengrok-mcp-server setup'.OPENGROK_VERIFY_SSLVerify TLS certificates. Set to false for self-signed or internal CA certs.OPENGROK_CODE_MODEEnable Code Mode: 2-tool sandbox interface with env.opengrok.* JavaScript API. Reduces AI token usage by ~90%.OPENGROK_ENABLE_MEMORY_TOOLSRegister the 3 memory tools in Code Mode (memory status, read, update). Off = api + execute only.OPENGROK_DEFAULT_PROJECTDefault project to scope all searches. Can be overridden per call.OPENGROK_CONTEXT_BUDGETResponse size tier controlling token usage.OPENGROK_API_VERSIONOpenGrok REST API version. Use v2 for call graph features (requires OpenGrok 1.12+).HTTP_PROXYHTTP/HTTPS proxy URL for all OpenGrok API requests (e.g. http://proxy.company.com:8080). Also set as HTTPS_PROXY.OPENGROK_RESPONSE_FORMAT_OVERRIDEForce a specific response format for all tools. Leave unset for per-tool auto-selection (recommended).OPENGROK_MEMORY_BANK_DIRDirectory where the AI stores investigation notes (active-task.md, investigation-log.md). Defaults to ~/.config/opengrok-mcp/memory-bank/ or workspace-relative when set by the VS Code extension.OPENGROK_LOCAL_COMPILE_DB_PATHSComma-separated paths to compile_commands.json for C/C++ compiler flag and include-path extraction. Leave unset for automatic workspace discovery.OPENGROK_ENABLE_ELICITATIONInteractive AI Prompts — the AI pauses to ask questions during investigations (project selection, file disambiguation). Requires Claude Code v2.1.76+ or a client that supports MCP Elicitation.OPENGROK_ENABLE_SAMPLINGAI Sampling — allow the server to request LLM completions for error explanations and summaries. Off by default to avoid consuming premium requests (e.g. GitHub Copilot).OPENGROK_SAMPLING_MODELModel preference for MCP Sampling (used for error explanation and query reformulation).OPENGROK_ENABLE_FILES_APIFiles API Cache — avoids re-uploading unchanged investigation notes. Requires Files API support in the MCP client.OPENGROK_ENABLE_OBSERVATION_MASKERObservation Masker — prepend compact history summaries to opengrok_execute results after N turns. Disabled by default; has no benefit for clients that retain full context (Claude Code, Cursor).OPENGROK_OBSERVATION_MASKER_TURNSNumber of most-recent opengrok_execute results to keep as full text before masking older ones. Default: 10.OPENGROK_SAMPLING_MAX_TOKENSシークレットMaximum tokens for AI sampling responses (error explanation, query reformulation). Range: 64–4096.OPENGROK_AUDIT_LOG_FILEPath to write structured audit events (CSV/JSON). Appends tool invocations, elicitation events, and errors. Leave unset to disable.OPENGROK_RATELIMIT_RPMMaximum requests per minute to the OpenGrok server. Default: 60.OPENGROK_PER_TOOL_RATELIMITPer-tool rate limits in requests per minute, as comma-separated tool:rpm pairs (e.g. opengrok_execute:15,opengrok_search_code:30). Overrides OPENGROK_RATELIMIT_RPM for specific tools.OPENGROK_TIMEOUTHTTP request timeout in seconds for OpenGrok API calls. Increase for slow servers. Default: 30.OPENGROK_DEFAULT_MAX_RESULTSDefault maximum number of results returned per search query. Default: 25.OPENGROK_PASSWORD_FILEシークレットPath to a file containing the OpenGrok password (file-mounted secret for containers). Takes precedence over the OS keychain when OPENGROK_PASSWORD is unset.OPENGROK_MAX_RESPONSE_BYTESHard cap on response payload size in bytes. Overrides the context-budget default. Non-positive values are ignored.OPENGROK_SEARCH_AND_READ_CAPCap for the search_and_read compound tool in bytes. Overrides the context-budget default (2–8 KB depending on tier). Non-positive values are ignored.OPENGROK_STRICT_SSRFWhen true, reject OPENGROK_BASE_URL values pointing at private/loopback IPs at startup. Default: false (warn only; per-request guards still apply).OPENGROK_JWT_ISSUERExpected JWT issuer (iss claim) for HTTP transport OAuth. When set, JWTs from other issuers are rejected.OPENGROK_GRAMMAR_DIRDirectory containing tree-sitter WASM grammars. Overrides the bundled grammar lookup.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
14掲載時のツール一覧 · 2 週間前に更新
このツールにパラメーターはありません。
詳細
OpenGrok MCP Server
OpenGrok でインデックス化されたあらゆるコードベースを対象とするコードインテリジェンス — 検索、読み取り、blame、シンボルナビゲーション、差分、コミット履歴、コールグラフ、依存関係マップ、ガイド付き調査に対応します。Code Mode と AST を考慮したコード読み取りにより、トークン効率を最適化しています。
クイックスタート
オプション 1 — VS Code 拡張機能
VS Code Marketplace から OpenGrok MCP をインストールするか、拡張機能パネルで「OpenGrok」を検索してください。初回起動時に設定パネルが開きます。OpenGrok のエンドポイント、ユーザー名、パスワードを入力し、Save Settings をクリックして、プロンプトが表示されたら再読み込みしてください。
この拡張機能はビジュアルな設定 UI を提供し、MCP サーバーのプロセスを自動的に管理します。Python、外部の Node.js のインストール、手動での環境設定は不要です。
オプション 2 — npm / npx CLI
npm install -g opengrok-mcp-server
opengrok-mcp setup # interactive wizard: URL, credentials, MCP client registration
インストールせずに実行するには、次のコマンドを使用します。
npx opengrok-mcp-server setup
その他の CLI コマンド:
opengrok-mcp status # health check: validates connectivity and detects installed MCP clients
opengrok-mcp setup --test # test the stored connection without the wizard
opengrok-mcp setup --set contextBudget=generous # update one stored setting non-interactively
opengrok-mcp export-audit --format json --output audit.jsonl # export the audit log
opengrok-mcp version # print version and exit
opengrok-mcp help # show all commands
あらゆる MCP 対応クライアント(CLI または IDE)で動作します。設定形式とトラブルシューティングについては、MCP_CLIENTS.md をご覧ください。
認証情報は OS のキーチェーン(macOS Keychain、Windows Credential Manager、Linux libsecret)に保存されます。ヘッドレス環境では、AES-256-GCM で暗号化されたファイルが代わりに使用されます。
ヒント
自動更新 — 拡張機能は 24 時間に 1 回 GitHub で新しいリリースを確認し、利用可能な場合は通知します。オンデマンドで確認するには、OpenGrok: Check for Updates を使用してください。
問題
大規模なコードベースを扱うエンジニアは、AI コーディングアシスタントを使う際に特有のギャップに直面します。モデルのコンテキストウィンドウに含まれるのは、現在開いているファイル、会話、手動で共有された情報です。しかし、本番環境のコードベースには、構造、履歴、モジュール間の関係があり、それらはすべてそのウィンドウの外に存在しています。
あるモジュールで定義され、ほかの 70 のモジュールから呼び出されるシンボル。動作を理解するには、その関数を形作った 3 つのコミットを確認する必要がある関数。十数個のディレクトリにまたがるインクルードチェーン。リファクタリングの前に、どのコンポーネントがサービスに依存しているかを示すコールグラフ。
コードインデックスにアクセスできないと、モデルは推測でこうしたギャップを埋めます。ファイルパスを捏造し、関数シグネチャをでっち上げ、変更を誤った作者に帰属させます。モデルの誤りは、知能が足りないためではなく、孤立しているために生じます。
OpenGrok は、すでに人間のエンジニア向けにこの問題を解決しています。数十のプログラミング言語のソースをインデックス化し、コミット済みの履歴全体にわたる全文検索インデックスを保持し、REST API を通じて定義の検索、参照グラフ、blame、ディレクトリの走査、ファイル履歴を提供します。問題は、AI ツールからそこにアクセスする方法がなかったことです。
仕組み
┌──────────────────────────────────────────────────────┐
│ AI Client (Claude, Copilot, Cursor, Codex …) │
└─────────────────────┬────────────────────────────────┘
│ MCP (stdio or HTTP)
┌─────────────────────▼────────────────────────────────┐
│ OpenGrok MCP Server (Node.js) │
│ opengrok_api ──── full API spec, once per session │
│ opengrok_execute ─ run JavaScript in sandbox │
│ │
│ OpenGrok client ── search · symbols · blame · diffs │
└─────────────────────┬────────────────────────────────┘
│ HTTP (REST + web fallback)
┌─────────────────────▼────────────────────────────────┐
│ OpenGrok │
│ search · symbols · call graphs · index health │
└──────────────────────────────────────────────────────┘
サーバーは、2 つの主要なツールを公開します。opengrok_api は、セッション開始時に API 仕様全体を提供します。それ以降のすべての操作は opengrok_execute を介して行われます。AI は env.opengrok.* オブジェクト(search、getFileContent、getFileAnnotate、getFileHistory、browseDir、getFileSymbols)を使った JavaScript プログラムを作成し、1 回の実行として送信します。
中間結果はサンドボックス内にとどまり、最終的な return 値だけがコンテキストウィンドウに返されます。シンボルを見つけ、定義を読み、誰が変更したかを確認し、呼び出し元をたどるという一連の調査が、各結果をその都度コンテキスト経由でやり取りするのではなく、1 つのスクリプトで完了します。複雑な調査では、トークンを通常 80~95%節約できます。
すべての env.opengrok.* 呼び出しは、サンドボックスコード内では同期的に見えます。QuickJS WASM VM は、SharedArrayBuffer + Atomics チャネル(データ領域 8 MB、呼び出しごとのタイムアウト 62 秒、実行時間のハード上限 62 秒)を介して、非同期 HTTP 呼び出しを透過的に中継しながら、Node.js のイベントループをブロックしません。
メモリバンク — 2 つのファイルが、ターンやセッションの再起動をまたいで保持されます。現在の調査状態を記録する active-task.md(4 KB)と、追記専用の調査結果を記録する investigation-log.md(32 KB)です。サンドボックス内では、env.opengrok.readMemory() / env.opengrok.writeMemory() を使います。詳しくは、以下のメモリバンクのリファレンスを参照してください。
リファレンス
ツールリファレンス
ツールは合計 31 個です。Code Mode では 2~5 個(opengrok_api + opengrok_execute と、OPENGROK_ENABLE_MEMORY_TOOLS=true の場合はメモリツール 3 個)、標準モードでは 26 個(OPENGROK_CODE_MODE=false)です。
主要ツール
| ツール | 用途 |
|---|---|
opengrok_search_code | 全文検索、定義検索、参照検索、パス検索、履歴検索を行います。file_type による絞り込みと cursor によるページネーションに対応しています。 |
opengrok_find_file | ファイル名またはディレクトリパターンでファイルを検索します。cursor によるページネーションに対応しています。 |
opengrok_get_file_content | ソースコードを読み取ります。大きなファイルでは start_line / end_line を使用してください。 |
opengrok_get_file_history | ファイルのコミット履歴を取得します。cursor によるページネーションに対応しています。 |
opengrok_browse_directory | フォルダー構造と、その中に含まれるファイルを表示します。cursor / limit によるページネーションに対応しています。 |
opengrok_list_projects | インデックス化されたすべてのリポジトリを一覧表示します。 |
opengrok_get_file_annotate | 行ごとの blame 注釈を取得します。revision、start_line / end_line による範囲指定、includeContent に対応しています。 |
opengrok_get_file_symbols | ファイルからクラス、関数、マクロ、構造体を抽出します。cursor によるページネーションに対応しています。 |
opengrok_search_suggest | クエリのオートコンプリート候補を取得します。ランキングに利用する context の受け渡しに対応しています。 |
複合ツール
複数の API 呼び出しを 1 つの操作にまとめます。
| ツール | 置き換える操作 | 節約量 |
|---|---|---|
opengrok_get_symbol_context | 定義の検索 + ソースの読み取り + ヘッダーの取得 + 参照の取得 | トークンを約 92%削減 |
opengrok_search_and_read | 検索 + 周辺コンテキストの読み取り(上限:OPENGROK_SEARCH_AND_READ_CAP) | トークンを約 92%削減 |
opengrok_batch_search | 2~5 件の並列検索、重複結果の排除 | トークンを約 73%削減 |
opengrok_index_health | レイテンシー、接続状態、陳腐化スコア | 診断 |
調査ツール
| ツール | 目的 |
|---|---|
opengrok_what_changed | コミットごとにグループ化された最近の行変更 — 作成者、日付、SHA、コンテキスト付きの変更行 |
opengrok_dependency_map | #include/import チェーンを深さ3まで幅優先探索し、uses/used_by を含む有向グラフを返します |
opengrok_search_pattern | 正規表現によるコード検索。file:line:content 形式の一致を返します |
opengrok_blame | 行範囲(line_start/line_end)と任意の差分を指定できる Blame |
opengrok_call_graph | OpenGrok API v2 を使用した呼び出しチェーンの追跡(OPENGROK_API_VERSION=v2 が必要。v1 では refs ベースのフォールバックを使用) |
opengrok_get_file_diff | コンテキスト行を含む、2つのリビジョン間の統合差分 |
opengrok_get_compile_info | ローカルの compile_commands.json から C/C++ のコンパイラフラグとインクルードパスを取得します |
opengrok_get_all_matches | 検索結果が省略されている場合に、ファイル内の一致するすべての行を取得します |
opengrok_get_file_history_with_files | RSS フィードを介して、変更されたファイルの一覧を含むコミット履歴を取得します |
opengrok_get_download_url | ファイルの直接ダウンロード URL(HTTP 呼び出しなし) |
opengrok_list_groups | プロジェクトグループ(管理者認証が必要な場合は空) |
opengrok_get_suggest_popularity | プロジェクトフィールドの人気の候補(管理者認証が必要な場合は空) |
opengrok_get_project_repositories | プロジェクトのリポジトリ(管理者認証が必要な場合は空) |
(注:検索ツールは言語フィルタリングに対応しています。file_type には正規のアナライザー名を指定してください。C++ は cxx、Go は golang、シェルは sh、JS は javascript です。エイリアスも使用できます:cpp/c++→cxx、go→golang、bash/shell→sh、js→javascript、ts→typescript、cs→csharp、py→python、rb→ruby、rs→rust。)
defs/refs/symbol のフォールバックに関する注意 — defs、refs、symbol の検索にはプロジェクトスコープが必要です(projects を渡すか、OPENGROK_DEFAULT_PROJECT を設定してください)。プロジェクトスコープがない場合、プロジェクトをまたいだ検索結果が多くなりすぎることがあります。これらの種類の検索で REST エンドポイントがエラーまたは空の結果を返すインスタンスでは、クライアントが自動的に Web UI の解析にフォールバックするため、LLM は引き続き回答を得られます。opengrok_call_graph には API v2 が必要で、v1 では refs ベースの表示に切り替わります。
Code Mode API
OPENGROK_CODE_MODE=true を設定します(デフォルト)。セッション開始時に opengrok_api を1回呼び出して、API 仕様全体を取得してください。それ以降のすべての操作は opengrok_execute を介して実行します。
サンドボックス API の呼び出しはすべて同期処理です。フラットなグローバル関数(search(...))を使用し、await は不要です。env.opengrok.* オブジェクト形式(env.opengrok.search(...))も同等です。
検索と探索
| メソッド | 戻り値 |
|---|---|
env.opengrok.search(query, opts?) | 全文、defs、refs、symbol、path、hist。オプション:searchType、projects、maxResults(デフォルトは5)、startIndex、cursor、fileType、sort、maxHitsPerFile、dir、pathFilter、file、expandFunction |
env.opengrok.batchSearch(queries[], opts?) | クエリごとに1つの結果セット(最大10件)。ホスト上で並列実行されます。クエリごとに expandFunction: true を指定すると、囲む関数のコンテキストが含まれます |
env.opengrok.findFile(pattern, opts?) | { totalCount, results: [{project, path}], cursor? } |
env.opengrok.searchSuggest(query, opts?) | { query, field, suggestions, time }。オプション:field、project/projects、context(ランキングに使用する他のフィールド値) |
env.opengrok.getAllMatchesInFile(project, path, query, opts?) | 検索結果が省略されている場合に、ファイル内の一致するすべての行を取得します。search() に file: フィルターを指定した場合にも自動的に使用されます(ページネーションなし) |
search() では正規のファイルタイプ名のみを使用します(例:cxx、golang、sh)。上記のエイリアス一覧を参照してください。一致した結果を囲む関数本体まで展開するには、expandFunction: true を渡します(ホスト側の読み取りが追加され、1回の呼び出しにつき最大3ファイルです)。
カーソルページネーション — cursor フィールドを返すメソッド(search、findFile、browseDir、getFileSymbols、getFileHistory、getFileDiff)はページネーションに対応しています。次のページを取得するには、カーソルを次の呼び出しで opts.cursor として渡してください。カーソルの有効期限が切れている場合(セッションが再起動された、または時間が経過しすぎた場合)、レスポンスに { _cursorExpired: true } が含まれます。最初からページネーションをやり直してください。
読み取りとナビゲーション
| メソッド | 戻り値 |
|---|---|
env.opengrok.getFileContent(project, path, opts?) | { project, path, content, lineCount, sizeBytes, startLine }。範囲を指定した読み取りでは、デフォルトで範囲を囲む関数まで拡張されます。正確に指定した範囲を維持するには、{expandFunction: false} を渡してください |
env.opengrok.browseDir(project, path?, opts?) | { project, path, entries, cursor? } |
env.opengrok.getFileSymbols(project, path, opts?) | { project, path, symbols, cursor? } |
env.opengrok.getFileOverview(project, path, opts?) | { lang, sizeLines, sizeBytes, imports, topLevelSymbols, recentAuthors, lastRevision }。インポートを含めるには includeImports:true を渡してください(デフォルトでは省略されます) |
履歴と Blame
| メソッド | 戻り値 |
|---|---|
env.opengrok.getFileAnnotate(project, path, opts?) | { project, path, lines: [{lineNumber, revision, author, date, content}] }。オプション:revision、startLine/endLine(範囲外の場合はエラーが発生します)、includeContent(デフォルトは true) |
env.opengrok.getFileHistory(project, path, opts?) | { project, path, entries, cursor? }(maxEntries、cursor) |
env.opengrok.getFileHistoryWithFiles(project, path, opts?) | RSS フィード経由のコミット履歴と、同じ変更で更新されたファイルの一覧(maxEntries) |
env.opengrok.getFileDiff(project, path, rev1, rev2, opts?) | { hunks, unifiedDiff, stats }。includeHunks:true(デフォルト)ではハンクを保持し、false では {unifiedDiff,stats} のみを返します。ハンク単位のカーソルページネーションに対応しています |
env.opengrok.getGuidanceForPath(project, path, opts?) | { guidance: [{path, scope, content, truncated}], missingCount, errorCount, incomplete, capped, searchedUpTo } — AGENTS.md/CLAUDE.md の検出 |
コードインテリジェンス
| メソッド | 戻り値 |
|---|---|
env.opengrok.traceCallChain(symbol, opts?) | 呼び出しチェーンのトレース。direction: 'callers'|'callees'|'both'。非同期 — 初回の呼び出しでは {status:'computing'} が返される場合があります。同じ呼び出しを再試行すると、キャッシュされた結果を取得できます |
env.opengrok.getSymbolContext(symbol, opts?) | 定義、参照、ヘッダーを統合して返します。tree-sitter により、定義は関数本体全体まで展開されます |
env.opengrok.dependencyMap(project, path, opts?) | 依存関係グラフ:uses(インポート)と used_by(参照)。高速パスを備えた非同期処理です。{status:'computing'} が返される場合は、再試行するとキャッシュされたグラフを取得できます。direction: 'uses'|'used_by'|'both' |
env.opengrok.getCompileInfo(path) | C/C++ のコンパイラフラグとインクルードパス。ローカルのコンパイルデータベースが設定されていない場合は null |
traceCallChain の呼び出し元は refs 検索から取得され、呼び出し先は対応言語(C/C++、Java、Go、Python、JS/TS、Rust など)の tree-sitter AST 解析から取得されます。時間のかかる2つのメソッドはいずれも、バックグラウンドクライアント(レート制限がなく、操作ごとの予算が短い、同系列の接続)に処理を分散します。そのため、深いトラバースでフォアグラウンドのレート制限枠を消費しません。
システム
| メソッド | 戻り値 |
|---|---|
env.opengrok.indexHealth() | { connected, latencyMs, baseUrl, serverVersion?, suggestConfig? } |
env.opengrok.listProjects(filter?) | { projects } — インデックス化されたすべてのリポジトリ(標準モードでの同等機能:opengrok_list_projects) |
env.opengrok.readMemory(filename) | active-task.md または investigation-log.md を読み込みます(未初期化の場合は null) |
env.opengrok.writeMemory(filename, content, mode?) | 'overwrite'(デフォルト)または 'append'。実行ごとに最大 5 回書き込み可能です |
env.opengrok.elicit(message, schema) | ユーザーに選択を求めます(OPENGROK_ENABLE_ELICITATION=true が必要です) |
env.opengrok.sample(prompt, opts?) | クライアントの LLM に AI テキストをリクエストします(OPENGROK_ENABLE_SAMPLING=true が必要です。未対応の場合は null が返されるため、必ず null チェックを行ってください) |
例
// Example opengrok_execute code
const refs = env.opengrok.search("handleCrash", { searchType: "refs", maxResults: 5 });
const first = refs.results[0];
const content = env.opengrok.getFileContent(first.project, first.path, {
startLine: first.matches[0].lineNumber - 5,
endLine: first.matches[0].lineNumber + 10,
});
return { callerFile: first.path, code: content.content };
search() が 結果なし を返し、サンプリングが有効な場合、結果には _suggestions: string[] が自動的に挿入されます。sample() を明示的に呼び出す前に、この値を確認してください。
Tree-sitter による解析機能 — 範囲読み取りと expandFunction は、tree-sitter AST 解析を使用して、一致箇所をそれを含む関数本体まで拡張します(WASM 文法を使用するため、ホスト側のツールチェーンは不要です)。ティアごとに行数の上限が適用されます:minimal は 200 行、standard は 400 行、generous は 600 行です。OPENGROK_GRAMMAR_DIR で文法ディレクトリを上書きできます。npm run copy-grammars で新しい文法を追加できます(CONTRIBUTING.md を参照)。
fitToBuffer による切り詰め — 8 MB のブリッジバッファーを超えるサンドボックスの結果は、fitToBuffer() によって、JSON の途中ではなく結果要素の単位で保持しながら切り詰められます。切り詰められた結果には _truncated: true が付与されます。この値がある場合は、クエリの範囲を狭めるか、cursor を使ってページ分割してください。
Elicitation(OPENGROK_ENABLE_ELICITATION=false で無効化、デフォルト:true)
有効にすると、OPENGROK_DEFAULT_PROJECT が設定されておらず、プロジェクトが複数存在する場合、セッション開始時に opengrok_api がユーザーに作業対象のプロジェクトを選択するよう求めます。サンドボックスコードから env.opengrok.elicit() を呼び出し、実行中に複数の一致候補からユーザーに選択を求めることもできます。MCP Elicitation に対応するクライアントが必要です。Claude Code v2.1.76 以降は対応しています。それ以外のクライアントでは、エラーにならず { action: "cancel" } にフォールバックします。
Sampling(OPENGROK_ENABLE_SAMPLING=true、デフォルト:false)
MCP Sampling を介して LLM の呼び出しをクライアントに委譲し、別途 API キーを用意せずにクライアントのモデルのサブスクリプションを使用します。サンドボックスエラーの説明、大規模な依存関係グラフの要約(10 ノード超)、結果なしのクエリの再構成(_suggestions の挿入)の 3 か所で自動的に実行されます。VS Code Copilot はサンプリングに対応していますが、他のクライアントの対応状況は異なります。サンプリングが利用できない場合、サーバーはエラーにならずに処理を続行します。
警告
サンプリングは自動的に実行され、オンデマンドではありません。1 回の調査セッションで、サンドボックスエラー、結果なしの検索、大規模な依存関係グラフに対して、多数のサンプリング呼び出しが発生する可能性があります。クライアントによっては、最初の確認プロンプト後、呼び出しごとにプレミアムリクエストを消費します。この点を踏まえて有効にしてください。
Memory Bank
Code Mode には、デフォルトで 2 つのツール(api と execute。OPENGROK_ENABLE_MEMORY_TOOLS=true の場合は 5 つ)が含まれます。次の 2 つのファイルは、ターン間およびセッションの再起動後も保持されます。
| ツール | 用途 |
|---|---|
opengrok_memory_status | 2 つのメモリファイルのステータス、サイズ、および 3 行のプレビュー |
opengrok_read_memory | active-task.md または investigation-log.md を読み込みます |
opengrok_update_memory | 書き込みまたは追記を行います。investigation-log.md のエントリには日時が自動的に付与されます |
| ファイル | サイズ上限 | 用途 |
|---|---|---|
active-task.md | ≤ 4 KB | 現在のタスクの状態:task:、last_symbol:、next_step:、open_questions:、status: |
investigation-log.md | ≤ 32 KB | 追記専用の調査ログ。## YYYY-MM-DD HH:MM: 見出しごとに調査結果をまとめます |
設定
コア
| 変数 | デフォルト | 説明 |
|---|---|---|
OPENGROK_BASE_URL | (blank) | OpenGrok サーバーのベース URL(必須)。セットアップウィザードまたは VS Code の設定で指定します。 |
OPENGROK_USERNAME | (blank) | 認証ユーザー名。匿名アクセスの場合は設定しないでください。 |
OPENGROK_PASSWORD | (blank) | 認証パスワード。opengrok-mcp setup を使用して OS のキーチェーンに保存することを推奨します。 |
OPENGROK_PASSWORD_FILE | (blank) | OpenGrok のパスワードを含むファイルへのパス(CI/コンテナーでファイルとしてマウントするシークレット)。OPENGROK_PASSWORD の代わりに使用します。 |
OPENGROK_VERIFY_SSL | true | 自己署名証明書の TLS 検証を無効にするには、false に設定します。 |
OPENGROK_TIMEOUT | 30 | HTTP リクエストのタイムアウト(秒)。 |
コードモードとパフォーマンス
| 変数 | デフォルト | 説明 |
|---|---|---|
OPENGROK_CODE_MODE | true | コードモード(2~5 個のツール:opengrok_api + opengrok_execute + 有効時は 3 個のメモリツール)。従来の標準ツール 26 個を使用するには、false に設定します。 |
OPENGROK_CONTEXT_BUDGET | standard | レスポンスサイズの段階:minimal(8 KB、tree-sitter の予算は 200 行)/standard(16 KB、400 行)/generous(32 KB、600 行)。 |
OPENGROK_MAX_RESPONSE_BYTES | — | レスポンスごとのバイト数上限を上書きします(OPENGROK_CONTEXT_BUDGET より優先されます)。 |
OPENGROK_SEARCH_AND_READ_CAP | — | opengrok_search_and_read の複合上限を上書きします(デフォルト:段階ごとに 2 KB/4 KB/8 KB)。 |
OPENGROK_RESPONSE_FORMAT_OVERRIDE | — | 全体で使用する形式を指定します:markdown/json/tsv/toon/yaml/text。 |
OPENGROK_DEFAULT_PROJECT | — | すべての検索対象を絞り込むデフォルトのプロジェクト名。 |
OPENGROK_DEFAULT_MAX_RESULTS | 25 | 検索結果のデフォルト上限数。 |
OPENGROK_LOCAL_COMPILE_DB_PATHS | — | C/C++ のフラグ抽出に使用する compile_commands.json へのパスをカンマ区切りで指定します。 |
OPENGROK_GRAMMAR_DIR | 自動検出 | tree-sitter の文法 WASM ファイルへのパスを上書きします。デフォルトでは、バンドルディレクトリから上の階層をたどって grammars/ を探します。 |
メモリバンク
| 変数 | デフォルト | 説明 |
|---|---|---|
OPENGROK_ENABLE_MEMORY_TOOLS | false | コードモードのメモリツール 3 個(メモリの状態確認、読み取り、更新)を登録します。無効の場合は api と execute のみです。 |
OPENGROK_MEMORY_BANK_DIR | サーバーのデフォルト | active-task.md と investigation-log.md の保存ディレクトリを上書きします。 |
OPENGROK_ENABLE_OBSERVATION_MASKER | false | 全文表示ウィンドウが埋まった後、opengrok_execute の結果の先頭に簡潔な履歴要約を付加します。コンテキストを切り詰めるクライアントでのみ有用です。 |
OPENGROK_OBSERVATION_MASKER_TURNS | 10 | 古い結果が簡潔にまとめられる前に、opengrok_execute の直近の結果を全文のまま保持する数。 |
レート制限
| 変数 | デフォルト | 説明 |
|---|---|---|
OPENGROK_RATELIMIT_ENABLED | true | トークンバケット方式のレート制限を有効にします。 |
OPENGROK_RATELIMIT_RPM | 60 | 全体の 1 分あたりのリクエスト数の上限。 |
OPENGROK_PER_TOOL_RATELIMIT | — | ツールごとの RPM 上書き設定:opengrok_execute:15,opengrok_batch_search:20。デフォルトは opengrok_execute が 15 rpm、opengrok_batch_search が 5 rpm、opengrok_dependency_map が 10 rpm、opengrok_call_graph が 5 rpm です。 |
レスポンスキャッシュ
| 変数 | デフォルト | 説明 |
|---|---|---|
OPENGROK_CACHE_ENABLED | true | TTL レスポンスキャッシュを有効にします。 |
OPENGROK_CACHE_MAX_SIZE | 500 | キャッシュエントリの最大数です。 |
OPENGROK_CACHE_MAX_BYTES | 52428800 | キャッシュ合計サイズの最大値(バイト単位、50 MB)です。 |
OPENGROK_CACHE_SEARCH_TTL | 300 | 検索結果キャッシュの TTL(秒単位)です。 |
OPENGROK_CACHE_FILE_TTL | 600 | ファイル内容キャッシュの TTL(秒単位)です。 |
OPENGROK_CACHE_HISTORY_TTL | 1800 | ファイル履歴キャッシュの TTL(秒単位)です。 |
OPENGROK_CACHE_PROJECTS_TTL | 3600 | プロジェクト一覧キャッシュの TTL(秒単位)です。 |
MCP プロトコル
| 変数 | デフォルト | 説明 |
|---|---|---|
OPENGROK_ENABLE_ELICITATION | true | opengrok_api の起動時のプロジェクト選択と、サンドボックス内の env.opengrok.elicit() を有効にします。 |
OPENGROK_ENABLE_SAMPLING | false | エラーの説明、グラフの要約、検索結果がない場合の復旧に MCP Sampling を使用します。 |
OPENGROK_ENABLE_FILES_API | false | investigation-log.md 用の FileReferenceCache(SHA-256 によるコンテンツアドレス指定)を有効にします。 |
OPENGROK_SAMPLING_MODEL | — | Sampling 呼び出しで使用するモデルの優先設定です。 |
OPENGROK_SAMPLING_MAX_TOKENS | 256 | Sampling 応答のトークン上限です(最大:4096)。 |
OpenGrok API
| 変数 | デフォルト | 説明 |
|---|---|---|
OPENGROK_API_VERSION | v1 | REST API のバージョンです。opengrok_call_graph には v2 を使用してください。 |
セキュリティと監査
| 変数 | デフォルト | 説明 |
|---|---|---|
OPENGROK_AUDIT_LOG_FILE | — | 構造化監査ログ(CSV または JSON)のファイルパスです。 |
OPENGROK_STRICT_SSRF | false | プライベート/ループバック IP 範囲に解決されるベース URL とリダイレクトを拒否します(デフォルト:警告のみ)。 |
ロギング
| 変数 | デフォルト | 説明 |
|---|---|---|
OPENGROK_LOG_LEVEL | info | 標準エラー出力への詳細な構造化ログを有効にするには、debug を設定します。 |
プロキシ
| 変数 | デフォルト | 説明 |
|---|---|---|
HTTP_PROXY | — | 外部リクエスト用の HTTP プロキシです。 |
HTTPS_PROXY | — | 外部リクエスト用の HTTPS プロキシです。 |
VS Code ユーザーは、代わりに VS Code の設定で opengrok-mcp.baseUrl、opengrok-mcp.codeMode、opengrok-mcp.contextBudget、opengrok-mcp.memoryBankDir、opengrok-mcp.defaultProject、opengrok-mcp.responseFormatOverride、opengrok-mcp.compileDbPaths、opengrok-mcp.enableObservationMasker、opengrok-mcp.observationMaskerTurns を設定できます。パスワードなどのシークレット値が VS Code の設定に書き込まれることはありません。
MCP SDK に関する注記: このバージョンでは
@modelcontextprotocol/sdkv1.30.0(v1 系列)を使用します。
HTTP トランスポートと認証
デフォルトでは、サーバーは stdio を介して通信します。チームで共有するデプロイでは、HTTP トランスポート層をライブラリ API(src/server/transport/http-transport.ts の startHttpTransport())として利用できますが、CLI のエントリーポイントにはまだ接続されていません。以下に OPENGROK_HTTP_PORT の記載がありますが、main.ts は HTTP サーバーを自動的に起動するためにこの値をまだ読み取りません。カスタムデプロイでは startHttpTransport() を直接使用してください。
セッション管理
- 各 HTTP クライアントには、分離された
McpServerインスタンスが割り当てられます(セッションごとのファクトリーパターン)。 - セッションは30分間操作がないと期限切れになります。
OPENGROK_HTTP_MAX_SESSIONSは同時セッション数を制限します(デフォルト:100)。 GET /mcp/sessionsは、アクティブなセッション数と最も古いセッションの経過時間を含む JSON を返します。
| 方法 | 設定 |
|---|---|
| 静的 Bearer トークン | OPENGROK_HTTP_AUTH_TOKEN=mysecret |
| OAuth 2.1 リソースサーバー | OPENGROK_JWKS_URI=https://idp.example.com/.well-known/jwks.json + OPENGROK_RESOURCE_URI=https://opengrok-mcp.example.com |
| 名前付きロールによる RBAC | OPENGROK_RBAC_TOKENS='alice-token:admin,bot-token:readonly' |
リソースサーバーモードでは、このサーバーは独自の IdP が発行した JWT を検証します。組み込みの /token エンドポイントはありません。OPENGROK_JWT_ISSUER が設定されている場合、他の発行者のトークンは拒否されます。RFC 9728 の保護リソースメタデータは /.well-known/oauth-protected-resource で提供されます。
RBAC ロール
| ロール | 権限 |
|---|---|
admin | すべてのツールと設定へのフルアクセス |
developer | すべての検索、読み取り、メモリ、コードツール |
readonly | 検索および読み取りツールのみ。メモリへの書き込みとコードの実行は不可 |
不明なトークンやトークンがない場合は、403 Forbidden で拒否されます。認証が設定されていない場合、未認証のリクエストには admin が付与されます(ローカル開発モード)。
CORS
ブラウザーベースのクライアントには、オリジンの許可リスト(カンマ区切りの OPENGROK_ALLOWED_ORIGINS)が適用されます。認証が設定されていない場合、ローカル開発用にループバックオリジン(localhost、127.0.0.1、[::1])が許可されます。認証(OPENGROK_HTTP_AUTH_TOKEN または RBAC トークン)を設定すると、ループバックは暗黙的に許可されなくなります。ローカルオリジンも含め、許可するすべてのオリジンを明示的に列挙してください。
セキュリティ
| 領域 | 保護 |
|---|---|
| SSRF | buildSafeUrl での DNS リバインディング検出と IPv6 マップアドレスのブロック。OPENGROK_STRICT_SSRF による厳格モード |
| パストラバーサル | assertSafePath での NFC 正規化と双方向 Unicode 文字のブロック |
| HTML インジェクション | 表示前にすべてのパーサーのテキストノードをエンティティデコード |
| プロンプトインジェクション | すべてのフォーマッターで Markdown フィールドをエスケープ |
| トークン比較 | すべての Bearer トークン比較に crypto.timingSafeEqual を使用 |
| CORS | OPENGROK_ALLOWED_ORIGINS による許可リスト。本番環境ではワイルドカードなし |
| セキュリティヘッダー | HTTP レスポンスに X-Content-Type-Options、X-Frame-Options、CSP を設定 |
| 認証情報の暗号化 | AES-256-GCM。古い暗号化ファイルから自動アップグレード |
| レート制限 | 整数ベースのトークンバケット(浮動小数点のずれを解消)。ツールごとのデフォルト設定(opengrok_execute:15 rpm) |
| サンドボックス分離 | QuickJS WASM VM。ファイルシステムとネットワークへのアクセスなし、許可リストにあるメソッドのみ。タイムアウトは 62 秒、バッファーは 8 MB |
| 監査ログ | インジェクション対策のエスケープを施した構造化監査エントリー |
セキュリティアーキテクチャの全容(脅威モデル、防御レイヤー、強化ガイド)については、SECURITY.md を参照してください。
サンドボックスの信頼に関する推奨事項: VS Code の MCP 設定で OpenGrok MCP を設定する際、sandboxEnabled: true を指定すると、確認プロンプトなしでツール呼び出しが自動承認されます。すべてのツール実行はホストへのアクセスがない QuickJS WASM サンドボックス内で行われるため、安全です。このサーバーを通じて、LLM が任意のシステムコマンドを実行することはできません。
VS Code との統合
| コマンド | 操作 |
|---|---|
OpenGrok: Open Configuration | 対話型の設定 GUI |
OpenGrok: Test Connection | API アクセスとトークンの有効性を確認 |
OpenGrok: Show Server Logs | バックグラウンドプロセスの stdout/stderr を表示 |
OpenGrok: Status Menu | ステータスバーからすばやくアクセスできるステータスメニュー |
OpenGrok: Check for Updates | 更新の確認を手動で実行 |
メモ
VS Code はワークスペースごとにツールの認可を管理します。別のリポジトリを開いた場合は、Copilot のツールパネルで OpenGrok のチェックボックスを再度オンにしてください。
設定パネルと VS Code の設定 UI では、同じ設定を管理できます。ガイド付きセットアップ、シークレット、テスト、再読み込みの確認にはパネルを使用してください。ワークスペースごとのオーバーライド、Settings Sync、スクリプトでのデフォルト設定には、settings.json の opengrok-mcp.* 設定を使用してください。Code Mode を推奨します。無効にすると、従来の標準ツールが使用され、新しい Code Mode 専用の機能は利用できません。
トラブルシューティング
ヒント
opengrok-mcp statusを実行すると、接続を確認し、設定済みの MCP クライアントを確認できます。
警告
VS Code の再読み込み後や拡張機能の更新後、一時的にツールが Copilot のツール一覧から消えることがあります。ツールアイコンをクリックして「Update Tools」を選択し、続けて
Developer: Reload Windowを実行すると、ツールが再表示されます。
接続に失敗する — OPENGROK_BASE_URL を確認してください。VPN またはプロキシがエンドポイントをブロックしていないことを確認してください。
401 Unauthorized — OpenGrok: Open Configuration を実行して、認証情報を再入力してください。
自己署名 SSL 証明書エラー — VS Code の設定で opengrok-mcp.verifySsl を false に設定するか、MCP クライアントの設定で OPENGROK_VERIFY_SSL=false に設定してください。
クエリが遅い、またはタイムアウトする — file_type フィルタリングを使って対象範囲を絞るか、特定のプロジェクトを指定してください。opengrok_index_health でインデックスの状態を確認してください。
詳細ログ — OPENGROK_LOG_LEVEL=debug を設定してください。
OpenGrok の互換性
| エンジンのバージョン | 状態 | 備考 |
|---|---|---|
| v1.13.x 以降 | 対応 | REST API 全機能 |
| v1.7.0 — v1.12.x | レガシーモード | シンボルと blame に HTML スクレイピングを使用 |
| v1.7.0 未満 | 非対応 | 動作が予測できません |
さらに詳しく
クライアントのセットアップ · アーキテクチャ · セキュリティ · コントリビューション · 変更履歴
ライセンス情報
このシステムは、PolyForm Noncommercial License 1.0.0 に基づいて配布されています。
- ✅ 許可される用途: 個人利用、趣味のプロジェクト、学術研究、教育
- ❌ 禁止される用途: 商用、業務、エンタープライズ、または有料でのあらゆる利用
商用ライセンス: エンタープライズ環境(社内ツール、CI パイプライン、業務インフラ)でこの拡張機能を使用するには、商用ライセンスが必須です。 エンタープライズ向けの料金については、[email protected] までお問い合わせください。
利用規約の全文は LICENSE-COMMERCIAL.md をご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。