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

Written by

in

文章目录
  • 在过去,如果想要让AI处理特定的数据,通常只能依赖于预训练数据或者手动上传数据,这既麻烦又低效。即便对于强大的AI模型而言,也存在数据隔离的问题,无法直接访问新的数据源,每次更新数据都需要重新训练或上传。现在,MCP解决了这个问题,它使得AI不再局限于静态知识库,而是能够像人类一样调用搜索引擎、访问本地文件、连接API服务等,极大提升了AI的动态交互能力。
  • MCP的核心是“客户端-服务器”架构,其中MCP客户端可以连接到多个服务器。客户端是指希望通过MCP访问数据的应用程序,如CLI工具、IDE插件或AI应用。
  • package main import ( “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命令,生成服务器端可执行文件
  • package main import ( “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.04.000000 * 6.000000 = 24.00
  • vscode 主要是通过cline插件运行MCP服务 安装cline插件 配置cline插件的MCP服务 增加如下配置 { “mcpServers”: { “mcp-calculator-server”: { “command”: “/Users/yourusername/Workspace/go/src/mcp-server/mcp-server” } } } 配置成功后即可看到如下信息
  • 配置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服务端的实现示例
  • 目录
    • 为什么MCP如此重要?
    • MCP总体架构
    • GO 构建MCP服务端
    • GO 构建MCP服务端
    • vs code调用 GO MCP服务端
    • cursor 调用 GO MCP服务端
    • 总结

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

    本文将带你速览MCP的核心概念,并以Go语言为例,介绍如何开发MCP服务端和客户端,并且用cursor和vscode调用自己开发的MCP服务器

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

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

    package main
    
    import (
    	"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命令,生成服务器端可执行文件

    package main
    
    import (
    	"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

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

    安装cline插件

    配置cline插件的MCP服务

    增加如下配置

    {
      "mcpServers": {
        "mcp-calculator-server": {
          "command": "/Users/yourusername/Workspace/go/src/mcp-server/mcp-server"
        }
      }
    }
    

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

    配置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服务端的实现示例

    站内搜索