一文弄懂用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服务端

go 复制代码
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服务端

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 %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 复制代码
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服务

增加如下配置

json 复制代码
{
  "mcpServers": {
    "mcp-calculator-server": {
      "command": "/Users/yourusername/Workspace/go/src/mcp-server/mcp-server"
    }
  }
}

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

cursor 调用 GO MCP服务端

  • 配置MCP服务器调用

添加如下配置

json 复制代码
{
  "mcpServers": {
    "mcp-calculator-server": {
      "command": "/Users/yourusername/Workspace/go/src/mcp-server/mcp-server"
    }
  }
}

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

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

总结

本文以 Go 语言为例,教你开发 MCP 服务端与客户端,并用 Cursor 和 VSCode 调用。

参考

1一文弄懂用Go实现MCP服务

2MCP 终极指南

相关推荐
装不满的克莱因瓶1 小时前
学习 LLM 的函数回调及格式化输出,让 LLM 拥有更强的能力
人工智能·ai·大模型·llm·agent·智能体
CoderJia程序员甲2 小时前
GitHub 热榜项目 - 周榜(2026-06-06)
ai·大模型·llm·github
AI破壁猿2 小时前
我做了一个 AI 工具,把 GitHub 仓库 5 分钟转成专利交底书
人工智能·llm·saas
yyk的萌6 小时前
创建属于自己的mysql的mcp
mysql·adb·ai·mcp
协享科技6 小时前
前端 SSE 流式响应处理实践:从接收、解析到渲染
前端·人工智能·程序人生·go·ai编程·sse
冬奇Lab7 小时前
Agent 系列(15):Agent 记忆系统进阶——短期、长期、压缩,三层记忆架构
人工智能·llm·agent
winlife_8 小时前
全程用 AI 做一款商业级手游 · EP0 立项:能做到吗、怎么做、边界在哪
人工智能·unity·ai编程·游戏开发·商业化·mcp·funplay
Esaka_Forever8 小时前
Agent = LLM + Tools + Knowledge + Memory
llm
星马梦缘9 小时前
MCP 模型上下文协议、Agent Skills 智能体技能、Harness操作系统 课程内容
人工智能·大模型·llm·agent·智能体·mcp·skills