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.
Files changed (151) hide show
  1. package/README.md +37 -6
  2. package/dist/cli/dataRecovery.js +38 -0
  3. package/dist/cli/dataRecovery.js.map +1 -0
  4. package/dist/cli/deployment.js +61 -0
  5. package/dist/cli/deployment.js.map +1 -0
  6. package/dist/cli/main.js +36 -1
  7. package/dist/cli/main.js.map +1 -1
  8. package/dist/config/globalConfig.js +3 -5
  9. package/dist/config/globalConfig.js.map +1 -1
  10. package/dist/errors.js +1 -1
  11. package/dist/errors.js.map +1 -1
  12. package/dist/ipc/server.js +2 -0
  13. package/dist/ipc/server.js.map +1 -1
  14. package/dist/ipc/timeouts.js +5 -0
  15. package/dist/ipc/timeouts.js.map +1 -0
  16. package/dist/platform/privateFs.js +32 -3
  17. package/dist/platform/privateFs.js.map +1 -1
  18. package/dist/platform/windowsPrivateAcl.js +90 -0
  19. package/dist/platform/windowsPrivateAcl.js.map +1 -0
  20. package/dist/security/outboundAddress.js +20 -0
  21. package/dist/security/outboundAddress.js.map +1 -0
  22. package/dist/server/aiAdmin.js +21 -24
  23. package/dist/server/aiAdmin.js.map +1 -1
  24. package/dist/server/appServer.js +3 -6
  25. package/dist/server/appServer.js.map +1 -1
  26. package/dist/server/bootstrap.js +14 -0
  27. package/dist/server/bootstrap.js.map +1 -1
  28. package/dist/server/configSession.js +21 -0
  29. package/dist/server/configSession.js.map +1 -0
  30. package/dist/server/configUi/index.html +3 -0
  31. package/dist/server/configUi/ui/dataRecovery.js +90 -0
  32. package/dist/server/configUi/ui/deployment.js +111 -0
  33. package/dist/server/configUi/ui/recovery.js +167 -0
  34. package/dist/server/configUi/workbench.js +23 -7
  35. package/dist/server/installationRuntime.js +3 -1
  36. package/dist/server/installationRuntime.js.map +1 -1
  37. package/dist/server/instructions.js.map +1 -1
  38. package/dist/server/ipcDispatch.js +219 -0
  39. package/dist/server/ipcDispatch.js.map +1 -1
  40. package/dist/server/localConfig.js +34 -11
  41. package/dist/server/localConfig.js.map +1 -1
  42. package/dist/server/remoteConfig.js +23 -13
  43. package/dist/server/remoteConfig.js.map +1 -1
  44. package/dist/server/stdioServer.js +2 -5
  45. package/dist/server/stdioServer.js.map +1 -1
  46. package/dist/services/ai/network.js +1 -18
  47. package/dist/services/ai/network.js.map +1 -1
  48. package/dist/services/ai/subagents.js +5 -2
  49. package/dist/services/ai/subagents.js.map +1 -1
  50. package/dist/services/assistance/verification.js +43 -10
  51. package/dist/services/assistance/verification.js.map +1 -1
  52. package/dist/services/changes/applier.js +472 -297
  53. package/dist/services/changes/applier.js.map +1 -1
  54. package/dist/services/git/gitService.js +150 -34
  55. package/dist/services/git/gitService.js.map +1 -1
  56. package/dist/services/jobs/jobManager.js +59 -2
  57. package/dist/services/jobs/jobManager.js.map +1 -1
  58. package/dist/services/jobs/spool.js +9 -3
  59. package/dist/services/jobs/spool.js.map +1 -1
  60. package/dist/services/multimodal/mediaService.js +6 -6
  61. package/dist/services/multimodal/mediaService.js.map +1 -1
  62. package/dist/services/recovery/configKeys.js +115 -0
  63. package/dist/services/recovery/configKeys.js.map +1 -0
  64. package/dist/services/recovery/configVault.js +361 -0
  65. package/dist/services/recovery/configVault.js.map +1 -0
  66. package/dist/services/recovery/contracts.js +24 -0
  67. package/dist/services/recovery/contracts.js.map +1 -0
  68. package/dist/services/recovery/databaseAwareness.js +179 -0
  69. package/dist/services/recovery/databaseAwareness.js.map +1 -0
  70. package/dist/services/recovery/deploymentArchive.js +129 -0
  71. package/dist/services/recovery/deploymentArchive.js.map +1 -0
  72. package/dist/services/recovery/deploymentContracts.js +70 -0
  73. package/dist/services/recovery/deploymentContracts.js.map +1 -0
  74. package/dist/services/recovery/deploymentHealth.js +143 -0
  75. package/dist/services/recovery/deploymentHealth.js.map +1 -0
  76. package/dist/services/recovery/deploymentMaintenance.js +197 -0
  77. package/dist/services/recovery/deploymentMaintenance.js.map +1 -0
  78. package/dist/services/recovery/deploymentService.js +429 -0
  79. package/dist/services/recovery/deploymentService.js.map +1 -0
  80. package/dist/services/recovery/deploymentSource.js +36 -0
  81. package/dist/services/recovery/deploymentSource.js.map +1 -0
  82. package/dist/services/recovery/dockerDeployment.js +172 -0
  83. package/dist/services/recovery/dockerDeployment.js.map +1 -0
  84. package/dist/services/recovery/drift.js +178 -0
  85. package/dist/services/recovery/drift.js.map +1 -0
  86. package/dist/services/recovery/evidence.js +127 -0
  87. package/dist/services/recovery/evidence.js.map +1 -0
  88. package/dist/services/recovery/gitCopies.js +219 -0
  89. package/dist/services/recovery/gitCopies.js.map +1 -0
  90. package/dist/services/recovery/history.js +423 -0
  91. package/dist/services/recovery/history.js.map +1 -0
  92. package/dist/services/recovery/recoveryService.js +521 -0
  93. package/dist/services/recovery/recoveryService.js.map +1 -0
  94. package/dist/services/recovery/storage.js +344 -0
  95. package/dist/services/recovery/storage.js.map +1 -0
  96. package/dist/services/schedules/scheduleService.js +9 -10
  97. package/dist/services/schedules/scheduleService.js.map +1 -1
  98. package/dist/store/db.js +71 -0
  99. package/dist/store/db.js.map +1 -1
  100. package/dist/tools/catalog.js +4 -0
  101. package/dist/tools/catalog.js.map +1 -1
  102. package/dist/tools/changeTools.js +1 -1
  103. package/dist/tools/changeTools.js.map +1 -1
  104. package/dist/tools/context.js +23 -3
  105. package/dist/tools/context.js.map +1 -1
  106. package/dist/tools/deploymentTools.js +58 -0
  107. package/dist/tools/deploymentTools.js.map +1 -0
  108. package/dist/tools/directTools.js +9 -5
  109. package/dist/tools/directTools.js.map +1 -1
  110. package/dist/tools/gitTools.js +7 -2
  111. package/dist/tools/gitTools.js.map +1 -1
  112. package/dist/tools/jobTools.js +4 -4
  113. package/dist/tools/jobTools.js.map +1 -1
  114. package/dist/tools/projectTools.js +1 -0
  115. package/dist/tools/projectTools.js.map +1 -1
  116. package/dist/tools/recoveryTools.js +79 -0
  117. package/dist/tools/recoveryTools.js.map +1 -0
  118. package/dist/tools/runtimeTools.js +1 -1
  119. package/dist/tools/runtimeTools.js.map +1 -1
  120. package/dist/tools/surface.js +6 -1
  121. package/dist/tools/surface.js.map +1 -1
  122. package/dist/tunnel/credentials.js +1 -1
  123. package/dist/tunnel/credentials.js.map +1 -1
  124. package/docs/ARCHITECTURE.md +92 -2
  125. package/docs/CI.md +118 -0
  126. package/docs/COMPATIBILITY.md +7 -6
  127. package/docs/EVALUATION.md +17 -12
  128. package/docs/MANUAL_ACCEPTANCE.md +72 -2
  129. package/docs/MCP_CONNECTIONS.md +238 -0
  130. package/docs/RECOVERY.md +448 -0
  131. package/docs/RELEASE_1.3.0.md +64 -0
  132. package/docs/RELEASE_1.3.1.md +49 -0
  133. package/docs/RELEASE_NOTES.md +31 -0
  134. package/docs/SECURITY.md +123 -0
  135. package/docs/TEST_REPORT.md +312 -5
  136. package/docs/TUNNEL.md +6 -0
  137. package/docs/WEB_CLIENTS.md +3 -0
  138. package/docs/adr/047-temporary-remote-config.md +11 -0
  139. package/docs/adr/051-source-recovery-foundation.md +45 -0
  140. package/docs/adr/052-reviewed-source-restore.md +50 -0
  141. package/docs/adr/053-content-drift-and-private-git-recovery.md +29 -0
  142. package/docs/adr/054-verified-source-checkpoints.md +58 -0
  143. package/docs/adr/055-reviewed-docker-deployments.md +42 -0
  144. package/docs/adr/056-owner-data-recovery.md +47 -0
  145. package/docs/adr/README.md +7 -0
  146. package/native/private-state-windows.cs +105 -0
  147. package/package.json +8 -1
  148. package/schemas/global-config.schema.json +34 -0
  149. package/schemas/tools.compact.json +175 -15
  150. package/schemas/tools.hybrid.json +350 -16
  151. package/schemas/tools.json +4883 -816
@@ -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 134 tools; เปิด Sub-agent MCP exposure แล้วเป็น 138
32
+ - STDIO default: Full 154 tools; เปิด Sub-agent MCP exposure แล้วเป็น 158
33
33
  - explicit Hybrid: 49 tools
34
34
 
35
- Complete capability schema มี 138 operations ค่าเริ่มต้น `exposeSubagentsToMcp=false`
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 Docker ไม่แทน Windows native Release gate ต้องมี
99
- หลักฐาน macOS local และ Linux Docker ที่ revision/lock digest ตรงกัน Docker image
100
- ติดตั้ง Playwright Chromium เพื่อรัน browser case จริง Dedicated self-hosted GitHub
101
- Actions รัน Linux Docker และ Windows native candidate เฉพาะ trusted main/manual
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
@@ -47,21 +47,21 @@ write → read → edit → read-back ผ่าน Compact gateway
47
47
 
48
48
  ## Platform gates
49
49
 
50
- macOS รันจาก owner checkout ส่วน Linux gate เดียวกันรันได้ทั้ง local Docker และ
51
- dedicated self-hosted GitHub Actions runner:
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 จริงใน Docker image แยก พร้อม Playwright Chromium
58
- npm run test:linux:docker
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
- Docker build ไม่รับ `.git`, `.npmrc`, `.env`, model, release evidence หรือเอกสารพัฒนา
62
- private เข้า build context ตัว runner ส่งเฉพาะ revision/dirty state ที่อ่านจาก host Git
63
- เข้า release gate และ DodoBench ผ่าน environment attestation ที่รับได้เฉพาะใน Linux
64
- container จากนั้นตรวจ report กลับว่าตรงกับ revision และ lock digest เดิม
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 เฉพาะ `docker-host-git` จาก clean checkout พร้อม
77
- fresh-install PASS จึงไม่รับ candidate ที่มี uncommitted source หรือ report จาก runner
78
- ชนิดอื่น Report บันทึก origin ว่ามาจาก local หรือ GitHub Actions ตามจริง ไม่มีคำสั่ง
79
- เหล่านี้ publish npm
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 มี 121 tools; Compact/Hybrid มี 19/49 ชื่อและ discover หา `subagent_spawn` ไม่พบ
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 มี 125 และ Compact discover/gateway มี `subagent_spawn/status/result/control`
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