dodo-mcp 1.2.1 → 1.3.1
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 +37 -6
- package/dist/cli/dataRecovery.js +38 -0
- package/dist/cli/dataRecovery.js.map +1 -0
- package/dist/cli/deployment.js +61 -0
- package/dist/cli/deployment.js.map +1 -0
- package/dist/cli/main.js +36 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/config/globalConfig.js +3 -5
- package/dist/config/globalConfig.js.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/ipc/server.js +2 -0
- package/dist/ipc/server.js.map +1 -1
- package/dist/ipc/timeouts.js +5 -0
- package/dist/ipc/timeouts.js.map +1 -0
- package/dist/platform/privateFs.js +32 -3
- package/dist/platform/privateFs.js.map +1 -1
- package/dist/platform/windowsPrivateAcl.js +90 -0
- package/dist/platform/windowsPrivateAcl.js.map +1 -0
- package/dist/security/outboundAddress.js +20 -0
- package/dist/security/outboundAddress.js.map +1 -0
- package/dist/server/aiAdmin.js +21 -24
- package/dist/server/aiAdmin.js.map +1 -1
- package/dist/server/appServer.js +3 -6
- package/dist/server/appServer.js.map +1 -1
- package/dist/server/bootstrap.js +14 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/configSession.js +21 -0
- package/dist/server/configSession.js.map +1 -0
- package/dist/server/configUi/index.html +3 -0
- package/dist/server/configUi/ui/dataRecovery.js +90 -0
- package/dist/server/configUi/ui/deployment.js +111 -0
- package/dist/server/configUi/ui/recovery.js +167 -0
- package/dist/server/configUi/workbench.js +23 -7
- package/dist/server/installationRuntime.js +3 -1
- package/dist/server/installationRuntime.js.map +1 -1
- package/dist/server/instructions.js.map +1 -1
- package/dist/server/ipcDispatch.js +219 -0
- package/dist/server/ipcDispatch.js.map +1 -1
- package/dist/server/localConfig.js +34 -11
- package/dist/server/localConfig.js.map +1 -1
- package/dist/server/remoteConfig.js +23 -13
- package/dist/server/remoteConfig.js.map +1 -1
- package/dist/server/stdioServer.js +2 -5
- package/dist/server/stdioServer.js.map +1 -1
- package/dist/services/ai/network.js +1 -18
- package/dist/services/ai/network.js.map +1 -1
- package/dist/services/ai/subagents.js +5 -2
- package/dist/services/ai/subagents.js.map +1 -1
- package/dist/services/assistance/verification.js +43 -10
- package/dist/services/assistance/verification.js.map +1 -1
- package/dist/services/changes/applier.js +472 -297
- package/dist/services/changes/applier.js.map +1 -1
- package/dist/services/git/gitService.js +150 -34
- package/dist/services/git/gitService.js.map +1 -1
- package/dist/services/jobs/jobManager.js +59 -2
- package/dist/services/jobs/jobManager.js.map +1 -1
- package/dist/services/jobs/spool.js +9 -3
- package/dist/services/jobs/spool.js.map +1 -1
- package/dist/services/multimodal/mediaService.js +6 -6
- package/dist/services/multimodal/mediaService.js.map +1 -1
- package/dist/services/recovery/configKeys.js +115 -0
- package/dist/services/recovery/configKeys.js.map +1 -0
- package/dist/services/recovery/configVault.js +361 -0
- package/dist/services/recovery/configVault.js.map +1 -0
- package/dist/services/recovery/contracts.js +24 -0
- package/dist/services/recovery/contracts.js.map +1 -0
- package/dist/services/recovery/databaseAwareness.js +179 -0
- package/dist/services/recovery/databaseAwareness.js.map +1 -0
- package/dist/services/recovery/deploymentArchive.js +129 -0
- package/dist/services/recovery/deploymentArchive.js.map +1 -0
- package/dist/services/recovery/deploymentContracts.js +70 -0
- package/dist/services/recovery/deploymentContracts.js.map +1 -0
- package/dist/services/recovery/deploymentHealth.js +143 -0
- package/dist/services/recovery/deploymentHealth.js.map +1 -0
- package/dist/services/recovery/deploymentMaintenance.js +197 -0
- package/dist/services/recovery/deploymentMaintenance.js.map +1 -0
- package/dist/services/recovery/deploymentService.js +429 -0
- package/dist/services/recovery/deploymentService.js.map +1 -0
- package/dist/services/recovery/deploymentSource.js +36 -0
- package/dist/services/recovery/deploymentSource.js.map +1 -0
- package/dist/services/recovery/dockerDeployment.js +172 -0
- package/dist/services/recovery/dockerDeployment.js.map +1 -0
- package/dist/services/recovery/drift.js +178 -0
- package/dist/services/recovery/drift.js.map +1 -0
- package/dist/services/recovery/evidence.js +127 -0
- package/dist/services/recovery/evidence.js.map +1 -0
- package/dist/services/recovery/gitCopies.js +219 -0
- package/dist/services/recovery/gitCopies.js.map +1 -0
- package/dist/services/recovery/history.js +423 -0
- package/dist/services/recovery/history.js.map +1 -0
- package/dist/services/recovery/recoveryService.js +521 -0
- package/dist/services/recovery/recoveryService.js.map +1 -0
- package/dist/services/recovery/storage.js +344 -0
- package/dist/services/recovery/storage.js.map +1 -0
- package/dist/services/schedules/scheduleService.js +9 -10
- package/dist/services/schedules/scheduleService.js.map +1 -1
- package/dist/store/db.js +71 -0
- package/dist/store/db.js.map +1 -1
- package/dist/tools/catalog.js +4 -0
- package/dist/tools/catalog.js.map +1 -1
- package/dist/tools/changeTools.js +1 -1
- package/dist/tools/changeTools.js.map +1 -1
- package/dist/tools/context.js +23 -3
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/deploymentTools.js +58 -0
- package/dist/tools/deploymentTools.js.map +1 -0
- package/dist/tools/directTools.js +9 -5
- package/dist/tools/directTools.js.map +1 -1
- package/dist/tools/gitTools.js +7 -2
- package/dist/tools/gitTools.js.map +1 -1
- package/dist/tools/jobTools.js +4 -4
- package/dist/tools/jobTools.js.map +1 -1
- package/dist/tools/projectTools.js +1 -0
- package/dist/tools/projectTools.js.map +1 -1
- package/dist/tools/recoveryTools.js +79 -0
- package/dist/tools/recoveryTools.js.map +1 -0
- package/dist/tools/runtimeTools.js +1 -1
- package/dist/tools/runtimeTools.js.map +1 -1
- package/dist/tools/surface.js +6 -1
- package/dist/tools/surface.js.map +1 -1
- package/dist/tunnel/credentials.js +1 -1
- package/dist/tunnel/credentials.js.map +1 -1
- package/docs/ARCHITECTURE.md +92 -2
- package/docs/CI.md +118 -0
- package/docs/COMPATIBILITY.md +7 -6
- package/docs/EVALUATION.md +17 -12
- package/docs/MANUAL_ACCEPTANCE.md +72 -2
- package/docs/MCP_CONNECTIONS.md +238 -0
- package/docs/RECOVERY.md +448 -0
- package/docs/RELEASE_1.3.0.md +64 -0
- package/docs/RELEASE_1.3.1.md +49 -0
- package/docs/RELEASE_NOTES.md +31 -0
- package/docs/SECURITY.md +123 -0
- package/docs/TEST_REPORT.md +312 -5
- package/docs/TUNNEL.md +6 -0
- package/docs/WEB_CLIENTS.md +3 -0
- package/docs/adr/047-temporary-remote-config.md +11 -0
- package/docs/adr/051-source-recovery-foundation.md +45 -0
- package/docs/adr/052-reviewed-source-restore.md +50 -0
- package/docs/adr/053-content-drift-and-private-git-recovery.md +29 -0
- package/docs/adr/054-verified-source-checkpoints.md +58 -0
- package/docs/adr/055-reviewed-docker-deployments.md +42 -0
- package/docs/adr/056-owner-data-recovery.md +47 -0
- package/docs/adr/README.md +7 -0
- package/native/private-state-windows.cs +105 -0
- package/package.json +8 -1
- package/schemas/global-config.schema.json +34 -0
- package/schemas/tools.compact.json +175 -15
- package/schemas/tools.hybrid.json +350 -16
- package/schemas/tools.json +4883 -816
package/docs/COMPATIBILITY.md
CHANGED
|
@@ -29,10 +29,10 @@ Effectful tools และ jobs ยังทำงานใน active workspace
|
|
|
29
29
|
## Tool surfaces
|
|
30
30
|
|
|
31
31
|
- HTTP default: Compact 20 tools
|
|
32
|
-
- STDIO default: Full
|
|
32
|
+
- STDIO default: Full 154 tools; เปิด Sub-agent MCP exposure แล้วเป็น 158
|
|
33
33
|
- explicit Hybrid: 49 tools
|
|
34
34
|
|
|
35
|
-
Complete capability schema มี
|
|
35
|
+
Complete capability schema มี 158 operations ค่าเริ่มต้น `exposeSubagentsToMcp=false`
|
|
36
36
|
ซ่อน `subagent_spawn/status/result/control` จาก MCP เท่านั้น หน้าเว็บ Chat & Tasks ยัง
|
|
37
37
|
ใช้ได้ Compact/Hybrid คงจำนวน 20/49 tool names แต่กรอง operation enum, instructions
|
|
38
38
|
และ discover index ให้ตรงกับ live runtime หลังเปลี่ยนค่าต้อง restart และให้ client
|
|
@@ -95,10 +95,11 @@ Directory guard ไม่ใช่ OS sandbox, repository instructions ไม่
|
|
|
95
95
|
## Evaluation evidence
|
|
96
96
|
|
|
97
97
|
DodoBench local fixture ใช้ยืนยัน contract บน platform/revision ที่ report ระบุเท่านั้น
|
|
98
|
-
ผลของ macOS ไม่แทน Linux และ Linux
|
|
99
|
-
หลักฐาน macOS local และ Linux
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
ผลของ macOS ไม่แทน Linux และ Linux ไม่แทน Windows native Release gate ต้องมี
|
|
99
|
+
หลักฐาน macOS local และ Linux native CI ที่ clean revision/source fingerprint/lock digest ตรงกัน
|
|
100
|
+
Dedicated self-hosted GitHub Actions รัน Linux และ Windows โดยตรงบน Node 22/24
|
|
101
|
+
ไม่ใช้ Docker; ตรวจ Chromium sandbox และ media dependencies บน Linux ก่อนรันทดสอบ
|
|
102
|
+
Workflow รับเฉพาะ trusted main/manual ดู [CI](CI.md) สำหรับ prerequisites และการสั่งรัน
|
|
102
103
|
Windows manual acceptance ยังคง `MANUAL_NOT_RUN` จนกว่าจะทดสอบบน Windows 11 จริง
|
|
103
104
|
|
|
104
105
|
## AI Providers / Multi-project
|
package/docs/EVALUATION.md
CHANGED
|
@@ -47,21 +47,21 @@ write → read → edit → read-back ผ่าน Compact gateway
|
|
|
47
47
|
|
|
48
48
|
## Platform gates
|
|
49
49
|
|
|
50
|
-
macOS รันจาก
|
|
51
|
-
|
|
50
|
+
macOS รันจาก checkout ส่วน Linux และ Windows ใช้ dedicated self-hosted GitHub
|
|
51
|
+
Actions runner โดยตรง ไม่ใช้ Docker:
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
54
|
# macOS บน checkout ปัจจุบัน
|
|
55
55
|
npm run release:gate
|
|
56
56
|
|
|
57
|
-
# Linux
|
|
58
|
-
|
|
57
|
+
# Linux และ Windows native CI / Node 22, 24
|
|
58
|
+
gh workflow run platform-gates.yml --ref main -f platform=all
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
Linux workflow ตรวจ prerequisites, ติดตั้ง dependencies จาก lockfile และ Chromium
|
|
62
|
+
แล้วพิสูจน์ว่า Chromium เปิดด้วย sandbox ได้ก่อนรัน gate อ่าน [CI](CI.md)
|
|
63
|
+
สำหรับการเตรียมเครื่อง ใช้ `npm run release:gate:ci` เช่นเดียวกับ Windows
|
|
64
|
+
ตรวจ Git HEAD ตรง GITHUB_SHA และ source สะอาดก่อนทดสอบ
|
|
65
65
|
|
|
66
66
|
`.github/workflows/platform-gates.yml` ใช้ self-hosted labels `linux-ci` และ
|
|
67
67
|
`windows-ci 02` ทดสอบ Node 22/24 เฉพาะ push ที่ `main` กับ manual dispatch ไม่มี
|
|
@@ -73,10 +73,15 @@ container จากนั้นตรวจ report กลับว่าตร
|
|
|
73
73
|
revision กับ `package-lock.json` เดียวกัน Windows ถูกระบุเป็น
|
|
74
74
|
`DEFERRED_MANUAL_NOT_RUN` และไม่ถูกนับเป็น supported release platform ในช่วงนี้
|
|
75
75
|
Manual external-AI, owner workspace และ Windows 11 อยู่แยกเป็น `MANUAL_NOT_RUN`
|
|
76
|
-
Strict gate รับ Linux evidence เฉพาะ `
|
|
77
|
-
fresh-install PASS
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
Strict gate รับ Linux evidence เฉพาะ `local-git` และ origin `github-actions-native`
|
|
77
|
+
จาก clean checkout พร้อม fresh-install PASS และ suites ที่ผ่านจริง ต้องตรงทั้ง
|
|
78
|
+
revision/source fingerprint/lock digest จึงไม่รับ uncommitted source หรือ Docker
|
|
79
|
+
report เก่ามาแทน native CI Report บันทึก origin ตามจริง ไม่มีคำสั่งเหล่านี้ publish npm
|
|
80
|
+
|
|
81
|
+
ผลทดสอบและ private diagnostics อยู่ใน runner ใต้ `.dodo-ci-evidence/` ข้าง checkout
|
|
82
|
+
แยกตาม run ID/attempt/platform/Node ไม่เขียนทับหลักฐานจากการ rerun หรือ checkout cleanup
|
|
83
|
+
อัปโหลดเฉพาะ allowlisted summary และตำแหน่ง failure ใน test source
|
|
84
|
+
ไม่ส่ง raw test logs หรือ private state ขึ้น artifact
|
|
80
85
|
|
|
81
86
|
## Security invariants
|
|
82
87
|
|
|
@@ -296,10 +296,10 @@ manual external-client acceptance
|
|
|
296
296
|
Automated catalog/API/Chromium/fresh-package fixtures: **AUTOMATED_PASS**
|
|
297
297
|
|
|
298
298
|
1. เปิด Local Config → Settings และตรวจว่าสวิตช์ “เปิดให้ MCP clients เห็น Sub-agent tools” ปิดเป็นค่าเริ่มต้น
|
|
299
|
-
2. ตรวจ Full live catalog มี
|
|
299
|
+
2. ตรวจ Full live catalog มี 154 tools; Compact/Hybrid มี 20/49 ชื่อและ discover หา `subagent_spawn` ไม่พบ
|
|
300
300
|
3. ตรวจ Chat & Tasks ยังสร้างและดูงานได้จากหน้าเว็บ
|
|
301
301
|
4. เปิดสวิตช์ ยืนยันผ่าน dialog แล้วตรวจข้อความว่าต้อง restart/rescan
|
|
302
|
-
5. restart fixture เท่านั้น แล้วตรวจ Full มี
|
|
302
|
+
5. restart fixture เท่านั้น แล้วตรวจ Full มี 158 และ Compact discover/gateway มี `subagent_spawn/status/result/control`
|
|
303
303
|
6. ปิดสวิตช์อีกครั้ง restart และตรวจว่า run history ยังอยู่ แต่ MCP definitions ถูกซ่อน
|
|
304
304
|
|
|
305
305
|
การ restart server จริงและ rescan ผ่าน ChatGPT/remote client จริง: **MANUAL_NOT_RUN**
|
|
@@ -363,3 +363,73 @@ credentials ผ่าน private UI ผลต้องแยกตาม provide
|
|
|
363
363
|
Live OpenAI, Gemini, Claude, MiniMax, GLM, Kimi, Ollama: MANUAL_NOT_RUN สำหรับงานนี้
|
|
364
364
|
จนกว่าจะมีหลักฐานจาก account/model จริง Browser automation และ synthetic Keychain
|
|
365
365
|
round-trip เป็น AUTOMATED_PASS ไม่ใช้แทน MANUAL_PASS ของ provider
|
|
366
|
+
|
|
367
|
+
## Recovery R00–R02
|
|
368
|
+
|
|
369
|
+
Automation uses separate fixture projects, including Chromium desktop/narrow
|
|
370
|
+
owner policy controls. Manual owner-device use and native Windows are
|
|
371
|
+
`MANUAL_NOT_RUN`. R02 adds automated fixture HTTP/owner browser/restore/crash
|
|
372
|
+
coverage. Before a release, an owner should create a fixture checkpoint, edit two
|
|
373
|
+
files, preview one-file and session undo, inspect exact-mirror deletions, verify
|
|
374
|
+
read-back, and inspect journal status after reconnect. Test backup opt-out,
|
|
375
|
+
external-edit conflict and restart with fresh context. Do not exercise this manual
|
|
376
|
+
gate on a production database or count automated browser tests as MANUAL_PASS.
|
|
377
|
+
|
|
378
|
+
## R03 — MANUAL_NOT_RUN on owner projects
|
|
379
|
+
|
|
380
|
+
In disposable projects: capture dirty/staged/untracked source; externally overwrite files while preserving size/mtime; verify target writes refuse and unrelated edits remain available. Review paginated drift, reject stale digest/epoch, then explicitly acknowledge or preview/restore. Verify emergency snapshots do not replace the baseline. Run a command that changes source and check unknown-author attribution after job completion. Confirm independent Git refs/objects, unchanged working index/HEAD/branch, and no hooks/filter markers. Remove the selected backup volume: expect refusal without fallback. Delete source and working `.git` while retaining root identity: preview/restore source only. Root replacement, real removable volumes, native Windows/Android and owner live projects require separate manual acceptance. Browser fixture automation is reported as AUTOMATED_PASS only after it runs.
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
## Recovery R04
|
|
384
|
+
|
|
385
|
+
Fixture browser automation covers project registration, default-on recovery, actual recipe evidence, owner names/pins, stale files, restore read-back and quota-blocked UI on desktop/narrow screens. Before a release, an owner should separately test their own project/storage and restart/reconnect workflow, inspect retained pins/names, and re-run required recipes after source/config changes. Live owner projects, Windows/Android and production/database recovery are MANUAL_NOT_RUN for this phase. Do not label a manual owner name as tested or production-known-good.
|
|
386
|
+
|
|
387
|
+
## Docker deployment and recovery
|
|
388
|
+
|
|
389
|
+
AUTOMATED_PASS (disposable local daemon fixture, native Node): real build/image
|
|
390
|
+
source verification, deploy/health/stabilization, failure preserving known-good,
|
|
391
|
+
reviewed image rollback, source restore without restarting service, unchanged
|
|
392
|
+
SQLite rows/migration metadata/private fixture config in an existing named volume,
|
|
393
|
+
image pin/review conflicts and exact cleanup. These results are separate from
|
|
394
|
+
native Windows/Linux release gates and do not certify a user's daemon/context.
|
|
395
|
+
|
|
396
|
+
MANUAL_NOT_RUN: owner production, remote Docker contexts, Windows/Linux Docker
|
|
397
|
+
engines, long-duration stabilization and manual browser deployment. Before opting
|
|
398
|
+
in, review the target's daemon authority and use a disposable project/service to
|
|
399
|
+
exercise interrupted build/deploy, live observation, probe cleanup, reconnect,
|
|
400
|
+
expired approval and reviewed rollback. Source/database recovery remain distinct.
|
|
401
|
+
|
|
402
|
+
## database/config recovery — MANUAL_NOT_RUN on owner data
|
|
403
|
+
|
|
404
|
+
Use disposable SQLite and a synthetic private `.env`, never production secrets.
|
|
405
|
+
Enable the migration adapter through the project page; verify unbound UNKNOWN,
|
|
406
|
+
owner-rule COMPATIBLE, and mismatched IDs blocking restore without changing rows.
|
|
407
|
+
Check external migration drift during a source restore, and explicitly review the
|
|
408
|
+
warning-only alternative if selected. Database undo/PITR remains unsupported.
|
|
409
|
+
|
|
410
|
+
For each OS credential provider, opt in a synthetic file, verify actual key-store
|
|
411
|
+
access, encrypted backup, redacted preview and exact read-back. Rotate; verify old
|
|
412
|
+
copies still need old keys. Lock/refuse the OS store and confirm no fallback.
|
|
413
|
+
Stop dependent fixture services before in-place restore. Test restart/reconnect
|
|
414
|
+
using the recorded receipt; UNKNOWN must not repeat writes. Review retention,
|
|
415
|
+
missing-file disable and recovery from the encrypted before-copy. Confirm no
|
|
416
|
+
secrets in MCP, public routes, browser storage, logs, source snapshots or tarball.
|
|
417
|
+
|
|
418
|
+
Automated browser/protocol tests are AUTOMATED_PASS only when reported. A real
|
|
419
|
+
Keychain fixture round-trip is not a manual Windows Credential Manager or Linux
|
|
420
|
+
Secret Service pass. Android encryption-provider support is NOT_SUPPORTED. Record
|
|
421
|
+
each OS and owner-production/manual case independently; no generic DB rollback
|
|
422
|
+
or disaster-recovery success is implied.
|
|
423
|
+
|
|
424
|
+
## 1.3.1 Config renewal and AI clients
|
|
425
|
+
|
|
426
|
+
- Keep an isolated fixture running over eight hours. Verify the old Local Config
|
|
427
|
+
link denies API access, then run `dodo --web`, pair, open Projects/AI settings and
|
|
428
|
+
save a fixture setting. MCP must retain its workspace epoch.
|
|
429
|
+
- Close/reopen from CLI; old code/cookie must fail, new pairing must work.
|
|
430
|
+
- Repeat in Cloudflare Local and DODO Tunnel with a real HTTPS route.
|
|
431
|
+
- Follow [MCP connections](MCP_CONNECTIONS.md) per client: overview, fixture
|
|
432
|
+
create/read/edit/read-back/delete. Record each client and version separately.
|
|
433
|
+
- Real external AI accounts, physical eight-hour waiting and real Cloudflare
|
|
434
|
+
routes are MANUAL_NOT_RUN for this patch unless separately recorded. Automated
|
|
435
|
+
tests advance the server clock and use isolated HTTP/browser fixtures.
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# เชื่อม DODO MCP กับ AI platforms
|
|
2
|
+
|
|
3
|
+
คู่มือสำหรับเจ้าของ DODO ตรวจเอกสารของ client เมื่อ 25 กันยายน 2026
|
|
4
|
+
ชื่อเมนูอาจต่างตามรุ่นและแผนบัญชี คู่มือนี้ไม่ใช่หลักฐานว่าทดสอบกับบัญชีจริงครบทุกค่าย
|
|
5
|
+
|
|
6
|
+
## เลือกวิธีเชื่อม
|
|
7
|
+
|
|
8
|
+
| Client | วิธีในคู่มือนี้ | สิ่งที่ต้องเตรียม |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| ChatGPT web | Public HTTPS + OAuth | DODO/Tunnel ที่เปิดอยู่ และ OAuth client ของ ChatGPT |
|
|
11
|
+
| Claude web / Desktop Custom Connector | Public HTTPS + OAuth | OAuth client ของ Claude แยกต่างหาก |
|
|
12
|
+
| Claude Code | Local STDIO | DODO CLI และ absolute project path |
|
|
13
|
+
| Codex CLI | Local STDIO | DODO CLI และ absolute project path |
|
|
14
|
+
| Gemini CLI | Local STDIO | DODO CLI และ absolute project path |
|
|
15
|
+
| Cursor | Local STDIO | MCP JSON และ absolute project path |
|
|
16
|
+
| VS Code / GitHub Copilot | Local STDIO | MCP JSON และ absolute project path |
|
|
17
|
+
|
|
18
|
+
Gemini CLI ไม่ใช่ Gemini web; Claude Code ไม่ใช่ Claude Desktop Custom Connector
|
|
19
|
+
และการเพิ่ม API provider ในหน้า DODO ก็เป็นคนละเรื่องกับการให้ AI ภายนอกเรียก MCP
|
|
20
|
+
|
|
21
|
+
## URL แต่ละตัวใช้ทำอะไร
|
|
22
|
+
|
|
23
|
+
| ค่า | ตัวอย่าง | ใช้ทำอะไร |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| Public origin | `https://dodo.example.com` | ตั้งโดเมนใน DODO/Tunnel |
|
|
26
|
+
| Public MCP URL | `https://dodo.example.com/mcp` | ใส่ช่อง MCP Server URL ใน AI |
|
|
27
|
+
| Remote Config | `https://dodo.example.com/config` | เจ้าของตั้งค่า หลังสั่ง `dodo --web` และจับคู่ |
|
|
28
|
+
| Local Config | `http://127.0.0.1:21731/` | เจ้าของตั้งค่าบนเครื่อง ผ่าน private link ใน Terminal |
|
|
29
|
+
| OAuth callback | URL ของ AI client | ลงทะเบียนด้วย `dodo auth add-client` เท่านั้น |
|
|
30
|
+
|
|
31
|
+
แทนโดเมนตัวอย่างด้วยโดเมนจริง ห้ามนำ `/config`, private link หรือ OAuth callback
|
|
32
|
+
ไปกรอกเป็น MCP Server URL ห้ามวาง Markdown `[ชื่อ](URL)` ในช่อง URI
|
|
33
|
+
|
|
34
|
+
## เตรียม DODO สำหรับ web clients ครั้งเดียว
|
|
35
|
+
|
|
36
|
+
1. ติดตั้ง `npm install -g dodo-mcp@latest` แล้วตรวจ `dodo --version`
|
|
37
|
+
2. ตั้ง **Cloudflare Local** หากดูแล cloudflared เอง หรือ **DODO Tunnel** หากให้ DODO
|
|
38
|
+
ดูแล โดยใช้ public origin จริง ดู [คู่มือ Tunnel](TUNNEL.md)
|
|
39
|
+
3. Tunnel ต้อง route **ทุก path** ของโดเมนไป `http://127.0.0.1:21730`
|
|
40
|
+
เพื่อให้ OAuth discovery/authorize/token เข้าถึงได้ด้วย ไม่เปิด 21731 หรือ 21732
|
|
41
|
+
4. รัน `dodo start` และเปิดค้างไว้ ถ้ารันอยู่แล้วไม่ต้องเปิดซ้ำ
|
|
42
|
+
5. เพิ่มโปรเจกต์ใน Config พร้อมระดับอ่าน/แก้/รันที่ต้องการ Managed mode ต้องกำหนด
|
|
43
|
+
client ACL ด้วย ส่วน personal mode ใช้ OAuth scopes ร่วมกับ project access level
|
|
44
|
+
|
|
45
|
+
รันคำสั่ง auth บนเครื่องและ OS user เดียวกับ server ใช้ `DODO_CONFIG_DIR` เดียวกัน
|
|
46
|
+
ทำจากโฟลเดอร์ใดก็ได้ อย่าสลับ Admin/User บน Windows แล้วคาดว่าจะเป็น installation เดียวกัน
|
|
47
|
+
|
|
48
|
+
## ChatGPT web
|
|
49
|
+
|
|
50
|
+
1. เปิด Developer mode ในบัญชี/องค์กรที่มีสิทธิ์ แล้วเปิดหน้าจัดการ MCP app/plugin
|
|
51
|
+
(ปัจจุบันที่ `https://chatgpt.com/plugins`; บางบัญชียังใช้ Settings → Apps)
|
|
52
|
+
2. ตั้งชื่อ `DODO`, URL เป็น Public MCP URL, Authentication เป็น **OAuth**
|
|
53
|
+
3. สร้าง client บนเครื่อง DODO ด้วยคำสั่งบรรทัดเดียว:
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
dodo auth add-client --name "ChatGPT" --redirect-uri "https://chatgpt.com/connector_platform_oauth_redirect"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
4. กรอก `client_id` และ `client_secret` ที่ได้ในช่อง OAuth Client ID/Secret
|
|
60
|
+
ค่านี้แสดงครั้งเดียว ไม่ใช่ API key ของ OpenAI และไม่ต้องส่งเข้าแชต
|
|
61
|
+
5. กด Connect/Scan Tools แล้วทำ [ขั้นตอนอนุมัติ](#อนุมัติการเชื่อมต่อจาก-terminal)
|
|
62
|
+
6. เปิดแชตใหม่ เลือก DODO แล้วทดสอบ overview ก่อนแก้ไฟล์
|
|
63
|
+
|
|
64
|
+
หากหน้า MCP management แสดง callback เฉพาะ connection ให้ลงทะเบียน **ค่าที่แสดงจริง**
|
|
65
|
+
แทนคำสั่งตัวอย่าง ห้ามใช้ wildcard หรือเดา callback ID
|
|
66
|
+
ดู [OAuth callback และ static client](https://developers.openai.com/plugins/build/auth)
|
|
67
|
+
กับ [ขั้นตอนเชื่อม ChatGPT](https://developers.openai.com/plugins/deploy/connect-chatgpt)
|
|
68
|
+
|
|
69
|
+
## Claude web / Claude Desktop Custom Connector
|
|
70
|
+
|
|
71
|
+
สร้าง client แยกจาก ChatGPT:
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
dodo auth add-client --name "Claude" --redirect-uri "https://claude.ai/api/mcp/auth_callback"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
ใน Claude ไปที่ **Customize → Connectors → + → Add custom connector**
|
|
78
|
+
(Team/Enterprise อาจต้องให้ Owner เพิ่ม connector ขององค์กรก่อน)
|
|
79
|
+
|
|
80
|
+
| ช่อง | ค่า |
|
|
81
|
+
|---|---|
|
|
82
|
+
| Name | `DODO` |
|
|
83
|
+
| Remote MCP server URL | `https://dodo.example.com/mcp` โดยแทนโดเมนจริง |
|
|
84
|
+
| Authentication | **Sign in now** |
|
|
85
|
+
| OAuth client | **Use your own OAuth client** |
|
|
86
|
+
| OAuth Client ID | `client_id` จากคำสั่ง Claude ด้านบน |
|
|
87
|
+
| OAuth Client Secret | `client_secret` คู่กัน |
|
|
88
|
+
| Request headers | เว้นว่าง |
|
|
89
|
+
|
|
90
|
+
DODO ใช้ static registration จึงไม่เลือก Register automatically (DCR) หรือ
|
|
91
|
+
Use Claude's published identity (CIMD) กด Add → Connect แล้วอนุมัติใน Terminal
|
|
92
|
+
เปิดแชตและเลือก **+ → Connectors → DODO**
|
|
93
|
+
|
|
94
|
+
ถ้า Desktop เปิด `claude.ai/login?returnTo=...` แล้วหน้าว่าง ให้ลองเข้า
|
|
95
|
+
`https://claude.ai/` ในเบราว์เซอร์ปกติ ล็อกอินบัญชี/องค์กรเดียวกัน และกด Connect
|
|
96
|
+
จากหน้าเว็บ ไม่ต้องสร้าง credentials ใหม่ ตรวจ browser extensions/cookies ถ้าแม้หน้าแรกก็ว่าง
|
|
97
|
+
ยังไม่ควรสรุปว่า Tunnel เสียจาก URL หน้า login เพียงอย่างเดียว
|
|
98
|
+
|
|
99
|
+
แหล่งอ้างอิง: [Claude connector setup](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp),
|
|
100
|
+
[callback และ static credentials](https://claude.com/docs/connectors/building)
|
|
101
|
+
|
|
102
|
+
## อนุมัติการเชื่อมต่อจาก Terminal
|
|
103
|
+
|
|
104
|
+
เมื่อ browser เปิดหน้ารออนุมัติของ DODO ให้เปิด Terminal อีกหน้าต่างบนเครื่อง DODO:
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
dodo auth pending
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
ตรวจชื่อ client, callback, scopes และรหัสยืนยันว่าตรงกับการเชื่อมต่อที่เพิ่งเริ่ม แล้วรัน:
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
dodo auth approve REQUEST_ID
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
แทน `REQUEST_ID` ด้วย ID จริง ไม่ใส่ `< >` หรือ `--` นำหน้า
|
|
117
|
+
Browser จะกลับไป AI client เมื่อสำเร็จ ไม่มี pending หมายถึงยังไม่มีคำขอรออนุมัติ
|
|
118
|
+
หากขึ้น no running server ให้ตรวจเครื่อง, OS user, state directory และ server ที่เปิดอยู่
|
|
119
|
+
เก็บ Client Secret ในช่องตั้งค่า client เท่านั้น ไม่ใส่ URL/headers/log/แชต
|
|
120
|
+
|
|
121
|
+
## Claude Code และ Codex CLI ในเครื่อง
|
|
122
|
+
|
|
123
|
+
แทน `/absolute/path/to/project` ด้วยโฟลเดอร์จริง และติดตั้ง DODO ให้เรียกจาก PATH ได้
|
|
124
|
+
ให้ AI client เป็นผู้เปิด STDIO subprocess; ไม่ต้องเปิด `dodo start` สำหรับ subprocess นี้
|
|
125
|
+
อย่าเปิดหลาย DODO processes ครอบ root เดียวกัน หาก root ถูกใช้อยู่ให้เลือก HTTP connection
|
|
126
|
+
หรือปิด process เดิมด้วยเจ้าของก่อน
|
|
127
|
+
|
|
128
|
+
Claude Code:
|
|
129
|
+
|
|
130
|
+
```text
|
|
131
|
+
claude mcp add --transport stdio --scope user dodo -- dodo stdio --root "/absolute/path/to/project"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
ตรวจด้วย `claude mcp list` และ `/mcp` ใน Claude Code
|
|
135
|
+
อ้างอิง [Claude Code MCP](https://code.claude.com/docs/en/mcp)
|
|
136
|
+
|
|
137
|
+
Codex CLI:
|
|
138
|
+
|
|
139
|
+
```text
|
|
140
|
+
codex mcp add dodo -- dodo stdio --root "/absolute/path/to/project"
|
|
141
|
+
codex mcp list
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
อ้างอิง [Codex MCP](https://developers.openai.com/codex/mcp/)
|
|
145
|
+
|
|
146
|
+
## Gemini CLI และ Cursor
|
|
147
|
+
|
|
148
|
+
Gemini CLI: เพิ่ม entry นี้ใน **user** `~/.gemini/settings.json` โดยรวมกับค่าเดิม
|
|
149
|
+
อย่าเขียนทับทั้งไฟล์ ส่วน Cursor ใช้ **user** `~/.cursor/mcp.json` รูปแบบเดียวกัน:
|
|
150
|
+
|
|
151
|
+
```json
|
|
152
|
+
{
|
|
153
|
+
"mcpServers": {
|
|
154
|
+
"dodo": {
|
|
155
|
+
"command": "dodo",
|
|
156
|
+
"args": ["stdio", "--root", "/absolute/path/to/project"]
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
เปิด client ใหม่ ตรวจ Gemini ด้วย `gemini mcp list` หรือ `/mcp`
|
|
163
|
+
และตรวจ Cursor ที่หน้าจัดการ MCP ของ Settings
|
|
164
|
+
อ้างอิง [Gemini CLI MCP](https://geminicli.com/docs/tools/mcp-server/)
|
|
165
|
+
และ [Cursor MCP](https://cursor.com/docs/mcp)
|
|
166
|
+
|
|
167
|
+
## VS Code / GitHub Copilot
|
|
168
|
+
|
|
169
|
+
เปิด Command Palette → **MCP: Open User Configuration** แล้วรวม entry นี้กับ config เดิม:
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"servers": {
|
|
174
|
+
"dodo": {
|
|
175
|
+
"type": "stdio",
|
|
176
|
+
"command": "dodo",
|
|
177
|
+
"args": ["stdio", "--root", "/absolute/path/to/project"]
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
ใช้ **MCP: List Servers** เริ่ม server แล้วเลือก tools ใน chat
|
|
184
|
+
อ้างอิง [VS Code MCP](https://code.visualstudio.com/docs/agent-customization/mcp-servers)
|
|
185
|
+
|
|
186
|
+
### Windows และ GUI ที่หา dodo ไม่พบ
|
|
187
|
+
|
|
188
|
+
ใช้ path รูปแบบ `C:/Users/YourName/Projects/demo` ใน JSON เพื่อลดปัญหา backslash
|
|
189
|
+
ถ้า client เปิด npm command shim ไม่ได้ ให้ใช้ Node กับ entry point จริง:
|
|
190
|
+
|
|
191
|
+
1. รัน `where.exe node` และ `npm root -g`
|
|
192
|
+
2. ตั้ง `command` เป็น absolute path ของ `node.exe`
|
|
193
|
+
3. ตั้ง `args` เป็น `["GLOBAL_NPM_ROOT/dodo-mcp/dist/cli/main.js", "stdio", "--root", "C:/path/to/project"]`
|
|
194
|
+
โดยแทน `GLOBAL_NPM_ROOT` ด้วยผลจริง
|
|
195
|
+
|
|
196
|
+
macOS/Linux GUI ที่ PATH ต่างจาก Terminal ใช้รูปแบบ Node + absolute entry point ได้เช่นกัน
|
|
197
|
+
Local STDIO ใช้ OS-owner principal; trust/approval, sandbox และ file guards ยังมีผล
|
|
198
|
+
ไม่ได้เปิด anonymous HTTP หรือข้าม OAuth ของ public MCP
|
|
199
|
+
|
|
200
|
+
## AI platform อื่น
|
|
201
|
+
|
|
202
|
+
ใช้ remote MCP ได้เมื่อ client รองรับ Streamable HTTP, OAuth code + PKCE S256
|
|
203
|
+
และให้กรอก static Client ID/Secret ได้ คัดลอก callback **จาก client นั้นจริง** แล้วลงทะเบียน:
|
|
204
|
+
|
|
205
|
+
```text
|
|
206
|
+
dodo auth add-client --name "My AI client" --redirect-uri "EXACT_CALLBACK_FROM_CLIENT"
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
ตัวอย่าง callback placeholder ไม่ใช่ URL ใช้งานจริง หาก client บังคับ DCR/CIMD
|
|
210
|
+
โดยไม่มี static credentials ให้ตรวจ compatibility ก่อน อย่าแก้ด้วย No sign-in
|
|
211
|
+
หรือใช้ token ของหน้า Config เป็น MCP credential
|
|
212
|
+
|
|
213
|
+
## ทดสอบและแก้ปัญหา
|
|
214
|
+
|
|
215
|
+
เริ่มด้วย prompt:
|
|
216
|
+
|
|
217
|
+
> ใช้ DODO เรียก project_overview แล้วบอกโปรเจกต์ที่ฉันเข้าถึงได้ ยังไม่ต้องแก้ไฟล์
|
|
218
|
+
|
|
219
|
+
จากนั้นเลือกโปรเจกต์ fixture และทดสอบ create → read → edit → read-back → delete
|
|
220
|
+
ใช้ `dodo_discover` ใน Compact เมื่อหาความสามารถไม่เจอ
|
|
221
|
+
|
|
222
|
+
| อาการ | ตรวจอะไร |
|
|
223
|
+
|---|---|
|
|
224
|
+
| invalid_client | ใช้ ID/Secret คู่เดียวกัน และ client ยังไม่ถูกลบ |
|
|
225
|
+
| redirect_uri ไม่ตรง | คัดลอก exact callback ของ client ไม่ใช้ callback ข้ามค่าย |
|
|
226
|
+
| ไม่เห็น tools ใหม่ | Refresh/rescan; ถ้ายัง cache เดิมให้สร้าง connection ใหม่ตาม client |
|
|
227
|
+
| WORKSPACE_ACCESS_REQUIRED | เพิ่มโปรเจกต์และตรวจ access level/scopes; managed mode ตรวจ ACL |
|
|
228
|
+
| STALE_WORKSPACE | เรียก project_overview ใหม่หลัง server restart/เปลี่ยน workspace |
|
|
229
|
+
| Remote Config แจ้ง 8 ชั่วโมง | อัปเป็น 1.3.1+, restart เพื่อโหลดแพตช์หนึ่งครั้ง แล้วใช้ dodo --web |
|
|
230
|
+
| `/config` เป็น 404 | lease ปิด/หมดอายุ ให้เจ้าของรัน dodo --web และจับคู่ใหม่ |
|
|
231
|
+
|
|
232
|
+
ตั้งแต่ 1.3.1 `dodo --web` สร้าง session ของโดเมนแยกจาก Local Config 8 ชั่วโมง
|
|
233
|
+
เปิดใหม่ได้แม้ process ทำงานหลายวัน แต่ละครั้งอยู่ได้ 1 ชั่วโมงและยังต้อง pairing
|
|
234
|
+
การเปิด/ปิด Config ไม่ทำให้ MCP/OAuth/Tunnel หยุด ไม่ต้องต่ออายุหน้าเว็บเพื่อให้ AI ทำงานต่อ
|
|
235
|
+
|
|
236
|
+
**สถานะตรวจรับ:** server HTTP/OAuth, STDIO และ Config มี automated fixture tests
|
|
237
|
+
ส่วนการล็อกอินและเรียก tools จากบัญชีจริงในแต่ละ AI platform เป็น `MANUAL_NOT_RUN`
|
|
238
|
+
สำหรับแพตช์นี้ ไม่ถือว่ามีคู่มือแล้วเท่ากับผ่าน live integration
|