@modootoday/datalab-extension-mcp 1.8.2 → 1.8.5

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.en.md CHANGED
@@ -55,10 +55,10 @@ Avoid sharing a screenshot or the copied setup. If it may have leaked, press **[
55
55
  One command finds **every** AI app on your computer and connects them automatically. Nothing to do per app.
56
56
 
57
57
  1. **Open a terminal** — on Windows type `cmd` in the search box → "Command Prompt"; on Mac press `⌘+Space` and type `Terminal`; on Linux open your terminal app (often `Ctrl+Alt+T`).
58
- 2. **Paste this command and press Enter.** (`@1.8.2` is the pinned version, so the connector never changes behind your back.)
58
+ 2. **Paste this command and press Enter.** (`@1.8.5` is the pinned version, so the connector never changes behind your back.)
59
59
 
60
60
  ```
61
- npx -y @modootoday/datalab-extension-mcp@1.8.2 install
61
+ npx -y @modootoday/datalab-extension-mcp@1.8.5 install
62
62
  ```
63
63
 
64
64
  Lines of English scrolling by is normal. This only downloads and runs the connector — it touches nothing else.
@@ -219,7 +219,7 @@ _(The DataLab Tools panel is closed in Chrome. Open Chrome, keep the panel open,
219
219
 
220
220
  Exactly what it says. Open Chrome, keep the DataLab Tools side panel open, and it works immediately.
221
221
 
222
- ### I only see 9 tools
222
+ ### I only see 10 tools
223
223
 
224
224
  That's expected — **it's deliberate.**
225
225
 
@@ -252,7 +252,7 @@ Start it again after a full quit and it picks the tools up. If they still aren't
252
252
  - **When the connection disappears** — run the very command you used at the start once more; it safely re-registers. (Some AI apps clean up their settings file and drop the connection.)
253
253
 
254
254
  ```
255
- npx -y @modootoday/datalab-extension-mcp@1.8.2 install
255
+ npx -y @modootoday/datalab-extension-mcp@1.8.5 install
256
256
  ```
257
257
 
258
258
  - **`'npx' is not recognized...`** — Node.js isn't installed. The "No Node.js?" one-liner in Step 2 is the simplest fix.
@@ -282,7 +282,7 @@ Start it again after a full quit and it picks the tools up. If they still aren't
282
282
  1. Run this in a terminal (it removes the entries registered in your AI apps).
283
283
 
284
284
  ```
285
- npx -y @modootoday/datalab-extension-mcp@1.8.2 uninstall
285
+ npx -y @modootoday/datalab-extension-mcp@1.8.5 uninstall
286
286
  ```
287
287
 
288
288
  2. Turn **MCP 연결** off in the extension settings. The panel is the bridge, so with it off a leftover config line can look nothing up.
package/README.md CHANGED
@@ -49,10 +49,10 @@ Claude 같은 AI 앱을 데이터랩툴즈에 연결해 주는 작은 무료 프
49
49
  명령 한 줄이면 컴퓨터에 있는 AI 앱을 **모두 자동으로** 찾아 연결해 줘요. 앱마다 따로 할 일은 없어요.
50
50
 
51
51
  1. **터미널을 열어요** — Windows는 검색창에 `cmd` → "명령 프롬프트", Mac은 `⌘+스페이스`로 `터미널`, Linux는 터미널 앱(보통 `Ctrl+Alt+T`)이에요.
52
- 2. **아래 명령을 붙여넣고 Enter를 눌러요.** (`@1.8.2`은 커넥터가 나도 모르게 바뀌지 않도록 고정한 버전이에요.)
52
+ 2. **아래 명령을 붙여넣고 Enter를 눌러요.** (`@1.8.5`은 커넥터가 나도 모르게 바뀌지 않도록 고정한 버전이에요.)
53
53
 
54
54
  ```
55
- npx -y @modootoday/datalab-extension-mcp@1.8.2 install
55
+ npx -y @modootoday/datalab-extension-mcp@1.8.5 install
56
56
  ```
57
57
 
58
58
  영어 글자가 여러 줄 올라오는 건 정상이에요. 이 명령은 커넥터를 내려받아 실행할 뿐, 다른 건 건드리지 않아요.
@@ -147,7 +147,7 @@ npx -y @modootoday/datalab-extension-mcp browsers revoke <handle>
147
147
 
148
148
  `add` 를 실행하면 **연결 토큰을 붙여넣으라고 물어봐요** — 설치할 때와 같은 값이고, 패널의 `복사` 버튼으로 얻습니다. 그러면 코드가 **한 번만** 출력돼요. 커넥터는 그 코드를 저장하지 않고 지문만 남기므로 다시 보여 줄 수 없어요.
149
149
 
150
- 받은 코드는 그 브라우저의 사이드 패널 → **이 크롬을 워크벤치에 올리기** 에 붙여넣습니다. 그 브라우저는 자기 코드를 따로 만들지 않아요.
150
+ 만든 코드는 올릴 크롬의 사이드 패널 → **이 크롬을 워크벤치에 올리기** 에 붙여넣습니다. 그 브라우저는 자기 코드를 따로 만들지 않아요.
151
151
 
152
152
  - `list` 는 `waiting`(코드는 만들었지만 아직 아무도 안 붙음)과 `connected` 를 구분해서 보여 줘요.
153
153
  - `revoke` 뒤에는 그 브라우저가 다시 붙지 못해요. 다시 넣으려면 **`revoke` 한 뒤 새로 `add`** 하세요 — 같은 브라우저에 코드만 새로 줘도 거절돼요.
@@ -189,7 +189,7 @@ AI 앱이 켜질 때 받은 옛 코드로 커넥터가 돌고 있어서 그래
189
189
 
190
190
  말 그대로예요. Chrome을 열고 데이터랩툴즈 사이드 패널을 열어 두면 바로 동작해요.
191
191
 
192
- ### 도구가 9개밖에 안 보여요
192
+ ### 도구가 10개밖에 안 보여요
193
193
 
194
194
  정상이에요. **일부러 그렇게 보냅니다.**
195
195
 
@@ -220,7 +220,7 @@ AI가 "그런 기능은 없다" 고 답하면, **"도구 목록을 확인해 보
220
220
  - **연결이 사라졌을 때** — 처음 실행했던 그 명령을 한 번 더 실행하면 안전하게 다시 등록돼요. (일부 AI 앱이 설정 파일을 정리하며 연결을 지우기도 해요.)
221
221
 
222
222
  ```
223
- npx -y @modootoday/datalab-extension-mcp@1.8.2 install
223
+ npx -y @modootoday/datalab-extension-mcp@1.8.5 install
224
224
  ```
225
225
 
226
226
  - **`'npx'을(는) 내부 또는 외부 명령...`** — Node.js가 없는 거예요. 위 2단계의 "Node.js가 없다면" 한 줄 설치가 가장 간단해요.
@@ -250,7 +250,7 @@ AI가 "그런 기능은 없다" 고 답하면, **"도구 목록을 확인해 보
250
250
  1. 터미널에서 아래 명령을 실행해요(AI 앱에 등록된 설정을 지워 줘요).
251
251
 
252
252
  ```
253
- npx -y @modootoday/datalab-extension-mcp@1.8.2 uninstall
253
+ npx -y @modootoday/datalab-extension-mcp@1.8.5 uninstall
254
254
  ```
255
255
 
256
256
  2. 확장 설정에서 **MCP 연결을 꺼요.** 패널이 브릿지라, 꺼 두면 어딘가 설정 줄이 남아 있어도 AI 앱이 아무것도 조회할 수 없어요.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEFAULT_HOST,
3
3
  DEFAULT_PORT
4
- } from "./chunk-6JBLBCLU.js";
4
+ } from "./chunk-KV7HFKJB.js";
5
5
  import {
6
6
  TOKEN_PROMPT_GUIDE,
7
7
  TOKEN_PROMPT_QUESTION,
@@ -1,4 +1,4 @@
1
- // ../mcp-server/dist/chunk-E7GLTDCZ.js
1
+ // ../mcp-server/dist/chunk-MNJBE7B3.js
2
2
  import { createHash } from "crypto";
3
3
  import { createHash as createHash2, randomUUID } from "crypto";
4
4
  import { mkdir, readFile, readdir, rm, writeFile } from "fs/promises";
@@ -15309,6 +15309,7 @@ var DESCRIBE_TOOL = "datalab_describe";
15309
15309
  var CALL_TOOL = "datalab_call";
15310
15310
  var CONFIRM_STATUS_TOOL = "datalab_confirm_status";
15311
15311
  var SESSION_STATE_TOOL = "datalab_session_state";
15312
+ var BROWSERS_TOOL = "datalab_browsers";
15312
15313
  var DESCRIBE_PAGE_SIZE = 10;
15313
15314
  function discoveryDescriptors(entries) {
15314
15315
  const sets = buildToolsets(entries.map((e) => e.name));
@@ -15404,6 +15405,18 @@ function sessionStateDescriptor() {
15404
15405
  annotations: LOOKUP_ANNOTATIONS
15405
15406
  };
15406
15407
  }
15408
+ function browsersDescriptor() {
15409
+ return {
15410
+ name: BROWSERS_TOOL,
15411
+ description: "\uC774 \uCEF4\uD4E8\uD130\uC5D0 \uC9C0\uAE08 \uC5F0\uACB0\uB3FC \uC788\uB294 \uBE0C\uB77C\uC6B0\uC800\uB97C \uC54C\uB824\uC900\uB2E4. \uD06C\uB86C\xB7\uC6E8\uC77C\xB7\uC5E3\uC9C0 \uC5B4\uB290 \uAC83\uC774\uB4E0, \uD504\uB85C\uD544\uC744 \uC5EC\uB7EC \uAC1C \uC5F0\uACB0\uD574 \uB454 \uC0AC\uC6A9\uC790\uC5D0\uAC8C\uB294 \uB3C4\uAD6C\uAC00 \uC5B4\uB514\uC11C \uC2E4\uD589\uB418\uB294\uC9C0\uAC00 \uACB0\uACFC\uB97C \uBC14\uAFBC\uB2E4 \u2014 \uC5F4\uB824 \uC788\uB294 \uAE00\uB3C4 \uB85C\uADF8\uC778\uD55C \uACC4\uC815\uB3C4 \uD504\uB85C\uD544\uB9C8\uB2E4 \uB2E4\uB974\uB2E4. \uBAA9\uB85D\uC758 id \uB97C \uB2E4\uB978 \uB3C4\uAD6C \uD638\uCD9C\uC758 browser \uC778\uC790\uC5D0 \uB123\uC73C\uBA74 \uADF8 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uC2E4\uD589\uB41C\uB2E4. \uC0DD\uB7B5\uD558\uBA74 \uAC00\uC7A5 \uBA3C\uC800 \uC5F0\uACB0\uB41C \uAC83\uC5D0\uC11C \uC2E4\uD589\uB418\uB2C8, \uB458 \uC774\uC0C1\uC774\uBA74 \uC5B4\uB514\uC11C \uD560\uC9C0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uD655\uC778\uD558\uACE0 \uC9C0\uC815\uD55C\uB2E4. \uC774 \uB3C4\uAD6C\uB294 \uC870\uD68C\uB9CC \uD558\uBA70 \uC0C8 \uBE0C\uB77C\uC6B0\uC800\uB97C \uB4F1\uB85D\uD558\uC9C0\uB294 \uBABB\uD55C\uB2E4 \u2014 \uB4F1\uB85D \uCF54\uB4DC\uB294 \uC0AC\uC6A9\uC790\uAC00 \uD328\uB110\uC5D0\uC11C \uC9C1\uC811 \uB9CC\uB4E0\uB2E4.",
15412
+ inputSchema: {
15413
+ type: "object",
15414
+ properties: {},
15415
+ additionalProperties: false
15416
+ },
15417
+ annotations: LOOKUP_ANNOTATIONS
15418
+ };
15419
+ }
15407
15420
  function allowlistNames() {
15408
15421
  return [.../* @__PURE__ */ new Set([...READ_ONLY_TOOLS, ...Object.keys(TOOL_TIERS)])];
15409
15422
  }
@@ -15413,7 +15426,11 @@ function staticDiscoveryCatalog() {
15413
15426
  description: "",
15414
15427
  inputSchema: {}
15415
15428
  }));
15416
- return [...discoveryDescriptors(entries), sessionStateDescriptor()].map(
15429
+ return [
15430
+ ...discoveryDescriptors(entries),
15431
+ sessionStateDescriptor(),
15432
+ browsersDescriptor()
15433
+ ].map(
15417
15434
  (e) => ({
15418
15435
  name: e.name,
15419
15436
  description: e.description,
@@ -15593,6 +15610,17 @@ var Bridge = class {
15593
15610
  for (const entry of this.#sessions.values()) return entry;
15594
15611
  return null;
15595
15612
  }
15613
+ /**
15614
+ * The browsers a caller could address, oldest first.
15615
+ *
15616
+ * `primary` marks the one an unaddressed call reaches, because that default
15617
+ * is invisible otherwise: with two profiles connected a host would keep
15618
+ * landing in the older one and never learn why the newer one saw nothing.
15619
+ */
15620
+ connectedBrowsers() {
15621
+ const keys = [...this.#sessions.keys()];
15622
+ return keys.map((id, i) => ({ id, primary: i === 0 }));
15623
+ }
15596
15624
  /**
15597
15625
  * The only place a registry is born, and it is born already in the map.
15598
15626
  * One living anywhere else would be missed by `sweep` and by `#closeSession`,
@@ -16496,6 +16524,19 @@ async function handleMcpRequest(bridge, body, accept, stage) {
16496
16524
  );
16497
16525
  }
16498
16526
  const args = typeof params.arguments === "object" && params.arguments !== null ? params.arguments : {};
16527
+ if (params.name === BROWSERS_TOOL) {
16528
+ return frameMcpResponse(
16529
+ rpcResult(id, {
16530
+ content: [
16531
+ {
16532
+ type: "text",
16533
+ text: JSON.stringify({ browsers: bridge.connectedBrowsers() })
16534
+ }
16535
+ ]
16536
+ }),
16537
+ accept
16538
+ );
16539
+ }
16499
16540
  if (stage && isMediaTool(params.name)) {
16500
16541
  const startedAt = Date.now();
16501
16542
  const result = await callMediaTool(stage, params.name, args);
@@ -4,7 +4,7 @@ import {
4
4
  mediaToolDescriptors,
5
5
  spawnDaemon,
6
6
  tryConnect
7
- } from "./chunk-6JBLBCLU.js";
7
+ } from "./chunk-KV7HFKJB.js";
8
8
  import {
9
9
  __export
10
10
  } from "./chunk-MLKGABMK.js";
@@ -15273,6 +15273,7 @@ var DESCRIBE_TOOL = "datalab_describe";
15273
15273
  var CALL_TOOL = "datalab_call";
15274
15274
  var CONFIRM_STATUS_TOOL = "datalab_confirm_status";
15275
15275
  var SESSION_STATE_TOOL = "datalab_session_state";
15276
+ var BROWSERS_TOOL = "datalab_browsers";
15276
15277
  var DESCRIBE_PAGE_SIZE = 10;
15277
15278
  function discoveryDescriptors(entries) {
15278
15279
  const sets = buildToolsets(entries.map((e) => e.name));
@@ -15368,6 +15369,18 @@ function sessionStateDescriptor() {
15368
15369
  annotations: LOOKUP_ANNOTATIONS
15369
15370
  };
15370
15371
  }
15372
+ function browsersDescriptor() {
15373
+ return {
15374
+ name: BROWSERS_TOOL,
15375
+ description: "\uC774 \uCEF4\uD4E8\uD130\uC5D0 \uC9C0\uAE08 \uC5F0\uACB0\uB3FC \uC788\uB294 \uBE0C\uB77C\uC6B0\uC800\uB97C \uC54C\uB824\uC900\uB2E4. \uD06C\uB86C\xB7\uC6E8\uC77C\xB7\uC5E3\uC9C0 \uC5B4\uB290 \uAC83\uC774\uB4E0, \uD504\uB85C\uD544\uC744 \uC5EC\uB7EC \uAC1C \uC5F0\uACB0\uD574 \uB454 \uC0AC\uC6A9\uC790\uC5D0\uAC8C\uB294 \uB3C4\uAD6C\uAC00 \uC5B4\uB514\uC11C \uC2E4\uD589\uB418\uB294\uC9C0\uAC00 \uACB0\uACFC\uB97C \uBC14\uAFBC\uB2E4 \u2014 \uC5F4\uB824 \uC788\uB294 \uAE00\uB3C4 \uB85C\uADF8\uC778\uD55C \uACC4\uC815\uB3C4 \uD504\uB85C\uD544\uB9C8\uB2E4 \uB2E4\uB974\uB2E4. \uBAA9\uB85D\uC758 id \uB97C \uB2E4\uB978 \uB3C4\uAD6C \uD638\uCD9C\uC758 browser \uC778\uC790\uC5D0 \uB123\uC73C\uBA74 \uADF8 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uC2E4\uD589\uB41C\uB2E4. \uC0DD\uB7B5\uD558\uBA74 \uAC00\uC7A5 \uBA3C\uC800 \uC5F0\uACB0\uB41C \uAC83\uC5D0\uC11C \uC2E4\uD589\uB418\uB2C8, \uB458 \uC774\uC0C1\uC774\uBA74 \uC5B4\uB514\uC11C \uD560\uC9C0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uD655\uC778\uD558\uACE0 \uC9C0\uC815\uD55C\uB2E4. \uC774 \uB3C4\uAD6C\uB294 \uC870\uD68C\uB9CC \uD558\uBA70 \uC0C8 \uBE0C\uB77C\uC6B0\uC800\uB97C \uB4F1\uB85D\uD558\uC9C0\uB294 \uBABB\uD55C\uB2E4 \u2014 \uB4F1\uB85D \uCF54\uB4DC\uB294 \uC0AC\uC6A9\uC790\uAC00 \uD328\uB110\uC5D0\uC11C \uC9C1\uC811 \uB9CC\uB4E0\uB2E4.",
15376
+ inputSchema: {
15377
+ type: "object",
15378
+ properties: {},
15379
+ additionalProperties: false
15380
+ },
15381
+ annotations: LOOKUP_ANNOTATIONS
15382
+ };
15383
+ }
15371
15384
  function allowlistNames() {
15372
15385
  return [.../* @__PURE__ */ new Set([...READ_ONLY_TOOLS, ...Object.keys(TOOL_TIERS)])];
15373
15386
  }
@@ -15377,7 +15390,11 @@ function staticDiscoveryCatalog() {
15377
15390
  description: "",
15378
15391
  inputSchema: {}
15379
15392
  }));
15380
- return [...discoveryDescriptors(entries), sessionStateDescriptor()].map(
15393
+ return [
15394
+ ...discoveryDescriptors(entries),
15395
+ sessionStateDescriptor(),
15396
+ browsersDescriptor()
15397
+ ].map(
15381
15398
  (e) => ({
15382
15399
  name: e.name,
15383
15400
  description: e.description,
package/dist/cli.js CHANGED
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  dispatchCli,
4
4
  runAdapter
5
- } from "./chunk-NKUU3DAF.js";
5
+ } from "./chunk-SN25XJOG.js";
6
6
  import {
7
7
  runDaemon
8
- } from "./chunk-6JBLBCLU.js";
8
+ } from "./chunk-KV7HFKJB.js";
9
9
  import "./chunk-MLKGABMK.js";
10
10
 
11
11
  // src/cli.ts
@@ -62,7 +62,7 @@ async function main() {
62
62
  // Loaded lazily, like the installer: the adapter path is what an MCP host
63
63
  // spawns and must not pay for a command only an operator types.
64
64
  browsers: async (argv) => {
65
- const { runBrowsers } = await import("./browsers-KHRZKQVP.js");
65
+ const { runBrowsers } = await import("./browsers-HTFKS44A.js");
66
66
  const { createNodeIo } = await import("./dist-JICXADYR.js");
67
67
  const io = createNodeIo();
68
68
  const code = await runBrowsers(argv, {
package/dist/index.js CHANGED
@@ -3,8 +3,8 @@ import {
3
3
  dispatchCli,
4
4
  ensureDaemonRunning,
5
5
  runAdapter
6
- } from "./chunk-NKUU3DAF.js";
7
- import "./chunk-6JBLBCLU.js";
6
+ } from "./chunk-SN25XJOG.js";
7
+ import "./chunk-KV7HFKJB.js";
8
8
  import "./chunk-MLKGABMK.js";
9
9
  export {
10
10
  createAdapterServer,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modootoday/datalab-extension-mcp",
3
- "version": "1.8.2",
3
+ "version": "1.8.5",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",