OpenGrok MCP Server
mcpkey · packageMCP server bridging OpenGrok search engine with AI for instant context across massive codebases.
run it
on your own machines, one way per deploy method#!/usr/bin/env bash # opengrok (io.github.IcyHot09/opengrok-mcp-server), recipe baremetal (generated). # Generated by Hub for toolset "my-agent"; started by mcp-my-agent-opengrok.service. set -euo pipefail export HOST=127.0.0.1 PORT=8101 exec npx -y supergateway@4 --stdio 'npx -y [email protected]' --outputTransport streamableHttp --stateful --host 127.0.0.1 --port 8101 --streamableHttpPath /mcp --healthEndpoint /healthz [Unit] Description=MCP server opengrok (toolset my-agent), generated by Hub After=network-online.target Wants=network-online.target [Service] Type=simple User=mcp Group=mcp EnvironmentFile=/etc/mcp/my-agent.env Environment=HOME=/var/lib/mcp/opengrok WorkingDirectory=/var/lib/mcp/opengrok ExecStart=/opt/mcp/my-agent/bin/opengrok.sh Restart=on-failure RestartSec=5 NoNewPrivileges=true ProtectSystem=strict ProtectHome=true PrivateTmp=true ReadWritePaths=/var/lib/mcp/opengrok [Install] WantedBy=multi-user.target
docker run --rm -p 127.0.0.1:8101:8000 -e OPENGROK_BASE_URL -e OPENGROK_USERNAME -e OPENGROK_PASSWORD -e OPENGROK_VERIFY_SSL -e OPENGROK_CODE_MODE -e OPENGROK_ENABLE_MEMORY_TOOLS -e OPENGROK_DEFAULT_PROJECT -e OPENGROK_CONTEXT_BUDGET -e OPENGROK_API_VERSION -e HTTP_PROXY -e OPENGROK_RESPONSE_FORMAT_OVERRIDE -e OPENGROK_MEMORY_BANK_DIR -e OPENGROK_LOCAL_COMPILE_DB_PATHS -e OPENGROK_ENABLE_ELICITATION -e OPENGROK_ENABLE_SAMPLING -e OPENGROK_SAMPLING_MODEL -e OPENGROK_ENABLE_FILES_API -e OPENGROK_ENABLE_OBSERVATION_MASKER -e OPENGROK_OBSERVATION_MASKER_TURNS -e OPENGROK_SAMPLING_MAX_TOKENS -e OPENGROK_AUDIT_LOG_FILE -e OPENGROK_RATELIMIT_RPM -e OPENGROK_PER_TOOL_RATELIMIT -e OPENGROK_TIMEOUT -e OPENGROK_DEFAULT_MAX_RESULTS -e OPENGROK_PASSWORD_FILE -e OPENGROK_MAX_RESPONSE_BYTES -e OPENGROK_SEARCH_AND_READ_CAP -e OPENGROK_STRICT_SSRF -e OPENGROK_JWT_ISSUER -e OPENGROK_GRAMMAR_DIR node:22-alpine sh -c 'npx -y supergateway@4 --stdio '"'"'npx -y [email protected]'"'"' --outputTransport streamableHttp --stateful --host 0.0.0.0 --port 8000 --streamableHttpPath /mcp --healthEndpoint /healthz'
# Generated by Hub for toolset "my-agent" (2026-10-18T12:03:23+00:00).
# Each package server runs behind a stdio->HTTP bridge and listens on localhost only.
# cp .env.example .env # fill the ${VAR}s
# docker compose up -d && bash smoke.sh
# Remote servers are not here: clients reach them directly (see clients/).
name: mcp-my-agent
services:
opengrok:
image: node:22-alpine
command:
- sh
- -c
- npx -y supergateway@4 --stdio 'npx -y [email protected]' --outputTransport streamableHttp
--stateful --host 0.0.0.0 --port 8000 --streamableHttpPath /mcp --healthEndpoint /healthz
ports:
- 127.0.0.1:8101:8000
volumes:
- npm-cache:/root/.npm
healthcheck:
test:
- CMD-SHELL
- wget -qO- http://127.0.0.1:8000/healthz || exit 1
interval: 30s
timeout: 5s
retries: 5
start_period: 2m
restart: unless-stopped
environment:
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}
volumes:
npm-cache: {}
uv-cache: {}
# Generated by Hub for toolset "my-agent" (2026-10-18T12:03:23+00:00).
# kubectl create namespace mcp
# kubectl -n mcp create secret generic mcp-credentials --from-env-file=.env
# kubectl apply -f kubernetes.yaml
# Services are cluster-internal: <name>.mcp.svc.cluster.local:8000/mcp. Put an ingress
# with auth in front before exposing any of them.
apiVersion: v1
kind: Namespace
metadata:
name: mcp
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: opengrok
namespace: mcp
labels: &id001
app: opengrok
spec:
replicas: 1
selector:
matchLabels: *id001
template:
metadata:
labels: *id001
spec:
containers:
- name: opengrok
image: node:22-alpine
ports:
- containerPort: 8000
name: http
env:
- name: OPENGROK_BASE_URL
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_BASE_URL
- name: OPENGROK_USERNAME
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_USERNAME
- name: OPENGROK_PASSWORD
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_PASSWORD
- name: OPENGROK_VERIFY_SSL
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_VERIFY_SSL
- name: OPENGROK_CODE_MODE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_CODE_MODE
- name: OPENGROK_ENABLE_MEMORY_TOOLS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_ENABLE_MEMORY_TOOLS
- name: OPENGROK_DEFAULT_PROJECT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_DEFAULT_PROJECT
- name: OPENGROK_CONTEXT_BUDGET
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_CONTEXT_BUDGET
- name: OPENGROK_API_VERSION
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_API_VERSION
- name: HTTP_PROXY
valueFrom:
secretKeyRef:
name: mcp-credentials
key: HTTP_PROXY
- name: OPENGROK_RESPONSE_FORMAT_OVERRIDE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_RESPONSE_FORMAT_OVERRIDE
- name: OPENGROK_MEMORY_BANK_DIR
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_MEMORY_BANK_DIR
- name: OPENGROK_LOCAL_COMPILE_DB_PATHS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_LOCAL_COMPILE_DB_PATHS
- name: OPENGROK_ENABLE_ELICITATION
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_ENABLE_ELICITATION
- name: OPENGROK_ENABLE_SAMPLING
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_ENABLE_SAMPLING
- name: OPENGROK_SAMPLING_MODEL
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_SAMPLING_MODEL
- name: OPENGROK_ENABLE_FILES_API
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_ENABLE_FILES_API
- name: OPENGROK_ENABLE_OBSERVATION_MASKER
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_ENABLE_OBSERVATION_MASKER
- name: OPENGROK_OBSERVATION_MASKER_TURNS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_OBSERVATION_MASKER_TURNS
- name: OPENGROK_SAMPLING_MAX_TOKENS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_SAMPLING_MAX_TOKENS
- name: OPENGROK_AUDIT_LOG_FILE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_AUDIT_LOG_FILE
- name: OPENGROK_RATELIMIT_RPM
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_RATELIMIT_RPM
- name: OPENGROK_PER_TOOL_RATELIMIT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_PER_TOOL_RATELIMIT
- name: OPENGROK_TIMEOUT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_TIMEOUT
- name: OPENGROK_DEFAULT_MAX_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_DEFAULT_MAX_RESULTS
- name: OPENGROK_PASSWORD_FILE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_PASSWORD_FILE
- name: OPENGROK_MAX_RESPONSE_BYTES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_MAX_RESPONSE_BYTES
- name: OPENGROK_SEARCH_AND_READ_CAP
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_SEARCH_AND_READ_CAP
- name: OPENGROK_STRICT_SSRF
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_STRICT_SSRF
- name: OPENGROK_JWT_ISSUER
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_JWT_ISSUER
- name: OPENGROK_GRAMMAR_DIR
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_GRAMMAR_DIR
command:
- sh
- -c
- npx -y supergateway@4 --stdio 'npx -y [email protected]' --outputTransport streamableHttp
--stateful --host 0.0.0.0 --port 8000 --streamableHttpPath /mcp --healthEndpoint /healthz
readinessProbe:
httpGet:
path: /healthz
port: http
initialDelaySeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: opengrok
namespace: mcp
spec:
selector:
app: opengrok
ports:
- port: 8000
targetPort: http
name: http
# Generated by Hub for toolset "my-agent" (2026-10-18T12:03:24+00:00).
# Credentials come from the Secret 'mcp-credentials' (kubectl create secret generic ... --from-env-file=.env).
# Each server under `servers` is one Deployment + Service; the keys after it configure
# upstream charts a worker verified.
servers:
opengrok:
enabled: true
replicas: 1
port: 8000
path: /mcp
container:
name: opengrok
image: node:22-alpine
ports:
- containerPort: 8000
name: http
env:
- name: OPENGROK_BASE_URL
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_BASE_URL
- name: OPENGROK_USERNAME
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_USERNAME
- name: OPENGROK_PASSWORD
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_PASSWORD
- name: OPENGROK_VERIFY_SSL
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_VERIFY_SSL
- name: OPENGROK_CODE_MODE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_CODE_MODE
- name: OPENGROK_ENABLE_MEMORY_TOOLS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_ENABLE_MEMORY_TOOLS
- name: OPENGROK_DEFAULT_PROJECT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_DEFAULT_PROJECT
- name: OPENGROK_CONTEXT_BUDGET
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_CONTEXT_BUDGET
- name: OPENGROK_API_VERSION
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_API_VERSION
- name: HTTP_PROXY
valueFrom:
secretKeyRef:
name: mcp-credentials
key: HTTP_PROXY
- name: OPENGROK_RESPONSE_FORMAT_OVERRIDE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_RESPONSE_FORMAT_OVERRIDE
- name: OPENGROK_MEMORY_BANK_DIR
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_MEMORY_BANK_DIR
- name: OPENGROK_LOCAL_COMPILE_DB_PATHS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_LOCAL_COMPILE_DB_PATHS
- name: OPENGROK_ENABLE_ELICITATION
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_ENABLE_ELICITATION
- name: OPENGROK_ENABLE_SAMPLING
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_ENABLE_SAMPLING
- name: OPENGROK_SAMPLING_MODEL
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_SAMPLING_MODEL
- name: OPENGROK_ENABLE_FILES_API
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_ENABLE_FILES_API
- name: OPENGROK_ENABLE_OBSERVATION_MASKER
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_ENABLE_OBSERVATION_MASKER
- name: OPENGROK_OBSERVATION_MASKER_TURNS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_OBSERVATION_MASKER_TURNS
- name: OPENGROK_SAMPLING_MAX_TOKENS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_SAMPLING_MAX_TOKENS
- name: OPENGROK_AUDIT_LOG_FILE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_AUDIT_LOG_FILE
- name: OPENGROK_RATELIMIT_RPM
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_RATELIMIT_RPM
- name: OPENGROK_PER_TOOL_RATELIMIT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_PER_TOOL_RATELIMIT
- name: OPENGROK_TIMEOUT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_TIMEOUT
- name: OPENGROK_DEFAULT_MAX_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_DEFAULT_MAX_RESULTS
- name: OPENGROK_PASSWORD_FILE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_PASSWORD_FILE
- name: OPENGROK_MAX_RESPONSE_BYTES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_MAX_RESPONSE_BYTES
- name: OPENGROK_SEARCH_AND_READ_CAP
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_SEARCH_AND_READ_CAP
- name: OPENGROK_STRICT_SSRF
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_STRICT_SSRF
- name: OPENGROK_JWT_ISSUER
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_JWT_ISSUER
- name: OPENGROK_GRAMMAR_DIR
valueFrom:
secretKeyRef:
name: mcp-credentials
key: OPENGROK_GRAMMAR_DIR
command:
- sh
- -c
- npx -y supergateway@4 --stdio 'npx -y [email protected]' --outputTransport streamableHttp
--stateful --host 0.0.0.0 --port 8000 --streamableHttpPath /mcp --healthEndpoint /healthz
readinessProbe:
httpGet:
path: /healthz
port: http
initialDelaySeconds: 10
# helm install my-agent helm/my-agent -n mcp
in the cloud
one click: the provider's deploy form opens filled in, in your own account- koyeb
-
The form opens with CHANGE_ME for each value you supply: OPENGROK_BASE_URL, OPENGROK_USERNAME, OPENGROK_PASSWORD, OPENGROK_VERIFY_SSL, OPENGROK_CODE_MODE, OPENGROK_ENABLE_MEMORY_TOOLS, OPENGROK_DEFAULT_PROJECT, OPENGROK_CONTEXT_BUDGET, OPENGROK_API_VERSION, HTTP_PROXY, OPENGROK_RESPONSE_FORMAT_OVERRIDE, OPENGROK_MEMORY_BANK_DIR, OPENGROK_LOCAL_COMPILE_DB_PATHS, OPENGROK_ENABLE_ELICITATION, OPENGROK_ENABLE_SAMPLING, OPENGROK_SAMPLING_MODEL, OPENGROK_ENABLE_FILES_API, OPENGROK_ENABLE_OBSERVATION_MASKER, OPENGROK_OBSERVATION_MASKER_TURNS, OPENGROK_SAMPLING_MAX_TOKENS, OPENGROK_AUDIT_LOG_FILE, OPENGROK_RATELIMIT_RPM, OPENGROK_PER_TOOL_RATELIMIT, OPENGROK_TIMEOUT, OPENGROK_DEFAULT_MAX_RESULTS, OPENGROK_PASSWORD_FILE, OPENGROK_MAX_RESPONSE_BYTES, OPENGROK_SEARCH_AND_READ_CAP, OPENGROK_STRICT_SSRF, OPENGROK_JWT_ISSUER, OPENGROK_GRAMMAR_DIR. Fill them in before you deploy.
Clients connect to the service's https://…koyeb.app address plus /mcp.
- azure
-
A Container Apps environment with one app per server, each with HTTPS ingress and one replica. The portal asks for each value you supply as a secure parameter; the deployment's outputs list the endpoints.
connect to it
copy what your client needsnpx -y [email protected] # env: OPENGROK_BASE_URL, OPENGROK_USERNAME, OPENGROK_PASSWORD, OPENGROK_VERIFY_SSL, OPENGROK_CODE_MODE, OPENGROK_ENABLE_MEMORY_TOOLS, OPENGROK_DEFAULT_PROJECT, OPENGROK_CONTEXT_BUDGET, OPENGROK_API_VERSION, HTTP_PROXY, OPENGROK_RESPONSE_FORMAT_OVERRIDE, OPENGROK_MEMORY_BANK_DIR, OPENGROK_LOCAL_COMPILE_DB_PATHS, OPENGROK_ENABLE_ELICITATION, OPENGROK_ENABLE_SAMPLING, OPENGROK_SAMPLING_MODEL, OPENGROK_ENABLE_FILES_API, OPENGROK_ENABLE_OBSERVATION_MASKER, OPENGROK_OBSERVATION_MASKER_TURNS, OPENGROK_SAMPLING_MAX_TOKENS, OPENGROK_AUDIT_LOG_FILE, OPENGROK_RATELIMIT_RPM, OPENGROK_PER_TOOL_RATELIMIT, OPENGROK_TIMEOUT, OPENGROK_DEFAULT_MAX_RESULTS, OPENGROK_PASSWORD_FILE, OPENGROK_MAX_RESPONSE_BYTES, OPENGROK_SEARCH_AND_READ_CAP, OPENGROK_STRICT_SSRF, OPENGROK_JWT_ISSUER, OPENGROK_GRAMMAR_DIR
{
"mcpServers": {
"opengrok": {
"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}"
}
}
}
}
#!/usr/bin/env bash
# Registers every server with Claude Code (run once; `claude mcp list` to check).
set -euo pipefail
set -a; [ -f .env ] && source .env; set +a
claude mcp add opengrok -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]
{
"mcpServers": {
"opengrok": {
"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}"
}
}
}
}
{
"servers": {
"opengrok": {
"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}"
}
}
}
}
name: my-agent target: local servers: - hub: io.github.IcyHot09/opengrok-mcp-server
- not probed yet: tools unpinned, ingest lists them