Configuration
Omnodex keeps its configuration in your Omnodex home: ~/.omnodex/ by default, C:\Users\<you>\.omnodex\ on native Windows, or the directory set in OMNODEX_HOME. Each file below is optional; create only the ones you need.
| File | Purpose |
|---|---|
config.json | Dashboard roots and machine label |
omnodex-config.json | Where hooks find their handlers (source installs) |
omnodex-proxy.json | MCP proxy upstream servers |
stream-config.json | Hosted dashboard connection, written by omnodex connect |
config.json
Section titled “config.json”{ "dashboard": { "roots": ["/mnt/c/Users/<you>/.omnodex"] }, "machine": { "label": "Work Laptop" }}dashboard.roots
Section titled “dashboard.roots”Type: string[]
Default: []
Additional Omnodex home directories the local dashboard reads. The dashboard’s own home is always included, so list only the extra ones. Paths that do not exist are skipped.
Use this to see several hosts in one dashboard, for example native Windows and WSL on the same machine. See Windows and WSL. For one-off use, pass omnodex dashboard --roots <path> instead.
machine.label
Section titled “machine.label”Type: string
Default: (none)
A readable name for this host, shown in the hosted dashboard’s machine selector. Without it, the dashboard shows an ID derived from the hostname. The label is display only; storage uses the derived ID.
omnodex-config.json
Section titled “omnodex-config.json”Tells hook launchers where the hook handlers of your Omnodex build are. Required for source installs.
{ "shim_paths": { "claude-code": "/path/to/omnodex/packages/hooks-provider/dist/bin/claude-hook-shim.js", "codex": "/path/to/omnodex/packages/codex-provider/dist/bin/codex-hook-shim.js", "antigravity": "/path/to/omnodex/packages/antigravity-provider/dist/bin/antigravity-hook-shim.js" }}Use absolute paths in the host’s path style, with escaped backslashes on Windows. An entry is used only if the file exists. See Installation.
MCP proxy configuration
Section titled “MCP proxy configuration”omnodex-proxy.json lists the upstream MCP servers the proxy routes. The proxy reads it from --config <path> if given, otherwise from the Omnodex home.
{ "version": 1, "redact_parameters": false, "proxy_bin": "/path/to/omnodex/packages/mcp-proxy/dist/bin/omnodex-mcp-proxy.js", "upstream_servers": [ { "name": "filesystem", "transport": "stdio", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/project"] }, { "name": "github", "transport": "stdio", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }, "redact_parameters": true } ], "upstream_connection": { "discovery_window_ms": 15000 }}| Field | Type | Default | Description |
|---|---|---|---|
version | 1 | required | Config schema version |
redact_parameters | boolean | false | Replace every parameter value with [REDACTED] in the event log. Parameter names are kept. |
proxy_bin | string | (none) | Path to the proxy script. Used by the Cowork, Codex, and Antigravity plugin launchers to find your build. Not needed when a client starts the proxy directly with node and --config. |
upstream_servers | array | [] | Upstream servers to route. May be empty: the proxy still serves its built-in omnodex_* tools. |
upstream_servers[].name | string | required | Identifier, used as the tool name prefix |
upstream_servers[].transport | "stdio" | required | Only stdio is supported |
upstream_servers[].command | string | required | Executable to start. Use an absolute path for desktop apps. |
upstream_servers[].args | string[] | [] | Arguments for the command |
upstream_servers[].env | object | (none) | Environment variables for the upstream. Values can reference the proxy’s environment as ${VAR}. |
upstream_servers[].cwd | string | proxy’s directory | Working directory for the upstream |
upstream_servers[].name_override | string | (none) | Prefix to use instead of name |
upstream_servers[].redact_parameters | boolean | inherits top level | Per-server redaction |
upstream_connection.discovery_window_ms | number | 15000 | Ceiling on how long the first tool listing waits for upstreams that are still starting. See Sizing the discovery window. |
upstream_connection.connect_timeout_ms | number | 30000 | Limit for one attempt to start an upstream and read its tools |
upstream_connection.retry_initial_delay_ms | number | 1000 | Delay before the first retry of a failed upstream. Doubles on each retry. |
upstream_connection.retry_give_up_delay_ms | number | 180000 | Retries stop once the next delay would reach this. With the defaults that is 9 attempts over about 4 minutes. |
Tools from each upstream are exposed as <prefix>__<tool>, for example filesystem__read_file. Keep secrets out of this file: put them in environment variables and reference them with ${VAR}.
How upstreams connect
Section titled “How upstreams connect”The proxy answers your agent straight away and connects upstream servers in the background, each one independently. A slow or broken upstream does not stop the others, and does not stop the built-in omnodex_* tools. A failed upstream is retried with a delay that doubles each time, until the next delay would reach retry_give_up_delay_ms; after that it stays failed. Ask your agent to call omnodex_status to see each upstream’s state, last error and next retry, or to call it with retry_failed: true to retry the failed ones immediately.
Sizing the discovery window
Section titled “Sizing the discovery window”Most agent clients read the tool list once, when they start the proxy. Claude Code is the exception: it acts on the MCP tools/list_changed notification and picks up an upstream that connects later in the session. ChatGPT Desktop, Codex CLI and Cowork do not, so for those an upstream that connects after the discovery window is unusable for the rest of that session, even though omnodex_status shows it connected. Restarting the agent does not fix it on its own, because the proxy restarts too and the upstream is slow again.
Set discovery_window_ms above the time your slowest upstream needs. The wait ends as soon as every upstream has settled, so this is a ceiling, not a delay you always pay.
{ "upstream_connection": { "discovery_window_ms": 25000 }}How long upstreams take:
- A local server started from an installed binary: well under a second.
- A first run of
npx -yoruvx, which downloads the package: several seconds, and longer on a slow network. Later runs are faster because the package is cached. - A server that signs in over the network at startup: as long as that call takes.
To check yours, ask your agent to call omnodex_status right after it starts. Any upstream still connecting, or any missing <prefix>__<tool>, means the window is too short.
Raising it costs nothing while upstreams are healthy. It costs time only when one is slow or hanging: the first tool listing can block for up to the window. Your agent still starts, because the proxy answers the MCP handshake immediately.
Lowering it gets the first tool listing sooner, at the risk of dropping a slow upstream for the whole session. Use a low value when every upstream is a fast local process, or when you would rather start with fewer tools than wait.
connect_timeout_ms is a separate, longer limit on a single connection attempt. An upstream can still be connecting when the window closes; it is simply missing from the first listing.
Test a new upstream by running the proxy yourself (node <proxy_bin> --config <path>) before adding it to a desktop app.
MCP proxy with Claude Code
Section titled “MCP proxy with Claude Code”To add the proxy to a project, put it in the project’s .mcp.json:
{ "mcpServers": { "omnodex": { "command": "/absolute/path/to/node", "args": [ "/path/to/omnodex/packages/mcp-proxy/dist/bin/omnodex-mcp-proxy.js", "--config", "/home/<you>/.omnodex/omnodex-proxy.json" ], "alwaysLoad": true } }}alwaysLoad is optional. Claude Code defers MCP tools until a tool search finds them; with alwaysLoad, the Omnodex tools are available from the start of the session.
stream-config.json
Section titled “stream-config.json”Written by omnodex connect. Holds the hosted dashboard connection for this host.
{ "passphrase": "word1 word2 word3 word4 word5 word6", "api_url": "https://api.omnodex.com", "api_token": "omx_..."}| Field | Description |
|---|---|
passphrase | Sync passphrase for zero-knowledge encryption. Generated as six random words on first connect. |
api_url | Omnodex cloud API endpoint |
api_token | API token for cloud features |
OMNODEX_API_TOKEN and OMNODEX_SYNC_PASSPHRASE take precedence over the values in this file. The file contains credentials; do not commit or share it.
Automatic sync settings
Section titled “Automatic sync settings”A connected host refreshes the hosted dashboard’s encrypted blob on its own. See Automatic sync for what runs where. These optional fields in the same file tune it; the defaults suit almost everyone.
| Field | Type | Default | Description |
|---|---|---|---|
auto_sync | boolean | true | Set to false to turn automatic sync off. omnodex sync still works by hand. |
auto_sync_min_interval_seconds | number | 60 | Shortest gap between two syncs. Stops back-to-back sessions each starting one. |
auto_sync_interval_seconds | number | 900 | How often a running MCP proxy syncs. Values under 30 are ignored. Does not apply to hook platforms, which sync when a session ends. |
OMNODEX_AUTO_SYNC=0 in the environment turns automatic sync off without editing the file.
Environment variables
Section titled “Environment variables”| Variable | Description |
|---|---|
OMNODEX_HOME | Omnodex home directory (default ~/.omnodex) |
OMNODEX_API_TOKEN | API token for cloud features |
OMNODEX_SYNC_PASSPHRASE | Sync passphrase |
OMNODEX_AUTO_SYNC | Set to 0 to turn automatic sync off on this host |
OMNODEX_DEBUG | Set to 1 for detailed hook launcher logging in launcher.log |
OMNODEX_NO_UPDATE_CHECK | Set to 1 to disable the background update check |
Desktop apps such as Cowork do not always pass user environment variables to the MCP servers they start. Use the config files above for anything a desktop app needs.
File locations
Section titled “File locations”$OMNODEX_HOME/ config.json Dashboard roots, machine label omnodex-config.json Hook handler locations omnodex-proxy.json MCP proxy configuration stream-config.json Hosted dashboard connection installations.json Projects where hooks are installed auto-sync-state.json Last automatic sync: time, blob, error auto-sync.lock Held while a sync runs; ignored after 10 minutes streaming-key-cache.json Cached streaming key, so each push skips the KDF event-log/ index.jsonl Session index sessions/<id>.jsonl Per-session event log (append-only) traces.db SQLite read model (derived, safe to delete) bin/ Hook launchers launcher.log Launcher failuresDefault paths by platform
Section titled “Default paths by platform”~/.omnodex/ (for example /Users/you/.omnodex/), used by every agent on the Mac.
~/.omnodex/ (for example /home/you/.omnodex/), used by every agent on the machine.
C:\Users\<you>\.omnodex\ for agents running natively on Windows, including Cowork and ChatGPT Desktop.
WSL has its own home, /home/<you>/.omnodex/, used by agents you run inside WSL. See Windows and WSL.
Next steps
Section titled “Next steps”- CLI Commands - Command reference
- Event Schema - Event data format