@kikilight/envmgr-mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +296 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# envmgr-mcp-server
|
|
2
|
+
|
|
3
|
+
通过 SSH 和浏览器访问管理多套命名环境的 MCP 服务器,供 Claude 等 LLM 直接调用。
|
|
4
|
+
|
|
5
|
+
提供三个工具:
|
|
6
|
+
- `envmgr_list` — 列出所有已配置环境(支持按 `type` 过滤)
|
|
7
|
+
- `envmgr_ssh` — 在指定环境上通过 SSH 执行 shell 命令
|
|
8
|
+
- `envmgr_browser` — 返回指定环境的浏览器 URL 和登录凭据(供 Playwright / chrome-devtools-mcp 使用)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 安装
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install -g @kikilight/envmgr-mcp-server
|
|
16
|
+
claude mcp add -s user envmgr-mcp-server -- envmgr-mcp-server
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
完成后**重启 Claude Code** 即可使用。
|
|
20
|
+
|
|
21
|
+
> 升级到新版本:`npm install -g @kikilight/envmgr-mcp-server@latest`
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 配置环境
|
|
26
|
+
|
|
27
|
+
首次运行时,若未找到配置文件,服务会自动生成一份示例配置:
|
|
28
|
+
- Windows: `%USERPROFILE%\.config\envmgr\envs.json`
|
|
29
|
+
- macOS / Linux: `~/.config/envmgr/envs.json`
|
|
30
|
+
|
|
31
|
+
按需编辑该文件即可,格式如下:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"envs": {
|
|
36
|
+
"prod": {
|
|
37
|
+
"type": "production",
|
|
38
|
+
"description": "生产环境",
|
|
39
|
+
"ssh": {
|
|
40
|
+
"host": "10.0.0.1",
|
|
41
|
+
"user": "root",
|
|
42
|
+
"password": "yourpassword",
|
|
43
|
+
"port": 22
|
|
44
|
+
},
|
|
45
|
+
"browser": {
|
|
46
|
+
"url": "https://admin.example.com",
|
|
47
|
+
"username": "admin",
|
|
48
|
+
"password": "yourpassword"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`ssh` 和 `browser` 均为可选,一个环境可同时拥有两者或只有其一。
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 开发 & 打包(开发者)
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npm install
|
|
63
|
+
npm run build # tsc 编译 → dist/
|
|
64
|
+
npm run dev # tsx watch 模式,自动重载
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
发布到 npm:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npm run build
|
|
71
|
+
npm publish
|
|
72
|
+
```
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { Client } from "ssh2";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { readFileSync, existsSync, mkdirSync, writeFileSync } from "fs";
|
|
7
|
+
import { homedir } from "os";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
const PROJECT_CONFIG_NAME = ".envmgr.json";
|
|
10
|
+
const GLOBAL_CONFIG_PATH = join(homedir(), ".config", "envmgr", "envs.json");
|
|
11
|
+
function resolveConfigPath() {
|
|
12
|
+
if (process.env.ENVMGR_CONFIG) {
|
|
13
|
+
return { path: process.env.ENVMGR_CONFIG, source: "env:ENVMGR_CONFIG" };
|
|
14
|
+
}
|
|
15
|
+
let dir = process.cwd();
|
|
16
|
+
while (true) {
|
|
17
|
+
const candidate = join(dir, PROJECT_CONFIG_NAME);
|
|
18
|
+
if (existsSync(candidate)) {
|
|
19
|
+
return { path: candidate, source: `project:${candidate}` };
|
|
20
|
+
}
|
|
21
|
+
const parent = join(dir, "..");
|
|
22
|
+
if (parent === dir)
|
|
23
|
+
break;
|
|
24
|
+
dir = parent;
|
|
25
|
+
}
|
|
26
|
+
return { path: GLOBAL_CONFIG_PATH, source: "global" };
|
|
27
|
+
}
|
|
28
|
+
function loadEnvs() {
|
|
29
|
+
const { path: configPath, source } = resolveConfigPath();
|
|
30
|
+
if (!existsSync(configPath)) {
|
|
31
|
+
if (source === "global") {
|
|
32
|
+
const dir = join(homedir(), ".config", "envmgr");
|
|
33
|
+
mkdirSync(dir, { recursive: true });
|
|
34
|
+
const example = {
|
|
35
|
+
envs: {
|
|
36
|
+
"example": {
|
|
37
|
+
type: "example",
|
|
38
|
+
ssh: {
|
|
39
|
+
host: "10.0.0.1",
|
|
40
|
+
user: "root",
|
|
41
|
+
password: "yourpassword",
|
|
42
|
+
port: 22,
|
|
43
|
+
},
|
|
44
|
+
browser: {
|
|
45
|
+
url: "https://admin.example.com",
|
|
46
|
+
username: "admin",
|
|
47
|
+
password: "yourpassword",
|
|
48
|
+
},
|
|
49
|
+
description: "示例环境,含 SSH 和浏览器配置,请修改后使用"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
writeFileSync(configPath, JSON.stringify(example, null, 2), "utf-8");
|
|
54
|
+
return { envs: example.envs, configPath, source };
|
|
55
|
+
}
|
|
56
|
+
return { envs: {}, configPath, source };
|
|
57
|
+
}
|
|
58
|
+
const raw = readFileSync(configPath, "utf-8").replace(/^/, "");
|
|
59
|
+
const parsed = JSON.parse(raw);
|
|
60
|
+
return { envs: parsed.envs ?? {}, configPath, source };
|
|
61
|
+
}
|
|
62
|
+
// ── SSH helper ────────────────────────────────────────────────────────────────
|
|
63
|
+
function sshExec(env, command, timeoutMs) {
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
const conn = new Client();
|
|
66
|
+
let output = "";
|
|
67
|
+
let errorOutput = "";
|
|
68
|
+
const timer = setTimeout(() => {
|
|
69
|
+
conn.destroy();
|
|
70
|
+
reject(new Error(`命令执行超时(${timeoutMs / 1000}s)`));
|
|
71
|
+
}, timeoutMs);
|
|
72
|
+
conn
|
|
73
|
+
.on("ready", () => {
|
|
74
|
+
conn.exec(command, (err, stream) => {
|
|
75
|
+
if (err) {
|
|
76
|
+
clearTimeout(timer);
|
|
77
|
+
conn.end();
|
|
78
|
+
return reject(err);
|
|
79
|
+
}
|
|
80
|
+
stream
|
|
81
|
+
.on("data", (data) => { output += data.toString(); })
|
|
82
|
+
.stderr.on("data", (data) => { errorOutput += data.toString(); });
|
|
83
|
+
stream.on("close", (code) => {
|
|
84
|
+
clearTimeout(timer);
|
|
85
|
+
conn.end();
|
|
86
|
+
const result = [output, errorOutput].filter(Boolean).join("\n[stderr]\n");
|
|
87
|
+
if (code !== 0) {
|
|
88
|
+
resolve(`[exit ${code}]\n${result}`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
resolve(result || "(无输出)");
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
})
|
|
96
|
+
.on("error", (err) => {
|
|
97
|
+
clearTimeout(timer);
|
|
98
|
+
reject(err);
|
|
99
|
+
})
|
|
100
|
+
.connect({
|
|
101
|
+
host: env.host,
|
|
102
|
+
port: env.port ?? 22,
|
|
103
|
+
username: env.user,
|
|
104
|
+
password: env.password,
|
|
105
|
+
privateKey: env.privateKey,
|
|
106
|
+
readyTimeout: Math.min(timeoutMs, 10000),
|
|
107
|
+
hostVerifier: () => true, // 跳过 host key 验证,内网使用
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// ── MCP Server ────────────────────────────────────────────────────────────────
|
|
112
|
+
const server = new McpServer({
|
|
113
|
+
name: "envmgr-mcp-server",
|
|
114
|
+
version: "1.0.0",
|
|
115
|
+
});
|
|
116
|
+
// Tool: envmgr_list
|
|
117
|
+
server.registerTool("envmgr_list", {
|
|
118
|
+
title: "列出环境",
|
|
119
|
+
description: `列出所有已配置的环境及其连接信息。
|
|
120
|
+
配置文件路径:${GLOBAL_CONFIG_PATH}(可通过 ENVMGR_CONFIG 环境变量覆盖)。
|
|
121
|
+
|
|
122
|
+
返回每个环境的:名称、类型、描述、SSH 状态、浏览器状态。密码不返回。`,
|
|
123
|
+
inputSchema: z.object({
|
|
124
|
+
type: z.string().optional().describe("按环境类型过滤,不传则返回所有"),
|
|
125
|
+
}).strict(),
|
|
126
|
+
annotations: {
|
|
127
|
+
readOnlyHint: true,
|
|
128
|
+
destructiveHint: false,
|
|
129
|
+
idempotentHint: true,
|
|
130
|
+
openWorldHint: false,
|
|
131
|
+
},
|
|
132
|
+
}, async ({ type }) => {
|
|
133
|
+
const { envs, configPath, source } = loadEnvs();
|
|
134
|
+
const filtered = type
|
|
135
|
+
? Object.fromEntries(Object.entries(envs).filter(([, e]) => e.type === type))
|
|
136
|
+
: envs;
|
|
137
|
+
const names = Object.keys(filtered);
|
|
138
|
+
const header = `配置来源:${source}\n文件路径:${configPath}`;
|
|
139
|
+
if (names.length === 0) {
|
|
140
|
+
const hint = type ? `(类型过滤: ${type})` : "";
|
|
141
|
+
return {
|
|
142
|
+
content: [{
|
|
143
|
+
type: "text",
|
|
144
|
+
text: `${header}\n\n没有配置任何环境${hint}。\n\n项目级配置:在项目根目录创建 ${PROJECT_CONFIG_NAME}\n全局配置:编辑 ${GLOBAL_CONFIG_PATH}`,
|
|
145
|
+
}],
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const lines = names.map((name) => {
|
|
149
|
+
const e = envs[name];
|
|
150
|
+
const hasSsh = e.ssh ? "✓ SSH" : "✗ SSH";
|
|
151
|
+
const hasBrowser = e.browser ? "✓ 浏览器" : "✗ 浏览器";
|
|
152
|
+
const desc = e.description ? ` 描述: ${e.description}` : "";
|
|
153
|
+
const sshDetail = e.ssh ? ` SSH: ${e.ssh.host}:${e.ssh.port ?? 22} 用户:${e.ssh.user}` : "";
|
|
154
|
+
const browserDetail = e.browser ? ` 浏览器: ${e.browser.url}` : "";
|
|
155
|
+
return `• ${name} [${e.type}]\n ${hasSsh} ${hasBrowser}${desc}${sshDetail}${browserDetail}`;
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
content: [{
|
|
159
|
+
type: "text",
|
|
160
|
+
text: `${header}\n\n已配置 ${names.length} 个环境:\n\n${lines.join("\n\n")}`,
|
|
161
|
+
}],
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
// Tool: envmgr_ssh
|
|
165
|
+
server.registerTool("envmgr_ssh", {
|
|
166
|
+
title: "在环境执行 SSH 命令",
|
|
167
|
+
description: `通过 SSH 在指定环境上执行 shell 命令,返回命令输出。
|
|
168
|
+
|
|
169
|
+
使用场景:
|
|
170
|
+
- 查看服务日志:tail -100 /data/logs/hillos-core/log-error.log
|
|
171
|
+
- 检查进程状态:ps aux | grep java
|
|
172
|
+
- 查看磁盘空间:df -h
|
|
173
|
+
- 统计日志错误:grep -c 'ERROR' /data/logs/xxx/log-error.log
|
|
174
|
+
|
|
175
|
+
注意:命令在 root 权限下执行,请谨慎使用破坏性命令。`,
|
|
176
|
+
inputSchema: z.object({
|
|
177
|
+
env: z.string().min(1).describe("环境名称,与 envmgr_list 返回的名称一致"),
|
|
178
|
+
command: z.string().min(1).describe("要执行的 shell 命令"),
|
|
179
|
+
timeout_seconds: z.number().int().min(5).max(120).default(30)
|
|
180
|
+
.describe("超时秒数,默认 30,最大 120"),
|
|
181
|
+
}).strict(),
|
|
182
|
+
annotations: {
|
|
183
|
+
readOnlyHint: false,
|
|
184
|
+
destructiveHint: true,
|
|
185
|
+
idempotentHint: false,
|
|
186
|
+
openWorldHint: true,
|
|
187
|
+
},
|
|
188
|
+
}, async ({ env: envName, command, timeout_seconds }) => {
|
|
189
|
+
const { envs } = loadEnvs();
|
|
190
|
+
const env = envs[envName];
|
|
191
|
+
if (!env) {
|
|
192
|
+
const available = Object.keys(envs).join(", ") || "(无)";
|
|
193
|
+
return {
|
|
194
|
+
content: [{
|
|
195
|
+
type: "text",
|
|
196
|
+
text: `错误:环境 "${envName}" 不存在。可用环境:${available}`,
|
|
197
|
+
}],
|
|
198
|
+
isError: true,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
if (!env.ssh) {
|
|
202
|
+
return {
|
|
203
|
+
content: [{
|
|
204
|
+
type: "text",
|
|
205
|
+
text: `错误:环境 "${envName}" 没有配置 SSH 访问`,
|
|
206
|
+
}],
|
|
207
|
+
isError: true,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
try {
|
|
211
|
+
const output = await sshExec(env.ssh, command, timeout_seconds * 1000);
|
|
212
|
+
const MAX = 20000;
|
|
213
|
+
const truncated = output.length > MAX
|
|
214
|
+
? output.slice(0, MAX) + `\n\n...[输出过长,已截断,原始长度 ${output.length} 字符]`
|
|
215
|
+
: output;
|
|
216
|
+
return {
|
|
217
|
+
content: [{
|
|
218
|
+
type: "text",
|
|
219
|
+
text: `[${envName}] $ ${command}\n\n${truncated}`,
|
|
220
|
+
}],
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
225
|
+
return {
|
|
226
|
+
content: [{
|
|
227
|
+
type: "text",
|
|
228
|
+
text: `SSH 连接失败(${envName} / ${env.ssh.host}):${msg}`,
|
|
229
|
+
}],
|
|
230
|
+
isError: true,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
// Tool: envmgr_browser
|
|
235
|
+
server.registerTool("envmgr_browser", {
|
|
236
|
+
title: "获取环境浏览器访问信息",
|
|
237
|
+
description: `返回指定环境的浏览器访问 URL 和认证凭据。
|
|
238
|
+
|
|
239
|
+
输出的结构化信息可供 Playwright、chrome-devtools-mcp 等浏览器自动化工具使用。
|
|
240
|
+
使用流程:
|
|
241
|
+
1. 调用 envmgr_browser 获取 url / username / password
|
|
242
|
+
2. 用浏览器自动化工具导航到 url
|
|
243
|
+
3. 填写 username 和 password 完成登录`,
|
|
244
|
+
inputSchema: z.object({
|
|
245
|
+
env: z.string().min(1).describe("环境名称,与 envmgr_list 返回的名称一致"),
|
|
246
|
+
}).strict(),
|
|
247
|
+
annotations: {
|
|
248
|
+
readOnlyHint: true,
|
|
249
|
+
destructiveHint: false,
|
|
250
|
+
idempotentHint: true,
|
|
251
|
+
openWorldHint: false,
|
|
252
|
+
},
|
|
253
|
+
}, async ({ env: envName }) => {
|
|
254
|
+
const { envs } = loadEnvs();
|
|
255
|
+
const env = envs[envName];
|
|
256
|
+
if (!env) {
|
|
257
|
+
const available = Object.keys(envs).join(", ") || "(无)";
|
|
258
|
+
return {
|
|
259
|
+
content: [{
|
|
260
|
+
type: "text",
|
|
261
|
+
text: `错误:环境 "${envName}" 不存在。可用环境:${available}`,
|
|
262
|
+
}],
|
|
263
|
+
isError: true,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
if (!env.browser) {
|
|
267
|
+
return {
|
|
268
|
+
content: [{
|
|
269
|
+
type: "text",
|
|
270
|
+
text: `错误:环境 "${envName}" 没有配置浏览器访问`,
|
|
271
|
+
}],
|
|
272
|
+
isError: true,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
content: [{
|
|
277
|
+
type: "text",
|
|
278
|
+
text: JSON.stringify({
|
|
279
|
+
url: env.browser.url,
|
|
280
|
+
username: env.browser.username,
|
|
281
|
+
password: env.browser.password,
|
|
282
|
+
}, null, 2),
|
|
283
|
+
}],
|
|
284
|
+
};
|
|
285
|
+
});
|
|
286
|
+
// ── Start ─────────────────────────────────────────────────────────────────────
|
|
287
|
+
async function main() {
|
|
288
|
+
const transport = new StdioServerTransport();
|
|
289
|
+
await server.connect(transport);
|
|
290
|
+
console.error("envmgr-mcp-server 已启动");
|
|
291
|
+
}
|
|
292
|
+
main().catch((err) => {
|
|
293
|
+
console.error("启动失败:", err);
|
|
294
|
+
process.exit(1);
|
|
295
|
+
});
|
|
296
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kikilight/envmgr-mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for managing environment access via SSH and browser",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"envmgr-mcp-server": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"author": "kiki",
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "git+https://github.com/KevinLvLight/envmgr-mcp-server.git"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://github.com/KevinLvLight/envmgr-mcp-server#readme",
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/KevinLvLight/envmgr-mcp-server/issues"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"dev": "tsx watch src/index.ts",
|
|
23
|
+
"start": "node dist/index.js",
|
|
24
|
+
"clean": "rm -rf dist"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist"
|
|
31
|
+
],
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@modelcontextprotocol/sdk": "^1.6.1",
|
|
34
|
+
"ssh2": "^1.16.0",
|
|
35
|
+
"zod": "^3.23.8"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/node": "^22.10.0",
|
|
39
|
+
"@types/ssh2": "^1.15.1",
|
|
40
|
+
"tsx": "^4.19.2",
|
|
41
|
+
"typescript": "^5.7.2"
|
|
42
|
+
}
|
|
43
|
+
}
|