Run Claude Desktop AND HTTP API simultaneously with a single Chrome instance
The Stdio-HTTP Proxy enables Claude Desktop to communicate with the HTTP server, solving the Chrome profile locking issue without requiring separate browser profiles.
┌─────────────────────────────────────────────────────────────────┐
│ ARCHITECTURE │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Claude Desktop ─────► Stdio-HTTP Proxy ────┐ │
│ (no Chrome) │ │
│ ▼ │
│ n8n / Zapier ──────────────────────► HTTP Server ──► Chrome │
│ │ │
│ curl / Postman ────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Benefits:
- ✅ Single Chrome instance (no profile conflicts)
- ✅ Shared authentication state
- ✅ Claude Desktop + HTTP API running simultaneously
- ✅ No additional disk space for separate profiles
⚠️ CRITICAL: The HTTP server MUST run on Windows (not WSL)The server uses Playwright to control Chrome. If you run the server from WSL, it will look for Chrome at Linux paths (
/opt/google/chrome/chrome) instead of Windows paths and will fail.Always start the HTTP server from PowerShell or CMD, not from WSL bash.
From PowerShell (recommended):
cd D:\path\to\notebooklm-mcp
# Build if needed
npm run build
# Start HTTP server (foreground)
node dist/http-wrapper.js
# Or in background (survives terminal close):
Start-Process -NoNewWindow node -ArgumentList "dist/http-wrapper.js"From WSL (recommended - use helper script):
# Helper script handles everything correctly
HELPER=/mnt/d/path/to/notebooklm-mcp/scripts/mcp-wsl-helper.sh
$HELPER start # Start server (Windows process)
$HELPER health # Check health
$HELPER auth # Authenticate (opens Chrome)
$HELPER ask "question" notebook-id # Ask a question
$HELPER stop # Stop serverFrom WSL (manual - launches Windows node process):
# This launches node.exe on Windows, NOT node in WSL
powershell.exe -Command "Start-Process -NoNewWindow -FilePath 'node' -ArgumentList 'D:/path/to/notebooklm-mcp/dist/http-wrapper.js' -WorkingDirectory 'D:/path/to/notebooklm-mcp'"Edit your Claude Desktop config file:
Windows: %APPDATA%\Claude\claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"notebooklm": {
"command": "node",
"args": ["D:/path/to/notebooklm-mcp/dist/stdio-http-proxy.js"],
"env": {
"MCP_HTTP_URL": "http://localhost:3000"
}
}
}
}Note: Replace the path with your actual installation path.
Close and reopen Claude Desktop. The proxy will connect to your HTTP server.
| Variable | Default | Description |
|---|---|---|
MCP_HTTP_URL |
http://localhost:3000 |
HTTP server URL |
HTTP_PORT |
3000 |
Port for HTTP server |
HTTP_HOST |
0.0.0.0 |
Host for HTTP server |
# Terminal 1: HTTP server on port 4000
HTTP_PORT=4000 npm run start:http
# Claude Desktop config
{
"mcpServers": {
"notebooklm": {
"command": "node",
"args": ["/path/to/dist/stdio-http-proxy.js"],
"env": {
"MCP_HTTP_URL": "http://localhost:4000"
}
}
}
}| Script | Description |
|---|---|
start:http |
Start HTTP server (foreground) |
start:proxy |
Start stdio proxy (for testing) |
daemon:start |
Start HTTP server as PM2 daemon |
daemon:stop |
Stop PM2 daemon |
daemon:logs |
View daemon logs |
dev:http |
Development mode with hot reload |
dev:proxy |
Development mode for proxy |
# Start HTTP server
npm run daemon:start
# Configure Claude Desktop with proxy (see above)
# Use Claude Desktop normally# Start HTTP server
npm run start:http
# Use HTTP API
curl -X POST http://localhost:3000/ask \
-H "Content-Type: application/json" \
-d '{"question": "What is X?", "notebook_id": "my-notebook"}'# Terminal 1: HTTP server (owns Chrome)
npm run daemon:start
# Claude Desktop: uses proxy (configured above)
# n8n/Zapier: uses HTTP API directly
# Both work simultaneously!Cannot connect to HTTP server at http://localhost:3000
Solution: Ensure HTTP server is running:
npm run daemon:status # Check if running
npm run daemon:start # Start if notThe HTTP server manages authentication. If you need to re-authenticate:
# Via HTTP API
curl -X POST http://localhost:3000/setup-auth
# Or use Claude Desktop (via proxy)
# Ask: "Setup NotebookLM authentication"Error: Playwright cannot find Chrome at /opt/google/chrome/chrome
This means you started the HTTP server from WSL instead of Windows.
The HTTP server MUST run as a Windows process to access Chrome. Fix:
# Use the helper script (recommended)
HELPER=/mnt/d/path/to/notebooklm-mcp/scripts/mcp-wsl-helper.sh
# 1. Stop any running server
$HELPER stop
# 2. Start server (launches Windows process)
$HELPER start
# 3. Verify it works
$HELPER healthOr manually:
# 1. Kill any WSL server
pkill -f http-wrapper
# 2. Start as Windows process
powershell.exe -Command "Start-Process -NoNewWindow -FilePath 'node' -ArgumentList 'D:/path/to/notebooklm-mcp/dist/http-wrapper.js' -WorkingDirectory 'D:/path/to/notebooklm-mcp'"
# 3. Verify (via PowerShell, not curl from WSL)
powershell.exe -Command "Invoke-RestMethod -Uri 'http://localhost:3000/health'"Note:
curlfrom WSL may not reach Windows localhost due to network isolation. Always usepowershell.exeor the helper script.
| Feature | Native Stdio | Stdio-HTTP Proxy |
|---|---|---|
| Chrome instance | Own instance | Uses HTTP server's |
| Run with HTTP server | ❌ Chrome conflict | ✅ Works |
| Authentication | Own profile | Shared with HTTP |
| Dependencies | Full (Playwright) | Minimal (fetch only) |
| Latency | Direct | +1 HTTP hop |
| Use case | Standalone | Multi-interface |
The multi-profile feature (separate Chrome profiles per mode) is planned for v1.4.0 but is a separate feature from multi-interface:
- Multi-Interface (v1.3.6): Single Chrome, multiple clients via proxy
- Multi-Profile (v1.4.0): Multiple Chrome profiles for independent auth
Most users should use the proxy approach for simplicity.