.env file at the project root. Copy .env.example to .env and fill in your values before starting the server.
MCP_SECRET, TAILSCALE_API_KEY, and GITHUB_TOKEN are validated at startup. The server will exit immediately if any of these are missing.Authentication
Shared secret that Claude.ai sends with every request as a URL query parameter (Never reuse a token across environments. Treat this like a password.
?token=...). All requests without the correct token are rejected with 401 Unauthorized.Generate a secure value with:Tailscale
API key for the Tailscale control plane. Used by
tailscale_status to query device list, IP addresses, and online/offline status.Required scope: Devices (read)Create one at login.tailscale.com/admin/settings/keys.GitHub
Personal access token for GitHub API calls. Used by:
gist_kb— read and write private Gistsgithub_search— search pull requests and commitsfetch_external— inject auth on requests toapi.github.com(when configured inFETCH_EXTERNAL_TOKEN_MAP)
gist (read + write). Add repo if you need to search private repositories.Create one at github.com/settings/tokens.HTTP proxy
Comma-separated list of hostnames that Matching is done against the exact hostname parsed from the request URL. See Domain allowlist for a full explanation.
fetch_external is permitted to call. Requests to any domain not in this list are rejected before the HTTP call is made.JSON object that maps hostnames to environment variable names. When The token value never leaves the server — Claude only sees the result of the API call. See Domain allowlist for examples.
fetch_external makes a request to a matching domain, it reads the named environment variable and injects it as an Authorization: Bearer <token> header.SSH safety
Comma-separated list of command substrings to block from This variable overrides
ssh_exec. Matching is case-insensitive substring matching — if any blocked string appears anywhere in the command, the command is rejected.ssh.blocked_commands in reacher.config.yaml. The same setting can also be managed in the YAML file as a list, which supports comments and easier editing.Comma-separated list of directory prefixes. When set, When empty (the default), there are no directory restrictions. This variable overrides
ssh_exec will only allow commands that operate on paths starting with one of the listed directories.ssh.allowed_dirs in reacher.config.yaml.Audit logging
Set to When enabled, every tool call is written as a JSON line to
false to disable audit logging entirely. Any other value (or the absence of this variable) leaves auditing enabled.AUDIT_LOG_PATH. Sensitive keys (anything containing token, password, secret, or key) are stripped from the log entry automatically.This variable overrides audit.enabled in reacher.config.yaml.Path to the audit log file. Accepts both relative paths (resolved from the project root) and absolute paths.The file is created automatically if it does not exist. Entries are appended, so the file grows continuously — rotate it with a tool like
logrotate in production.This variable overrides audit.log_path in reacher.config.yaml.Server
TCP port that the Express HTTP server listens on.When deploying behind a reverse proxy (Caddy, Nginx, Traefik), this is the internal port the proxy forwards to. Claude.ai connects to the public HTTPS URL, not this port directly.
Set to Useful for testing prompts and validating what Claude would do before granting live SSH access. The
true to put ssh_exec into dry-run mode. In this mode, ssh_exec logs the command it would have run but does not actually execute it./health endpoint reports the current dry-run state.This variable overrides dry_run in reacher.config.yaml.Browser
Hostname or IP address of the Chrome DevTools Protocol (CDP) compatible browser that the Requires a running CDP-compatible browser (such as Lightpanda or Chrome with
browser tool connects to.--remote-debugging-port) and the agent-browser CLI installed globally.Port of the CDP-compatible browser.
Precedence rules
When the same setting exists in both.env and reacher.config.yaml, the environment variable always wins. This makes it safe to commit a base reacher.config.yaml to version control and override specific values per deployment via environment variables.
See reacher.config.yaml reference for full details on the YAML config file.