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.
- package/dist/cli/team-definition-audit.d.ts +2 -1
- package/dist/cli/team-definition-audit.js +20 -8
- package/dist/cli/validate-team-def.js +3 -3
- package/dist/docs/mcp-support.md +11 -0
- package/dist/docs/mcp-support.zh.md +7 -0
- package/dist/docs/team_mgmt-toolset.md +5 -2
- package/dist/docs/team_mgmt-toolset.zh.md +4 -2
- package/dist/docs/tool-availability-protocol.md +4 -2
- package/dist/mcp/config.d.ts +1 -0
- package/dist/mcp/config.js +16 -0
- package/dist/mcp/supervisor.d.ts +7 -1
- package/dist/mcp/supervisor.js +298 -16
- package/dist/minds/load.js +5 -0
- package/dist/minds/system-prompt.d.ts +1 -0
- package/dist/minds/system-prompt.js +14 -6
- package/dist/tools/builtins.js +2 -0
- package/dist/tools/env.js +10 -58
- package/dist/tools/manual/render.js +4 -0
- package/dist/tools/mcp.d.ts +1 -0
- package/dist/tools/mcp.js +55 -5
- package/dist/tools/prompts/mcp_admin/en/errors.md +0 -14
- package/dist/tools/prompts/mcp_admin/en/index.md +5 -3
- package/dist/tools/prompts/mcp_admin/en/principles.md +11 -5
- package/dist/tools/prompts/mcp_admin/en/scenarios.md +19 -3
- package/dist/tools/prompts/mcp_admin/en/tools.md +85 -21
- package/dist/tools/prompts/mcp_admin/zh/errors.md +0 -14
- package/dist/tools/prompts/mcp_admin/zh/index.md +5 -3
- package/dist/tools/prompts/mcp_admin/zh/principles.md +11 -5
- package/dist/tools/prompts/mcp_admin/zh/scenarios.md +19 -3
- package/dist/tools/prompts/mcp_admin/zh/tools.md +85 -21
- package/dist/tools/prompts/os/en/errors.md +0 -28
- package/dist/tools/prompts/os/en/scenarios.md +1 -1
- package/dist/tools/prompts/os/en/tools.md +8 -17
- package/dist/tools/prompts/os/zh/errors.md +0 -28
- package/dist/tools/prompts/os/zh/scenarios.md +1 -1
- package/dist/tools/prompts/os/zh/tools.md +8 -17
- package/dist/tools/registry.d.ts +5 -0
- package/dist/tools/team_mgmt-mcp-manual.d.ts +2 -2
- package/dist/tools/team_mgmt-mcp-manual.js +57 -16
- package/dist/tools/team_mgmt.js +4 -4
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-B7M9Q0Fa.js → _basePickBy-Dnh413xT.js} +3 -3
- package/webapp/dist/assets/_basePickBy-Dnh413xT.js.map +1 -0
- package/webapp/dist/assets/{_baseUniq-DAeYoL6j.js → _baseUniq-DWzYqpN_.js} +2 -2
- package/webapp/dist/assets/_baseUniq-DWzYqpN_.js.map +1 -0
- package/webapp/dist/assets/{arc-Bh4nDbNR.js → arc-vfBkNCOx.js} +2 -2
- package/webapp/dist/assets/arc-vfBkNCOx.js.map +1 -0
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CxqmdsIm.js → architectureDiagram-VXUJARFQ-DiUEBXOa.js} +8 -26
- package/webapp/dist/assets/architectureDiagram-VXUJARFQ-DiUEBXOa.js.map +1 -0
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CxIWLtpt.js → blockDiagram-VD42YOAC-BqK1KM2m.js} +170 -187
- package/webapp/dist/assets/blockDiagram-VD42YOAC-BqK1KM2m.js.map +1 -0
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-1qErOIgG.js → c4Diagram-YG6GDRKO-ClHNu1Uo.js} +4 -4
- package/webapp/dist/assets/c4Diagram-YG6GDRKO-ClHNu1Uo.js.map +1 -0
- package/webapp/dist/assets/{channel-DkgZHNUe.js → channel-BbWLVc8W.js} +2 -2
- package/webapp/dist/assets/channel-BbWLVc8W.js.map +1 -0
- package/webapp/dist/assets/{chunk-4BX2VUAB-BmdMbU9v.js → chunk-4BX2VUAB-CItdSmZH.js} +2 -2
- package/webapp/dist/assets/chunk-4BX2VUAB-CItdSmZH.js.map +1 -0
- package/webapp/dist/assets/{chunk-55IACEB6-D6LDTDBy.js → chunk-55IACEB6-DSCX9WCf.js} +2 -2
- package/webapp/dist/assets/chunk-55IACEB6-DSCX9WCf.js.map +1 -0
- package/webapp/dist/assets/{chunk-WL4C6EOR-B-Pk44be.js → chunk-B4BG7PRW-5CRXFeD9.js} +121 -171
- package/webapp/dist/assets/chunk-B4BG7PRW-5CRXFeD9.js.map +1 -0
- package/webapp/dist/assets/{chunk-NQ4KR5QH-wlvxalE3.js → chunk-DI55MBZ5-CRMf6XZu.js} +7 -9
- package/webapp/dist/assets/chunk-DI55MBZ5-CRMf6XZu.js.map +1 -0
- package/webapp/dist/assets/{chunk-FMBD7UC4-C-BdCe4C.js → chunk-FMBD7UC4-BJ1vT2se.js} +2 -2
- package/webapp/dist/assets/chunk-FMBD7UC4-BJ1vT2se.js.map +1 -0
- package/webapp/dist/assets/{chunk-KX2RTZJC-CA7sDJO5.js → chunk-QN33PNHL-CGyezTSD.js} +2 -2
- package/webapp/dist/assets/chunk-QN33PNHL-CGyezTSD.js.map +1 -0
- package/webapp/dist/assets/{chunk-QZHKN3VN-Bo1VMcph.js → chunk-QZHKN3VN-9xs15j8C.js} +2 -2
- package/webapp/dist/assets/chunk-QZHKN3VN-9xs15j8C.js.map +1 -0
- package/webapp/dist/assets/{chunk-JSJVCQXG-WA_BLIm9.js → chunk-TZMSLE5B-D2g6Tj7Z.js} +6 -14
- package/webapp/dist/assets/chunk-TZMSLE5B-D2g6Tj7Z.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-BqKuyb49.js → classDiagram-2ON5EDUG-BQFGGJNm.js} +6 -7
- package/webapp/dist/assets/classDiagram-2ON5EDUG-BQFGGJNm.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BqKuyb49.js → classDiagram-v2-WZHVMYZB-BQFGGJNm.js} +6 -7
- package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-BQFGGJNm.js.map +1 -0
- package/webapp/dist/assets/{clone-BX5z8WVZ.js → clone-DOfPd4cz.js} +2 -2
- package/webapp/dist/assets/clone-DOfPd4cz.js.map +1 -0
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-s11SgN.js → cose-bilkent-S5V4N54A-BYN-vqm8.js} +2 -2
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-BYN-vqm8.js.map +1 -0
- package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-DmQFV2qK.js → dagre-6UL2VRFP-ClEaFABE.js} +7 -7
- package/webapp/dist/assets/dagre-6UL2VRFP-ClEaFABE.js.map +1 -0
- package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-QRaBfST8.js → diagram-PSM6KHXK-CM4hLE_0.js} +10 -10
- package/webapp/dist/assets/diagram-PSM6KHXK-CM4hLE_0.js.map +1 -0
- package/webapp/dist/assets/{diagram-IFDJBPK2-lrWn1Obo.js → diagram-QEK2KX5R-BZjGFX-2.js} +8 -9
- package/webapp/dist/assets/diagram-QEK2KX5R-BZjGFX-2.js.map +1 -0
- package/webapp/dist/assets/{diagram-P4PSJMXO-sTU7Hh-Y.js → diagram-S2PKOQOG-Bvw01OOG.js} +8 -8
- package/webapp/dist/assets/diagram-S2PKOQOG-Bvw01OOG.js.map +1 -0
- package/webapp/dist/assets/{erDiagram-INFDFZHY-Cx6jc9Wq.js → erDiagram-Q2GNP2WA-ctHu5zQL.js} +75 -96
- package/webapp/dist/assets/erDiagram-Q2GNP2WA-ctHu5zQL.js.map +1 -0
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DfGI49Dz.js → flowDiagram-NV44I4VS-m7ofIhri.js} +81 -98
- package/webapp/dist/assets/flowDiagram-NV44I4VS-m7ofIhri.js.map +1 -0
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-nrcHWWaM.js → ganttDiagram-JELNMOA3-D9wS5Veb.js} +3 -28
- package/webapp/dist/assets/ganttDiagram-JELNMOA3-D9wS5Veb.js.map +1 -0
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js → gitGraphDiagram-V2S2FVAM-B86qqJx7.js} +46 -38
- package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-B86qqJx7.js.map +1 -0
- package/webapp/dist/assets/graph-u844GGQC.js +425 -0
- package/webapp/dist/assets/graph-u844GGQC.js.map +1 -0
- package/webapp/dist/assets/{index-DZFkLLVz.css → index-BGdI3lWA.css} +1 -1
- package/webapp/dist/assets/{index--fy89xGh.js → index-tinPEZoH.js} +1059 -1034
- package/webapp/dist/assets/{index--fy89xGh.js.map → index-tinPEZoH.js.map} +1 -1
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-PIoZHr7s.js → infoDiagram-HS3SLOUP-DwRPUctP.js} +7 -7
- package/webapp/dist/assets/infoDiagram-HS3SLOUP-DwRPUctP.js.map +1 -0
- package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C2qidjQ5.js → journeyDiagram-XKPGCS4Q-B91ZO-ec.js} +5 -5
- package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-B91ZO-ec.js.map +1 -0
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Du0TC8WS.js → kanban-definition-3W4ZIXB7-CoogrZ07.js} +3 -5
- package/webapp/dist/assets/kanban-definition-3W4ZIXB7-CoogrZ07.js.map +1 -0
- package/webapp/dist/assets/{layout-VmEo1OEB.js → layout-BrzQmqFJ.js} +5 -5
- package/webapp/dist/assets/layout-BrzQmqFJ.js.map +1 -0
- package/webapp/dist/assets/{linear-B662YHAc.js → linear-C6H7K9Zy.js} +2 -2
- package/webapp/dist/assets/linear-C6H7K9Zy.js.map +1 -0
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D7arZj95.js → mindmap-definition-VGOIOE7T-UDHZQkNZ.js} +5 -7
- package/webapp/dist/assets/mindmap-definition-VGOIOE7T-UDHZQkNZ.js.map +1 -0
- package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DvjPP4PA.js → pieDiagram-ADFJNKIX-M81uyQ1J.js} +8 -8
- package/webapp/dist/assets/pieDiagram-ADFJNKIX-M81uyQ1J.js.map +1 -0
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-B_JUGMj_.js → quadrantDiagram-AYHSOK5B-ClzIh9Gb.js} +3 -3
- package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-ClzIh9Gb.js.map +1 -0
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DF0mpvE3.js → requirementDiagram-UZGBJVZJ-DLK3A-pn.js} +6 -16
- package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-DLK3A-pn.js.map +1 -0
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CoXlxv00.js → sankeyDiagram-TZEHDZUN-CYqju8I1.js} +2 -2
- package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-CYqju8I1.js.map +1 -0
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYqT5Pg7.js → sequenceDiagram-WL72ISMW-2guv6eOd.js} +201 -601
- package/webapp/dist/assets/sequenceDiagram-WL72ISMW-2guv6eOd.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9b1mN8-.js → stateDiagram-FKZM4ZOC-iujqSp0X.js} +9 -9
- package/webapp/dist/assets/stateDiagram-FKZM4ZOC-iujqSp0X.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DNzgudL_.js → stateDiagram-v2-4FDKWEC3-BxzY81ky.js} +5 -5
- package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-BxzY81ky.js.map +1 -0
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkyKUY7A.js → timeline-definition-IT6M3QCI-DjCFSC8d.js} +3 -3
- package/webapp/dist/assets/timeline-definition-IT6M3QCI-DjCFSC8d.js.map +1 -0
- package/webapp/dist/assets/{treemap-KZPCXAKY-CZd09kF-.js → treemap-GDKQZRPO-iaBzDWCP.js} +24 -37
- package/webapp/dist/assets/treemap-GDKQZRPO-iaBzDWCP.js.map +1 -0
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BRwRloPc.js → xychartDiagram-PRI3JC2R-R6Jl1c89.js} +4 -4
- package/webapp/dist/assets/xychartDiagram-PRI3JC2R-R6Jl1c89.js.map +1 -0
- package/webapp/dist/index.html +2 -2
- package/webapp/dist/assets/_basePickBy-B7M9Q0Fa.js.map +0 -1
- package/webapp/dist/assets/_baseUniq-DAeYoL6j.js.map +0 -1
- package/webapp/dist/assets/arc-Bh4nDbNR.js.map +0 -1
- package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CxqmdsIm.js.map +0 -1
- package/webapp/dist/assets/blockDiagram-WCTKOSBZ-CxIWLtpt.js.map +0 -1
- package/webapp/dist/assets/c4Diagram-IC4MRINW-1qErOIgG.js.map +0 -1
- package/webapp/dist/assets/channel-DkgZHNUe.js.map +0 -1
- package/webapp/dist/assets/chunk-4BX2VUAB-BmdMbU9v.js.map +0 -1
- package/webapp/dist/assets/chunk-55IACEB6-D6LDTDBy.js.map +0 -1
- package/webapp/dist/assets/chunk-FMBD7UC4-C-BdCe4C.js.map +0 -1
- package/webapp/dist/assets/chunk-JSJVCQXG-WA_BLIm9.js.map +0 -1
- package/webapp/dist/assets/chunk-KX2RTZJC-CA7sDJO5.js.map +0 -1
- package/webapp/dist/assets/chunk-NQ4KR5QH-wlvxalE3.js.map +0 -1
- package/webapp/dist/assets/chunk-QZHKN3VN-Bo1VMcph.js.map +0 -1
- package/webapp/dist/assets/chunk-WL4C6EOR-B-Pk44be.js.map +0 -1
- package/webapp/dist/assets/classDiagram-VBA2DB6C-BqKuyb49.js.map +0 -1
- package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-BqKuyb49.js.map +0 -1
- package/webapp/dist/assets/clone-BX5z8WVZ.js.map +0 -1
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-B-s11SgN.js.map +0 -1
- package/webapp/dist/assets/dagre-KLK3FWXG-DmQFV2qK.js.map +0 -1
- package/webapp/dist/assets/diagram-E7M64L7V-QRaBfST8.js.map +0 -1
- package/webapp/dist/assets/diagram-IFDJBPK2-lrWn1Obo.js.map +0 -1
- package/webapp/dist/assets/diagram-P4PSJMXO-sTU7Hh-Y.js.map +0 -1
- package/webapp/dist/assets/erDiagram-INFDFZHY-Cx6jc9Wq.js.map +0 -1
- package/webapp/dist/assets/flowDiagram-PKNHOUZH-DfGI49Dz.js.map +0 -1
- package/webapp/dist/assets/ganttDiagram-A5KZAMGK-nrcHWWaM.js.map +0 -1
- package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js.map +0 -1
- package/webapp/dist/assets/graph-R5G-y8tB.js +0 -782
- package/webapp/dist/assets/graph-R5G-y8tB.js.map +0 -1
- package/webapp/dist/assets/infoDiagram-LFFYTUFH-PIoZHr7s.js.map +0 -1
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-oCM-LYk1.js +0 -966
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-oCM-LYk1.js.map +0 -1
- package/webapp/dist/assets/journeyDiagram-4ABVD52K-C2qidjQ5.js.map +0 -1
- package/webapp/dist/assets/kanban-definition-K7BYSVSG-Du0TC8WS.js.map +0 -1
- package/webapp/dist/assets/layout-VmEo1OEB.js.map +0 -1
- package/webapp/dist/assets/linear-B662YHAc.js.map +0 -1
- package/webapp/dist/assets/mindmap-definition-YRQLILUH-D7arZj95.js.map +0 -1
- package/webapp/dist/assets/pieDiagram-SKSYHLDU-DvjPP4PA.js.map +0 -1
- package/webapp/dist/assets/quadrantDiagram-337W2JSQ-B_JUGMj_.js.map +0 -1
- package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-DF0mpvE3.js.map +0 -1
- package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-CoXlxv00.js.map +0 -1
- package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DYqT5Pg7.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-RAJIS63D-D9b1mN8-.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-DNzgudL_.js.map +0 -1
- package/webapp/dist/assets/timeline-definition-YZTLITO2-CkyKUY7A.js.map +0 -1
- package/webapp/dist/assets/treemap-KZPCXAKY-CZd09kF-.js.map +0 -1
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-BxVF5Olo.js +0 -2487
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-BxVF5Olo.js.map +0 -1
- 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
|
-
|
|
47
|
-
|
|
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
|
|
100
|
-
if (!
|
|
101
|
-
throw new Error(
|
|
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
|
-
|
|
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
|
}
|
package/dist/tools/mcp.d.ts
CHANGED
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').
|
|
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: '
|
|
80
|
+
description: 'Enable a configured MCP server if needed, then restart it using the current `.minds/mcp.yaml` config.',
|
|
63
81
|
descriptionI18n: {
|
|
64
|
-
en: '
|
|
65
|
-
zh: '
|
|
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**:
|
|
29
|
+
- **MCP restart/enable**: Enable and restart MCP service
|
|
30
30
|
- **MCP release**: Release MCP lease
|
|
31
|
-
- **
|
|
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
|
-
-
|
|
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 |
|
|
57
|
-
| mcp_release | Release MCP lease
|
|
58
|
-
|
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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.
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
109
|
+
### 6. env_unset
|
|
81
110
|
|
|
82
|
-
|
|
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
|
-
|
|
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
|
-
|
|
178
|
+
These tools use the short text return formats described in their own sections:
|
|
113
179
|
|
|
114
|
-
-
|
|
115
|
-
-
|
|
180
|
+
- Success: starts with `ok:`
|
|
181
|
+
- Failure: starts with `error:`
|
|
116
182
|
|
|
117
183
|
On error, returns:
|
|
118
184
|
|
|
119
185
|
```yaml
|
|
120
|
-
|
|
121
|
-
error_code: <error code>
|
|
122
|
-
message: <error message>
|
|
186
|
+
error: <error message>
|
|
123
187
|
```
|
|
@@ -26,9 +26,10 @@
|
|
|
26
26
|
|
|
27
27
|
mcp_admin 是 Dominds 的 **MCP 管理工具集**,用于管理 MCP(Model Context Protocol)连接和资源:
|
|
28
28
|
|
|
29
|
-
- **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
|
|
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 |
|
|
57
|
-
| mcp_release | 释放 MCP 租约
|
|
58
|
-
|
|
|
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
|
|
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
|
-
## 场景 4
|
|
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
|
-
## 场景
|
|
88
|
+
## 场景 6:资源清理
|
|
73
89
|
|
|
74
90
|
### 场景描述
|
|
75
91
|
|