{"name":"io.github.IcyHot09/opengrok-mcp-server","slug":"icyhot09-opengrok-mcp-server","title":"OpenGrok MCP Server","description":"MCP server bridging OpenGrok search engine with AI for instant context across massive codebases.","url":"https://mcp.market/server/icyhot09-opengrok-mcp-server","rating":null,"grade":"B","score":75,"certified":false,"status":"active","category":"search","tags":["search"],"presence":{"score":39,"stars":6,"forks":2,"downloads_week":337,"last_push_at":"2026-09-16T08:32:28.000Z","license":"NOASSERTION"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/IcyHot09/opengrok-mcp-server","website":"https://github.com/IcyHot09/opengrok-mcp-server","version":"9.6.0","remotes":[],"packages":[{"registryType":"npm","identifier":"opengrok-mcp-server","version":"9.6.0","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"OpenGrok server base URL (e.g. https://opengrok.example.com/source/)","isRequired":true,"format":"string","placeholder":"https://opengrok.example.com/source/","name":"OPENGROK_BASE_URL"},{"description":"OpenGrok authentication username. Leave unset for anonymous access.","format":"string","name":"OPENGROK_USERNAME"},{"description":"OpenGrok authentication password. Prefer storing via OS keychain using 'npx opengrok-mcp-server setup'.","format":"string","isSecret":true,"name":"OPENGROK_PASSWORD"},{"description":"Verify TLS certificates. Set to false for self-signed or internal CA certs.","format":"boolean","default":"true","name":"OPENGROK_VERIFY_SSL"},{"description":"Enable Code Mode: 2-tool sandbox interface with env.opengrok.* JavaScript API. Reduces AI token usage by ~90%.","format":"boolean","default":"true","name":"OPENGROK_CODE_MODE"},{"description":"Register the 3 memory tools in Code Mode (memory status, read, update). Off = api + execute only.","format":"boolean","default":"false","name":"OPENGROK_ENABLE_MEMORY_TOOLS"},{"description":"Default project to scope all searches. Can be overridden per call.","format":"string","name":"OPENGROK_DEFAULT_PROJECT"},{"description":"Response size tier controlling token usage.","format":"string","default":"standard","choices":["minimal","standard","generous"],"name":"OPENGROK_CONTEXT_BUDGET"},{"description":"OpenGrok REST API version. Use v2 for call graph features (requires OpenGrok 1.12+).","format":"string","default":"v1","choices":["v1","v2"],"name":"OPENGROK_API_VERSION"},{"description":"HTTP/HTTPS proxy URL for all OpenGrok API requests (e.g. http://proxy.company.com:8080). Also set as HTTPS_PROXY.","format":"string","name":"HTTP_PROXY"},{"description":"Force a specific response format for all tools. Leave unset for per-tool auto-selection (recommended).","format":"string","choices":["markdown","json","tsv","toon","yaml","text"],"name":"OPENGROK_RESPONSE_FORMAT_OVERRIDE"},{"description":"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.","format":"string","name":"OPENGROK_MEMORY_BANK_DIR"},{"description":"Comma-separated paths to compile_commands.json for C/C++ compiler flag and include-path extraction. Leave unset for automatic workspace discovery.","format":"string","name":"OPENGROK_LOCAL_COMPILE_DB_PATHS"},{"description":"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.","format":"boolean","default":"true","name":"OPENGROK_ENABLE_ELICITATION"},{"description":"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).","format":"boolean","default":"false","name":"OPENGROK_ENABLE_SAMPLING"},{"description":"Model preference for MCP Sampling (used for error explanation and query reformulation).","format":"string","name":"OPENGROK_SAMPLING_MODEL"},{"description":"Files API Cache — avoids re-uploading unchanged investigation notes. Requires Files API support in the MCP client.","format":"boolean","default":"false","name":"OPENGROK_ENABLE_FILES_API"},{"description":"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).","format":"boolean","default":"false","name":"OPENGROK_ENABLE_OBSERVATION_MASKER"},{"description":"Number of most-recent opengrok_execute results to keep as full text before masking older ones. Default: 10.","format":"string","default":"10","name":"OPENGROK_OBSERVATION_MASKER_TURNS"},{"description":"Maximum tokens for AI sampling responses (error explanation, query reformulation). Range: 64–4096.","format":"string","default":"256","name":"OPENGROK_SAMPLING_MAX_TOKENS"},{"description":"Path to write structured audit events (CSV/JSON). Appends tool invocations, elicitation events, and errors. Leave unset to disable.","format":"string","name":"OPENGROK_AUDIT_LOG_FILE"},{"description":"Maximum requests per minute to the OpenGrok server. Default: 60.","format":"string","default":"60","name":"OPENGROK_RATELIMIT_RPM"},{"description":"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.","format":"string","name":"OPENGROK_PER_TOOL_RATELIMIT"},{"description":"HTTP request timeout in seconds for OpenGrok API calls. Increase for slow servers. Default: 30.","format":"string","default":"30","name":"OPENGROK_TIMEOUT"},{"description":"Default maximum number of results returned per search query. Default: 25.","format":"string","default":"25","name":"OPENGROK_DEFAULT_MAX_RESULTS"},{"description":"Path to a file containing the OpenGrok password (file-mounted secret for containers). Takes precedence over the OS keychain when OPENGROK_PASSWORD is unset.","format":"string","name":"OPENGROK_PASSWORD_FILE"},{"description":"Hard cap on response payload size in bytes. Overrides the context-budget default. Non-positive values are ignored.","format":"string","name":"OPENGROK_MAX_RESPONSE_BYTES"},{"description":"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.","format":"string","name":"OPENGROK_SEARCH_AND_READ_CAP"},{"description":"When true, reject OPENGROK_BASE_URL values pointing at private/loopback IPs at startup. Default: false (warn only; per-request guards still apply).","format":"boolean","default":"false","name":"OPENGROK_STRICT_SSRF"},{"description":"Expected JWT issuer (iss claim) for HTTP transport OAuth. When set, JWTs from other issuers are rejected.","format":"string","name":"OPENGROK_JWT_ISSUER"},{"description":"Directory containing tree-sitter WASM grammars. Overrides the bundled grammar lookup.","format":"string","name":"OPENGROK_GRAMMAR_DIR"}]}],"tools":[{"name":"opengrok_api","description":"Return the full Code Mode API specification.","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_batch_search","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_blame","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_browse_directory","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_call_graph","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_dependency_map","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_execute","description":"Execute JavaScript against the OpenGrok API (see opengrok_api for available methods)","write_action":true,"price_micros":0,"input_schema":null},{"name":"opengrok_find_file","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_get_all_matches","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_get_compile_info","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_get_download_url","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_get_file_annotate","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_get_file_content","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_get_file_diff","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_get_file_history","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_get_file_history_with_files","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_get_file_symbols","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_get_project_repositories","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_get_suggest_popularity","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_get_symbol_context","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_index_health","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_list_groups","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_list_projects","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_memory_status","description":"Show current memory bank file sizes and modification times.","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_read_memory","description":"Read active-task.md or investigation-log.md from the memory bank.","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_search_and_read","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_search_code","description":"Project name","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_search_pattern","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_search_suggest","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"opengrok_update_memory","description":"Write or append to active-task.md or investigation-log.md.","write_action":true,"price_micros":0,"input_schema":null},{"name":"opengrok_what_changed","description":"","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":75,"grade":"B","scanned_at":"2026-09-19T21:03:58.915Z","report":{"scannerVersion":"0.1.8","scannedAt":"2026-09-19T21:03:58.941Z","components":{"code":{"score":20,"max":25,"notes":["4 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 4 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"out/server/main.js: …&&(A=this.opts.code.process(A,e));let g=new Function(`${cu.default.self}`,`${cu.default.scope…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"opengrok-mcp-server","version":"9.6.0","found":true,"license":"PolyForm-Noncommercial-1.0.0","hasInstallScripts":false,"dependencyCount":18,"publishedAt":"2026-09-16T07:02:20.873Z","repositoryUrl":"git+https://github.com/IcyHot09/opengrok-mcp-server.git","weeklyDownloads":337}],"repo":{"found":true,"owner":"IcyHot09","repo":"opengrok-mcp-server","archived":false,"pushedAt":"2026-09-16T08:32:28Z","stars":6,"forks":2,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/24820480?v=4","ownerCreatedAt":"2016-12-29T04:53:29Z","license":"NOASSERTION"},"icon":{"url":"https://avatars.githubusercontent.com/u/24820480?v=4&s=128","source":"registry"},"presence":{"stars":6,"forks":2,"downloadsWeek":337,"license":"NOASSERTION","lastPushAt":"2026-09-16T08:32:28.000Z","score":39}}}},"grade_history":[{"kind":"restore","fromGrade":"C","toGrade":"B","reason":"score 75: eval / new Function used","createdAt":"2026-09-19T21:03:59.446Z"}],"reviews":[]}