@brightdata/cli 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  <p align="center">
12
12
  <a href="https://www.npmjs.com/package/%40brightdata%2Fcli"><img src="https://img.shields.io/npm/v/%40brightdata%2Fcli?color=black&label=npm" alt="npm version" /></a>
13
13
  <img src="https://img.shields.io/badge/node-%3E%3D20-black" alt="node requirement" />
14
- <img src="https://img.shields.io/badge/license-ISC-black" alt="license" />
14
+ <img src="https://img.shields.io/badge/license-MIT-black" alt="license" />
15
15
  </p>
16
16
 
17
17
  ---
@@ -28,6 +28,7 @@
28
28
  | `brightdata zones` | List and inspect your Bright Data proxy zones |
29
29
  | `brightdata budget` | View account balance and per-zone cost & bandwidth |
30
30
  | `brightdata skill` | Install Bright Data AI agent skills into your coding agent |
31
+ | `brightdata add mcp` | Add the Bright Data MCP server to Claude Code, Cursor, or Codex |
31
32
  | `brightdata config` | Manage CLI configuration |
32
33
  | `brightdata init` | Interactive setup wizard |
33
34
 
@@ -47,6 +48,7 @@
47
48
  - [zones](#zones)
48
49
  - [budget](#budget)
49
50
  - [skill](#skill)
51
+ - [add mcp](#add-mcp)
50
52
  - [config](#config)
51
53
  - [login / logout](#login--logout)
52
54
  - [Configuration](#configuration)
@@ -105,6 +107,9 @@ brightdata pipelines linkedin_person_profile "https://linkedin.com/in/username"
105
107
 
106
108
  # 5. Check your account balance
107
109
  brightdata budget
110
+
111
+ # 6. Install the Bright Data MCP server into your coding agent
112
+ brightdata add mcp
108
113
  ```
109
114
 
110
115
  ---
@@ -131,6 +136,8 @@ On first login the CLI checks for required zones (`cli_unlocker`, `cli_browser`)
131
136
  brightdata logout
132
137
  ```
133
138
 
139
+ `brightdata add mcp` uses the API key stored by `brightdata login`. It does not currently read `BRIGHTDATA_API_KEY` or the global `--api-key` flag, so log in first before using it.
140
+
134
141
  ---
135
142
 
136
143
  ## Commands
@@ -397,6 +404,54 @@ brightdata skill list
397
404
 
398
405
  ---
399
406
 
407
+ ### `add mcp`
408
+
409
+ Write a Bright Data MCP server entry into Claude Code, Cursor, or Codex config files using the API key already stored by `brightdata login`.
410
+
411
+ ```bash
412
+ brightdata add mcp # Interactive agent + scope prompts
413
+ brightdata add mcp --agent claude-code --global
414
+ brightdata add mcp --agent claude-code,cursor --project
415
+ brightdata add mcp --agent codex --global
416
+ ```
417
+
418
+ | Flag | Description |
419
+ |---|---|
420
+ | `--agent <agents>` | Comma-separated targets: `claude-code,cursor,codex` |
421
+ | `--global` | Install to the agent's global config file |
422
+ | `--project` | Install to the current project's config file |
423
+
424
+ **Config targets**
425
+
426
+ | Agent | Global path | Project path |
427
+ |---|---|---|
428
+ | Claude Code | `~/.claude.json` | `.claude/settings.json` |
429
+ | Cursor | `~/.cursor/mcp.json` | `.cursor/mcp.json` |
430
+ | Codex | `$CODEX_HOME/mcp.json` or `~/.codex/mcp.json` | Not supported |
431
+
432
+ The command writes the MCP server under `mcpServers["bright-data"]`:
433
+
434
+ ```json
435
+ {
436
+ "mcpServers": {
437
+ "bright-data": {
438
+ "command": "npx",
439
+ "args": ["@brightdata/mcp"],
440
+ "env": {
441
+ "API_TOKEN": "<stored-api-key>"
442
+ }
443
+ }
444
+ }
445
+ }
446
+ ```
447
+
448
+ Behavior notes:
449
+ - Existing config is preserved; only `mcpServers["bright-data"]` is added or replaced.
450
+ - If the target config contains invalid JSON, the CLI warns and offers to overwrite it in interactive mode.
451
+ - In non-interactive mode, pass both `--agent` and the appropriate scope flag to skip prompts.
452
+
453
+ ---
454
+
400
455
  ### `config`
401
456
 
402
457
  View and manage CLI configuration.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=add-mcp.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-mcp.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/commands/add-mcp.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const os_1 = __importDefault(require("os"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const vitest_1 = require("vitest");
10
+ const mocks = vitest_1.vi.hoisted(() => ({
11
+ checkbox: vitest_1.vi.fn(),
12
+ select: vitest_1.vi.fn(),
13
+ confirm: vitest_1.vi.fn(),
14
+ get_api_key: vitest_1.vi.fn(),
15
+ dim: vitest_1.vi.fn((msg) => msg),
16
+ green: vitest_1.vi.fn((msg) => msg),
17
+ red: vitest_1.vi.fn((msg) => msg),
18
+ warn: vitest_1.vi.fn(),
19
+ }));
20
+ vitest_1.vi.mock('@inquirer/prompts', () => ({
21
+ checkbox: mocks.checkbox,
22
+ select: mocks.select,
23
+ confirm: mocks.confirm,
24
+ }));
25
+ vitest_1.vi.mock('../../utils/credentials', () => ({
26
+ get_api_key: mocks.get_api_key,
27
+ }));
28
+ vitest_1.vi.mock('../../utils/output', () => ({
29
+ dim: mocks.dim,
30
+ green: mocks.green,
31
+ red: mocks.red,
32
+ warn: mocks.warn,
33
+ }));
34
+ const add_mcp_1 = require("../../commands/add-mcp");
35
+ const get_expected_entry = (api_key) => ({
36
+ command: 'npx',
37
+ args: ['@brightdata/mcp'],
38
+ env: {
39
+ API_TOKEN: api_key,
40
+ },
41
+ });
42
+ const mk_tmp_dir = () => fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'brightdata-add-mcp-'));
43
+ const read_json = (file_path) => JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'));
44
+ (0, vitest_1.describe)('commands/add-mcp', () => {
45
+ let tmp_dir = '';
46
+ let home_dir = '';
47
+ let project_dir = '';
48
+ let codex_home = '';
49
+ let original_cwd = '';
50
+ let stdin_tty;
51
+ let stdout_tty;
52
+ (0, vitest_1.beforeEach)(() => {
53
+ vitest_1.vi.clearAllMocks();
54
+ tmp_dir = mk_tmp_dir();
55
+ home_dir = path_1.default.join(tmp_dir, 'home');
56
+ project_dir = path_1.default.join(tmp_dir, 'project');
57
+ codex_home = path_1.default.join(tmp_dir, 'codex-home');
58
+ original_cwd = process.cwd();
59
+ stdin_tty = Object.getOwnPropertyDescriptor(process.stdin, 'isTTY');
60
+ stdout_tty = Object.getOwnPropertyDescriptor(process.stdout, 'isTTY');
61
+ fs_1.default.mkdirSync(home_dir, { recursive: true });
62
+ fs_1.default.mkdirSync(project_dir, { recursive: true });
63
+ process.chdir(project_dir);
64
+ process.env['CODEX_HOME'] = codex_home;
65
+ vitest_1.vi.spyOn(os_1.default, 'homedir').mockReturnValue(home_dir);
66
+ Object.defineProperty(process.stdin, 'isTTY', {
67
+ value: true,
68
+ configurable: true,
69
+ });
70
+ Object.defineProperty(process.stdout, 'isTTY', {
71
+ value: true,
72
+ configurable: true,
73
+ });
74
+ mocks.get_api_key.mockReturnValue('test_api_key');
75
+ mocks.checkbox.mockResolvedValue(['claude-code', 'cursor', 'codex']);
76
+ mocks.select.mockResolvedValue('project');
77
+ mocks.confirm.mockResolvedValue(true);
78
+ vitest_1.vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
79
+ });
80
+ (0, vitest_1.afterEach)(() => {
81
+ process.chdir(original_cwd);
82
+ if (stdin_tty)
83
+ Object.defineProperty(process.stdin, 'isTTY', stdin_tty);
84
+ if (stdout_tty)
85
+ Object.defineProperty(process.stdout, 'isTTY', stdout_tty);
86
+ delete process.env['CODEX_HOME'];
87
+ vitest_1.vi.restoreAllMocks();
88
+ if (tmp_dir)
89
+ fs_1.default.rmSync(tmp_dir, { recursive: true, force: true });
90
+ });
91
+ (0, vitest_1.it)('writes selected agent configs in the full interactive flow', async () => {
92
+ await (0, add_mcp_1.run_add_mcp)();
93
+ (0, vitest_1.expect)(mocks.checkbox).toHaveBeenCalledOnce();
94
+ (0, vitest_1.expect)(mocks.select).toHaveBeenCalledOnce();
95
+ (0, vitest_1.expect)(mocks.confirm).not.toHaveBeenCalled();
96
+ (0, vitest_1.expect)(read_json(path_1.default.join(project_dir, '.claude', 'settings.json')))
97
+ .toEqual({
98
+ mcpServers: {
99
+ 'bright-data': get_expected_entry('test_api_key'),
100
+ },
101
+ });
102
+ (0, vitest_1.expect)(read_json(path_1.default.join(project_dir, '.cursor', 'mcp.json')))
103
+ .toEqual({
104
+ mcpServers: {
105
+ 'bright-data': get_expected_entry('test_api_key'),
106
+ },
107
+ });
108
+ (0, vitest_1.expect)(read_json(path_1.default.join(codex_home, 'mcp.json')))
109
+ .toEqual({
110
+ mcpServers: {
111
+ 'bright-data': get_expected_entry('test_api_key'),
112
+ },
113
+ });
114
+ (0, vitest_1.expect)(fs_1.default.existsSync(path_1.default.join(home_dir, '.claude.json'))).toBe(false);
115
+ (0, vitest_1.expect)(fs_1.default.existsSync(path_1.default.join(home_dir, '.cursor', 'mcp.json')))
116
+ .toBe(false);
117
+ });
118
+ (0, vitest_1.it)('warns and overwrites invalid JSON after confirmation', async () => {
119
+ const cursor_config = path_1.default.join(project_dir, '.cursor', 'mcp.json');
120
+ fs_1.default.mkdirSync(path_1.default.dirname(cursor_config), { recursive: true });
121
+ fs_1.default.writeFileSync(cursor_config, '{invalid-json');
122
+ mocks.checkbox.mockResolvedValue(['cursor']);
123
+ mocks.select.mockResolvedValue('project');
124
+ mocks.confirm.mockResolvedValue(true);
125
+ await (0, add_mcp_1.run_add_mcp)();
126
+ (0, vitest_1.expect)(mocks.warn).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Invalid JSON in ' + cursor_config));
127
+ (0, vitest_1.expect)(mocks.confirm).toHaveBeenCalledWith({
128
+ message: 'Overwrite invalid config at ' + cursor_config + '?',
129
+ default: false,
130
+ });
131
+ (0, vitest_1.expect)(read_json(cursor_config)).toEqual({
132
+ mcpServers: {
133
+ 'bright-data': get_expected_entry('test_api_key'),
134
+ },
135
+ });
136
+ });
137
+ });
138
+ //# sourceMappingURL=add-mcp.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-mcp.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/add-mcp.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/mcp-config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const os_1 = __importDefault(require("os"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const vitest_1 = require("vitest");
10
+ const mcp_config_1 = require("../../utils/mcp-config");
11
+ const get_expected_entry = (api_key) => ({
12
+ command: 'npx',
13
+ args: ['@brightdata/mcp'],
14
+ env: {
15
+ API_TOKEN: api_key,
16
+ },
17
+ });
18
+ const mk_tmp_dir = () => fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'brightdata-mcp-config-'));
19
+ (0, vitest_1.describe)('utils/mcp-config', () => {
20
+ let tmp_dir = '';
21
+ (0, vitest_1.beforeEach)(() => {
22
+ tmp_dir = mk_tmp_dir();
23
+ });
24
+ (0, vitest_1.afterEach)(() => {
25
+ vitest_1.vi.restoreAllMocks();
26
+ delete process.env['CODEX_HOME'];
27
+ if (tmp_dir)
28
+ fs_1.default.rmSync(tmp_dir, { recursive: true, force: true });
29
+ });
30
+ (0, vitest_1.it)('creates a new config file when none exists', () => {
31
+ const file_path = path_1.default.join(tmp_dir, 'mcp.json');
32
+ (0, mcp_config_1.upsert_mcp_config)(file_path, 'new_key');
33
+ (0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'))).toEqual({
34
+ mcpServers: {
35
+ 'bright-data': get_expected_entry('new_key'),
36
+ },
37
+ });
38
+ (0, vitest_1.expect)(fs_1.default.statSync(file_path).mode & 0o777).toBe(0o600);
39
+ });
40
+ (0, vitest_1.it)('merges the Bright Data server into an existing config', () => {
41
+ const file_path = path_1.default.join(tmp_dir, 'mcp.json');
42
+ fs_1.default.writeFileSync(file_path, JSON.stringify({
43
+ theme: 'light',
44
+ mcpServers: {
45
+ existing: {
46
+ command: 'node',
47
+ },
48
+ },
49
+ }, null, 4));
50
+ (0, mcp_config_1.upsert_mcp_config)(file_path, 'merged_key');
51
+ (0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'))).toEqual({
52
+ theme: 'light',
53
+ mcpServers: {
54
+ existing: {
55
+ command: 'node',
56
+ },
57
+ 'bright-data': get_expected_entry('merged_key'),
58
+ },
59
+ });
60
+ });
61
+ (0, vitest_1.it)('overwrites an existing bright-data entry without removing other servers', () => {
62
+ const file_path = path_1.default.join(tmp_dir, 'mcp.json');
63
+ fs_1.default.writeFileSync(file_path, JSON.stringify({
64
+ mcpServers: {
65
+ 'bright-data': {
66
+ command: 'old-command',
67
+ args: ['old-package'],
68
+ env: {
69
+ API_TOKEN: 'old_key',
70
+ EXTRA: 'value',
71
+ },
72
+ },
73
+ existing: {
74
+ command: 'node',
75
+ },
76
+ },
77
+ }, null, 4));
78
+ (0, mcp_config_1.upsert_mcp_config)(file_path, 'fresh_key');
79
+ (0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'))).toEqual({
80
+ mcpServers: {
81
+ 'bright-data': get_expected_entry('fresh_key'),
82
+ existing: {
83
+ command: 'node',
84
+ },
85
+ },
86
+ });
87
+ });
88
+ (0, vitest_1.it)('throws on invalid JSON unless overwrite_invalid is set', () => {
89
+ const file_path = path_1.default.join(tmp_dir, 'mcp.json');
90
+ fs_1.default.writeFileSync(file_path, '{invalid-json');
91
+ (0, vitest_1.expect)(() => (0, mcp_config_1.upsert_mcp_config)(file_path, 'api_key'))
92
+ .toThrow(mcp_config_1.Invalid_mcp_config_error);
93
+ (0, mcp_config_1.upsert_mcp_config)(file_path, 'api_key', { overwrite_invalid: true });
94
+ (0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'))).toEqual({
95
+ mcpServers: {
96
+ 'bright-data': get_expected_entry('api_key'),
97
+ },
98
+ });
99
+ });
100
+ (0, vitest_1.it)('writes Claude Code global config to the home directory', () => {
101
+ const home_dir = path_1.default.join(tmp_dir, 'home');
102
+ const exists_sync = vitest_1.vi.spyOn(fs_1.default, 'existsSync').mockReturnValue(false);
103
+ const mkdir_sync = vitest_1.vi.spyOn(fs_1.default, 'mkdirSync')
104
+ .mockImplementation(() => undefined);
105
+ const write_file_sync = vitest_1.vi.spyOn(fs_1.default, 'writeFileSync')
106
+ .mockImplementation(() => undefined);
107
+ const chmod_sync = vitest_1.vi.spyOn(fs_1.default, 'chmodSync')
108
+ .mockImplementation(() => undefined);
109
+ vitest_1.vi.spyOn(os_1.default, 'homedir').mockReturnValue(home_dir);
110
+ (0, mcp_config_1.write_claude_code_mcp)('api_key', 'global');
111
+ (0, vitest_1.expect)(exists_sync).toHaveBeenCalled();
112
+ (0, vitest_1.expect)(mkdir_sync).toHaveBeenCalledWith(home_dir, { recursive: true });
113
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenCalledWith(path_1.default.join(home_dir, '.claude.json'), vitest_1.expect.any(String), { mode: 0o600 });
114
+ (0, vitest_1.expect)(chmod_sync).toHaveBeenCalledWith(path_1.default.join(home_dir, '.claude.json'), 0o600);
115
+ });
116
+ (0, vitest_1.it)('writes Claude Code project config under the current directory', () => {
117
+ const project_dir = path_1.default.join(tmp_dir, 'project');
118
+ const write_file_sync = vitest_1.vi.spyOn(fs_1.default, 'writeFileSync')
119
+ .mockImplementation(() => undefined);
120
+ vitest_1.vi.spyOn(fs_1.default, 'existsSync').mockReturnValue(false);
121
+ vitest_1.vi.spyOn(fs_1.default, 'mkdirSync').mockImplementation(() => undefined);
122
+ vitest_1.vi.spyOn(fs_1.default, 'chmodSync').mockImplementation(() => undefined);
123
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(project_dir);
124
+ (0, mcp_config_1.write_claude_code_mcp)('api_key', 'project');
125
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenCalledWith(path_1.default.join(project_dir, '.claude', 'settings.json'), vitest_1.expect.any(String), { mode: 0o600 });
126
+ });
127
+ (0, vitest_1.it)('writes Cursor config to the correct global and project paths', () => {
128
+ const home_dir = path_1.default.join(tmp_dir, 'home');
129
+ const project_dir = path_1.default.join(tmp_dir, 'project');
130
+ const write_file_sync = vitest_1.vi.spyOn(fs_1.default, 'writeFileSync')
131
+ .mockImplementation(() => undefined);
132
+ vitest_1.vi.spyOn(fs_1.default, 'existsSync').mockReturnValue(false);
133
+ vitest_1.vi.spyOn(fs_1.default, 'mkdirSync').mockImplementation(() => undefined);
134
+ vitest_1.vi.spyOn(fs_1.default, 'chmodSync').mockImplementation(() => undefined);
135
+ vitest_1.vi.spyOn(os_1.default, 'homedir').mockReturnValue(home_dir);
136
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(project_dir);
137
+ (0, mcp_config_1.write_cursor_mcp)('api_key', 'global');
138
+ (0, mcp_config_1.write_cursor_mcp)('api_key', 'project');
139
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenNthCalledWith(1, path_1.default.join(home_dir, '.cursor', 'mcp.json'), vitest_1.expect.any(String), { mode: 0o600 });
140
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenNthCalledWith(2, path_1.default.join(project_dir, '.cursor', 'mcp.json'), vitest_1.expect.any(String), { mode: 0o600 });
141
+ });
142
+ (0, vitest_1.it)('writes Codex config to CODEX_HOME when it is set', () => {
143
+ const codex_home = path_1.default.join(tmp_dir, 'codex-home');
144
+ const write_file_sync = vitest_1.vi.spyOn(fs_1.default, 'writeFileSync')
145
+ .mockImplementation(() => undefined);
146
+ vitest_1.vi.spyOn(fs_1.default, 'existsSync').mockReturnValue(false);
147
+ vitest_1.vi.spyOn(fs_1.default, 'mkdirSync').mockImplementation(() => undefined);
148
+ vitest_1.vi.spyOn(fs_1.default, 'chmodSync').mockImplementation(() => undefined);
149
+ process.env['CODEX_HOME'] = codex_home;
150
+ (0, mcp_config_1.write_codex_mcp)('api_key');
151
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenCalledWith(path_1.default.join(codex_home, 'mcp.json'), vitest_1.expect.any(String), { mode: 0o600 });
152
+ });
153
+ });
154
+ //# sourceMappingURL=mcp-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/mcp-config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Command } from 'commander';
2
+ import type { Mcp_scope, Mcp_write_opts } from '../utils/mcp-config';
3
+ type Mcp_agent = 'claude-code' | 'cursor' | 'codex';
4
+ type Add_mcp_opts = {
5
+ agent?: string;
6
+ global?: boolean;
7
+ project?: boolean;
8
+ };
9
+ type Mcp_writers = {
10
+ write_claude_code_mcp: (api_key: string, scope: Mcp_scope, opts?: Mcp_write_opts) => void | Promise<void>;
11
+ write_cursor_mcp: (api_key: string, scope: Mcp_scope, opts?: Mcp_write_opts) => void | Promise<void>;
12
+ write_codex_mcp: (api_key: string, opts?: Mcp_write_opts) => void | Promise<void>;
13
+ };
14
+ declare const run_add_mcp: (opts?: Add_mcp_opts, writers?: Mcp_writers) => Promise<void>;
15
+ declare const add_mcp_command: Command;
16
+ export { add_mcp_command, run_add_mcp };
17
+ export type { Add_mcp_opts, Mcp_agent, Mcp_writers };
18
+ //# sourceMappingURL=add-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-mcp.d.ts","sourceRoot":"","sources":["../../src/commands/add-mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AASlC,OAAO,KAAK,EAAC,SAAS,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAEnE,KAAK,SAAS,GAAG,aAAa,GAAC,QAAQ,GAAC,OAAO,CAAC;AAChD,KAAK,YAAY,GAAG;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,KAAK,WAAW,GAAG;IACf,qBAAqB,EAAE,CACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,cAAc,KACtB,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,gBAAgB,EAAE,CACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,cAAc,KACtB,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,KACpD,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B,CAAC;AAyOF,QAAA,MAAM,WAAW,GACb,OAAM,YAAiB,EACvB,UAAS,WAA6B,kBA0CzC,CAAC;AAEF,QAAA,MAAM,eAAe,SAQf,CAAC;AAEP,OAAO,EAAC,eAAe,EAAE,WAAW,EAAC,CAAC;AACtC,YAAY,EAAC,YAAY,EAAE,SAAS,EAAE,WAAW,EAAC,CAAC"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.run_add_mcp = exports.add_mcp_command = void 0;
4
+ const prompts_1 = require("@inquirer/prompts");
5
+ const commander_1 = require("commander");
6
+ const credentials_1 = require("../utils/credentials");
7
+ const output_1 = require("../utils/output");
8
+ const mcp_config_1 = require("../utils/mcp-config");
9
+ const backtick = String.fromCharCode(96);
10
+ const mcp_agent_labels = {
11
+ 'claude-code': 'Claude Code',
12
+ cursor: 'Cursor',
13
+ codex: 'Codex',
14
+ };
15
+ const mcp_agents = ['claude-code', 'cursor', 'codex'];
16
+ const default_writers = {
17
+ write_claude_code_mcp: mcp_config_1.write_claude_code_mcp,
18
+ write_cursor_mcp: mcp_config_1.write_cursor_mcp,
19
+ write_codex_mcp: mcp_config_1.write_codex_mcp,
20
+ };
21
+ const format_error = (error) => {
22
+ if (error instanceof Error)
23
+ return error.message;
24
+ return 'Unknown error';
25
+ };
26
+ const format_agent_list = () => mcp_agents.join(', ');
27
+ const is_tty = () => process.stdin.isTTY !== false && process.stdout.isTTY !== false;
28
+ const parse_selected_agents = (agent_flag) => {
29
+ const selected = Array.from(new Set(agent_flag.split(',')
30
+ .map(agent => agent.trim().toLowerCase())
31
+ .filter(Boolean)));
32
+ if (!selected.length) {
33
+ process.stderr.write('No agents provided. Use --agent '
34
+ + format_agent_list() + '\n');
35
+ process.exitCode = 1;
36
+ return null;
37
+ }
38
+ const invalid = selected.filter(agent => !mcp_agents.includes(agent));
39
+ if (invalid.length) {
40
+ process.stderr.write('Unknown agent ' + invalid[0] + '. Supported agents: '
41
+ + format_agent_list() + '\n');
42
+ process.exitCode = 1;
43
+ return null;
44
+ }
45
+ return selected;
46
+ };
47
+ const resolve_selected_agents = async (opts) => {
48
+ if (opts.agent)
49
+ return parse_selected_agents(opts.agent);
50
+ if (!is_tty()) {
51
+ process.stderr.write('Non-interactive MCP installation requires --agent <agents>.\n');
52
+ process.exitCode = 1;
53
+ return null;
54
+ }
55
+ return await (0, prompts_1.checkbox)({
56
+ message: 'Which coding agents should Bright Data MCP be added to?',
57
+ choices: mcp_agents.map(agent => ({
58
+ name: mcp_agent_labels[agent],
59
+ value: agent,
60
+ })),
61
+ validate: value => {
62
+ if (value.length)
63
+ return true;
64
+ return 'Select at least one coding agent';
65
+ },
66
+ });
67
+ };
68
+ const resolve_scope_from_flags = (selected_agents, opts) => {
69
+ if (opts.global && opts.project) {
70
+ process.stderr.write('Choose either --global or --project, not both.\n');
71
+ process.exitCode = 1;
72
+ return 'error';
73
+ }
74
+ if (selected_agents.every(agent => agent == 'codex')) {
75
+ if (opts.project) {
76
+ process.stderr.write('Codex only supports global MCP installation.\n');
77
+ process.exitCode = 1;
78
+ return 'error';
79
+ }
80
+ return 'global';
81
+ }
82
+ if (opts.global)
83
+ return 'global';
84
+ if (opts.project)
85
+ return 'project';
86
+ return 'prompt';
87
+ };
88
+ const resolve_scope = async (selected_agents, opts) => {
89
+ const scope_from_flags = resolve_scope_from_flags(selected_agents, opts);
90
+ if (scope_from_flags == 'global' || scope_from_flags == 'project')
91
+ return scope_from_flags;
92
+ if (scope_from_flags == 'error')
93
+ return null;
94
+ if (!is_tty()) {
95
+ process.stderr.write('Non-interactive MCP installation requires --global or --project '
96
+ + 'when targeting Claude Code or Cursor.\n');
97
+ process.exitCode = 1;
98
+ return null;
99
+ }
100
+ return await (0, prompts_1.select)({
101
+ message: 'Install globally or for this project?',
102
+ choices: [
103
+ {
104
+ name: 'Global',
105
+ value: 'global',
106
+ },
107
+ {
108
+ name: 'Project',
109
+ value: 'project',
110
+ },
111
+ ],
112
+ default: 'global',
113
+ });
114
+ };
115
+ const write_agent_mcp = async (agent, api_key, scope, writers, opts = {}) => {
116
+ if (agent == 'claude-code')
117
+ return writers.write_claude_code_mcp(api_key, scope, opts);
118
+ if (agent == 'cursor')
119
+ return writers.write_cursor_mcp(api_key, scope, opts);
120
+ return writers.write_codex_mcp(api_key, opts);
121
+ };
122
+ const write_agent_with_recovery = async (agent, api_key, scope, writers) => {
123
+ try {
124
+ await write_agent_mcp(agent, api_key, scope, writers);
125
+ return;
126
+ }
127
+ catch (error) {
128
+ if (!(error instanceof mcp_config_1.Invalid_mcp_config_error))
129
+ throw error;
130
+ (0, output_1.warn)(error.message);
131
+ if (!is_tty()) {
132
+ throw new Error('Fix the invalid JSON manually or rerun with a TTY to '
133
+ + 'overwrite it.');
134
+ }
135
+ const overwrite = await (0, prompts_1.confirm)({
136
+ message: 'Overwrite invalid config at ' + error.file_path + '?',
137
+ default: false,
138
+ });
139
+ if (!overwrite) {
140
+ throw new Error('Aborted because ' + error.file_path + ' contains invalid JSON');
141
+ }
142
+ await write_agent_mcp(agent, api_key, scope, writers, { overwrite_invalid: true });
143
+ }
144
+ };
145
+ const print_summary = (selected_agents, success_count, failures) => {
146
+ process.stderr.write('\n');
147
+ process.stderr.write((0, output_1.dim)('Summary: ' + selected_agents.length + ' target'
148
+ + (selected_agents.length == 1 ? '' : 's') + ', ' + success_count
149
+ + ' succeeded, ' + failures.length + ' failed.\n'));
150
+ for (const failure of failures) {
151
+ process.stderr.write((0, output_1.red)('✗ ' + mcp_agent_labels[failure.agent] + ': ' + failure.reason + '\n'));
152
+ }
153
+ };
154
+ const run_add_mcp = async (opts = {}, writers = default_writers) => {
155
+ const api_key = (0, credentials_1.get_api_key)();
156
+ if (api_key == null) {
157
+ process.stderr.write('Not logged in. Run ' + backtick
158
+ + 'brightdata login' + backtick + ' first.\n');
159
+ process.exitCode = 1;
160
+ return;
161
+ }
162
+ const selected_agents = await resolve_selected_agents(opts);
163
+ if (selected_agents == null)
164
+ return;
165
+ const scope = await resolve_scope(selected_agents, opts);
166
+ if (scope == null)
167
+ return;
168
+ const failures = [];
169
+ let success_count = 0;
170
+ for (const agent of selected_agents) {
171
+ try {
172
+ await write_agent_with_recovery(agent, api_key, scope, writers);
173
+ success_count++;
174
+ process.stderr.write((0, output_1.green)('✓ Added Bright Data MCP to '
175
+ + mcp_agent_labels[agent] + '\n'));
176
+ }
177
+ catch (error) {
178
+ const reason = format_error(error);
179
+ failures.push({ agent, reason });
180
+ process.stderr.write((0, output_1.red)('✗ Failed ' + mcp_agent_labels[agent] + ': ' + reason + '\n'));
181
+ process.exitCode = 1;
182
+ }
183
+ }
184
+ print_summary(selected_agents, success_count, failures);
185
+ };
186
+ exports.run_add_mcp = run_add_mcp;
187
+ const add_mcp_command = new commander_1.Command('mcp')
188
+ .description('Add Bright Data MCP to Claude Code, Cursor, or Codex')
189
+ .option('--agent <agents>', 'Comma-separated: claude-code,cursor,codex')
190
+ .option('--global', 'Install to global config')
191
+ .option('--project', 'Install to project config')
192
+ .action(async (opts) => {
193
+ await run_add_mcp(opts);
194
+ });
195
+ exports.add_mcp_command = add_mcp_command;
196
+ //# sourceMappingURL=add-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-mcp.js","sourceRoot":"","sources":["../../src/commands/add-mcp.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -17,8 +17,12 @@ const init_1 = require("./commands/init");
17
17
  const version_1 = require("./commands/version");
18
18
  const skill_1 = require("./commands/skill");
19
19
  const budget_1 = require("./commands/budget");
20
+ const add_mcp_1 = require("./commands/add-mcp");
20
21
  const package_json_1 = __importDefault(require("../package.json"));
21
22
  const program = new commander_1.Command();
23
+ const add_command = new commander_1.Command('add')
24
+ .description('Add Bright Data integrations to supported coding agents')
25
+ .addCommand(add_mcp_1.add_mcp_command);
22
26
  program
23
27
  .name('brightdata')
24
28
  .description('Command-line interface for Bright Data. Scrape, search, '
@@ -38,5 +42,6 @@ program.addCommand(init_1.init_command);
38
42
  program.addCommand(version_1.version_command);
39
43
  program.addCommand(skill_1.skill_command);
40
44
  program.addCommand(budget_1.budget_command);
45
+ program.addCommand(add_command);
41
46
  program.parse(process.argv);
42
47
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AACA,yCAAkC;AAClC,4CAA+C;AAC/C,8CAAiD;AACjD,8CAAiD;AACjD,8CAAiD;AACjD,gDAAqD;AACrD,8CAAiD;AACjD,4CAA+C;AAC/C,8CAAiD;AACjD,0CAA6C;AAC7C,gDAAmD;AACnD,4CAA+C;AAC/C,8CAAiD;AACjD,mEAA0C;AAE1C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CACR,0DAA0D;MACzD,oEAAoE,CACxE;KACA,OAAO,CAAC,sBAAW,CAAC,OAAO,EAAE,eAAe,CAAC;KAC7C,MAAM,CAAC,qBAAqB,EAAE,4CAA4C,CAAC;KAC3E,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;AAE/C,OAAO,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,2BAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,mBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,yBAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AAGnC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AACA,yCAAkC;AAClC,4CAA+C;AAC/C,8CAAiD;AACjD,8CAAiD;AACjD,8CAAiD;AACjD,gDAAqD;AACrD,8CAAiD;AACjD,4CAA+C;AAC/C,8CAAiD;AACjD,0CAA6C;AAC7C,gDAAmD;AACnD,4CAA+C;AAC/C,8CAAiD;AACjD,gDAAmD;AACnD,mEAA0C;AAE1C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAC9B,MAAM,WAAW,GAAG,IAAI,mBAAO,CAAC,KAAK,CAAC;KACjC,WAAW,CAAC,yDAAyD,CAAC;KACtE,UAAU,CAAC,yBAAe,CAAC,CAAC;AAEjC,OAAO;KACF,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CACR,0DAA0D;MACzD,oEAAoE,CACxE;KACA,OAAO,CAAC,sBAAW,CAAC,OAAO,EAAE,eAAe,CAAC;KAC7C,MAAM,CAAC,qBAAqB,EAAE,4CAA4C,CAAC;KAC3E,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;AAE/C,OAAO,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,2BAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,mBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,yBAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAEhC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ type Mcp_scope = 'global' | 'project';
2
+ type Mcp_write_opts = {
3
+ overwrite_invalid?: boolean;
4
+ };
5
+ declare class Invalid_mcp_config_error extends Error {
6
+ file_path: string;
7
+ constructor(file_path: string, reason: string);
8
+ }
9
+ declare const upsert_mcp_config: (file_path: string, api_key: string, opts?: Mcp_write_opts) => void;
10
+ declare const write_claude_code_mcp: (api_key: string, scope: Mcp_scope, opts?: Mcp_write_opts) => void;
11
+ declare const write_cursor_mcp: (api_key: string, scope: Mcp_scope, opts?: Mcp_write_opts) => void;
12
+ declare const write_codex_mcp: (api_key: string, opts?: Mcp_write_opts) => void;
13
+ export { Invalid_mcp_config_error, upsert_mcp_config, write_claude_code_mcp, write_cursor_mcp, write_codex_mcp, };
14
+ export type { Mcp_scope, Mcp_write_opts };
15
+ //# sourceMappingURL=mcp-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../src/utils/mcp-config.ts"],"names":[],"mappings":"AAIA,KAAK,SAAS,GAAG,QAAQ,GAAC,SAAS,CAAC;AACpC,KAAK,cAAc,GAAG;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAGF,cAAM,wBAAyB,SAAQ,KAAK;IACxC,SAAS,EAAE,MAAM,CAAC;gBAEN,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAMhD;AAqCD,QAAA,MAAM,iBAAiB,GACnB,WAAW,MAAM,EACjB,SAAS,MAAM,EACf,OAAM,cAAmB,SAsB5B,CAAC;AAEF,QAAA,MAAM,qBAAqB,GACvB,SAAS,MAAM,EACf,OAAO,SAAS,EAChB,OAAM,cAAmB,SAM5B,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAClB,SAAS,MAAM,EACf,OAAO,SAAS,EAChB,OAAM,cAAmB,SAM5B,CAAC;AAEF,QAAA,MAAM,eAAe,GACjB,SAAS,MAAM,EACf,OAAM,cAAmB,SAK5B,CAAC;AAEF,OAAO,EACH,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,GAClB,CAAC;AACF,YAAY,EAAC,SAAS,EAAE,cAAc,EAAC,CAAC"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.write_codex_mcp = exports.write_cursor_mcp = exports.write_claude_code_mcp = exports.upsert_mcp_config = exports.Invalid_mcp_config_error = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const os_1 = __importDefault(require("os"));
9
+ const path_1 = __importDefault(require("path"));
10
+ class Invalid_mcp_config_error extends Error {
11
+ file_path;
12
+ constructor(file_path, reason) {
13
+ super('Invalid JSON in ' + file_path + ': ' + reason);
14
+ this.name = 'Invalid_mcp_config_error';
15
+ this.file_path = file_path;
16
+ }
17
+ }
18
+ exports.Invalid_mcp_config_error = Invalid_mcp_config_error;
19
+ const is_plain_object = (value) => typeof value == 'object' && value !== null && !Array.isArray(value);
20
+ const get_bright_data_mcp = (api_key) => ({
21
+ command: 'npx',
22
+ args: ['@brightdata/mcp'],
23
+ env: {
24
+ API_TOKEN: api_key,
25
+ },
26
+ });
27
+ const load_json_object = (file_path, opts = {}) => {
28
+ if (!fs_1.default.existsSync(file_path))
29
+ return {};
30
+ const raw = fs_1.default.readFileSync(file_path, 'utf8').trim();
31
+ if (!raw)
32
+ return {};
33
+ try {
34
+ const parsed = JSON.parse(raw);
35
+ if (!is_plain_object(parsed))
36
+ throw new Error('Expected top-level JSON object');
37
+ return parsed;
38
+ }
39
+ catch (error) {
40
+ if (opts.overwrite_invalid)
41
+ return {};
42
+ const reason = error instanceof Error ? error.message : 'Unknown error';
43
+ throw new Invalid_mcp_config_error(file_path, reason);
44
+ }
45
+ };
46
+ const upsert_mcp_config = (file_path, api_key, opts = {}) => {
47
+ const current = load_json_object(file_path, opts);
48
+ const mcp_servers = is_plain_object(current['mcpServers'])
49
+ ? current['mcpServers']
50
+ : {};
51
+ const next = {
52
+ ...current,
53
+ mcpServers: {
54
+ ...mcp_servers,
55
+ 'bright-data': get_bright_data_mcp(api_key),
56
+ },
57
+ };
58
+ const dir = path_1.default.dirname(file_path);
59
+ if (!fs_1.default.existsSync(dir))
60
+ fs_1.default.mkdirSync(dir, { recursive: true });
61
+ fs_1.default.writeFileSync(file_path, JSON.stringify(next, null, 4) + '\n', {
62
+ mode: 0o600,
63
+ });
64
+ fs_1.default.chmodSync(file_path, 0o600);
65
+ };
66
+ exports.upsert_mcp_config = upsert_mcp_config;
67
+ const write_claude_code_mcp = (api_key, scope, opts = {}) => {
68
+ const file_path = scope == 'project'
69
+ ? path_1.default.join(process.cwd(), '.claude', 'settings.json')
70
+ : path_1.default.join(os_1.default.homedir(), '.claude.json');
71
+ upsert_mcp_config(file_path, api_key, opts);
72
+ };
73
+ exports.write_claude_code_mcp = write_claude_code_mcp;
74
+ const write_cursor_mcp = (api_key, scope, opts = {}) => {
75
+ const file_path = scope == 'project'
76
+ ? path_1.default.join(process.cwd(), '.cursor', 'mcp.json')
77
+ : path_1.default.join(os_1.default.homedir(), '.cursor', 'mcp.json');
78
+ upsert_mcp_config(file_path, api_key, opts);
79
+ };
80
+ exports.write_cursor_mcp = write_cursor_mcp;
81
+ const write_codex_mcp = (api_key, opts = {}) => {
82
+ const codex_home = process.env['CODEX_HOME']?.trim()
83
+ || path_1.default.join(os_1.default.homedir(), '.codex');
84
+ upsert_mcp_config(path_1.default.join(codex_home, 'mcp.json'), api_key, opts);
85
+ };
86
+ exports.write_codex_mcp = write_codex_mcp;
87
+ //# sourceMappingURL=mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/utils/mcp-config.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightdata/cli",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Command-line interface for Bright Data. Scrape, search, extract structured data, and automate browsers directly from your terminal.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {