Skip to content

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.

FilePurpose
config.jsonDashboard roots and machine label
omnodex-config.jsonWhere hooks find their handlers (source installs)
omnodex-proxy.jsonMCP proxy upstream servers
stream-config.jsonHosted dashboard connection, written by omnodex connect
{
"dashboard": {
"roots": ["/mnt/c/Users/<you>/.omnodex"]
},
"machine": {
"label": "Work Laptop"
}
}

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.

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.

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.

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
}
}
FieldTypeDefaultDescription
version1requiredConfig schema version
redact_parametersbooleanfalseReplace every parameter value with [REDACTED] in the event log. Parameter names are kept.
proxy_binstring(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_serversarray[]Upstream servers to route. May be empty: the proxy still serves its built-in omnodex_* tools.
upstream_servers[].namestringrequiredIdentifier, used as the tool name prefix
upstream_servers[].transport"stdio"requiredOnly stdio is supported
upstream_servers[].commandstringrequiredExecutable to start. Use an absolute path for desktop apps.
upstream_servers[].argsstring[][]Arguments for the command
upstream_servers[].envobject(none)Environment variables for the upstream. Values can reference the proxy’s environment as ${VAR}.
upstream_servers[].cwdstringproxy’s directoryWorking directory for the upstream
upstream_servers[].name_overridestring(none)Prefix to use instead of name
upstream_servers[].redact_parametersbooleaninherits top levelPer-server redaction
upstream_connection.discovery_window_msnumber15000Ceiling on how long the first tool listing waits for upstreams that are still starting. See Sizing the discovery window.
upstream_connection.connect_timeout_msnumber30000Limit for one attempt to start an upstream and read its tools
upstream_connection.retry_initial_delay_msnumber1000Delay before the first retry of a failed upstream. Doubles on each retry.
upstream_connection.retry_give_up_delay_msnumber180000Retries 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}.

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.

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 -y or uvx, 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.

To add the proxy to a project, put it in the project’s .mcp.json:

.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.

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_..."
}
FieldDescription
passphraseSync passphrase for zero-knowledge encryption. Generated as six random words on first connect.
api_urlOmnodex cloud API endpoint
api_tokenAPI 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.

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.

FieldTypeDefaultDescription
auto_syncbooleantrueSet to false to turn automatic sync off. omnodex sync still works by hand.
auto_sync_min_interval_secondsnumber60Shortest gap between two syncs. Stops back-to-back sessions each starting one.
auto_sync_interval_secondsnumber900How 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.

VariableDescription
OMNODEX_HOMEOmnodex home directory (default ~/.omnodex)
OMNODEX_API_TOKENAPI token for cloud features
OMNODEX_SYNC_PASSPHRASESync passphrase
OMNODEX_AUTO_SYNCSet to 0 to turn automatic sync off on this host
OMNODEX_DEBUGSet to 1 for detailed hook launcher logging in launcher.log
OMNODEX_NO_UPDATE_CHECKSet 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.

$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 failures

~/.omnodex/ (for example /Users/you/.omnodex/), used by every agent on the Mac.