README
🚀 使用 WebAssembly Go 实现的 SAI MCP 服务器
本项目借助 WebAssembly 中的 Go 语言,实现了一个管理控制协议(MCP)服务器。该服务器可执行 "sai" 命令,并对其输出和退出码进行处理。此实现与 wpcli 框架兼容。
🚀 快速开始
SAI MCP 服务器是一个 WebAssembly 模块,能提供从 JavaScript 执行 SAI 命令行工具的接口。它主要处理以下内容:
- 执行带有提供的参数的 "sai" 命令。
- 分别捕获 stdout、stderr 和退出码。
- 解析输出格式(YAML、JSON 或纯文本)。
- 将结构化的结果返回到 JavaScript 环境。
🏗️ 项目结构
sai_mcp/
├── cmd/
│ └── main/
│ ├── main.go # WebAssembly 入口点和 JavaScript 接口
│ ├── sai_executor.go # SAI 命令执行逻辑
│ ├── parser.go # 输出格式解析(YAML、JSON)
│ └── main_test.go # 实现的测试用例
└── go.mod # Go 模块定义
🔧 技术细节
WebAssembly 接口
WebAssembly 模块暴露了一个 JavaScript 函数 executeSai,该函数接受命令参数并返回一个包含以下属性的对象:
stdout:标准输出。stderr:标准错误输出。exitCode:退出码(0 表示成功,非零表示错误)。parsedOutput:(可选)如果检测到格式,则解析输出。format:(可选)检测到的输出格式(json、yaml、文本)。
SAI 命令执行
SaiExecutor 组件处理实际执行 SAI 命令:
- 为 SAI 命令创建新进程。
- 分别捕获 stdout 和 stderr。
- 从进程提取退出码。
- 合适地处理执行错误。
输出解析
实现包括不同输出格式的解析器:
- JSON:解析 JSON 输出到结构化对象。
- YAML:解析 YAML 输出到结构化对象。
- 文本:返回纯文本作为原始文本。 格式基于命令和输出内容自动检测。
📦 安装指南
要构建 WebAssembly 模块,可使用以下命令:
GOOS=js GOARCH=wasm go build -o sai_mcp.wasm ./cmd/main
这将生成一个 WebAssembly 文件(sai_mcp.wasm),该文件可以由 wpcli 框架加载。
💻 使用示例
基础用法
// 执行 SAI 命令
const result = executeSai("install", "nginx");
// 检查结果
console.log("退出码:", result.exitCode);
console.log("输出:", result.stdout);
if (result.stderr) {
console.error("错误:", result.stderr);
}
// 如果有解析的输出则访问
if (result.parsedOutput) {
console.log("解析的输出:", result.parsedOutput);
}
❌ 错误处理
实现处理了各种错误场景:
- 命令未找到:在 stderr 中返回适当的错误并使用非零退出码。
- 命令执行失败:捕获错误消息并在 stderr 中返回实际退出码。
- 输出解析错误:忽略无法解析的输出。
📚 术语表
- WebAssembly:一种可以在浏览器和非浏览器环境中以近似于 C++ 等效速度运行的二进制指令格式。
- Go:Google 开发的一种开源编程语言,专注于效率、安全性和可维护性。
- MCP 协议:管理控制协议,用于管理和控制分布式系统中的组件。
- wpcli:一个用于构建和管理命令行界面的 PHP 库。
通过以上实现,可以在 WebAssembly 和 Go 的结合下,为 SAI 命令提供高效的执行和管理。
Scan to join WeChat group