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

 更新时间:2025年04月21日 08:24:40   作者:nil  
这篇文章将带大家速览MCP的核心概念,并以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 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: %v\n", err)
	}
}

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

GO 构建MCP服务端

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 %s\n", 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 = %s\n", 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 语言下基于Redis分布式锁的实现方式

    Go 语言下基于Redis分布式锁的实现方式

    本篇文章将详细介绍如何正确地实现Redis分布式锁,下面通过一个项目基于 Redis 的分布式锁能够提供哪些分布锁特性,本文给大家介绍的非常详细,需要的朋友参考下吧
    2021-06-06
  • Go语言项目中使用Viper获取配置信息详解

    Go语言项目中使用Viper获取配置信息详解

    Viper是Go应用的完整配置解决方案,它能处理所有类型的配置需求和配置格式,这篇文章主要介绍了Go项目中使用Viper获取配置信息,需要的可以参考下
    2024-04-04
  • go语言中bufferio字段的实现

    go语言中bufferio字段的实现

    Go语言的bufio包通过缓冲区减少系统调用,提升I/O效率,它封装Reader和Writer接口,提供Read/Write等高效方法,具有一定的参考价值,感兴趣的可以了解一下
    2025-06-06
  • Go语言中日志管理详解之从log到zap

    Go语言中日志管理详解之从log到zap

    在软件开发的世界里,日志就像是应用程序的黑匣子,记录着程序运行过程中的关键信息,帮助开发者在遇到问题时快速定位和解决,在Go语言生态中,日志管理有着丰富的工具和方案,这篇文章主要介绍了Go语言中日志管理详解之从log到zap的相关资料,需要的朋友可以参考下
    2026-04-04
  • golang实现可中断的流式下载功能

    golang实现可中断的流式下载功能

    这篇文章主要给大家介绍了golang实现可中断的流式下载,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • Golang 二维切片代码示例

    Golang 二维切片代码示例

    本文主要介绍了Golang 二维切片代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-10-10
  • Golang实现简易的rpc调用

    Golang实现简易的rpc调用

    RPC指(Remote Procedure Call Protocol)远程过程调用协议。本文将实现利用Golang进行rpc调用(只实现一个rpc框架基本的功能,不对性能做保证),需要的可以参考一下
    2023-03-03
  • Go语言自定义linter静态检查工具

    Go语言自定义linter静态检查工具

    这篇文章主要介绍了Go语言自定义linter静态检查工具,Go语言是一门编译型语言,编译器将高级语言翻译成机器语言,会先对源代码做词法分析,词法分析是将字符序列转换为Token序列的过程,文章详细介绍需要的小伙伴可以参考一下
    2022-05-05
  • Golang标准库之errors包应用方式

    Golang标准库之errors包应用方式

    Go语言的errors包提供了基础的错误处理能力,允许通过errors.New创建自定义error对象,error在Go中是一个接口,通过实现Error方法来定义错误文本,对错误的比较通常基于对象地址,而非文本内容,因此即使两个错误文本相同
    2024-10-10
  • 十个Go map面试常考问题合集

    十个Go map面试常考问题合集

    go面试中,map相关知识点问的比较多,这篇文章主要为大家整理归纳了10个常考的问题,文中的示例代码讲解详细,希望对大家有一定的帮助
    2023-07-07

最新评论