@modootoday/datalab-extension-mcp 1.7.0 → 1.8.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.
- package/README.en.md +55 -9
- package/README.md +47 -9
- package/dist/browsers-KHRZKQVP.js +119 -0
- package/dist/{dist-WMNHKGZR.js → chunk-5S7RFXIU.js} +1032 -442
- package/dist/chunk-6JBLBCLU.js +17524 -0
- package/dist/chunk-NKUU3DAF.js +15888 -0
- package/dist/cli.js +64 -4
- package/dist/dist-JICXADYR.js +105 -0
- package/dist/index.d.ts +22 -4
- package/dist/index.js +2 -1
- package/dist/skills-ACWHUGX7.js +101 -0
- package/package.json +3 -5
- package/skills/datalab-ad-disclosure-check/SKILL.md +74 -0
- package/skills/datalab-ad-disclosure-check/references/ad-disclosure-rules.md +98 -0
- package/skills/datalab-ad-disclosure-check/references/naver-terms-excerpt.md +28 -0
- package/skills/datalab-blog-widget/SKILL.md +65 -0
- package/skills/datalab-blog-widget/references/naver-constraints.md +51 -0
- package/skills/datalab-blog-widget/references/templates.md +123 -0
- package/skills/datalab-card-news/SKILL.md +93 -0
- package/skills/datalab-card-news/references/slide-structure.md +48 -0
- package/skills/datalab-cta-rewrite/SKILL.md +55 -0
- package/skills/datalab-cta-rewrite/references/output-format.md +24 -0
- package/skills/datalab-cta-rewrite/references/principles.md +36 -0
- package/skills/datalab-material-suggestion/SKILL.md +70 -0
- package/skills/datalab-material-suggestion/references/discovery.md +47 -0
- package/skills/datalab-material-suggestion/references/output-format.md +41 -0
- package/skills/datalab-photo-prompt/SKILL.md +52 -0
- package/skills/datalab-photo-prompt/references/prompt-dimensions.md +43 -0
- package/skills/datalab-photo-prompt/references/style-vocabulary.md +35 -0
- package/skills/datalab-reader-simulation/SKILL.md +83 -0
- package/skills/datalab-reader-simulation/references/checklist-format.md +36 -0
- package/skills/datalab-research-brief/SKILL.md +77 -0
- package/skills/datalab-research-brief/references/brief-format.md +39 -0
- package/skills/datalab-social-repurpose/SKILL.md +70 -0
- package/skills/datalab-social-repurpose/references/output-format.md +43 -0
- package/skills/datalab-social-repurpose/references/platform-specs.md +44 -0
- package/skills/datalab-tone-manner/SKILL.md +59 -0
- package/skills/datalab-tone-manner/references/analysis-dimensions.md +51 -0
- package/skills/datalab-tone-manner/references/spec-format.md +58 -0
- package/skills/datalab-tutorial-post/SKILL.md +61 -0
- package/skills/datalab-tutorial-post/references/analogy-and-case-templates.md +37 -0
- package/skills/datalab-tutorial-post/references/structure-and-length.md +22 -0
- package/skills/datalab-tutorial-post/references/tone-and-hooks.md +26 -0
- package/skills/datalab-video-script/SKILL.md +84 -0
- package/skills/datalab-video-script/references/scene-structure.md +41 -0
- package/skills/datalab-video-script/references/writing-for-the-ear.md +22 -0
- package/dist/chunk-NYUIYZG6.js +0 -32468
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.
|
|
58
|
+
2. **Paste this command and press Enter.** (`@1.8.0` is the pinned version, so the connector never changes behind your back.)
|
|
59
59
|
|
|
60
60
|
```
|
|
61
|
-
npx -y @modootoday/datalab-extension-mcp@1.
|
|
61
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.0 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.
|
|
@@ -125,6 +125,52 @@ Apps it **only prints instructions for** (follow the on-screen guide): VS Code,
|
|
|
125
125
|
- The connector is only a bridge — it stores no logins or passwords and doesn't work outside your computer.
|
|
126
126
|
- When the extension updates, new features appear in your AI app automatically. The connector program itself stays the same.
|
|
127
127
|
|
|
128
|
+
## Choosing which writing skills are installed
|
|
129
|
+
|
|
130
|
+
Installing also places the bundled **writing skills**. An AI app reads the name and description of every installed skill on every start, so the more are installed the less room the conversation has. The default therefore places only the ones that work right away.
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
npx -y @modootoday/datalab-extension-mcp skills list
|
|
134
|
+
npx -y @modootoday/datalab-extension-mcp skills status
|
|
135
|
+
npx -y @modootoday/datalab-extension-mcp skills attach <name>
|
|
136
|
+
npx -y @modootoday/datalab-extension-mcp skills detach <name>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
- `list` shows everything in this version, name and description.
|
|
140
|
+
- `status` shows which folder on this machine holds what.
|
|
141
|
+
- `attach` / `detach` take one in or out.
|
|
142
|
+
- Pass `--all-skills` to `install` for everything, or `--no-skills` for none.
|
|
143
|
+
|
|
144
|
+
**Three are held back by default** — two need the photo or video editor to be **already open**, and one is AI photo generation, which only works inside the extension panel. Attach them if you use those editors.
|
|
145
|
+
|
|
146
|
+
If another tool installed a skill of the same name, it is left alone and said so. Removal deletes only the files we wrote.
|
|
147
|
+
|
|
148
|
+
## Adding another browser
|
|
149
|
+
|
|
150
|
+
If you use more than one Chrome profile, each can join the same connector with a
|
|
151
|
+
**code of its own**. Codes are made on the computer where the connector is
|
|
152
|
+
installed.
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
npx -y @modootoday/datalab-extension-mcp browsers add "Work Chrome"
|
|
156
|
+
npx -y @modootoday/datalab-extension-mcp browsers list
|
|
157
|
+
npx -y @modootoday/datalab-extension-mcp browsers revoke <handle>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`add` **asks you to paste the pairing token** — the same value you used to
|
|
161
|
+
install, copied from the panel. It then prints a code **once**. The connector
|
|
162
|
+
keeps only a fingerprint of it, so it cannot show it to you again.
|
|
163
|
+
|
|
164
|
+
Paste that code into the other browser's side panel, under **기존 연결에 참여**
|
|
165
|
+
(join an existing connection). That browser does not make a code of its own.
|
|
166
|
+
|
|
167
|
+
- `list` separates `waiting` (a code exists, nobody has used it) from
|
|
168
|
+
`connected`.
|
|
169
|
+
- After `revoke`, that browser cannot rejoin. To let it back in, **revoke and
|
|
170
|
+
then `add` again** — handing the same browser a new code alone is refused.
|
|
171
|
+
- With the connector stopped, these commands do nothing and say so. Opening the
|
|
172
|
+
AI app you paired brings it back.
|
|
173
|
+
|
|
128
174
|
## Troubleshooting
|
|
129
175
|
|
|
130
176
|
Whatever happened, the first question is always the same — **is the panel open?** If the card reads "문제 발생" (problem), look for the red sentence under it in the headings below. If it isn't there, the connector is passing an error through verbatim — see "None of the above" further down for the log file.
|
|
@@ -159,7 +205,7 @@ The connector is running with the code its AI app handed it at startup. **[다
|
|
|
159
205
|
2. Paste it into the AI app's settings
|
|
160
206
|
3. **Fully quit that AI app and start it again** — not just close the window (Windows: tray icon → quit; Mac: `⌘+Q`; Linux: Quit from the app menu)
|
|
161
207
|
|
|
162
|
-
Step 3 is what brings the connector back up with the new code.
|
|
208
|
+
Step 3 is what brings the connector back up with the new code. **Don't press [새 토큰 발급] (issue a new token) again** — that changes the code once more and puts you right back here.
|
|
163
209
|
|
|
164
210
|
### "연결 통로(포트)를 다른 프로그램이 쓰고 있어요."
|
|
165
211
|
|
|
@@ -173,11 +219,11 @@ _(The DataLab Tools panel is closed in Chrome. Open Chrome, keep the panel open,
|
|
|
173
219
|
|
|
174
220
|
Exactly what it says. Open Chrome, keep the DataLab Tools side panel open, and it works immediately.
|
|
175
221
|
|
|
176
|
-
### I only see
|
|
222
|
+
### I only see 9 tools
|
|
177
223
|
|
|
178
224
|
That's expected — **it's deliberate.**
|
|
179
225
|
|
|
180
|
-
There are
|
|
226
|
+
There are 187 tools. Sending all of them as a list runs into the cap each AI app
|
|
181
227
|
sets: some quietly drop whatever doesn't fit, some refuse the connection outright.
|
|
182
228
|
So the common ones go in the list, and **the rest are handed over as an answer when
|
|
183
229
|
the AI asks for them.**
|
|
@@ -206,7 +252,7 @@ Start it again after a full quit and it picks the tools up. If they still aren't
|
|
|
206
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.)
|
|
207
253
|
|
|
208
254
|
```
|
|
209
|
-
npx -y @modootoday/datalab-extension-mcp@1.
|
|
255
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.0 install
|
|
210
256
|
```
|
|
211
257
|
|
|
212
258
|
- **`'npx' is not recognized...`** — Node.js isn't installed. The "No Node.js?" one-liner in Step 2 is the simplest fix.
|
|
@@ -223,7 +269,7 @@ Start it again after a full quit and it picks the tools up. If they still aren't
|
|
|
223
269
|
|
|
224
270
|
## Safety
|
|
225
271
|
|
|
226
|
-
- **Lookups just work; editing is asked for.** Looking data up is immediate. Changing your **Naver draft** or a photo/video editor needs **AI editing** allowed, in the side panel or in settings, and you pick how long that lasts: allow it for this connection and closing the panel turns it back off, or save **always allow** so you don't switch it on again (turned off in the same place). In the draft, that covers setting the title, inserting text, and undo. Replacing the whole body, inserting a photo, closing an editor window, deleting anything
|
|
272
|
+
- **Lookups just work; editing is asked for.** Looking data up is immediate. Changing your **Naver draft** or a photo/video editor needs **AI editing** allowed, in the side panel or in settings, and you pick how long that lasts: allow it for this connection and closing the panel turns it back off, or save **always allow** so you don't switch it on again (turned off in the same place). In the draft, that covers setting the title, inserting text, and undo. Replacing the whole body, inserting a photo, closing an editor window, and deleting anything are **not covered by "always allow"** — that setting does not open them. Anything that costs money is opened by no setting at all and is asked about **every single time**.
|
|
227
273
|
- **It never publishes.** Posting or making a draft public is not connected — edits stay in the draft window, and publishing is yours to do.
|
|
228
274
|
- **The connector stores no logins, passwords, or cookies.** It never contacts Naver directly. Every lookup happens inside your own logged-in browser.
|
|
229
275
|
- **It works only inside your computer.** Nothing outside can connect, and it's double-locked: the connection token plus a check that the caller really is your extension.
|
|
@@ -236,7 +282,7 @@ Start it again after a full quit and it picks the tools up. If they still aren't
|
|
|
236
282
|
1. Run this in a terminal (it removes the entries registered in your AI apps).
|
|
237
283
|
|
|
238
284
|
```
|
|
239
|
-
npx -y @modootoday/datalab-extension-mcp@1.
|
|
285
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.0 uninstall
|
|
240
286
|
```
|
|
241
287
|
|
|
242
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.
|
|
@@ -272,7 +318,7 @@ Deleting the extension also renders any leftover connector inert. A leftover lin
|
|
|
272
318
|
| `DATALAB_MCP_PORT` | optional | `8765` | Listen port. |
|
|
273
319
|
| `DATALAB_MCP_HOST` | optional | `127.0.0.1` | Bind address. Non-loopback values are rejected. |
|
|
274
320
|
|
|
275
|
-
**Rate limit** — `10` calls of burst per
|
|
321
|
+
**Rate limit** — `10` calls of burst per connector, refilling at `1` per second. Browsers connected to the same connector **share that budget**. It damps runaway loops rather than enforcing billing, so ordinary use never reaches it.
|
|
276
322
|
|
|
277
323
|
**Failure responses** — a failed tool call arrives as an `isError` result rather than a protocol error, and its body is JSON like a success (`ok` / `reason` / `message` / `retryable`, plus `retryAfterMs` when waiting helps). Canonical list of every failure code and whether it is worth retrying: <https://github.com/modootoday/datalab-extension-mcp/blob/main/mcp-core/src/errors.ts>
|
|
278
324
|
|
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.
|
|
52
|
+
2. **아래 명령을 붙여넣고 Enter를 눌러요.** (`@1.8.0`은 커넥터가 나도 모르게 바뀌지 않도록 고정한 버전이에요.)
|
|
53
53
|
|
|
54
54
|
```
|
|
55
|
-
npx -y @modootoday/datalab-extension-mcp@1.
|
|
55
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.0 install
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
영어 글자가 여러 줄 올라오는 건 정상이에요. 이 명령은 커넥터를 내려받아 실행할 뿐, 다른 건 건드리지 않아요.
|
|
@@ -113,6 +113,44 @@ Claude 같은 AI 앱을 데이터랩툴즈에 연결해 주는 작은 무료 프
|
|
|
113
113
|
- 커넥터는 다리일 뿐이에요 — 아이디·비밀번호를 저장하지 않고, 내 컴퓨터 밖에서는 동작하지 않아요.
|
|
114
114
|
- 확장이 업데이트되면 새 기능이 자동으로 AI 앱에 나타나요. 커넥터 프로그램 자체는 그대로예요.
|
|
115
115
|
|
|
116
|
+
## 설치된 글쓰기 도움말 고르기
|
|
117
|
+
|
|
118
|
+
설치할 때 **글쓰기 도움말(스킬)** 도 함께 놓입니다. AI 앱은 켜질 때마다 설치된 도움말의 이름과 설명을 전부 읽기 때문에, 많이 깔수록 대화에 쓸 자리가 줄어들어요. 그래서 기본은 **바로 쓸 수 있는 것만** 놓습니다.
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
npx -y @modootoday/datalab-extension-mcp skills list
|
|
122
|
+
npx -y @modootoday/datalab-extension-mcp skills status
|
|
123
|
+
npx -y @modootoday/datalab-extension-mcp skills attach <이름>
|
|
124
|
+
npx -y @modootoday/datalab-extension-mcp skills detach <이름>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
- `list` 는 이 버전에 들어 있는 전부를 이름과 설명으로 보여 줘요.
|
|
128
|
+
- `status` 는 지금 내 컴퓨터의 어느 폴더에 무엇이 들어가 있는지 보여 줘요.
|
|
129
|
+
- `attach` / `detach` 로 하나씩 넣고 뺍니다.
|
|
130
|
+
- 설치할 때 전부 원하시면 `install` 에 `--all-skills` 를, 아예 원하지 않으시면 `--no-skills` 를 붙이세요.
|
|
131
|
+
|
|
132
|
+
**기본에서 빠지는 것 3가지** — 사진 편집기·영상 편집기가 **열려 있어야** 시작하거나, AI 사진 생성처럼 확장 패널에서만 되는 것들이에요. 그 편집기를 쓰신다면 `attach` 로 넣으시면 됩니다.
|
|
133
|
+
|
|
134
|
+
다른 도구로 설치한 같은 이름의 도움말이 있으면 **건드리지 않고 그렇게 말해요.** 뺄 때도 우리가 넣은 파일만 지웁니다.
|
|
135
|
+
|
|
136
|
+
## 브라우저를 하나 더 연결하기
|
|
137
|
+
|
|
138
|
+
크롬 프로필을 여러 개 쓰신다면, 프로필마다 **자기 코드**로 같은 커넥터에 참여할 수 있어요. 코드를 만드는 쪽은 커넥터가 설치된 컴퓨터입니다.
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
npx -y @modootoday/datalab-extension-mcp browsers add "회사 크롬"
|
|
142
|
+
npx -y @modootoday/datalab-extension-mcp browsers list
|
|
143
|
+
npx -y @modootoday/datalab-extension-mcp browsers revoke <handle>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
`add` 를 실행하면 **연결 토큰을 붙여넣으라고 물어봐요** — 설치할 때와 같은 값이고, 패널의 `복사` 버튼으로 얻습니다. 그러면 코드가 **한 번만** 출력돼요. 커넥터는 그 코드를 저장하지 않고 지문만 남기므로 다시 보여 줄 수 없어요.
|
|
147
|
+
|
|
148
|
+
받은 코드는 그 브라우저의 사이드 패널 → **기존 연결에 참여** 에 붙여넣습니다. 그 브라우저는 자기 코드를 따로 만들지 않아요.
|
|
149
|
+
|
|
150
|
+
- `list` 는 `waiting`(코드는 만들었지만 아직 아무도 안 붙음)과 `connected` 를 구분해서 보여 줘요.
|
|
151
|
+
- `revoke` 뒤에는 그 브라우저가 다시 붙지 못해요. 다시 넣으려면 **`revoke` 한 뒤 새로 `add`** 하세요 — 같은 브라우저에 코드만 새로 줘도 거절돼요.
|
|
152
|
+
- 커넥터가 꺼져 있으면 이 명령은 아무것도 하지 않고 그렇게 말해요. 연결해 둔 AI 앱을 켜면 커넥터가 함께 살아납니다.
|
|
153
|
+
|
|
116
154
|
## 문제해결
|
|
117
155
|
|
|
118
156
|
무슨 일이든 첫 질문은 하나예요 — **패널이 열려 있나요?** 카드 상태가 "문제 발생"이면 그 아래 빨간 문장을 아래 소제목에서 찾아보세요. 여기 없는 문장이 떴다면 커넥터가 그대로 전해 준 오류예요 — 아래 "위 어느 것도 아닐 때" 의 기록 파일을 보시면 돼요.
|
|
@@ -139,7 +177,7 @@ AI 앱이 켜질 때 받은 옛 코드로 커넥터가 돌고 있어서 그래
|
|
|
139
177
|
2. 그 내용을 AI 앱 설정에 붙여넣은 뒤
|
|
140
178
|
3. **그 AI 앱을 완전히 종료했다가 다시 켜요** (창 닫기 말고 — Windows 트레이 종료 / Mac `⌘+Q` / Linux 앱 메뉴 Quit)
|
|
141
179
|
|
|
142
|
-
3번까지 해야 커넥터가 새 코드로 다시 떠요.
|
|
180
|
+
3번까지 해야 커넥터가 새 코드로 다시 떠요. **[새 토큰 발급]을 다시 누르지 마세요** — 코드가 또 바뀌어서 같은 상황이 반복돼요.
|
|
143
181
|
|
|
144
182
|
### "연결 통로(포트)를 다른 프로그램이 쓰고 있어요."
|
|
145
183
|
|
|
@@ -149,11 +187,11 @@ AI 앱이 켜질 때 받은 옛 코드로 커넥터가 돌고 있어서 그래
|
|
|
149
187
|
|
|
150
188
|
말 그대로예요. Chrome을 열고 데이터랩툴즈 사이드 패널을 열어 두면 바로 동작해요.
|
|
151
189
|
|
|
152
|
-
### 도구가
|
|
190
|
+
### 도구가 9개밖에 안 보여요
|
|
153
191
|
|
|
154
192
|
정상이에요. **일부러 그렇게 보냅니다.**
|
|
155
193
|
|
|
156
|
-
전체 도구는
|
|
194
|
+
전체 도구는 187개인데, 그걸 전부 목록으로 보내면 AI 앱마다 정해 둔 상한에 걸려요.
|
|
157
195
|
어떤 앱은 넘치는 만큼 조용히 잘라내고, 어떤 앱은 아예 연결을 거부해요. 그래서 자주 쓰는
|
|
158
196
|
것만 목록에 올리고, 나머지는 **AI가 물어보면 답으로 건네줍니다.**
|
|
159
197
|
|
|
@@ -180,7 +218,7 @@ AI가 "그런 기능은 없다" 고 답하면, **"도구 목록을 확인해 보
|
|
|
180
218
|
- **연결이 사라졌을 때** — 처음 실행했던 그 명령을 한 번 더 실행하면 안전하게 다시 등록돼요. (일부 AI 앱이 설정 파일을 정리하며 연결을 지우기도 해요.)
|
|
181
219
|
|
|
182
220
|
```
|
|
183
|
-
npx -y @modootoday/datalab-extension-mcp@1.
|
|
221
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.0 install
|
|
184
222
|
```
|
|
185
223
|
|
|
186
224
|
- **`'npx'을(는) 내부 또는 외부 명령...`** — Node.js가 없는 거예요. 위 2단계의 "Node.js가 없다면" 한 줄 설치가 가장 간단해요.
|
|
@@ -197,7 +235,7 @@ AI가 "그런 기능은 없다" 고 답하면, **"도구 목록을 확인해 보
|
|
|
197
235
|
|
|
198
236
|
## 안전
|
|
199
237
|
|
|
200
|
-
- **조회는 그냥 되고, 고치는 건 허락받아요.** 데이터 조회는 바로 돼요. **네이버 글쓰기 창**과 사진·영상 편집기의 내용을 고치려면 사이드패널이나 설정에서 **AI 편집 허용**을 켜야 해요. 두 가지 중에 고르면 됩니다 — 이번 연결에만 켜면 패널을 닫을 때 다시 꺼지고, **항상 허용**으로 저장하면 매번 켜지 않아도 돼요(끄는 것도 같은 자리에서 합니다). 글쓰기 창에서는 제목·본문 넣기와 되돌리기가 열려요. 본문을 통째로 바꾸거나 사진을 넣는 것, 편집기 창을 닫는 것,
|
|
238
|
+
- **조회는 그냥 되고, 고치는 건 허락받아요.** 데이터 조회는 바로 돼요. **네이버 글쓰기 창**과 사진·영상 편집기의 내용을 고치려면 사이드패널이나 설정에서 **AI 편집 허용**을 켜야 해요. 두 가지 중에 고르면 됩니다 — 이번 연결에만 켜면 패널을 닫을 때 다시 꺼지고, **항상 허용**으로 저장하면 매번 켜지 않아도 돼요(끄는 것도 같은 자리에서 합니다). 글쓰기 창에서는 제목·본문 넣기와 되돌리기가 열려요. 본문을 통째로 바꾸거나 사진을 넣는 것, 편집기 창을 닫는 것, 지우기는 **항상 허용에 포함되지 않아요** — 그 설정으로는 열리지 않습니다. 요금이 드는 기능은 어떤 설정으로도 열리지 않고, 실행 전에 **매번** 물어봐요.
|
|
201
239
|
- **발행은 하지 않아요.** 글을 올리거나 공개하는 기능은 연결되지 않습니다 — 고친 내용은 글쓰기 창에 남고, 올릴지는 사용자가 직접 정해요.
|
|
202
240
|
- **아이디·비밀번호·쿠키를 저장하지 않아요.** 네이버에 직접 접속하지도 않아요. 모든 조회는 내가 로그인해 둔 내 브라우저 안에서 일어나요.
|
|
203
241
|
- **내 컴퓨터 안에서만 동작해요.** 밖에서는 접속할 수 없고, 연결 토큰과 확장 확인이라는 이중 잠금이 걸려 있어요.
|
|
@@ -210,7 +248,7 @@ AI가 "그런 기능은 없다" 고 답하면, **"도구 목록을 확인해 보
|
|
|
210
248
|
1. 터미널에서 아래 명령을 실행해요(AI 앱에 등록된 설정을 지워 줘요).
|
|
211
249
|
|
|
212
250
|
```
|
|
213
|
-
npx -y @modootoday/datalab-extension-mcp@1.
|
|
251
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.0 uninstall
|
|
214
252
|
```
|
|
215
253
|
|
|
216
254
|
2. 확장 설정에서 **MCP 연결을 꺼요.** 패널이 브릿지라, 꺼 두면 어딘가 설정 줄이 남아 있어도 AI 앱이 아무것도 조회할 수 없어요.
|
|
@@ -246,7 +284,7 @@ AI가 "그런 기능은 없다" 고 답하면, **"도구 목록을 확인해 보
|
|
|
246
284
|
| `DATALAB_MCP_PORT` | 선택 | `8765` | 수신 포트. |
|
|
247
285
|
| `DATALAB_MCP_HOST` | 선택 | `127.0.0.1` | 바인드 주소. loopback 외 값은 거부. |
|
|
248
286
|
|
|
249
|
-
**호출 한도** —
|
|
287
|
+
**호출 한도** — 커넥터 하나가 `10`회까지 몰아 부를 수 있고 초당 `1`회씩 다시 찹니다. 브라우저를 여러 대 연결했다면 그 예산을 **함께 씁니다**. 요금 제한이 아니라 폭주 루프 완충용이라 평범한 사용에서는 닿지 않습니다.
|
|
250
288
|
|
|
251
289
|
**실패 응답** — 도구 호출 실패는 프로토콜 오류가 아니라 `isError` 결과로 오고, 본문은 성공과 같은 JSON입니다(`ok` / `reason` / `message` / `retryable`, 기다리면 풀리는 경우 `retryAfterMs`). 실패 코드 전체 목록과 각각의 재시도 여부 정본: <https://github.com/modootoday/datalab-extension-mcp/blob/main/mcp-core/src/errors.ts>
|
|
252
290
|
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_HOST,
|
|
3
|
+
DEFAULT_PORT
|
|
4
|
+
} from "./chunk-6JBLBCLU.js";
|
|
5
|
+
import {
|
|
6
|
+
TOKEN_PROMPT_GUIDE,
|
|
7
|
+
TOKEN_PROMPT_QUESTION,
|
|
8
|
+
TOKEN_REQUIRED_NON_INTERACTIVE
|
|
9
|
+
} from "./chunk-5S7RFXIU.js";
|
|
10
|
+
import "./chunk-MLKGABMK.js";
|
|
11
|
+
|
|
12
|
+
// src/browsers.ts
|
|
13
|
+
function flagValue(argv, flag) {
|
|
14
|
+
const at = argv.indexOf(flag);
|
|
15
|
+
if (at === -1) return void 0;
|
|
16
|
+
const value = argv[at + 1]?.trim();
|
|
17
|
+
return value && !value.startsWith("-") ? value : void 0;
|
|
18
|
+
}
|
|
19
|
+
function withoutFlag(argv, flag) {
|
|
20
|
+
const at = argv.indexOf(flag);
|
|
21
|
+
if (at === -1) return [...argv];
|
|
22
|
+
return [...argv.slice(0, at), ...argv.slice(at + 2)];
|
|
23
|
+
}
|
|
24
|
+
async function ask(deps) {
|
|
25
|
+
if (!deps.prompt) return void 0;
|
|
26
|
+
deps.out(TOKEN_PROMPT_GUIDE);
|
|
27
|
+
const answer = (await deps.prompt(TOKEN_PROMPT_QUESTION)).trim();
|
|
28
|
+
return answer.length > 0 ? answer : void 0;
|
|
29
|
+
}
|
|
30
|
+
async function runBrowsers(argv, deps) {
|
|
31
|
+
const flagged = flagValue(argv, "--token");
|
|
32
|
+
const token = flagged ?? deps.env["DATALAB_MCP_TOKEN"]?.trim() ?? await ask(deps);
|
|
33
|
+
if (!token) {
|
|
34
|
+
deps.out(TOKEN_REQUIRED_NON_INTERACTIVE);
|
|
35
|
+
return 1;
|
|
36
|
+
}
|
|
37
|
+
const host = deps.env["DATALAB_MCP_HOST"]?.trim() || DEFAULT_HOST;
|
|
38
|
+
const port = deps.env["DATALAB_MCP_PORT"]?.trim() || String(DEFAULT_PORT);
|
|
39
|
+
const url = `http://${host}:${port}/mcp/browsers`;
|
|
40
|
+
const send = deps.fetchImpl ?? globalThis.fetch;
|
|
41
|
+
const rest = withoutFlag(argv, "--token");
|
|
42
|
+
const action = rest[0] ?? "list";
|
|
43
|
+
if (action !== "add" && action !== "list" && action !== "revoke") {
|
|
44
|
+
deps.out(
|
|
45
|
+
`usage: browsers [add <label>|list|revoke <handle>] [--token <t>]`
|
|
46
|
+
);
|
|
47
|
+
return 2;
|
|
48
|
+
}
|
|
49
|
+
let body;
|
|
50
|
+
if (action === "add") {
|
|
51
|
+
const label = rest.slice(1).join(" ").trim();
|
|
52
|
+
if (!label) {
|
|
53
|
+
deps.out("usage: browsers add <label> (e.g. browsers add \uD68C\uC0AC \uD06C\uB86C)");
|
|
54
|
+
return 2;
|
|
55
|
+
}
|
|
56
|
+
body = { token, action, label };
|
|
57
|
+
} else if (action === "revoke") {
|
|
58
|
+
const handle = rest[1]?.trim();
|
|
59
|
+
if (!handle) {
|
|
60
|
+
deps.out("usage: browsers revoke <handle> (see: browsers list)");
|
|
61
|
+
return 2;
|
|
62
|
+
}
|
|
63
|
+
body = { token, action, handle };
|
|
64
|
+
} else {
|
|
65
|
+
body = { token, action };
|
|
66
|
+
}
|
|
67
|
+
let raw;
|
|
68
|
+
try {
|
|
69
|
+
raw = await send(url, {
|
|
70
|
+
method: "POST",
|
|
71
|
+
headers: { "content-type": "application/json" },
|
|
72
|
+
body: JSON.stringify(body)
|
|
73
|
+
}).then((r) => r.text());
|
|
74
|
+
} catch {
|
|
75
|
+
deps.out("The connector is not running.");
|
|
76
|
+
deps.out("Open the AI app you paired, then run this again.");
|
|
77
|
+
return 1;
|
|
78
|
+
}
|
|
79
|
+
let parsed;
|
|
80
|
+
try {
|
|
81
|
+
parsed = JSON.parse(raw);
|
|
82
|
+
} catch {
|
|
83
|
+
deps.out(`Something else is answering on port ${port}.`);
|
|
84
|
+
deps.out("Close it, or point the connector at another port, then retry.");
|
|
85
|
+
return 1;
|
|
86
|
+
}
|
|
87
|
+
if (parsed["ok"] !== true) {
|
|
88
|
+
const why = String(parsed["error"] ?? "unknown");
|
|
89
|
+
deps.out(`Refused: ${why}`);
|
|
90
|
+
if (typeof parsed["detail"] === "string")
|
|
91
|
+
deps.out(String(parsed["detail"]));
|
|
92
|
+
return 1;
|
|
93
|
+
}
|
|
94
|
+
if (action === "list") {
|
|
95
|
+
const rows = parsed["browsers"] ?? [];
|
|
96
|
+
if (rows.length === 0) {
|
|
97
|
+
deps.out("No browsers registered.");
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
for (const row of rows) {
|
|
101
|
+
const state = row.browserId === null ? "waiting" : "connected";
|
|
102
|
+
deps.out(`${row.handle} ${state.padEnd(9)} ${row.label}`);
|
|
103
|
+
}
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
if (action === "revoke") {
|
|
107
|
+
deps.out(
|
|
108
|
+
parsed["removed"] === true ? "Revoked." : "No browser by that handle."
|
|
109
|
+
);
|
|
110
|
+
return parsed["removed"] === true ? 0 : 1;
|
|
111
|
+
}
|
|
112
|
+
deps.out(`Registered ${String(parsed["handle"])}.`);
|
|
113
|
+
deps.out(`Paste this into the browser's panel \u2014 it is shown only now:`);
|
|
114
|
+
deps.out(String(parsed["token"]));
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
export {
|
|
118
|
+
runBrowsers
|
|
119
|
+
};
|