最近这段时间,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服务内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论