@kiro-paradigm/browser 0.1.0 → 0.2.0

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.
@@ -44,10 +44,20 @@ export declare class CdpClient {
44
44
  * List open tabs on the given CDP port.
45
45
  */
46
46
  listTabs(port: number): Promise<CdpTab[]>;
47
+ /**
48
+ * Get the browser-level websocket URL for sending browser-scoped CDP commands
49
+ * (e.g. Target.createTarget, Target.closeTarget).
50
+ */
51
+ getBrowserWsUrl(port: number): Promise<string>;
47
52
  /**
48
53
  * Get the websocket URL for a tab by index.
49
54
  */
50
55
  getTabWsUrl(port: number, tabIndex: number): Promise<string>;
56
+ /**
57
+ * Find the Kiro Tab Groups extension service worker and return its websocket URL.
58
+ * The extension is identified by its title containing "Kiro Tab Groups".
59
+ */
60
+ getExtensionWsUrl(port: number): Promise<string>;
51
61
  /**
52
62
  * Send a CDP command and return the response.
53
63
  */
@@ -95,6 +95,18 @@ export class CdpClient {
95
95
  const body = await this.httpGet(`http://localhost:${port}/json/list`);
96
96
  return JSON.parse(body);
97
97
  }
98
+ /**
99
+ * Get the browser-level websocket URL for sending browser-scoped CDP commands
100
+ * (e.g. Target.createTarget, Target.closeTarget).
101
+ */
102
+ async getBrowserWsUrl(port) {
103
+ const body = await this.httpGet(`http://localhost:${port}/json/version`);
104
+ const version = JSON.parse(body);
105
+ if (!version.webSocketDebuggerUrl) {
106
+ throw new Error('Browser websocket URL not available');
107
+ }
108
+ return version.webSocketDebuggerUrl;
109
+ }
98
110
  /**
99
111
  * Get the websocket URL for a tab by index.
100
112
  */
@@ -109,6 +121,20 @@ export class CdpClient {
109
121
  }
110
122
  return wsUrl;
111
123
  }
124
+ /**
125
+ * Find the Kiro Tab Groups extension service worker and return its websocket URL.
126
+ * The extension is identified by its title containing "Kiro Tab Groups".
127
+ */
128
+ async getExtensionWsUrl(port) {
129
+ const body = await this.httpGet(`http://localhost:${port}/json/list`);
130
+ const targets = JSON.parse(body);
131
+ const sw = targets.find(t => t.type === 'service_worker' && t.title?.includes('Kiro Tab Groups'));
132
+ if (!sw?.webSocketDebuggerUrl) {
133
+ throw new Error('Kiro Tab Groups extension not found. Install the extension from browser-kirospace/extension/ ' +
134
+ '(chrome://extensions → Load unpacked).');
135
+ }
136
+ return sw.webSocketDebuggerUrl;
137
+ }
112
138
  /**
113
139
  * Send a CDP command and return the response.
114
140
  */
@@ -1 +1 @@
1
- {"version":3,"file":"cdp-client.js","sourceRoot":"","sources":["../src/cdp-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cdp-client.js","sourceRoot":"","sources":["../src/cdp-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Chrome Launcher — finds and spawns a Chrome instance with --remote-debugging-port.
3
+ *
4
+ * The server owns the Chrome lifecycle: launch on first tool call, kill on shutdown.
5
+ */
6
+ interface LaunchOptions {
7
+ port?: number;
8
+ userDataDir?: string;
9
+ extensionPath?: string;
10
+ headless?: boolean;
11
+ }
12
+ export declare class ChromeLauncher {
13
+ private process;
14
+ private _port;
15
+ private readonly userDataDir;
16
+ private readonly extensionPath;
17
+ private readonly headless;
18
+ private launchPromise;
19
+ constructor(options?: LaunchOptions);
20
+ get port(): number;
21
+ get isRunning(): boolean;
22
+ /**
23
+ * Ensure Chrome is running. If already launched, returns immediately.
24
+ * If not, launches Chrome and waits for the CDP port to become available.
25
+ * Guarded by a launch promise to prevent concurrent tool calls from spawning
26
+ * duplicate Chrome processes.
27
+ */
28
+ ensureRunning(): Promise<number>;
29
+ private launch;
30
+ private waitForPort;
31
+ private isPortReady;
32
+ /**
33
+ * Kill the Chrome process if we launched it.
34
+ */
35
+ shutdown(): void;
36
+ }
37
+ export {};
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Chrome Launcher — finds and spawns a Chrome instance with --remote-debugging-port.
3
+ *
4
+ * The server owns the Chrome lifecycle: launch on first tool call, kill on shutdown.
5
+ */
6
+ import { spawn } from 'node:child_process';
7
+ import { existsSync } from 'node:fs';
8
+ import { resolve } from 'node:path';
9
+ import http from 'node:http';
10
+ const DEFAULT_PORT = 9223; // Avoid 9222 (commonly used by manual launches)
11
+ const DEFAULT_USER_DATA_DIR = '.chrome-cdp-data';
12
+ export class ChromeLauncher {
13
+ process = null;
14
+ _port;
15
+ userDataDir;
16
+ extensionPath;
17
+ headless;
18
+ launchPromise = null;
19
+ constructor(options = {}) {
20
+ this._port = options.port ?? DEFAULT_PORT;
21
+ this.userDataDir = resolve(options.userDataDir ?? DEFAULT_USER_DATA_DIR);
22
+ this.extensionPath = options.extensionPath;
23
+ this.headless = options.headless ?? false;
24
+ }
25
+ get port() {
26
+ return this._port;
27
+ }
28
+ get isRunning() {
29
+ return this.process !== null && this.process.exitCode === null;
30
+ }
31
+ /**
32
+ * Ensure Chrome is running. If already launched, returns immediately.
33
+ * If not, launches Chrome and waits for the CDP port to become available.
34
+ * Guarded by a launch promise to prevent concurrent tool calls from spawning
35
+ * duplicate Chrome processes.
36
+ */
37
+ async ensureRunning() {
38
+ if (this.isRunning) {
39
+ return this._port;
40
+ }
41
+ // Check if something is already listening on the port (e.g. user-launched Chrome)
42
+ if (await this.isPortReady()) {
43
+ return this._port;
44
+ }
45
+ // Mutex: if a launch is already in progress, wait for it
46
+ if (!this.launchPromise) {
47
+ this.launchPromise = this.launch().finally(() => { this.launchPromise = null; });
48
+ }
49
+ await this.launchPromise;
50
+ return this._port;
51
+ }
52
+ async launch() {
53
+ const chromePath = findChrome();
54
+ const args = [
55
+ `--remote-debugging-port=${this._port}`,
56
+ `--user-data-dir=${this.userDataDir}`,
57
+ '--no-first-run',
58
+ '--no-default-browser-check',
59
+ ];
60
+ if (this.extensionPath && existsSync(this.extensionPath)) {
61
+ args.push(`--load-extension=${resolve(this.extensionPath)}`);
62
+ }
63
+ if (this.headless) {
64
+ args.push('--headless=new');
65
+ }
66
+ this.process = spawn(chromePath, args, {
67
+ detached: false,
68
+ stdio: 'ignore',
69
+ });
70
+ this.process.on('error', (err) => {
71
+ console.error(`[chrome-cdp] Chrome process error: ${err.message}`);
72
+ this.process = null;
73
+ });
74
+ this.process.on('exit', (code) => {
75
+ console.error(`[chrome-cdp] Chrome exited with code ${code}`);
76
+ this.process = null;
77
+ });
78
+ // Wait for CDP port to become available
79
+ await this.waitForPort(15000);
80
+ }
81
+ async waitForPort(timeoutMs) {
82
+ const start = Date.now();
83
+ while (Date.now() - start < timeoutMs) {
84
+ if (await this.isPortReady())
85
+ return;
86
+ await sleep(200);
87
+ }
88
+ throw new Error(`Chrome did not start within ${timeoutMs}ms (port ${this._port})`);
89
+ }
90
+ isPortReady() {
91
+ return new Promise((resolve) => {
92
+ http.get(`http://localhost:${this._port}/json/version`, { timeout: 1000 }, (res) => {
93
+ let body = '';
94
+ res.on('data', (chunk) => { body += chunk.toString(); });
95
+ res.on('end', () => resolve(body.length > 0));
96
+ res.on('error', () => resolve(false));
97
+ }).on('error', () => resolve(false));
98
+ });
99
+ }
100
+ /**
101
+ * Kill the Chrome process if we launched it.
102
+ */
103
+ shutdown() {
104
+ if (this.process && this.process.exitCode === null) {
105
+ this.process.kill('SIGTERM');
106
+ this.process = null;
107
+ }
108
+ }
109
+ }
110
+ /**
111
+ * Find the Chrome executable on the current platform.
112
+ */
113
+ function findChrome() {
114
+ // Check CHROME_PATH env var first (same pattern as Puppeteer/Lighthouse)
115
+ if (process.env['CHROME_PATH'] && existsSync(process.env['CHROME_PATH'])) {
116
+ return process.env['CHROME_PATH'];
117
+ }
118
+ const candidates = [];
119
+ if (process.platform === 'darwin') {
120
+ candidates.push('/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary', '/Applications/Chromium.app/Contents/MacOS/Chromium');
121
+ }
122
+ else if (process.platform === 'linux') {
123
+ candidates.push('/usr/bin/google-chrome', '/usr/bin/google-chrome-stable', '/usr/bin/chromium-browser', '/usr/bin/chromium');
124
+ }
125
+ else if (process.platform === 'win32') {
126
+ const programFiles = process.env['PROGRAMFILES'] || 'C:\\Program Files';
127
+ const programFilesX86 = process.env['PROGRAMFILES(X86)'] || 'C:\\Program Files (x86)';
128
+ candidates.push(`${programFiles}\\Google\\Chrome\\Application\\chrome.exe`, `${programFilesX86}\\Google\\Chrome\\Application\\chrome.exe`);
129
+ }
130
+ for (const candidate of candidates) {
131
+ if (existsSync(candidate))
132
+ return candidate;
133
+ }
134
+ throw new Error(`Chrome not found. Searched: ${candidates.join(', ')}. ` +
135
+ 'Set CHROME_PATH environment variable to the Chrome executable path.');
136
+ }
137
+ function sleep(ms) {
138
+ return new Promise((resolve) => setTimeout(resolve, ms));
139
+ }
140
+ //# sourceMappingURL=chrome-launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome-launcher.js","sourceRoot":"","sources":["../src/chrome-launcher.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * CDP Browser MCP Server — connects to an already-running Chrome instance
4
- * via Chrome DevTools Protocol when Playwright MCP cannot launch.
3
+ * CDP Browser MCP Server — launches its own Chrome instance with
4
+ * --remote-debugging-port for self-contained CDP access.
5
5
  *
6
- * Auto-discovers the CDP port from running Chrome processes.
6
+ * No dependency on Playwright MCP or chrome-devtools-mcp for port discovery.
7
7
  */
8
8
  export {};
package/dist/index.js CHANGED
@@ -1,30 +1,46 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * CDP Browser MCP Server — connects to an already-running Chrome instance
4
- * via Chrome DevTools Protocol when Playwright MCP cannot launch.
3
+ * CDP Browser MCP Server — launches its own Chrome instance with
4
+ * --remote-debugging-port for self-contained CDP access.
5
5
  *
6
- * Auto-discovers the CDP port from running Chrome processes.
6
+ * No dependency on Playwright MCP or chrome-devtools-mcp for port discovery.
7
7
  */
8
8
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
9
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
10
10
  import { z } from 'zod';
11
11
  import { CdpClient } from './cdp-client.js';
12
+ import { ChromeLauncher } from './chrome-launcher.js';
13
+ import { resolve, dirname } from 'node:path';
14
+ import { fileURLToPath } from 'node:url';
15
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
16
  const server = new McpServer({
13
- name: 'alternative',
14
- version: '0.1.0',
17
+ name: 'chrome-cdp',
18
+ version: '0.2.0',
19
+ });
20
+ // Extension path: relative to the package root (one level up from dist/)
21
+ const extensionPath = resolve(__dirname, '..', 'extension');
22
+ const launcher = new ChromeLauncher({
23
+ extensionPath,
15
24
  });
16
- // Workspace-specific port discovery relies on process.cwd() being the workspace
17
- // folder at startup. Kiro sets cwd to the workspace folder when launching MCP
18
- // servers, so the default (no explicit cwd) is correct for production use.
19
25
  const cdp = new CdpClient();
26
+ /**
27
+ * Resolve the CDP port: use explicit port if provided, otherwise ensure
28
+ * our own Chrome is running and return its port.
29
+ */
30
+ async function resolvePort(port) {
31
+ if (port !== undefined)
32
+ return port;
33
+ return launcher.ensureRunning();
34
+ }
20
35
  // --- Tool: cdp_list_tabs ---
21
- server.tool('cdp_list_tabs', 'List open browser tabs. Auto-discovers the CDP port from running Chrome processes.', { port: z.number().optional().describe('CDP port (auto-detected if omitted)') }, async ({ port }) => {
22
- const resolvedPort = port ?? await cdp.discoverPort();
36
+ server.tool('cdp_list_tabs', 'List open browser tabs. Launches Chrome automatically if not running.', { port: z.number().optional().describe('CDP port (auto-detected if omitted)') }, async ({ port }) => {
37
+ const resolvedPort = await resolvePort(port);
23
38
  const tabs = await cdp.listTabs(resolvedPort);
24
39
  const pages = tabs
25
40
  .filter((t) => t.type === 'page')
26
41
  .map((t, i) => `${i}: ${t.title ?? '(no title)'}\n ${t.url ?? ''}`);
27
- return { content: [{ type: 'text', text: pages.join('\n\n') || '(no page tabs open)' }] };
42
+ const header = `[chrome-cdp v0.2.0 | ${tabs.length} raw, ${pages.length} pages]`;
43
+ return { content: [{ type: 'text', text: `${header}\n\n${pages.join('\n\n') || '(no page tabs open)'}` }] };
28
44
  });
29
45
  // --- Tool: cdp_navigate ---
30
46
  server.tool('cdp_navigate', 'Navigate a browser tab to a URL.', {
@@ -33,7 +49,7 @@ server.tool('cdp_navigate', 'Navigate a browser tab to a URL.', {
33
49
  wait: z.number().optional().default(3).describe('Seconds to wait after navigation (default: 3)'),
34
50
  port: z.number().optional().describe('CDP port (auto-detected if omitted)'),
35
51
  }, async ({ tab, url, wait, port }) => {
36
- const resolvedPort = port ?? await cdp.discoverPort();
52
+ const resolvedPort = await resolvePort(port);
37
53
  const wsUrl = await cdp.getTabWsUrl(resolvedPort, tab);
38
54
  const result = await cdp.send(wsUrl, 'Page.navigate', { url });
39
55
  if (result.error) {
@@ -49,7 +65,7 @@ server.tool('cdp_screenshot', 'Take a screenshot of a browser tab. Returns the i
49
65
  wait: z.number().optional().default(0).describe('Seconds to wait before screenshot (default: 0)'),
50
66
  port: z.number().optional().describe('CDP port (auto-detected if omitted)'),
51
67
  }, async ({ tab, wait, port }) => {
52
- const resolvedPort = port ?? await cdp.discoverPort();
68
+ const resolvedPort = await resolvePort(port);
53
69
  const wsUrl = await cdp.getTabWsUrl(resolvedPort, tab);
54
70
  if (wait > 0)
55
71
  await sleep(wait * 1000);
@@ -75,7 +91,7 @@ server.tool('cdp_evaluate', 'Evaluate a JavaScript expression in a browser tab a
75
91
  expression: z.string().describe('JavaScript expression to evaluate'),
76
92
  port: z.number().optional().describe('CDP port (auto-detected if omitted)'),
77
93
  }, async ({ tab, expression, port }) => {
78
- const resolvedPort = port ?? await cdp.discoverPort();
94
+ const resolvedPort = await resolvePort(port);
79
95
  const wsUrl = await cdp.getTabWsUrl(resolvedPort, tab);
80
96
  const result = await cdp.send(wsUrl, 'Runtime.evaluate', {
81
97
  expression,
@@ -104,20 +120,176 @@ server.tool('cdp_reload', 'Reload a browser tab.', {
104
120
  wait: z.number().optional().default(3).describe('Seconds to wait after reload (default: 3)'),
105
121
  port: z.number().optional().describe('CDP port (auto-detected if omitted)'),
106
122
  }, async ({ tab, wait, port }) => {
107
- const resolvedPort = port ?? await cdp.discoverPort();
123
+ const resolvedPort = await resolvePort(port);
108
124
  const wsUrl = await cdp.getTabWsUrl(resolvedPort, tab);
109
125
  await cdp.send(wsUrl, 'Page.reload', {});
110
126
  if (wait > 0)
111
127
  await sleep(wait * 1000);
112
128
  return { content: [{ type: 'text', text: 'Page reloaded' }] };
113
129
  });
130
+ // --- Tool: cdp_new_tab ---
131
+ server.tool('cdp_new_tab', 'Create a new browser tab. Returns the new tab index.', {
132
+ url: z.string().optional().default('about:blank').describe('URL to open in the new tab (default: about:blank)'),
133
+ port: z.number().optional().describe('CDP port (auto-detected if omitted)'),
134
+ }, async ({ url, port }) => {
135
+ const resolvedPort = await resolvePort(port);
136
+ const browserWsUrl = await cdp.getBrowserWsUrl(resolvedPort);
137
+ const result = await cdp.send(browserWsUrl, 'Target.createTarget', { url });
138
+ if (result.error) {
139
+ return { content: [{ type: 'text', text: `Error: ${JSON.stringify(result.error)}` }], isError: true };
140
+ }
141
+ const targetId = result.result?.targetId;
142
+ // Find the new tab's index
143
+ await sleep(500);
144
+ const tabs = await cdp.listTabs(resolvedPort);
145
+ const newIndex = tabs.findIndex(t => t.id === targetId);
146
+ return {
147
+ content: [{
148
+ type: 'text',
149
+ text: `Created new tab${newIndex >= 0 ? ` (index: ${newIndex})` : ''} → ${url}`,
150
+ }],
151
+ };
152
+ });
153
+ // --- Tool: cdp_close_tab ---
154
+ server.tool('cdp_close_tab', 'Close a browser tab by index (page-only index from cdp_list_tabs).', {
155
+ tab: z.number().describe('Tab index from cdp_list_tabs (page-only index)'),
156
+ port: z.number().optional().describe('CDP port (auto-detected if omitted)'),
157
+ }, async ({ tab, port }) => {
158
+ const resolvedPort = await resolvePort(port);
159
+ const tabs = await cdp.listTabs(resolvedPort);
160
+ const pages = tabs.filter((t) => t.type === 'page');
161
+ if (tab < 0 || tab >= pages.length) {
162
+ return { content: [{ type: 'text', text: `Tab index ${tab} out of range (0-${pages.length - 1})` }], isError: true };
163
+ }
164
+ const targetId = pages[tab].id;
165
+ const browserWsUrl = await cdp.getBrowserWsUrl(resolvedPort);
166
+ const result = await cdp.send(browserWsUrl, 'Target.closeTarget', { targetId });
167
+ if (result.error) {
168
+ return { content: [{ type: 'text', text: `Error: ${JSON.stringify(result.error)}` }], isError: true };
169
+ }
170
+ return { content: [{ type: 'text', text: `Closed tab ${tab}: ${pages[tab].title ?? pages[tab].url ?? '(unknown)'}` }] };
171
+ });
172
+ // --- Tool: cdp_group_tabs ---
173
+ server.tool('cdp_group_tabs', 'Group browser tabs into a named tab group. Requires the Kiro Tab Groups extension.', {
174
+ tabIds: z.array(z.number()).describe('Chrome tab IDs (from cdp_list_tabs_detailed) to group'),
175
+ groupId: z.number().optional().describe('Existing group ID to add tabs to. If omitted, creates a new group.'),
176
+ name: z.string().optional().describe('Name for the tab group (e.g. workspace name)'),
177
+ color: z.enum(['grey', 'blue', 'red', 'yellow', 'green', 'pink', 'purple', 'cyan', 'orange']).optional().describe('Tab group color'),
178
+ port: z.number().optional().describe('CDP port (auto-detected if omitted)'),
179
+ }, async ({ tabIds, groupId, name, color, port }) => {
180
+ const resolvedPort = await resolvePort(port);
181
+ const extWsUrl = await cdp.getExtensionWsUrl(resolvedPort);
182
+ // Group the tabs
183
+ // Safety: tabIds is validated as z.array(z.number()) — JSON.stringify on number[] cannot produce injection
184
+ const groupOpts = { tabIds };
185
+ if (groupId !== undefined)
186
+ groupOpts.groupId = groupId;
187
+ const groupResult = await cdp.send(extWsUrl, 'Runtime.evaluate', {
188
+ expression: `chrome.tabs.group(${JSON.stringify(groupOpts)})`,
189
+ awaitPromise: true,
190
+ returnByValue: true,
191
+ });
192
+ if (groupResult.error) {
193
+ return { content: [{ type: 'text', text: `Error grouping tabs: ${JSON.stringify(groupResult.error)}` }], isError: true };
194
+ }
195
+ const resultObj = groupResult.result?.result;
196
+ const newGroupId = resultObj?.value;
197
+ if (newGroupId === undefined) {
198
+ return { content: [{ type: 'text', text: 'Error: no group ID returned' }], isError: true };
199
+ }
200
+ // Update group properties if name or color provided
201
+ if (name || color) {
202
+ const updateProps = {};
203
+ if (name)
204
+ updateProps.title = name;
205
+ if (color)
206
+ updateProps.color = color;
207
+ const updateResult = await cdp.send(extWsUrl, 'Runtime.evaluate', {
208
+ expression: `chrome.tabGroups.update(${newGroupId}, ${JSON.stringify(updateProps)})`,
209
+ awaitPromise: true,
210
+ returnByValue: true,
211
+ });
212
+ if (updateResult.error) {
213
+ return { content: [{ type: 'text', text: `Grouped ${tabIds.length} tab(s) into group ${newGroupId}, but failed to update properties: ${JSON.stringify(updateResult.error)}` }] };
214
+ }
215
+ const updateEval = updateResult.result?.result;
216
+ if (updateEval?.subtype === 'error') {
217
+ return { content: [{ type: 'text', text: `Grouped ${tabIds.length} tab(s) into group ${newGroupId}, but update failed: ${updateEval.description ?? 'unknown error'}` }] };
218
+ }
219
+ }
220
+ return { content: [{ type: 'text', text: `Grouped ${tabIds.length} tab(s) into group ${newGroupId}${name ? ` "${name}"` : ''}` }] };
221
+ });
222
+ // --- Tool: cdp_list_tab_groups ---
223
+ server.tool('cdp_list_tab_groups', 'List all tab groups in the browser. Requires the Kiro Tab Groups extension.', {
224
+ port: z.number().optional().describe('CDP port (auto-detected if omitted)'),
225
+ }, async ({ port }) => {
226
+ const resolvedPort = await resolvePort(port);
227
+ const extWsUrl = await cdp.getExtensionWsUrl(resolvedPort);
228
+ const result = await cdp.send(extWsUrl, 'Runtime.evaluate', {
229
+ expression: 'chrome.tabGroups.query({})',
230
+ awaitPromise: true,
231
+ returnByValue: true,
232
+ });
233
+ if (result.error) {
234
+ return { content: [{ type: 'text', text: `Error: ${JSON.stringify(result.error)}` }], isError: true };
235
+ }
236
+ const groups = result.result?.result?.value ?? [];
237
+ if (groups.length === 0) {
238
+ return { content: [{ type: 'text', text: '(no tab groups)' }] };
239
+ }
240
+ const lines = groups.map(g => `${g.id}: "${g.title || '(unnamed)'}" [${g.color}]${g.collapsed ? ' (collapsed)' : ''}`);
241
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
242
+ });
243
+ // --- Tool: cdp_ungroup_tabs ---
244
+ server.tool('cdp_ungroup_tabs', 'Remove tabs from their tab group. Requires the Kiro Tab Groups extension.', {
245
+ tabIds: z.array(z.number()).describe('Chrome tab IDs to ungroup'),
246
+ port: z.number().optional().describe('CDP port (auto-detected if omitted)'),
247
+ }, async ({ tabIds, port }) => {
248
+ const resolvedPort = await resolvePort(port);
249
+ const extWsUrl = await cdp.getExtensionWsUrl(resolvedPort);
250
+ const result = await cdp.send(extWsUrl, 'Runtime.evaluate', {
251
+ expression: `chrome.tabs.ungroup(${JSON.stringify(tabIds)})`,
252
+ awaitPromise: true,
253
+ returnByValue: true,
254
+ });
255
+ if (result.error) {
256
+ return { content: [{ type: 'text', text: `Error: ${JSON.stringify(result.error)}` }], isError: true };
257
+ }
258
+ return { content: [{ type: 'text', text: `Ungrouped ${tabIds.length} tab(s)` }] };
259
+ });
260
+ // --- Tool: cdp_list_tabs_detailed ---
261
+ server.tool('cdp_list_tabs_detailed', 'List open tabs with Chrome tab IDs (needed for tab group operations). Requires the Kiro Tab Groups extension.', {
262
+ port: z.number().optional().describe('CDP port (auto-detected if omitted)'),
263
+ }, async ({ port }) => {
264
+ const resolvedPort = await resolvePort(port);
265
+ const extWsUrl = await cdp.getExtensionWsUrl(resolvedPort);
266
+ const result = await cdp.send(extWsUrl, 'Runtime.evaluate', {
267
+ expression: 'chrome.tabs.query({})',
268
+ awaitPromise: true,
269
+ returnByValue: true,
270
+ });
271
+ if (result.error) {
272
+ return { content: [{ type: 'text', text: `Error: ${JSON.stringify(result.error)}` }], isError: true };
273
+ }
274
+ const tabs = result.result?.result?.value ?? [];
275
+ const lines = tabs.map(t => {
276
+ const group = t.groupId >= 0 ? ` [group:${t.groupId}]` : '';
277
+ return `${t.index}: (id:${t.id})${group} ${t.title}\n ${t.url}`;
278
+ });
279
+ return { content: [{ type: 'text', text: lines.join('\n\n') || '(no tabs)' }] };
280
+ });
114
281
  function sleep(ms) {
115
282
  return new Promise(resolve => setTimeout(resolve, ms));
116
283
  }
117
284
  // --- Start ---
118
285
  async function main() {
286
+ console.error(`[chrome-cdp] v0.2.0 starting`);
119
287
  const transport = new StdioServerTransport();
120
288
  await server.connect(transport);
289
+ console.error(`[chrome-cdp] connected via stdio`);
290
+ // Graceful shutdown: kill Chrome when the server exits
291
+ process.on('SIGTERM', () => { launcher.shutdown(); process.exit(0); });
292
+ process.on('SIGINT', () => { launcher.shutdown(); process.exit(0); });
121
293
  }
122
294
  main().catch((err) => {
123
295
  console.error('Fatal:', err);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ {
2
+ "manifest_version": 3,
3
+ "name": "Kiro Tab Groups",
4
+ "version": "0.1.0",
5
+ "description": "Exposes Chrome Tab Groups API to CDP for Kiro browser automation",
6
+ "permissions": ["tabs", "tabGroups"],
7
+ "background": {
8
+ "service_worker": "service-worker.js"
9
+ }
10
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Kiro Tab Groups — Chrome extension service worker.
3
+ *
4
+ * This service worker exists so that CDP can connect to it and call
5
+ * chrome.tabs.group / chrome.tabGroups APIs via Runtime.evaluate.
6
+ *
7
+ * No active logic — all calls come from the CDP MCP server.
8
+ */
9
+
10
+ // Keep service worker alive by responding to install/activate
11
+ self.addEventListener('install', () => self.skipWaiting());
12
+ self.addEventListener('activate', (event) => event.waitUntil(self.clients.claim()));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kiro-paradigm/browser",
3
- "version": "0.1.0",
4
- "description": "MCP server providing Chrome DevTools Protocol (CDP) browser automation — connects to an already-running Chrome instance when Playwright MCP cannot launch",
3
+ "version": "0.2.0",
4
+ "description": "MCP server providing Chrome DevTools Protocol (CDP) browser automation — launches its own Chrome instance with tab management and extension support",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
@@ -31,6 +31,7 @@
31
31
  },
32
32
  "files": [
33
33
  "dist/",
34
+ "extension/",
34
35
  "README.md",
35
36
  "LICENSE"
36
37
  ],