MCP Go WASM服务器
A. 模型上下文协议(MCP) Go中的服务器实现,通过WebAssembly在浏览器中运行。该项目演示了如何构建一个可以使用WASM在客户端执行的MCP服务器,从而实现无需外部依赖的流式HTTP通信。
🌟 特性
- 纯Go实现:使用Go的标准库构建,没有外部依赖
- WebAssembly支持:完全通过WASM在浏览器中运行
- 符合MCP协议:实现模型上下文协议规范(2024-11-05版)
- Go WASM模块:编译为WebAssembly并公开JavaScript函数
- JavaScript桥:处理浏览器和WASM之间的通信
- JSON-RPC协议:工具调用的标准请求/响应模式
- MCP合规性:遵循模型上下文协议规范
🚀 快速开始
先决条件
- 达到1.21或更高
- Python 3(用于本地HTTP服务器)
- 支持WebAssembly的现代web浏览器
- 或者将附带的Dev容器用于预配置的环境
使用开发容器(推荐)
该项目包括 Dev容器 VS代码的配置。你不需要在本地安装Go或Python。
步骤:
- 在VS Code中打开项目。
- 如果系统提示,请“在容器中重新打开”(或使用命令选项板:
Dev Containers: Reopen in Container). - 容器将使用预装的Go和Python构建,并启用Go和Python的VS Code扩展。
- 使用集成终端运行
make build和make serve如下所述。
这确保了所有贡献者都有一个一致的开发环境。
构建并运行
# Build the WASM binary
make build
# Serve the application (builds automatically)
make serve
# Or combine both steps
make run然后打开浏览器 http://localhost:8080
手动构建
# Build WASM
GOOS=js GOARCH=wasm go build -o main.wasm main.go
# Copy the Go WASM runtime
cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .
# Serve with any HTTP server
python3 -m http.server 8080📖 用法
使用Web界面
- 初始化服务器:点击“初始化服务器”建立MCP连接
- 列出工具:查看所有可用工具及其模式
- 呼叫工具:从下拉列表中选择一个工具,输入参数(空格分隔),然后执行该工具。例如,使用
add 2 3要获得2和3的和,或选择getCurrentTime没有参数。
程序化使用
// Send a JSON-RPC request to the MCP server
const request = {
jsonrpc: "2.0",
id: 1,
method: "tools/call",
params: {
name: "add",
arguments: { a: 2, b: 3 }
}
};
const responseJSON = mcpHandleRequest(JSON.stringify(request));
const response = JSON.parse(responseJSON);
console.log(response.result);🛠️ MCP协议实现
支持的方法
| 方法 | 说明 |
|---|---|
initialize | 初始化MCP服务器连接 |
tools/list | 列出所有可用工具 |
tools/call | 执行特定工具 |
示例工具
获取当前时间
{
"name": "getCurrentTime",
"description": "Returns the current time in RFC3339 format",
"inputSchema": {
"type": "object",
"properties": {},
"required": []
}
}添加
{
"name": "add",
"description": "Returns the sum of two numbers (a + b)",
"inputSchema": {
"type": "object",
"properties": {
"a": { "type": "number" },
"b": { "type": "number" }
},
"required": ["a", "b"]
}
}🔧 添加新工具
🔧 添加或使用工具
要使用工具,请从UI中的下拉列表中选择它并输入其参数(空格分隔)。例如:
- 对于
add,输入:2 3(返回5) - 对于
getCurrentTime,不需要参数
要向服务器添加新工具,请在中定义它 NewMCPServer() 并在中实现其处理程序 handleToolCall(),然后重建WASM二进制文件。
📁 项目结构
.
├── main.go # MCP server implementation
├── index.html # Web interface
├── go.mod # Go module definition
├── Makefile # Build automation
└── README.md # This file🎨 设计理念
该实施优先考虑:
- 简洁:无外部依赖,纯Go标准库
- 效率:开销最小,直接JavaScript桥接
- 成语Go:遵循Go最佳实践和惯例
- 浏览器优先:专为WASM/浏览器环境设计
- MCP合规性:遵守模型上下文协议规范
🔍 技术细节
WASM大桥
Go代码向JavaScript公开了一个函数:
js.Global().Set("mcpHandleRequest", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
requestJSON := args[0].String()
response := server.HandleRequest(requestJSON)
return response
}))JSON-RPC 2.0
所有通信均遵循JSON-RPC 2.0规范:
- 请求:
{ jsonrpc, id, method, params } - 回应:
{ jsonrpc, id, result }或{ jsonrpc, id, error }
错误代码
标准JSON-RPC错误代码:
-32700:分析错误-32601:未找到方法-32602:无效参数
🧪 测试
使用web界面或浏览器控制台测试服务器:
// Initialize
mcpHandleRequest('{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}')
// List tools
mcpHandleRequest('{"jsonrpc":"2.0","id":2,"method":"tools/list"}')
// Call tool
mcpHandleRequest('{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"getCurrentTime"}}')📝 许可证
MIT许可证-您可以在自己的项目中自由使用!
🤝 贡献
欢迎投稿!请随意:
- 添加新的示例工具
- 优化用户界面
- 加强错误处理
- 添加测试
- 改进文档
🔗 资源
______________________________________________________________________
内置于❤️ 使用Go和WebAssembly
