feat(ai): 完善 MCP Docker 启动参数指引

- 新增 Docker MCP 启动模板和参数顺序提示

- 校验 docker run、-i 和镜像名等易漏参数

- 同步 MCP 设置页说明、空状态和单元测试
This commit is contained in:
Syngnat
2026-06-11 15:45:52 +08:00
parent e4672062f8
commit c9053bccc5
9 changed files with 196 additions and 19 deletions

View File

@@ -33,6 +33,7 @@ const KNOWN_LAUNCHER_COMMANDS = new Set([
'py',
'uv',
'uvx',
'docker',
'go',
'java',
'cmd',
@@ -74,7 +75,33 @@ const argsContainEnvOrShellGlue = (args: string[]): boolean =>
const launcherUsuallyNeedsArgs = (command: string): boolean => {
const firstToken = firstShellToken(command);
return ['node', 'python', 'python3', 'py', 'uvx', 'npx', 'bun', 'deno', 'go', 'java'].includes(firstToken);
return ['node', 'python', 'python3', 'py', 'uvx', 'npx', 'bun', 'deno', 'docker', 'go', 'java'].includes(firstToken);
};
const isDockerCommand = (command: string): boolean =>
firstShellToken(command) === 'docker';
const hasDockerRunArg = (args: string[]): boolean =>
args.some((arg) => arg.toLowerCase() === 'run');
const hasDockerInteractiveArg = (args: string[]): boolean =>
args.some((arg) => arg.toLowerCase() === '-i' || arg.toLowerCase() === '--interactive');
const hasDockerImageArg = (args: string[]): boolean => {
const runIndex = args.findIndex((arg) => arg.toLowerCase() === 'run');
const candidates = runIndex >= 0 ? args.slice(runIndex + 1) : args;
for (let index = 0; index < candidates.length; index += 1) {
const arg = candidates[index];
if (!arg || arg.startsWith('-')) {
const lower = arg.toLowerCase();
if (['-e', '--env', '--name', '--network', '-v', '--volume'].includes(lower)) {
index += 1;
}
continue;
}
return true;
}
return false;
};
export const validateMCPServerDraft = (
@@ -129,6 +156,33 @@ export const validateMCPServerDraft = (
});
}
if (command && isDockerCommand(command)) {
if (!hasDockerRunArg(args)) {
issues.push({
key: 'docker-run-missing',
severity: 'warning',
title: 'Docker 参数缺少 run',
detail: 'Docker MCP 通常需要 command=dockerargs 里单独填写 run、--rm、-i、镜像名和服务参数。',
});
}
if (!hasDockerInteractiveArg(args)) {
issues.push({
key: 'docker-interactive-missing',
severity: 'warning',
title: 'Docker 参数缺少 -i',
detail: 'MCP 需要持续读取标准输入docker run 场景请加 -i 或 --interactive否则工具发现可能立即断开。',
});
}
if (!hasDockerImageArg(args)) {
issues.push({
key: 'docker-image-missing',
severity: 'warning',
title: 'Docker 参数可能缺少镜像名',
detail: '请在 docker run 选项之后填写 README 提供的镜像名,例如 mcp/server-fetch:latest。',
});
}
}
if (argsContainEnvOrShellGlue(args)) {
issues.push({
key: 'args-contain-env-or-shell-glue',