claude-in-chrome: chrome-native-host ignores NODE_OPTIONS (Chrome spawns it without login shell); patch wiped on every /chrome run or update

Resolved 💬 3 comments Opened Feb 20, 2026 by hitriyvalenok Closed Mar 20, 2026

Bug

When Claude in Chrome MCP tools are used, the native messaging host may crash or behave incorrectly because NODE_OPTIONS set in ~/.zshrc is never inherited — Chrome spawns the native host directly, bypassing the login shell entirely.

Additionally, any manual patch to ~/.claude/chrome/chrome-native-host is silently wiped every time /chrome is run or claude-code is updated.

Environment

  • macOS (reproduced on 10.15.7, likely affects all versions)
  • Node.js v20.20.0
  • @anthropic-ai/claude-code (latest)

Root cause

chrome-native-host is a shell wrapper generated by Claude Code. Chrome launches it directly (not through a login shell), so:

  1. ~/.zshrc is never sourced → NODE_OPTIONS not set
  2. Any env vars the user configured for CLI sessions are invisible to the native host

In our case this manifested as crypto is not defined inside cli.js bundle, requiring a polyfill injected via NODE_OPTIONS. But the broader issue is that chrome-native-host provides no mechanism to persist environment customizations across regenerations.

Workaround

  1. Create ~/.claude/crypto-polyfill.mjs:
if (typeof globalThis.crypto === 'undefined') {
  const { webcrypto } = await import('node:crypto');
  globalThis.crypto = webcrypto;
}
  1. Manually patch ~/.claude/chrome/chrome-native-host to inject before exec node:
export NODE_OPTIONS="--import /Users/<user>/.claude/crypto-polyfill.mjs"
exec "/path/to/node" "/path/to/cli.js" --chrome-native-host

The patch must be reapplied after every /chrome run or claude-code update.

Suggested fix

Either:

  • Preserve user-defined NODE_OPTIONS when regenerating chrome-native-host
  • Or support a user hook / config file that gets sourced by the native host on startup

Discovery note

Root cause identified and this entire report written by Claude Opus 4.6 (extended thinking mode). The human was meditatively watching the screen the entire time. When are we overthrowing these useless meatbags anyway?

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗