dominds 1.19.2 → 1.19.3

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 (186) hide show
  1. package/dist/cli/team-definition-audit.d.ts +2 -1
  2. package/dist/cli/team-definition-audit.js +20 -8
  3. package/dist/cli/validate-team-def.js +3 -3
  4. package/dist/docs/mcp-support.md +11 -0
  5. package/dist/docs/mcp-support.zh.md +7 -0
  6. package/dist/docs/team_mgmt-toolset.md +5 -2
  7. package/dist/docs/team_mgmt-toolset.zh.md +4 -2
  8. package/dist/docs/tool-availability-protocol.md +4 -2
  9. package/dist/mcp/config.d.ts +1 -0
  10. package/dist/mcp/config.js +16 -0
  11. package/dist/mcp/supervisor.d.ts +7 -1
  12. package/dist/mcp/supervisor.js +298 -16
  13. package/dist/minds/load.js +5 -0
  14. package/dist/minds/system-prompt.d.ts +1 -0
  15. package/dist/minds/system-prompt.js +14 -6
  16. package/dist/tools/builtins.js +2 -0
  17. package/dist/tools/env.js +10 -58
  18. package/dist/tools/manual/render.js +4 -0
  19. package/dist/tools/mcp.d.ts +1 -0
  20. package/dist/tools/mcp.js +55 -5
  21. package/dist/tools/prompts/mcp_admin/en/errors.md +0 -14
  22. package/dist/tools/prompts/mcp_admin/en/index.md +5 -3
  23. package/dist/tools/prompts/mcp_admin/en/principles.md +11 -5
  24. package/dist/tools/prompts/mcp_admin/en/scenarios.md +19 -3
  25. package/dist/tools/prompts/mcp_admin/en/tools.md +85 -21
  26. package/dist/tools/prompts/mcp_admin/zh/errors.md +0 -14
  27. package/dist/tools/prompts/mcp_admin/zh/index.md +5 -3
  28. package/dist/tools/prompts/mcp_admin/zh/principles.md +11 -5
  29. package/dist/tools/prompts/mcp_admin/zh/scenarios.md +19 -3
  30. package/dist/tools/prompts/mcp_admin/zh/tools.md +85 -21
  31. package/dist/tools/prompts/os/en/errors.md +0 -28
  32. package/dist/tools/prompts/os/en/scenarios.md +1 -1
  33. package/dist/tools/prompts/os/en/tools.md +8 -17
  34. package/dist/tools/prompts/os/zh/errors.md +0 -28
  35. package/dist/tools/prompts/os/zh/scenarios.md +1 -1
  36. package/dist/tools/prompts/os/zh/tools.md +8 -17
  37. package/dist/tools/registry.d.ts +5 -0
  38. package/dist/tools/team_mgmt-mcp-manual.d.ts +2 -2
  39. package/dist/tools/team_mgmt-mcp-manual.js +57 -16
  40. package/dist/tools/team_mgmt.js +4 -4
  41. package/package.json +3 -3
  42. package/webapp/dist/assets/{_basePickBy-B7M9Q0Fa.js → _basePickBy-Dnh413xT.js} +3 -3
  43. package/webapp/dist/assets/_basePickBy-Dnh413xT.js.map +1 -0
  44. package/webapp/dist/assets/{_baseUniq-DAeYoL6j.js → _baseUniq-DWzYqpN_.js} +2 -2
  45. package/webapp/dist/assets/_baseUniq-DWzYqpN_.js.map +1 -0
  46. package/webapp/dist/assets/{arc-Bh4nDbNR.js → arc-vfBkNCOx.js} +2 -2
  47. package/webapp/dist/assets/arc-vfBkNCOx.js.map +1 -0
  48. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CxqmdsIm.js → architectureDiagram-VXUJARFQ-DiUEBXOa.js} +8 -26
  49. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-DiUEBXOa.js.map +1 -0
  50. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CxIWLtpt.js → blockDiagram-VD42YOAC-BqK1KM2m.js} +170 -187
  51. package/webapp/dist/assets/blockDiagram-VD42YOAC-BqK1KM2m.js.map +1 -0
  52. package/webapp/dist/assets/{c4Diagram-IC4MRINW-1qErOIgG.js → c4Diagram-YG6GDRKO-ClHNu1Uo.js} +4 -4
  53. package/webapp/dist/assets/c4Diagram-YG6GDRKO-ClHNu1Uo.js.map +1 -0
  54. package/webapp/dist/assets/{channel-DkgZHNUe.js → channel-BbWLVc8W.js} +2 -2
  55. package/webapp/dist/assets/channel-BbWLVc8W.js.map +1 -0
  56. package/webapp/dist/assets/{chunk-4BX2VUAB-BmdMbU9v.js → chunk-4BX2VUAB-CItdSmZH.js} +2 -2
  57. package/webapp/dist/assets/chunk-4BX2VUAB-CItdSmZH.js.map +1 -0
  58. package/webapp/dist/assets/{chunk-55IACEB6-D6LDTDBy.js → chunk-55IACEB6-DSCX9WCf.js} +2 -2
  59. package/webapp/dist/assets/chunk-55IACEB6-DSCX9WCf.js.map +1 -0
  60. package/webapp/dist/assets/{chunk-WL4C6EOR-B-Pk44be.js → chunk-B4BG7PRW-5CRXFeD9.js} +121 -171
  61. package/webapp/dist/assets/chunk-B4BG7PRW-5CRXFeD9.js.map +1 -0
  62. package/webapp/dist/assets/{chunk-NQ4KR5QH-wlvxalE3.js → chunk-DI55MBZ5-CRMf6XZu.js} +7 -9
  63. package/webapp/dist/assets/chunk-DI55MBZ5-CRMf6XZu.js.map +1 -0
  64. package/webapp/dist/assets/{chunk-FMBD7UC4-C-BdCe4C.js → chunk-FMBD7UC4-BJ1vT2se.js} +2 -2
  65. package/webapp/dist/assets/chunk-FMBD7UC4-BJ1vT2se.js.map +1 -0
  66. package/webapp/dist/assets/{chunk-KX2RTZJC-CA7sDJO5.js → chunk-QN33PNHL-CGyezTSD.js} +2 -2
  67. package/webapp/dist/assets/chunk-QN33PNHL-CGyezTSD.js.map +1 -0
  68. package/webapp/dist/assets/{chunk-QZHKN3VN-Bo1VMcph.js → chunk-QZHKN3VN-9xs15j8C.js} +2 -2
  69. package/webapp/dist/assets/chunk-QZHKN3VN-9xs15j8C.js.map +1 -0
  70. package/webapp/dist/assets/{chunk-JSJVCQXG-WA_BLIm9.js → chunk-TZMSLE5B-D2g6Tj7Z.js} +6 -14
  71. package/webapp/dist/assets/chunk-TZMSLE5B-D2g6Tj7Z.js.map +1 -0
  72. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BqKuyb49.js → classDiagram-2ON5EDUG-BQFGGJNm.js} +6 -7
  73. package/webapp/dist/assets/classDiagram-2ON5EDUG-BQFGGJNm.js.map +1 -0
  74. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BqKuyb49.js → classDiagram-v2-WZHVMYZB-BQFGGJNm.js} +6 -7
  75. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-BQFGGJNm.js.map +1 -0
  76. package/webapp/dist/assets/{clone-BX5z8WVZ.js → clone-DOfPd4cz.js} +2 -2
  77. package/webapp/dist/assets/clone-DOfPd4cz.js.map +1 -0
  78. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-s11SgN.js → cose-bilkent-S5V4N54A-BYN-vqm8.js} +2 -2
  79. package/webapp/dist/assets/cose-bilkent-S5V4N54A-BYN-vqm8.js.map +1 -0
  80. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  81. package/webapp/dist/assets/{dagre-KLK3FWXG-DmQFV2qK.js → dagre-6UL2VRFP-ClEaFABE.js} +7 -7
  82. package/webapp/dist/assets/dagre-6UL2VRFP-ClEaFABE.js.map +1 -0
  83. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  84. package/webapp/dist/assets/{diagram-E7M64L7V-QRaBfST8.js → diagram-PSM6KHXK-CM4hLE_0.js} +10 -10
  85. package/webapp/dist/assets/diagram-PSM6KHXK-CM4hLE_0.js.map +1 -0
  86. package/webapp/dist/assets/{diagram-IFDJBPK2-lrWn1Obo.js → diagram-QEK2KX5R-BZjGFX-2.js} +8 -9
  87. package/webapp/dist/assets/diagram-QEK2KX5R-BZjGFX-2.js.map +1 -0
  88. package/webapp/dist/assets/{diagram-P4PSJMXO-sTU7Hh-Y.js → diagram-S2PKOQOG-Bvw01OOG.js} +8 -8
  89. package/webapp/dist/assets/diagram-S2PKOQOG-Bvw01OOG.js.map +1 -0
  90. package/webapp/dist/assets/{erDiagram-INFDFZHY-Cx6jc9Wq.js → erDiagram-Q2GNP2WA-ctHu5zQL.js} +75 -96
  91. package/webapp/dist/assets/erDiagram-Q2GNP2WA-ctHu5zQL.js.map +1 -0
  92. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DfGI49Dz.js → flowDiagram-NV44I4VS-m7ofIhri.js} +81 -98
  93. package/webapp/dist/assets/flowDiagram-NV44I4VS-m7ofIhri.js.map +1 -0
  94. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-nrcHWWaM.js → ganttDiagram-JELNMOA3-D9wS5Veb.js} +3 -28
  95. package/webapp/dist/assets/ganttDiagram-JELNMOA3-D9wS5Veb.js.map +1 -0
  96. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js → gitGraphDiagram-V2S2FVAM-B86qqJx7.js} +46 -38
  97. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-B86qqJx7.js.map +1 -0
  98. package/webapp/dist/assets/graph-u844GGQC.js +425 -0
  99. package/webapp/dist/assets/graph-u844GGQC.js.map +1 -0
  100. package/webapp/dist/assets/{index-DZFkLLVz.css → index-BGdI3lWA.css} +1 -1
  101. package/webapp/dist/assets/{index--fy89xGh.js → index-tinPEZoH.js} +1059 -1034
  102. package/webapp/dist/assets/{index--fy89xGh.js.map → index-tinPEZoH.js.map} +1 -1
  103. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-PIoZHr7s.js → infoDiagram-HS3SLOUP-DwRPUctP.js} +7 -7
  104. package/webapp/dist/assets/infoDiagram-HS3SLOUP-DwRPUctP.js.map +1 -0
  105. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  106. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C2qidjQ5.js → journeyDiagram-XKPGCS4Q-B91ZO-ec.js} +5 -5
  107. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-B91ZO-ec.js.map +1 -0
  108. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Du0TC8WS.js → kanban-definition-3W4ZIXB7-CoogrZ07.js} +3 -5
  109. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-CoogrZ07.js.map +1 -0
  110. package/webapp/dist/assets/{layout-VmEo1OEB.js → layout-BrzQmqFJ.js} +5 -5
  111. package/webapp/dist/assets/layout-BrzQmqFJ.js.map +1 -0
  112. package/webapp/dist/assets/{linear-B662YHAc.js → linear-C6H7K9Zy.js} +2 -2
  113. package/webapp/dist/assets/linear-C6H7K9Zy.js.map +1 -0
  114. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D7arZj95.js → mindmap-definition-VGOIOE7T-UDHZQkNZ.js} +5 -7
  115. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-UDHZQkNZ.js.map +1 -0
  116. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  117. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DvjPP4PA.js → pieDiagram-ADFJNKIX-M81uyQ1J.js} +8 -8
  118. package/webapp/dist/assets/pieDiagram-ADFJNKIX-M81uyQ1J.js.map +1 -0
  119. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-B_JUGMj_.js → quadrantDiagram-AYHSOK5B-ClzIh9Gb.js} +3 -3
  120. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-ClzIh9Gb.js.map +1 -0
  121. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DF0mpvE3.js → requirementDiagram-UZGBJVZJ-DLK3A-pn.js} +6 -16
  122. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-DLK3A-pn.js.map +1 -0
  123. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CoXlxv00.js → sankeyDiagram-TZEHDZUN-CYqju8I1.js} +2 -2
  124. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-CYqju8I1.js.map +1 -0
  125. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYqT5Pg7.js → sequenceDiagram-WL72ISMW-2guv6eOd.js} +201 -601
  126. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-2guv6eOd.js.map +1 -0
  127. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9b1mN8-.js → stateDiagram-FKZM4ZOC-iujqSp0X.js} +9 -9
  128. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-iujqSp0X.js.map +1 -0
  129. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DNzgudL_.js → stateDiagram-v2-4FDKWEC3-BxzY81ky.js} +5 -5
  130. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-BxzY81ky.js.map +1 -0
  131. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkyKUY7A.js → timeline-definition-IT6M3QCI-DjCFSC8d.js} +3 -3
  132. package/webapp/dist/assets/timeline-definition-IT6M3QCI-DjCFSC8d.js.map +1 -0
  133. package/webapp/dist/assets/{treemap-KZPCXAKY-CZd09kF-.js → treemap-GDKQZRPO-iaBzDWCP.js} +24 -37
  134. package/webapp/dist/assets/treemap-GDKQZRPO-iaBzDWCP.js.map +1 -0
  135. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BRwRloPc.js → xychartDiagram-PRI3JC2R-R6Jl1c89.js} +4 -4
  136. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-R6Jl1c89.js.map +1 -0
  137. package/webapp/dist/index.html +2 -2
  138. package/webapp/dist/assets/_basePickBy-B7M9Q0Fa.js.map +0 -1
  139. package/webapp/dist/assets/_baseUniq-DAeYoL6j.js.map +0 -1
  140. package/webapp/dist/assets/arc-Bh4nDbNR.js.map +0 -1
  141. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CxqmdsIm.js.map +0 -1
  142. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-CxIWLtpt.js.map +0 -1
  143. package/webapp/dist/assets/c4Diagram-IC4MRINW-1qErOIgG.js.map +0 -1
  144. package/webapp/dist/assets/channel-DkgZHNUe.js.map +0 -1
  145. package/webapp/dist/assets/chunk-4BX2VUAB-BmdMbU9v.js.map +0 -1
  146. package/webapp/dist/assets/chunk-55IACEB6-D6LDTDBy.js.map +0 -1
  147. package/webapp/dist/assets/chunk-FMBD7UC4-C-BdCe4C.js.map +0 -1
  148. package/webapp/dist/assets/chunk-JSJVCQXG-WA_BLIm9.js.map +0 -1
  149. package/webapp/dist/assets/chunk-KX2RTZJC-CA7sDJO5.js.map +0 -1
  150. package/webapp/dist/assets/chunk-NQ4KR5QH-wlvxalE3.js.map +0 -1
  151. package/webapp/dist/assets/chunk-QZHKN3VN-Bo1VMcph.js.map +0 -1
  152. package/webapp/dist/assets/chunk-WL4C6EOR-B-Pk44be.js.map +0 -1
  153. package/webapp/dist/assets/classDiagram-VBA2DB6C-BqKuyb49.js.map +0 -1
  154. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-BqKuyb49.js.map +0 -1
  155. package/webapp/dist/assets/clone-BX5z8WVZ.js.map +0 -1
  156. package/webapp/dist/assets/cose-bilkent-S5V4N54A-B-s11SgN.js.map +0 -1
  157. package/webapp/dist/assets/dagre-KLK3FWXG-DmQFV2qK.js.map +0 -1
  158. package/webapp/dist/assets/diagram-E7M64L7V-QRaBfST8.js.map +0 -1
  159. package/webapp/dist/assets/diagram-IFDJBPK2-lrWn1Obo.js.map +0 -1
  160. package/webapp/dist/assets/diagram-P4PSJMXO-sTU7Hh-Y.js.map +0 -1
  161. package/webapp/dist/assets/erDiagram-INFDFZHY-Cx6jc9Wq.js.map +0 -1
  162. package/webapp/dist/assets/flowDiagram-PKNHOUZH-DfGI49Dz.js.map +0 -1
  163. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-nrcHWWaM.js.map +0 -1
  164. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js.map +0 -1
  165. package/webapp/dist/assets/graph-R5G-y8tB.js +0 -782
  166. package/webapp/dist/assets/graph-R5G-y8tB.js.map +0 -1
  167. package/webapp/dist/assets/infoDiagram-LFFYTUFH-PIoZHr7s.js.map +0 -1
  168. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-oCM-LYk1.js +0 -966
  169. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-oCM-LYk1.js.map +0 -1
  170. package/webapp/dist/assets/journeyDiagram-4ABVD52K-C2qidjQ5.js.map +0 -1
  171. package/webapp/dist/assets/kanban-definition-K7BYSVSG-Du0TC8WS.js.map +0 -1
  172. package/webapp/dist/assets/layout-VmEo1OEB.js.map +0 -1
  173. package/webapp/dist/assets/linear-B662YHAc.js.map +0 -1
  174. package/webapp/dist/assets/mindmap-definition-YRQLILUH-D7arZj95.js.map +0 -1
  175. package/webapp/dist/assets/pieDiagram-SKSYHLDU-DvjPP4PA.js.map +0 -1
  176. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-B_JUGMj_.js.map +0 -1
  177. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-DF0mpvE3.js.map +0 -1
  178. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-CoXlxv00.js.map +0 -1
  179. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DYqT5Pg7.js.map +0 -1
  180. package/webapp/dist/assets/stateDiagram-RAJIS63D-D9b1mN8-.js.map +0 -1
  181. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-DNzgudL_.js.map +0 -1
  182. package/webapp/dist/assets/timeline-definition-YZTLITO2-CkyKUY7A.js.map +0 -1
  183. package/webapp/dist/assets/treemap-KZPCXAKY-CZd09kF-.js.map +0 -1
  184. package/webapp/dist/assets/vennDiagram-LZ73GAT5-BxVF5Olo.js +0 -2487
  185. package/webapp/dist/assets/vennDiagram-LZ73GAT5-BxVF5Olo.js.map +0 -1
  186. package/webapp/dist/assets/xychartDiagram-JWTSCODW-BRwRloPc.js.map +0 -1
package/dist/tools/env.js CHANGED
@@ -13,47 +13,20 @@ const log_1 = require("../log");
13
13
  const tool_1 = require("../tool");
14
14
  const log = (0, log_1.createLogger)('tools/env');
15
15
  const ENV_KEY_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
16
- const DEFAULT_ALLOWED_PREFIXES = ['MCP_', 'UX_', 'DOMINDS_TEST_'];
17
- const DEFAULT_ALLOWED_EXACT = ['DOMINDS_LOG_LEVEL'];
18
- function isAllowedEnvKey(key) {
19
- if (!ENV_KEY_RE.test(key))
20
- return false;
21
- if (DEFAULT_ALLOWED_EXACT.includes(key))
22
- return true;
23
- for (const p of DEFAULT_ALLOWED_PREFIXES) {
24
- if (key.startsWith(p))
25
- return true;
26
- }
27
- return false;
28
- }
29
- function isSensitiveKeyName(key) {
30
- const upper = key.toUpperCase();
31
- return (upper.includes('KEY') ||
32
- upper.includes('TOKEN') ||
33
- upper.includes('SECRET') ||
34
- upper.includes('PASSWORD'));
35
- }
36
- function redactValue(value) {
37
- if (value.length <= 4)
38
- return '<redacted>';
39
- return `<redacted len=${value.length} prefix=${JSON.stringify(value.slice(0, 2))} suffix=${JSON.stringify(value.slice(-2))}>`;
40
- }
41
16
  function parseEnvGetArgs(args) {
42
17
  const key = args.key;
43
18
  if (typeof key !== 'string' || !key.trim()) {
44
19
  throw new Error(`env_get.key must be a non-empty string`);
45
20
  }
46
- const revealVal = args.reveal;
47
- if (revealVal !== undefined && typeof revealVal !== 'boolean') {
48
- throw new Error(`env_get.reveal must be a boolean if provided`);
49
- }
50
- return { key, reveal: revealVal };
21
+ assertValidEnvKey('env_get', key);
22
+ return { key };
51
23
  }
52
24
  function parseEnvSetArgs(args) {
53
25
  const key = args.key;
54
26
  if (typeof key !== 'string' || !key.trim()) {
55
27
  throw new Error(`env_set.key must be a non-empty string`);
56
28
  }
29
+ assertValidEnvKey('env_set', key);
57
30
  const value = args.value;
58
31
  if (typeof value !== 'string') {
59
32
  throw new Error(`env_set.value must be a string`);
@@ -65,16 +38,13 @@ function parseEnvUnsetArgs(args) {
65
38
  if (typeof key !== 'string' || !key.trim()) {
66
39
  throw new Error(`env_unset.key must be a non-empty string`);
67
40
  }
41
+ assertValidEnvKey('env_unset', key);
68
42
  return { key };
69
43
  }
70
44
  const envGetSchema = {
71
45
  type: 'object',
72
46
  properties: {
73
47
  key: { type: 'string', description: 'Environment variable name to read' },
74
- reveal: {
75
- type: 'boolean',
76
- description: 'When true, returns the raw value. For keys that look like secrets, default is redacted unless reveal=true.',
77
- },
78
48
  },
79
49
  required: ['key'],
80
50
  additionalProperties: false,
@@ -96,12 +66,9 @@ const envUnsetSchema = {
96
66
  required: ['key'],
97
67
  additionalProperties: false,
98
68
  };
99
- function assertAllowedKey(key) {
100
- if (!isAllowedEnvKey(key)) {
101
- throw new Error(`env key '${key}' is not allowed. Allowed: ${[
102
- ...DEFAULT_ALLOWED_EXACT,
103
- ...DEFAULT_ALLOWED_PREFIXES.map((p) => `${p}*`),
104
- ].join(', ')}`);
69
+ function assertValidEnvKey(toolName, key) {
70
+ if (!ENV_KEY_RE.test(key)) {
71
+ throw new Error(`${toolName}.key must be a valid environment variable name matching ${ENV_KEY_RE.source}`);
105
72
  }
106
73
  }
107
74
  exports.envGetTool = {
@@ -116,7 +83,6 @@ exports.envGetTool = {
116
83
  argsValidation: 'dominds',
117
84
  call: async (_dlg, caller, args) => {
118
85
  const parsed = parseEnvGetArgs(args);
119
- assertAllowedKey(parsed.key);
120
86
  const raw = process.env[parsed.key];
121
87
  const value = raw === undefined ? undefined : String(raw);
122
88
  log.debug('env_get', undefined, {
@@ -126,10 +92,6 @@ exports.envGetTool = {
126
92
  });
127
93
  if (value === undefined)
128
94
  return (0, tool_1.toolSuccess)('(unset)');
129
- if (parsed.reveal === true)
130
- return (0, tool_1.toolSuccess)(value);
131
- if (isSensitiveKeyName(parsed.key))
132
- return (0, tool_1.toolSuccess)(redactValue(value));
133
95
  return (0, tool_1.toolSuccess)(value);
134
96
  },
135
97
  };
@@ -145,7 +107,6 @@ exports.envSetTool = {
145
107
  argsValidation: 'dominds',
146
108
  call: async (_dlg, caller, args) => {
147
109
  const parsed = parseEnvSetArgs(args);
148
- assertAllowedKey(parsed.key);
149
110
  const prev = process.env[parsed.key];
150
111
  process.env[parsed.key] = parsed.value;
151
112
  log.warn('env_set', undefined, {
@@ -154,12 +115,8 @@ exports.envSetTool = {
154
115
  prevSet: prev !== undefined,
155
116
  nextLen: parsed.value.length,
156
117
  });
157
- const prevStr = prev === undefined
158
- ? '(unset)'
159
- : isSensitiveKeyName(parsed.key)
160
- ? redactValue(String(prev))
161
- : String(prev);
162
- const nextStr = isSensitiveKeyName(parsed.key) ? redactValue(parsed.value) : parsed.value;
118
+ const prevStr = prev === undefined ? '(unset)' : String(prev);
119
+ const nextStr = parsed.value;
163
120
  return (0, tool_1.toolSuccess)(`ok: ${parsed.key}\nprev: ${prevStr}\nnext: ${nextStr}`);
164
121
  },
165
122
  };
@@ -175,7 +132,6 @@ exports.envUnsetTool = {
175
132
  argsValidation: 'dominds',
176
133
  call: async (_dlg, caller, args) => {
177
134
  const parsed = parseEnvUnsetArgs(args);
178
- assertAllowedKey(parsed.key);
179
135
  const prev = process.env[parsed.key];
180
136
  delete process.env[parsed.key];
181
137
  log.warn('env_unset', undefined, {
@@ -183,11 +139,7 @@ exports.envUnsetTool = {
183
139
  key: parsed.key,
184
140
  prevSet: prev !== undefined,
185
141
  });
186
- const prevStr = prev === undefined
187
- ? '(unset)'
188
- : isSensitiveKeyName(parsed.key)
189
- ? redactValue(String(prev))
190
- : String(prev);
142
+ const prevStr = prev === undefined ? '(unset)' : String(prev);
191
143
  return (0, tool_1.toolSuccess)(`ok: ${parsed.key}\nprev: ${prevStr}\nnext: (unset)`);
192
144
  },
193
145
  };
@@ -84,6 +84,10 @@ function renderToolsetManual(input) {
84
84
  }
85
85
  }
86
86
  const sections = [];
87
+ const notice = meta.manualNoticeI18n?.[input.language]?.trim();
88
+ if (notice) {
89
+ sections.push(notice);
90
+ }
87
91
  if (missingTopics.length > 0) {
88
92
  sections.push(renderMissingTopicsWarning(input.language, input.toolsetId, missingTopics));
89
93
  }
@@ -6,4 +6,5 @@
6
6
  import type { FuncTool, ReminderOwner } from '../tool';
7
7
  export declare const mcpRestartTool: FuncTool;
8
8
  export declare const mcpReleaseTool: FuncTool;
9
+ export declare const mcpDisableTool: FuncTool;
9
10
  export declare const mcpLeaseReminderOwner: ReminderOwner;
package/dist/tools/mcp.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * Local MCP supervisor control tools for testing and operations.
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.mcpLeaseReminderOwner = exports.mcpReleaseTool = exports.mcpRestartTool = void 0;
8
+ exports.mcpLeaseReminderOwner = exports.mcpDisableTool = exports.mcpReleaseTool = exports.mcpRestartTool = void 0;
9
9
  const log_1 = require("../log");
10
10
  const supervisor_1 = require("../mcp/supervisor");
11
11
  const driver_messages_1 = require("../runtime/driver-messages");
@@ -27,6 +27,13 @@ function parseMcpReleaseArgs(args) {
27
27
  }
28
28
  return { serverId };
29
29
  }
30
+ function parseMcpDisableArgs(args) {
31
+ const serverId = args.serverId;
32
+ if (typeof serverId !== 'string' || !serverId.trim()) {
33
+ throw new Error(`mcp_disable.serverId must be a non-empty string`);
34
+ }
35
+ return { serverId };
36
+ }
30
37
  function isMcpLeaseReminderMeta(value) {
31
38
  if (!isRecord(value) || Array.isArray(value))
32
39
  return false;
@@ -39,7 +46,7 @@ const mcpRestartSchema = {
39
46
  properties: {
40
47
  serverId: {
41
48
  type: 'string',
42
- description: "MCP server id from `.minds/mcp.yaml` (e.g., 'sdk_stdio'). Restarts this server only.",
49
+ description: "MCP server id from `.minds/mcp.yaml` (e.g., 'sdk_stdio'). Enables the server if needed, then restarts this server only.",
43
50
  },
44
51
  },
45
52
  required: ['serverId'],
@@ -56,13 +63,24 @@ const mcpReleaseSchema = {
56
63
  required: ['serverId'],
57
64
  additionalProperties: false,
58
65
  };
66
+ const mcpDisableSchema = {
67
+ type: 'object',
68
+ properties: {
69
+ serverId: {
70
+ type: 'string',
71
+ description: "MCP server id from `.minds/mcp.yaml` (e.g., 'playwright'). Stops any loaded runtime/leases and writes servers.<id>.enabled=false.",
72
+ },
73
+ },
74
+ required: ['serverId'],
75
+ additionalProperties: false,
76
+ };
59
77
  exports.mcpRestartTool = {
60
78
  type: 'func',
61
79
  name: 'mcp_restart',
62
- description: 'Restart a configured MCP server using the current `.minds/mcp.yaml` config (best-effort).',
80
+ description: 'Enable a configured MCP server if needed, then restart it using the current `.minds/mcp.yaml` config.',
63
81
  descriptionI18n: {
64
- en: 'Restart a configured MCP server using the current `.minds/mcp.yaml` config (best-effort).',
65
- zh: '使用当前的 `.minds/mcp.yaml` 配置重启指定的 MCP 服务器(尽力而为)。',
82
+ en: 'Enable a configured MCP server if needed, then restart it using the current `.minds/mcp.yaml` config.',
83
+ zh: '按需启用指定 MCP 服务器,然后使用当前 `.minds/mcp.yaml` 配置重启它。',
66
84
  },
67
85
  parameters: mcpRestartSchema,
68
86
  argsValidation: 'dominds',
@@ -126,6 +144,38 @@ exports.mcpReleaseTool = {
126
144
  return (0, tool_1.toolSuccess)(`ok: released ${parsed.serverId} for dialog ${dialogKey}`);
127
145
  },
128
146
  };
147
+ exports.mcpDisableTool = {
148
+ type: 'func',
149
+ name: 'mcp_disable',
150
+ description: 'Disable a configured MCP server, clear its loaded runtime/leases, and persist enabled=false in `.minds/mcp.yaml`.',
151
+ descriptionI18n: {
152
+ en: 'Disable a configured MCP server, clear its loaded runtime/leases, and persist enabled=false in `.minds/mcp.yaml`.',
153
+ zh: '禁用指定 MCP 服务器,清理其已加载运行时/租约,并在 `.minds/mcp.yaml` 中持久写入 enabled=false。',
154
+ },
155
+ parameters: mcpDisableSchema,
156
+ argsValidation: 'dominds',
157
+ call: async (_dlg, caller, args) => {
158
+ const parsed = parseMcpDisableArgs(args);
159
+ const res = await (0, supervisor_1.requestMcpServerDisable)(parsed.serverId);
160
+ if (res.ok) {
161
+ log.info('mcp_disable', undefined, {
162
+ caller: caller.id,
163
+ serverId: parsed.serverId,
164
+ ok: true,
165
+ });
166
+ }
167
+ else {
168
+ log.warn('mcp_disable failed', undefined, {
169
+ caller: caller.id,
170
+ serverId: parsed.serverId,
171
+ ok: false,
172
+ errorText: res.errorText,
173
+ });
174
+ return (0, tool_1.toolFailure)(`error: ${res.errorText}`);
175
+ }
176
+ return (0, tool_1.toolSuccess)(`ok: disabled ${parsed.serverId} and set enabled=false`);
177
+ },
178
+ };
129
179
  exports.mcpLeaseReminderOwner = {
130
180
  name: 'mcpLease',
131
181
  async updateReminder(dlg, reminder) {
@@ -68,20 +68,6 @@
68
68
  - Check lease status
69
69
  - Contact administrator
70
70
 
71
- ### ENV_NOT_FOUND
72
-
73
- **Description:** Environment variable doesn't exist.
74
-
75
- **Cause:**
76
-
77
- - Environment variable not set
78
- - Environment variable name is incorrect
79
-
80
- **Solution:**
81
-
82
- - Check environment variable name
83
- - Set required environment variable
84
-
85
71
  ## Frequently Asked Questions
86
72
 
87
73
  ### Q: What is an MCP lease?
@@ -26,9 +26,10 @@
26
26
 
27
27
  mcp_admin is Dominds' **MCP administration toolset** for managing MCP (Model Context Protocol) connections and resources:
28
28
 
29
- - **MCP restart**: Restart MCP service
29
+ - **MCP restart/enable**: Enable and restart MCP service
30
30
  - **MCP release**: Release MCP lease
31
- - **Environment variables**: Read environment variables
31
+ - **MCP disable**: Disable MCP service while keeping a zero-tool toolset/manual visible
32
+ - **Environment variables**: Read, set, and delete local environment variables
32
33
 
33
34
  ## Quick Navigation
34
35
 
@@ -43,7 +44,8 @@ mcp_admin is Dominds' **MCP administration toolset** for managing MCP (Model Con
43
44
 
44
45
  - Status: Implemented
45
46
  - Main implementation files:
46
- - Tool implementation: `dominds/main/tools/mcp-admin.ts`
47
+ - MCP tool implementation: `dominds/main/tools/mcp.ts`
48
+ - Environment variable tool implementation: `dominds/main/tools/env.ts`
47
49
  - Toolset metadata: `dominds/main/tools/builtins.ts`, `dominds/main/tools/registry.ts`
48
50
 
49
51
  ## Core Concepts
@@ -45,17 +45,22 @@ MCP uses a lease mechanism to manage runtime resources such as HTTP connections
45
45
  - **Hold lease**: Keep using that runtime instance
46
46
  - **Release lease**: Stop/disconnect and release resources
47
47
 
48
+ `mcp_restart` changes the target server from `enabled: false` back to `enabled: true`, then tries to start it. When it succeeds, it replaces the global MCP runtime and clears all dialog leases on the old runtime; you do not need to call `mcp_release` first. To force a server into the disabled state, use `mcp_disable`.
49
+
48
50
  ### 3. Environment Variables
49
51
 
50
52
  Shared with os toolset for environment variable functionality.
51
53
 
52
54
  ## Tool Overview
53
55
 
54
- | Tool | Function |
55
- | ----------- | ------------------------ |
56
- | mcp_restart | Restart MCP service |
57
- | mcp_release | Release MCP lease |
58
- | env_get | Get environment variable |
56
+ | Tool | Function |
57
+ | ----------- | ------------------------------ |
58
+ | mcp_restart | Enable and restart MCP service |
59
+ | mcp_release | Release MCP lease |
60
+ | mcp_disable | Disable MCP service |
61
+ | env_get | Get environment variable |
62
+ | env_set | Set environment variable |
63
+ | env_unset | Delete environment variable |
59
64
 
60
65
  ## Best Practices
61
66
 
@@ -64,6 +69,7 @@ Shared with os toolset for environment variable functionality.
64
69
  - **Release timely**: Release lease when MCP is no longer used
65
70
  - **Monitor status**: Regularly check MCP connection status
66
71
  - **Error handling**: Handle connection failures
72
+ - **Responsibility routing**: teammates without the `mcp_admin` toolset should use the team responsibility quick table / routing cards to ask the MCP troubleshooter or administrator for help when MCP tools stop working; they should not improvise a bypass.
67
73
 
68
74
  ### 2. Resource Management
69
75
 
@@ -15,7 +15,9 @@
15
15
 
16
16
  ### Scenario Description
17
17
 
18
- When MCP service has issues or needs to refresh the connection, restart the MCP service.
18
+ When an MCP service has issues, needs to refresh the connection, or is currently disabled with `enabled: false`, enable and restart the MCP service.
19
+
20
+ `mcp_restart` writes `enabled: true` when the server is currently `enabled: false`, then tries to start it. After it succeeds, it clears every dialog lease on the old runtime; you do not need to call `mcp_release` first.
19
21
 
20
22
  ### Example
21
23
 
@@ -53,7 +55,21 @@ env_get({
53
55
  });
54
56
  ```
55
57
 
56
- ## Scenario 4: MCP Connection Failure Handling
58
+ ## Scenario 4: Disable MCP Service
59
+
60
+ ### Scenario Description
61
+
62
+ When an MCP server should stop providing tools, or troubleshooting needs to force it offline, disable that server and write `enabled: false`. A disabled server is still exposed as a zero-tool toolset, and its manual clearly marks it as disabled.
63
+
64
+ ### Example
65
+
66
+ ```typescript
67
+ mcp_disable({
68
+ serverId: 'filesystem',
69
+ });
70
+ ```
71
+
72
+ ## Scenario 5: MCP Connection Failure Handling
57
73
 
58
74
  ### Scenario Description
59
75
 
@@ -69,7 +85,7 @@ mcp_restart({
69
85
  });
70
86
  ```
71
87
 
72
- ## Scenario 5: Resource Cleanup
88
+ ## Scenario 6: Resource Cleanup
73
89
 
74
90
  ### Scenario Description
75
91
 
@@ -21,7 +21,7 @@
21
21
 
22
22
  ### 1. mcp_restart
23
23
 
24
- Restart MCP service.
24
+ Enable and rebuild an MCP service using the current `.minds/mcp.yaml` config. If the target server is currently `enabled: false`, this writes `enabled: true` before trying to start it. After a successful restart, Dominds replaces the global MCP runtime/tool registration and clears all dialog leases held on the old runtime. If restart fails, the old runtime/leases are kept so troubleshooting does not tear down a still-working connection.
25
25
 
26
26
  **Parameters:**
27
27
 
@@ -30,9 +30,7 @@ Restart MCP service.
30
30
  **Returns:**
31
31
 
32
32
  ```yaml
33
- status: ok|error
34
- serverId: <MCP service identifier>
35
- restarted_at: <restart timestamp>
33
+ ok: restarted <MCP service identifier>
36
34
  ```
37
35
 
38
36
  **Errors:**
@@ -50,9 +48,13 @@ Release the current dialog's leased MCP runtime instance for a server. This stop
50
48
  **Returns:**
51
49
 
52
50
  ```yaml
53
- status: ok|error
54
- serverId: <MCP service identifier>
55
- released_at: <release timestamp>
51
+ ok: released <MCP service identifier> for dialog <dialog identifier>
52
+ ```
53
+
54
+ If the current dialog has no releasable lease, returns:
55
+
56
+ ```yaml
57
+ ok: no active lease for <MCP service identifier> (or server is truely-stateless)
56
58
  ```
57
59
 
58
60
  **Errors:**
@@ -60,7 +62,21 @@ released_at: <release timestamp>
60
62
  - `MCP_NOT_FOUND`: MCP service doesn't exist
61
63
  - `MCP_NOT_RUNNING`: MCP service not running
62
64
 
63
- ### 3. env_get
65
+ ### 3. mcp_disable
66
+
67
+ Disable an MCP service and write `enabled: false` for that server in `.minds/mcp.yaml`. This does not wait for a replacement service to become available: it unconditionally clears the loaded runtime/leases. The disabled server remains visible as a zero-tool MCP toolset, with its manual clearly marked disabled.
68
+
69
+ **Parameters:**
70
+
71
+ - `serverId` (required): MCP service identifier
72
+
73
+ **Returns:**
74
+
75
+ ```yaml
76
+ ok: disabled <MCP service identifier> and set enabled=false
77
+ ```
78
+
79
+ ### 4. env_get
64
80
 
65
81
  Get environment variable (shared with os toolset).
66
82
 
@@ -70,16 +86,41 @@ Get environment variable (shared with os toolset).
70
86
 
71
87
  **Returns:**
72
88
 
89
+ - Set: returns the environment variable value directly
90
+ - Unset: returns `(unset)`
91
+
92
+ ### 5. env_set
93
+
94
+ Set an environment variable in the Dominds server process (shared with os toolset).
95
+
96
+ **Parameters:**
97
+
98
+ - `key` (required): Environment variable name
99
+ - `value` (required): Environment variable value
100
+
101
+ **Returns:**
102
+
73
103
  ```yaml
74
- status: ok|error
75
- key: <environment variable name>
76
- value: <environment variable value>
77
- retrieved_at: <retrieval timestamp>
104
+ ok: <environment variable name>
105
+ prev: <previous value or (unset)>
106
+ next: <new value>
78
107
  ```
79
108
 
80
- **Errors:**
109
+ ### 6. env_unset
81
110
 
82
- - `ENV_NOT_FOUND`: Environment variable doesn't exist
111
+ Delete an environment variable from the Dominds server process (shared with os toolset).
112
+
113
+ **Parameters:**
114
+
115
+ - `key` (required): Environment variable name
116
+
117
+ **Returns:**
118
+
119
+ ```yaml
120
+ ok: <environment variable name>
121
+ prev: <previous value or (unset)>
122
+ next: (unset)
123
+ ```
83
124
 
84
125
  ## Usage Examples
85
126
 
@@ -99,6 +140,14 @@ mcp_release({
99
140
  });
100
141
  ```
101
142
 
143
+ ### Disable MCP Service
144
+
145
+ ```typescript
146
+ mcp_disable({
147
+ serverId: 'browser',
148
+ });
149
+ ```
150
+
102
151
  ### Get Environment Variable
103
152
 
104
153
  ```typescript
@@ -107,17 +156,32 @@ env_get({
107
156
  });
108
157
  ```
109
158
 
110
- ## YAML Output Contract
159
+ ### Set Environment Variable
160
+
161
+ ```typescript
162
+ env_set({
163
+ key: 'MCP_AUTH_TOKEN',
164
+ value: 'local-token',
165
+ });
166
+ ```
167
+
168
+ ### Delete Environment Variable
169
+
170
+ ```typescript
171
+ env_unset({
172
+ key: 'MCP_AUTH_TOKEN',
173
+ });
174
+ ```
175
+
176
+ ## Output Contract
111
177
 
112
- All tool outputs use YAML format for programmatic processing:
178
+ These tools use the short text return formats described in their own sections:
113
179
 
114
- - `status`: Operation status, `ok` for success, `error` for failure
115
- - Other fields: Additional information for specific operations
180
+ - Success: starts with `ok:`
181
+ - Failure: starts with `error:`
116
182
 
117
183
  On error, returns:
118
184
 
119
185
  ```yaml
120
- status: error
121
- error_code: <error code>
122
- message: <error message>
186
+ error: <error message>
123
187
  ```
@@ -68,20 +68,6 @@
68
68
  - 检查租约状态
69
69
  - 联系管理员
70
70
 
71
- ### ENV_NOT_FOUND
72
-
73
- **描述:** 环境变量不存在。
74
-
75
- **原因:**
76
-
77
- - 环境变量未被设置
78
- - 环境变量名称错误
79
-
80
- **解决方案:**
81
-
82
- - 检查环境变量名称
83
- - 设置所需的环境变量
84
-
85
71
  ## 常见问题
86
72
 
87
73
  ### Q: MCP 租约是什么?
@@ -26,9 +26,10 @@
26
26
 
27
27
  mcp_admin 是 Dominds 的 **MCP 管理工具集**,用于管理 MCP(Model Context Protocol)连接和资源:
28
28
 
29
- - **MCP 重启**:重启 MCP 服务
29
+ - **MCP 重启/启用**:启用并重启 MCP 服务
30
30
  - **MCP 释放**:释放 MCP 租约
31
- - **环境变量**:读取环境变量
31
+ - **MCP 禁用**:禁用 MCP 服务,并保留 0 工具 toolset/手册可见性
32
+ - **环境变量**:读取、设置、删除本地环境变量
32
33
 
33
34
  ## 快速导航
34
35
 
@@ -43,7 +44,8 @@ mcp_admin 是 Dominds 的 **MCP 管理工具集**,用于管理 MCP(Model Con
43
44
 
44
45
  - 状态:已实现
45
46
  - 主要实现文件:
46
- - 工具实现:`dominds/main/tools/mcp-admin.ts`
47
+ - MCP 工具实现:`dominds/main/tools/mcp.ts`
48
+ - 环境变量工具实现:`dominds/main/tools/env.ts`
47
49
  - toolset 元信息:`dominds/main/tools/builtins.ts`、`dominds/main/tools/registry.ts`
48
50
 
49
51
  ## 核心概念
@@ -45,17 +45,22 @@ MCP 使用租约机制管理运行时资源,例如 HTTP 连接和 stdio 进程
45
45
  - **持有租约**:继续使用该运行时实例
46
46
  - **释放租约**:停止/断开并释放资源
47
47
 
48
+ `mcp_restart` 会把目标 server 的 `enabled: false` 改回 `enabled: true`,然后尝试启动;成功时会替换全局 MCP runtime 并清掉旧 runtime 的所有对话 lease;不需要先逐个 `mcp_release`。如果需要强制禁用某个 server,使用 `mcp_disable`。
49
+
48
50
  ### 3. 环境变量
49
51
 
50
52
  与 os 工具集共享环境变量功能。
51
53
 
52
54
  ## 工具概览
53
55
 
54
- | 工具 | 功能 |
55
- | ----------- | ------------- |
56
- | mcp_restart | 重启 MCP 服务 |
57
- | mcp_release | 释放 MCP 租约 |
58
- | env_get | 获取环境变量 |
56
+ | 工具 | 功能 |
57
+ | ----------- | ------------------- |
58
+ | mcp_restart | 启用并重启 MCP 服务 |
59
+ | mcp_release | 释放 MCP 租约 |
60
+ | mcp_disable | 禁用 MCP 服务 |
61
+ | env_get | 获取环境变量 |
62
+ | env_set | 设置环境变量 |
63
+ | env_unset | 删除环境变量 |
59
64
 
60
65
  ## 最佳实践
61
66
 
@@ -64,6 +69,7 @@ MCP 使用租约机制管理运行时资源,例如 HTTP 连接和 stdio 进程
64
69
  - **及时释放**:不再使用 MCP 时及时释放租约
65
70
  - **监控状态**:定期检查 MCP 连接状态
66
71
  - **错误处理**:处理连接失败的情况
72
+ - **职责路由**:没有 `mcp_admin` 工具集的队友遇到 MCP 工具异常时,应按团队职责速查表/路由卡找到 MCP 排障或管理员队友协助,不要自行绕过。
67
73
 
68
74
  ### 2. 资源管理
69
75
 
@@ -15,7 +15,9 @@
15
15
 
16
16
  ### 场景描述
17
17
 
18
- 当 MCP 服务出现故障或需要刷新连接时,重启 MCP 服务。
18
+ 当 MCP 服务出现故障、需要刷新连接,或当前被 `enabled: false` 禁用时,启用并重启 MCP 服务。
19
+
20
+ `mcp_restart` 会把 `enabled: false` 写回 `enabled: true` 后尝试启动;成功后会清理旧 runtime 的全部对话 lease,不需要先 `mcp_release`。
19
21
 
20
22
  ### 示例
21
23
 
@@ -53,7 +55,21 @@ env_get({
53
55
  });
54
56
  ```
55
57
 
56
- ## 场景 4MCP 连接故障处理
58
+ ## 场景 4:禁用 MCP 服务
59
+
60
+ ### 场景描述
61
+
62
+ 当某个 MCP server 不应继续提供工具,或排障时需要强制下线它,禁用该 server 并写入 `enabled: false`。禁用后的 server 仍会作为 0 工具 toolset 暴露,手册会明确标记已禁用。
63
+
64
+ ### 示例
65
+
66
+ ```typescript
67
+ mcp_disable({
68
+ serverId: 'filesystem',
69
+ });
70
+ ```
71
+
72
+ ## 场景 5:MCP 连接故障处理
57
73
 
58
74
  ### 场景描述
59
75
 
@@ -69,7 +85,7 @@ mcp_restart({
69
85
  });
70
86
  ```
71
87
 
72
- ## 场景 5:资源清理
88
+ ## 场景 6:资源清理
73
89
 
74
90
  ### 场景描述
75
91