NestDaddy

OpenGrok MCP Server

io.github.IcyHot09/opengrok-mcp-server · v9.6.0

MCP server bridging OpenGrok search engine with AI for instant context across massive codebases.

Connect Runs on your machine

Terminal
claude mcp add opengrok-mcp-server -e OPENGROK_BASE_URL=<OPENGROK_BASE_URL> -e OPENGROK_USERNAME=<OPENGROK_USERNAME> -e OPENGROK_PASSWORD=<OPENGROK_PASSWORD> -e OPENGROK_VERIFY_SSL=<OPENGROK_VERIFY_SSL> -e OPENGROK_CODE_MODE=<OPENGROK_CODE_MODE> -e OPENGROK_ENABLE_MEMORY_TOOLS=<OPENGROK_ENABLE_MEMORY_TOOLS> -e OPENGROK_DEFAULT_PROJECT=<OPENGROK_DEFAULT_PROJECT> -e OPENGROK_CONTEXT_BUDGET=<OPENGROK_CONTEXT_BUDGET> -e OPENGROK_API_VERSION=<OPENGROK_API_VERSION> -e HTTP_PROXY=<HTTP_PROXY> -e OPENGROK_RESPONSE_FORMAT_OVERRIDE=<OPENGROK_RESPONSE_FORMAT_OVERRIDE> -e OPENGROK_MEMORY_BANK_DIR=<OPENGROK_MEMORY_BANK_DIR> -e OPENGROK_LOCAL_COMPILE_DB_PATHS=<OPENGROK_LOCAL_COMPILE_DB_PATHS> -e OPENGROK_ENABLE_ELICITATION=<OPENGROK_ENABLE_ELICITATION> -e OPENGROK_ENABLE_SAMPLING=<OPENGROK_ENABLE_SAMPLING> -e OPENGROK_SAMPLING_MODEL=<OPENGROK_SAMPLING_MODEL> -e OPENGROK_ENABLE_FILES_API=<OPENGROK_ENABLE_FILES_API> -e OPENGROK_ENABLE_OBSERVATION_MASKER=<OPENGROK_ENABLE_OBSERVATION_MASKER> -e OPENGROK_OBSERVATION_MASKER_TURNS=<OPENGROK_OBSERVATION_MASKER_TURNS> -e OPENGROK_SAMPLING_MAX_TOKENS=<OPENGROK_SAMPLING_MAX_TOKENS> -e OPENGROK_AUDIT_LOG_FILE=<OPENGROK_AUDIT_LOG_FILE> -e OPENGROK_RATELIMIT_RPM=<OPENGROK_RATELIMIT_RPM> -e OPENGROK_PER_TOOL_RATELIMIT=<OPENGROK_PER_TOOL_RATELIMIT> -e OPENGROK_TIMEOUT=<OPENGROK_TIMEOUT> -e OPENGROK_DEFAULT_MAX_RESULTS=<OPENGROK_DEFAULT_MAX_RESULTS> -e OPENGROK_PASSWORD_FILE=<OPENGROK_PASSWORD_FILE> -e OPENGROK_MAX_RESPONSE_BYTES=<OPENGROK_MAX_RESPONSE_BYTES> -e OPENGROK_SEARCH_AND_READ_CAP=<OPENGROK_SEARCH_AND_READ_CAP> -e OPENGROK_STRICT_SSRF=<OPENGROK_STRICT_SSRF> -e OPENGROK_JWT_ISSUER=<OPENGROK_JWT_ISSUER> -e OPENGROK_GRAMMAR_DIR=<OPENGROK_GRAMMAR_DIR> -- npx -y [email protected]
claude_desktop_config.json
{
  "mcpServers": {
    "opengrok-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "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>"
      }
    }
  }
}
~/.cursor/mcp.json
{
  "mcpServers": {
    "opengrok-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "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>"
      }
    }
  }
}
.vscode/mcp.json
{
  "servers": {
    "opengrok-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "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>"
      }
    }
  }
}

Replace the values in angle brackets with your own. Keys stay on your machine; we never see them.

Tools

This server runs locally, so its tools are listed by your MCP client once it starts.

Environment variables

NameDescription
OPENGROK_BASE_URL
Required
OpenGrok server base URL (e.g. https://opengrok.example.com/source/)
OPENGROK_USERNAME
Optional
OpenGrok authentication username. Leave unset for anonymous access.
OPENGROK_PASSWORD
Optional, secret
OpenGrok authentication password. Prefer storing via OS keychain using 'npx opengrok-mcp-server setup'.
OPENGROK_VERIFY_SSL
Optional
Verify TLS certificates. Set to false for self-signed or internal CA certs.
OPENGROK_CODE_MODE
Optional
Enable Code Mode: 2-tool sandbox interface with env.opengrok.* JavaScript API. Reduces AI token usage by ~90%.
OPENGROK_ENABLE_MEMORY_TOOLS
Optional
Register the 3 memory tools in Code Mode (memory status, read, update). Off = api + execute only.
OPENGROK_DEFAULT_PROJECT
Optional
Default project to scope all searches. Can be overridden per call.
OPENGROK_CONTEXT_BUDGET
Optional
Response size tier controlling token usage.
OPENGROK_API_VERSION
Optional
OpenGrok REST API version. Use v2 for call graph features (requires OpenGrok 1.12+).
HTTP_PROXY
Optional
HTTP/HTTPS proxy URL for all OpenGrok API requests (e.g. http://proxy.company.com:8080). Also set as HTTPS_PROXY.
OPENGROK_RESPONSE_FORMAT_OVERRIDE
Optional
Force a specific response format for all tools. Leave unset for per-tool auto-selection (recommended).
OPENGROK_MEMORY_BANK_DIR
Optional
Directory 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_PATHS
Optional
Comma-separated paths to compile_commands.json for C/C++ compiler flag and include-path extraction. Leave unset for automatic workspace discovery.
OPENGROK_ENABLE_ELICITATION
Optional
Interactive 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_SAMPLING
Optional
AI 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_MODEL
Optional
Model preference for MCP Sampling (used for error explanation and query reformulation).
OPENGROK_ENABLE_FILES_API
Optional
Files API Cache — avoids re-uploading unchanged investigation notes. Requires Files API support in the MCP client.
OPENGROK_ENABLE_OBSERVATION_MASKER
Optional
Observation 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_TURNS
Optional
Number of most-recent opengrok_execute results to keep as full text before masking older ones. Default: 10.
OPENGROK_SAMPLING_MAX_TOKENS
Optional
Maximum tokens for AI sampling responses (error explanation, query reformulation). Range: 64–4096.
OPENGROK_AUDIT_LOG_FILE
Optional
Path to write structured audit events (CSV/JSON). Appends tool invocations, elicitation events, and errors. Leave unset to disable.
OPENGROK_RATELIMIT_RPM
Optional
Maximum requests per minute to the OpenGrok server. Default: 60.
OPENGROK_PER_TOOL_RATELIMIT
Optional
Per-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_TIMEOUT
Optional
HTTP request timeout in seconds for OpenGrok API calls. Increase for slow servers. Default: 30.
OPENGROK_DEFAULT_MAX_RESULTS
Optional
Default maximum number of results returned per search query. Default: 25.
OPENGROK_PASSWORD_FILE
Optional
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_BYTES
Optional
Hard cap on response payload size in bytes. Overrides the context-budget default. Non-positive values are ignored.
OPENGROK_SEARCH_AND_READ_CAP
Optional
Cap 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_SSRF
Optional
When true, reject OPENGROK_BASE_URL values pointing at private/loopback IPs at startup. Default: false (warn only; per-request guards still apply).
OPENGROK_JWT_ISSUER
Optional
Expected JWT issuer (iss claim) for HTTP transport OAuth. When set, JWTs from other issuers are rejected.
OPENGROK_GRAMMAR_DIR
Optional
Directory containing tree-sitter WASM grammars. Overrides the bundled grammar lookup.

Details

Package[email protected] (NPM, stdio)
First published16 Sep 2026
Last updated16 Sep 2026
Registry nameio.github.IcyHot09/opengrok-mcp-server

More search and web servers See all

Listing data from the official MCP registry. Status and tools from NestDaddy's daily check. Browse all MCP servers.