mcpField
O
OpenGrok MCP Server

OpenGrok MCP Server

本地服务
github.com开发工具106 周前更新

关于 OpenGrok MCP Server

OpenGrok MCP Server 为 AI 编码客户端提供 OpenGrok 索引代码及历史记录的访问能力。它整合搜索、导航、归责和调查操作,并通过沙盒 Code Mode 避免中间结果进入模型上下文。

主要功能

  1. 01搜索代码、符号和文件路径
  2. 02读取文件并浏览目录
  3. 03查看归责信息、历史和差异
  4. 04追踪调用图和依赖关系
  5. 05在 Code Mode 中执行组合调查
  6. 06通过 VS Code 扩展或命令行配置

适用场景

  1. 01查找符号并检查其实现
  2. 02重构前追踪调用方或依赖链
  3. 03查看文件历史并确认代码行变更来源
  4. 04调查大型 OpenGrok 索引代码库

MCP 相关

MCP 服务通过 stdio 或 HTTP 将兼容客户端连接到 OpenGrok 实例,提供代码搜索和代码库调查工具。沙盒模式支持用 JavaScript 组合多个操作。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"icyhot09-opengrok": {
"command": "npx",
"args": [
"-y",
"opengrok-mcp-server"
],
"env": {
"OPENGROK_BASE_URL": "<OPENGROK_BASE_URL>",
"OPENGROK_USERNAME": "<OPENGROK_USERNAME>",
"OPENGROK_PASSWORD": "<OPENGROK_PASSWORD>",
"OPENGROK_VERIFY_SSL": "<OPENGROK_VERIFY_SSL>",
"OPENGROK_CODE_MODE": "<OPENGROK_CODE_MODE>",
"OPENGROK_ENABLE_MEMORY_TOOLS": "<OPENGROK_ENABLE_MEMORY_TOOLS>",
"OPENGROK_DEFAULT_PROJECT": "<OPENGROK_DEFAULT_PROJECT>",
"OPENGROK_CONTEXT_BUDGET": "<OPENGROK_CONTEXT_BUDGET>",
"OPENGROK_API_VERSION": "<OPENGROK_API_VERSION>",
"HTTP_PROXY": "<HTTP_PROXY>",
"OPENGROK_RESPONSE_FORMAT_OVERRIDE": "<OPENGROK_RESPONSE_FORMAT_OVERRIDE>",
"OPENGROK_MEMORY_BANK_DIR": "<OPENGROK_MEMORY_BANK_DIR>",
"OPENGROK_LOCAL_COMPILE_DB_PATHS": "<OPENGROK_LOCAL_COMPILE_DB_PATHS>",
"OPENGROK_ENABLE_ELICITATION": "<OPENGROK_ENABLE_ELICITATION>",
"OPENGROK_ENABLE_SAMPLING": "<OPENGROK_ENABLE_SAMPLING>",
"OPENGROK_SAMPLING_MODEL": "<OPENGROK_SAMPLING_MODEL>",
"OPENGROK_ENABLE_FILES_API": "<OPENGROK_ENABLE_FILES_API>",
"OPENGROK_ENABLE_OBSERVATION_MASKER": "<OPENGROK_ENABLE_OBSERVATION_MASKER>",
"OPENGROK_OBSERVATION_MASKER_TURNS": "<OPENGROK_OBSERVATION_MASKER_TURNS>",
"OPENGROK_SAMPLING_MAX_TOKENS": "<OPENGROK_SAMPLING_MAX_TOKENS>",
"OPENGROK_AUDIT_LOG_FILE": "<OPENGROK_AUDIT_LOG_FILE>",
"OPENGROK_RATELIMIT_RPM": "<OPENGROK_RATELIMIT_RPM>",
"OPENGROK_PER_TOOL_RATELIMIT": "<OPENGROK_PER_TOOL_RATELIMIT>",
"OPENGROK_TIMEOUT": "<OPENGROK_TIMEOUT>",
"OPENGROK_DEFAULT_MAX_RESULTS": "<OPENGROK_DEFAULT_MAX_RESULTS>",
"OPENGROK_PASSWORD_FILE": "<OPENGROK_PASSWORD_FILE>",
"OPENGROK_MAX_RESPONSE_BYTES": "<OPENGROK_MAX_RESPONSE_BYTES>",
"OPENGROK_SEARCH_AND_READ_CAP": "<OPENGROK_SEARCH_AND_READ_CAP>",
"OPENGROK_STRICT_SSRF": "<OPENGROK_STRICT_SSRF>",
"OPENGROK_JWT_ISSUER": "<OPENGROK_JWT_ISSUER>",
"OPENGROK_GRAMMAR_DIR": "<OPENGROK_GRAMMAR_DIR>"
}
}
}
}
启动命令npx -y opengrok-mcp-server
需要配置的环境变量
OPENGROK_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmopengrok-mcp-server9.6.0

工具

14

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

OpenGrok MCP Server logo

OpenGrok MCP Server

为任何由 OpenGrok 建立索引的代码库提供代码智能——搜索、读取、追溯代码责任、符号导航、差异、提交历史、调用图、依赖关系图和引导式调查。通过 Code Mode 和感知 AST 的代码读取优化 token 使用效率。

npm MCP Registry CI GitHub Release


快速开始

选项 1 — VS Code 扩展

从 VS Code Marketplace 安装 OpenGrok MCP,或在扩展面板中搜索“OpenGrok”。首次启动时会打开配置面板——输入 OpenGrok 端点、用户名和密码,然后点击 Save Settings,并在出现提示时重新加载。

该扩展提供可视化配置界面,并自动管理 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。

凭据存储在操作系统的密钥链中(macOS Keychain、Windows Credential Manager、Linux libsecret);在无头环境中,则会回退到使用 AES-256-GCM 加密文件。


提示

自动更新 — 扩展每 24 小时检查一次 GitHub 是否发布新版本,并在有可用版本时通知你。可使用 OpenGrok: Check for Updates 按需检查。


问题所在

使用 AI 编码助手的工程师在处理大型代码库时,会遇到一个特定的缺口。模型的上下文窗口包含当前打开的文件、对话内容,以及手动分享的内容——但生产代码库还包含结构、历史记录和跨模块关系,这些信息完全处于该窗口之外。

一个符号在某个模块中定义,却被另外 70 个模块调用。某个函数的行为只有结合塑造它的 3 次提交才能看清。一条横跨十几个目录的 include 链。一个调用图展示了重构服务之前依赖它的组件。

如果无法访问代码索引,模型就会通过猜测填补这些空白:捏造文件路径、臆造函数签名、错误归属代码变更的作者。模型出错并非因为它不够聪明,而是因为它处于孤立状态。

OpenGrok 已经为人工工程师解决了这个问题。它为数十种编程语言的源代码建立索引,维护涵盖已提交历史的全文索引,并通过 REST API 提供定义查询、引用关系图、代码责任追溯、目录遍历和文件历史。问题在于,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       │
└──────────────────────────────────────────────────────┘

该服务提供两个主要工具。opengrok_api 会在会话开始时提供完整的 API 规范。之后的每项操作都通过 opengrok_execute 执行:AI 使用 env.opengrok.* 对象编写 JavaScript 程序——包括 search、getFileContent、getFileAnnotate、getFileHistory、browseDir、getFileSymbols——并将其作为单次执行提交。

中间结果保留在沙箱内;只有最终的 return 值会传回上下文窗口。一次完整的调查——找到符号、读取定义、查看修改者、追踪调用方——只需一个脚本,而非多次往返并在每次之间通过上下文传递结果。复杂调查通常可节省 80–95% 的令牌。

在沙箱代码中,所有 env.opengrok.* 调用看起来都是同步的——QuickJS WASM VM 通过 SharedArrayBuffer + Atomics 通道透明地转接异步 HTTP 调用(8 MB 数据区域,每次调用超时 62 s,硬性执行上限为 62 s),同时让 Node.js 事件循环保持空闲。

记忆库——两个文件会在多个轮次和会话重启之间持久保存: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 调用合并为一次操作。

工具替代内容节省
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 的 BFS 遍历;生成包含 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两个版本之间带上下文行的统一差异
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,shell 使用 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 的视图。

代码模式 API

设置 OPENGROK_CODE_MODE=true(默认值)。在会话开始时调用一次 opengrok_api,以获取完整的 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?)每个查询返回一个结果集(最多 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?)搜索结果显示命中项已截断时,获取文件中的所有匹配行。搜索时提供 file: 筛选条件(不分页)也会自动使用此方法

search() 仅使用规范文件类型名称(例如 cxx、golang、sh)——请参阅上方的别名列表。传入 expandFunction: true 可将匹配结果扩展为其所在函数体(会增加主机端读取,每次调用最多读取 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 可包含导入项(默认省略)

历史记录与归属信息

方法返回值
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 的调用方来自引用搜索;被调用方来自 tree-sitter AST 分析,支持的语言包括 C/C++、Java、Go、Python、JS/TS、Rust 等。两个长时间运行的方法都会通过后台客户端进行扇出——这是一个无速率限制、每次操作预算较短的同级连接,因此深度遍历不会消耗前台速率限制配额。

系统

方法返回值
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?)请求客户端的大模型生成文本(需要设置 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 分页。

用户询问(设置 OPENGROK_ENABLE_ELICITATION=false 可禁用,默认值:true)

启用后,如果未配置 OPENGROK_DEFAULT_PROJECT 且存在多个项目,opengrok_api 会在会话开始时提示用户选择工作项目。沙箱代码也可以调用 env.opengrok.elicit(),在执行期间请用户从多个匹配项中进行选择。需要客户端支持 MCP Elicitation——Claude Code v2.1.76+ 支持此功能。在其他客户端上会平稳降级为 { action: "cancel" }。

采样(OPENGROK_ENABLE_SAMPLING=true,默认值:false)

通过 MCP Sampling 将大模型调用委托回客户端,使用客户端的模型订阅,无需单独的 API 密钥。会在三个场景下自动触发:解释沙箱错误、总结大型依赖关系图(>10 个节点),以及改写零结果查询(注入 _suggestions)。VS Code Copilot 支持采样;其他客户端的支持情况各不相同。采样不可用时,服务会平稳降级。

警告

采样会自动触发,并非按需调用。单次调查会话可能会因沙箱错误、零结果搜索和大型依赖关系图而产生多次采样调用。部分客户端在首次确认提示后,每次调用都会消耗高级请求额度。启用时请注意这一点。

记忆库

Code Mode 默认包含 2 个工具(api + execute;设置 OPENGROK_ENABLE_MEMORY_TOOLS=true 后为 5 个)。两个文件会在不同轮次和会话重启后持续保留:

工具用途
opengrok_memory_status显示两个记忆文件的状态、大小和 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: 标题分组
在重复读取未修改的内容时,增量编码会返回 `[unchanged]`。空间不足时,按信息价值评分的裁剪会保留价值最高的日志条目。
配置
核心
变量默认值描述
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_SSLtrue设为 false 可为自签名证书禁用 TLS 验证。
OPENGROK_TIMEOUT30HTTP 请求超时时间,单位为秒。
代码模式与性能
变量默认值描述
OPENGROK_CODE_MODEtrue代码模式(2–5 个工具:opengrok_api + opengrok_execute,启用时再加 3 个记忆工具)。设为 false 可使用 26 个旧版标准工具。
OPENGROK_CONTEXT_BUDGETstandard响应大小级别: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_RESULTS25默认搜索结果上限。
OPENGROK_LOCAL_COMPILE_DB_PATHS—用逗号分隔的 compile_commands.json 路径,用于提取 C/C++ 标志。
OPENGROK_GRAMMAR_DIR自动检测覆盖 tree-sitter 语法 WASM 文件的路径。默认情况下,从捆绑包目录向上查找 grammars/。
记忆库
变量默认值描述
OPENGROK_ENABLE_MEMORY_TOOLSfalse注册 3 个代码模式记忆工具(记忆状态、读取、更新)。关闭时仅提供 api + execute。
OPENGROK_MEMORY_BANK_DIR服务默认值覆盖 active-task.md + investigation-log.md 的目录。
OPENGROK_ENABLE_OBSERVATION_MASKERfalse完整文本窗口填满后,在 opengrok_execute 结果前附加精简的历史摘要。仅对会截断上下文的客户端有用。
OPENGROK_OBSERVATION_MASKER_TURNS10在压缩较早结果前,完整保留最近的 opengrok_execute 结果数量。
速率限制
变量默认值描述
OPENGROK_RATELIMIT_ENABLEDtrue启用令牌桶速率限制。
OPENGROK_RATELIMIT_RPM60全局每分钟请求数上限。
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_ENABLEDtrue启用带 TTL 的响应缓存。
OPENGROK_CACHE_MAX_SIZE500最大缓存条目数。
OPENGROK_CACHE_MAX_BYTES52428800缓存总大小上限(字节,50 MB)。
OPENGROK_CACHE_SEARCH_TTL300搜索结果缓存 TTL,单位为秒。
OPENGROK_CACHE_FILE_TTL600文件内容缓存 TTL,单位为秒。
OPENGROK_CACHE_HISTORY_TTL1800文件历史记录缓存 TTL,单位为秒。
OPENGROK_CACHE_PROJECTS_TTL3600项目列表缓存 TTL,单位为秒。
MCP 协议
变量默认值描述
OPENGROK_ENABLE_ELICITATIONtrue在 opengrok_api 启动时显示项目选择器,并在沙盒中启用 env.opengrok.elicit()。
OPENGROK_ENABLE_SAMPLINGfalse用于解释错误、总结图表和恢复零结果的 MCP Sampling。
OPENGROK_ENABLE_FILES_APIfalse用于 investigation-log.md 的 FileReferenceCache(基于内容的 SHA-256 寻址)。
OPENGROK_SAMPLING_MODEL—Sampling 调用的模型偏好。
OPENGROK_SAMPLING_MAX_TOKENS256Sampling 响应的 Token 预算(最大值:4096)。
OpenGrok API
变量默认值描述
OPENGROK_API_VERSIONv1REST API 版本。使用 v2 调用 opengrok_call_graph。
安全与审计
变量默认值描述
OPENGROK_AUDIT_LOG_FILE—结构化审计日志的文件路径(CSV 或 JSON)。
OPENGROK_STRICT_SSRFfalse拒绝解析到私有/环回 IP 地址范围的基础 URL 和重定向(默认仅发出警告)。
日志记录
变量默认值描述
OPENGROK_LOG_LEVELinfo设置为 debug,即可将详细的结构化日志输出到 stderr。
代理
变量默认值描述
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/sdk v1.30.0(v1 系列)。

HTTP 传输与身份验证

默认情况下,服务通过 stdio 通信。对于团队共享部署,可通过库 API 使用 HTTP 传输层(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
使用命名角色的 RBACOPENGROK_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 s,缓冲区为 8 MB
审计日志对注入内容进行转义的结构化审计条目

完整的安全架构(威胁模型、防御层、加固指南)请参阅 SECURITY.md。

**沙箱信任建议:**在 VS Code 的 MCP 设置中配置 OpenGrok MCP 时,你可以设置 sandboxEnabled: true,以便自动批准工具调用而无需确认提示。这是安全的,因为所有工具执行都在 QuickJS WASM 沙箱中进行,无法访问主机——大模型无法通过此服务执行任意系统命令。


VS Code 集成

命令操作
OpenGrok: Open Configuration交互式设置界面
OpenGrok: Test Connection验证 API 访问权限和令牌有效性
OpenGrok: Show Server Logs显示后台进程的标准输出/标准错误
OpenGrok: Status Menu从状态栏快速访问状态菜单
OpenGrok: Check for Updates手动触发更新检查

说明

VS Code 按工作区管理工具授权。如果你打开了其他代码库,请在 Copilot 工具面板中重新勾选 OpenGrok。

配置面板和 VS Code 设置 UI 涵盖相同的设置:使用面板进行引导式设置、管理机密、测试和查看重新加载提示。使用 settings.json 中的 opengrok-mcp.* 设置来覆盖工作区设置、使用 Settings Sync,以及设置脚本化默认值。建议使用 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旧版模式使用 HTML 抓取符号和代码责任信息
低于 v1.7.0不支持行为不可预测

深入了解

客户端设置 · 架构 · 安全性 · 贡献指南 · 更新日志


许可证信息

本系统依据 PolyForm Noncommercial License 1.0.0 发布。

  • ✅ 允许: 个人使用、兴趣项目、学术研究、教育
  • ❌ 禁止: 任何商业、企业或付费用途

商业许可: 若要在企业环境中使用此扩展(内部工具、CI 管道、业务基础设施),必须取得商业许可证。 请联系 [email protected] 了解企业级定价。

请阅读 LICENSE-COMMERCIAL.md 获取完整条款。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。