一文带你学会使用Go语言实现自己的MCP服务端 学会使用

一文带你学会使用Go语言实现自己的MCP服务端 学会使用

目录
  • 为什么MCP如此重要?
  • MCP总体架构
  • GO 构建MCP服务端
  • GO 构建MCP服务端
  • vs code调用 GO MCP服务端
  • cursor 调用 GO MCP服务端
  • 拓展资料

最近这段时刻,AI领域里有一个非常热门的概念——MCP(模型上下文协议) 。Anthropic推出的这一开放标准旨在为大型语言模型和AI助手提供统一的接口,使其能够轻松操作外部工具并完成更复杂的任务。

这篇文章小编将带你速览MCP的核心概念,并以Go语言为例,介绍怎样开发MCP服务端和客户端,并且用cursor和vscode调用自己开发的MCP服务器

为什么MCP如此重要?

在过去,如果想要让AI处理特定的数据,通常只能依赖于预训练数据或者手动上传数据,这既麻烦又低效。即便对于强大的AI模型而言,也存在数据隔离的难题,无法直接访问新的数据源,每次更新数据都需要重新训练或上传。现在,MCP解决了这个难题,它使得AI不再局限于静态聪明库,而是能够像人类一样调用搜索引擎、访问本地文件、连接API服务等,极大提升了AI的动态交互能力。

MCP总体架构

MCP的核心是“客户端-服务器”架构,其中MCP客户端可以连接到多个服务器。客户端是指希望通过MCP访问数据的应用程序,如CLI工具、IDE插件或AI应用。

GO 构建MCP服务端

package mainimport ( “context” “errors” “github.com/mark3labs/mcp-go/mcp” “github.com/mark3labs/mcp-go/server” “log”)func main() s := server.NewMCPServer(“CalculatorServer”, “1.0.0”) // 添加工具 calculatorTool := mcp.NewTool(“calculate”, mcp.WithDescription(“执行基本的算术运算”), mcp.WithString(“operation”, mcp.Required(), mcp.Description(“要执行的算术运算类型”), mcp.Enum(“multiply”, “divide”), ), mcp.WithNumber(“x”, mcp.Required(), mcp.Description(“第一个数字”), ), mcp.WithNumber(“y”, mcp.Required(), mcp.Description(“第二个数字”), ), ) s.AddTool(calculatorTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) op := request.Params.Arguments[“operation”].(string) x := request.Params.Arguments[“x”].(float64) y := request.Params.Arguments[“y”].(float64) var result float64 switch op case “multiply”: result = x * y case “divide”: if y == 0 return nil, errors.New(“不允许除以零”) } result = x / y } return mcp.FormatNumberResult(result), nil }) //sseServer := server.NewSSEServer(s, server.WithBaseURL(“http://localhost:8082”)) //log.Printf(“SSE server listening on :8082”) //if err := sseServer.Start(“:8082”); err != nil // log.Fatalf(“Server error: %v”, err) //} // 启动基于 stdio 的服务器 if err := server.ServeStdio(s); err != nil log.Printf(“Server error: %vn”, err) }}

执行go build -o mcp-server main.go命令,生成服务器端可执行文件

GO 构建MCP服务端

package mainimport ( “context” “fmt” “os” “strconv” “time” “github.com/mark3labs/mcp-go/client” “github.com/mark3labs/mcp-go/mcp”)func main() if len(os.Args) < 2 fmt.Println(“请提供至少一个参数。”) return } // 输出程序名称 // 遍历并输出所有参数 a, _ := strconv.ParseFloat(os.Args[1], 64) b, _ := strconv.ParseFloat(os.Args[2], 64) // 这里的路径是上面编译的mcp-server可执行文件 mcpClient, err := client.NewStdioMCPClient(“/Users/yourusername/Workspace/go/src/mcp-server/mcp-server”, []string}) if err != nil panic(err) } defer mcpClient.Close() ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() initRequest := mcp.InitializeRequest} initRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION initRequest.Params.ClientInfo = mcp.Implementation Name: “Client Demo”, Version: “1.0.0”, } initResult, err := mcpClient.Initialize(ctx, initRequest) if err != nil panic(err) } fmt.Printf(“初始化成功,服务器信息: %s %sn”, initResult.ServerInfo.Name, initResult.ServerInfo.Version) // 调用工具 toolRequest := mcp.CallToolRequest Request: mcp.Request Method: “tools/call”, }, } toolRequest.Params.Name = “calculate” toolRequest.Params.Arguments = map[string]any “operation”: “multiply”, “x”: a, “y”: b, } result, err := mcpClient.CallTool(ctx, toolRequest) if err != nil panic(err) } fmt.Printf(“%f * %f = %sn”, a, b, result.Content[0].(mcp.TextContent).Text)}

运行客户端

go run main.go 4 6

初始化成功,服务器信息: CalculatorServer 1.0.0
4.000000 * 6.000000 = 24.00

vs code调用 GO MCP服务端

vscode 主要是通过cline插件运行MCP服务

安装cline插件

配置cline插件的MCP服务

增加如下配置

“mcpServers”: “mcp-calculator-server”: “command”: “/Users/yourusername/Workspace/go/src/mcp-server/mcp-server” } }}

配置成功后即可看到如下信息

cursor 调用 GO MCP服务端

配置MCP服务器调用

添加如下配置

“mcpServers”: “mcp-calculator-server”: “command”: “/Users/yourusername/Workspace/go/src/mcp-server/mcp-server” } }}

配置成功后,看到如下信息

接着去聊天对话框中问大模型,可以看到它调用了自定义的MCP服务

拓展资料

这篇文章小编将以 Go 语言为例,教你开发 MCP 服务端与客户端,并用 Cursor 和 VSCode 调用。

到此这篇关于一文带你学会使用Go语言实现自己的MCP服务端的文章就介绍到这了,更多相关Go实现MCP服务内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

无论兄弟们可能感兴趣的文章:

  • go语言实现http服务端与客户端的例子
  • Golang 实现Socket服务端和客户端使用TCP协议通讯
  • go语言中切片与内存复制 memcpy 的实现操作
  • Go语言实现服务端消息接收和发送
  • 一文带你吃透Golang中net/http标准库服务端
  • go标准库net/http服务端的实现示例
版权声明

相关文章