关于 OpenGrok MCP Server
OpenGrok MCP Server 为 AI 编码客户端提供 OpenGrok 索引代码及历史记录的访问能力。它整合搜索、导航、归责和调查操作,并通过沙盒 Code Mode 避免中间结果进入模型上下文。
主要功能
- 01搜索代码、符号和文件路径
- 02读取文件并浏览目录
- 03查看归责信息、历史和差异
- 04追踪调用图和依赖关系
- 05在 Code Mode 中执行组合调查
- 06通过 VS Code 扩展或命令行配置
适用场景
- 01查找符号并检查其实现
- 02重构前追踪调用方或依赖链
- 03查看文件历史并确认代码行变更来源
- 04调查大型 OpenGrok 索引代码库
MCP 相关
MCP 服务通过 stdio 或 HTTP 将兼容客户端连接到 OpenGrok 实例,提供代码搜索和代码库调查工具。沙盒模式支持用 JavaScript 组合多个操作。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
14收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
OpenGrok MCP Server
为任何由 OpenGrok 建立索引的代码库提供代码智能——搜索、读取、追溯代码责任、符号导航、差异、提交历史、调用图、依赖关系图和引导式调查。通过 Code Mode 和感知 AST 的代码读取优化 token 使用效率。
快速开始
选项 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 个文件)。
读取与导航
| 方法 | 返回值 |
|---|---|
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: 标题分组 |
配置
核心
| 变量 | 默认值 | 描述 |
|---|---|---|
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 | 设为 false 可为自签名证书禁用 TLS 验证。 |
OPENGROK_TIMEOUT | 30 | HTTP 请求超时时间,单位为秒。 |
代码模式与性能
| 变量 | 默认值 | 描述 |
|---|---|---|
OPENGROK_CODE_MODE | true | 代码模式(2–5 个工具:opengrok_api + opengrok_execute,启用时再加 3 个记忆工具)。设为 false 可使用 26 个旧版标准工具。 |
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 | — | 用逗号分隔的 compile_commands.json 路径,用于提取 C/C++ 标志。 |
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 | 全局每分钟请求数上限。 |
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 响应的 Token 预算(最大值:4096)。 |
OpenGrok API
| 变量 | 默认值 | 描述 |
|---|---|---|
OPENGROK_API_VERSION | v1 | REST API 版本。使用 v2 调用 opengrok_call_graph。 |
安全与审计
| 变量 | 默认值 | 描述 |
|---|---|---|
OPENGROK_AUDIT_LOG_FILE | — | 结构化审计日志的文件路径(CSV 或 JSON)。 |
OPENGROK_STRICT_SSRF | false | 拒绝解析到私有/环回 IP 地址范围的基础 URL 和重定向(默认仅发出警告)。 |
日志记录
| 变量 | 默认值 | 描述 |
|---|---|---|
OPENGROK_LOG_LEVEL | info | 设置为 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/sdkv1.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 |
| 使用命名角色的 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 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 获取完整条款。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。