章
目
录
在大语言模型(LLM)的应用场景里,有时候模型自身的能力不足以完成一些复杂任务,这就需要借助外部工具来帮忙。今天咱就来聊聊怎么用Golang实现一个能和大语言模型配合的MCP Server。
一、MCP到底是啥?
MCP,也就是Model Communication Protocol,它是一种专门用来让大语言模型和外部工具进行交互的协议。打个比方,大语言模型就像是一个“智慧大脑”,但它不是啥都会,遇到一些专业的、复杂的任务,比如计算复杂数据、调用特定API获取信息,或者查询数据库找资料时,就需要借助外部工具来完成。MCP协议就是它们之间沟通的“桥梁”,有了它,大语言模型不用自己去实现所有功能,通过调用外部工具就能轻松扩展自身能力。它的核心思路就是把复杂任务拆分成一个个工具调用,这样模型用起来更灵活,效率也更高。
二、Golang开发MCP Server的SDK有哪些?
目前官方还没有直接给出针对Golang的MCP实现。不过别担心,在awesome – mcp – servers这个项目里,我们能找到一些基于Go的SDK,像foxy – contexts、mcp – go、mcp – golang等。这里得提醒一下,这些库使用的Golang版本普遍比较高,大家在使用的时候一定要注意版本兼容性问题。当下,在MCP的Golang实现里,mark3labs/mcp – go这个库用得比较多。它给开发者提供了一整套工具,不管是定义工具、处理参数,还是调用工具,都能轻松搞定。而且,它还提供了丰富的配置选项,方便我们根据实际需求进行调整,日志记录功能也很实用,方便排查问题。
三、用Golang实现MCP Server的详细步骤
下面咱们就来实际操作一下,做一个能进行加减乘除运算的MCP Server。以后大模型遇到计算任务,就能找它帮忙了。
(一)示例代码展示
package main
import (
"context"
"fmt"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
func main() {
// 创建一个新的MCP服务器实例
// 第一个参数是服务器名称,第二个是版本号
// server.WithResourceCapabilities用于设置资源相关能力,这里两个true表示开启某些资源功能
// server.WithLogging开启日志记录功能,方便查看服务器运行状态
s := server.NewMCPServer(
"Calculator Demo",
"1.0.0",
server.WithResourceCapabilities(true, true),
server.WithLogging(),
)
// 创建一个名为calculate的工具
// mcp.WithDescription用于描述工具的功能
// mcp.WithString定义了一个名为operation的字符串类型参数,Required表示该参数是必填的
// mcp.Description对参数进行描述,Enum指定了该参数的取值范围
// mcp.WithNumber定义了名为x和y的数字类型参数,同样是必填的
calculatorTool := mcp.NewTool("calculate",
mcp.WithDescription("Perform basic arithmetic operations"),
mcp.WithString("operation",
mcp.Required(),
mcp.Description("The operation to perform (add, subtract, multiply, divide)"),
mcp.Enum("add", "subtract", "multiply", "divide"),
),
mcp.WithNumber("x",
mcp.Required(),
mcp.Description("First number"),
),
mcp.WithNumber("y",
mcp.Required(),
mcp.Description("Second number"),
),
)
// 为calculate工具添加处理函数
// 当工具被调用时,会执行这个函数
// ctx是上下文对象,用于传递一些运行时的信息
// request包含了调用工具时传入的参数
// 返回值是调用结果和可能出现的错误
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 "add":
result = x + y
case "subtract":
result = x - y
case "multiply":
result = x * y
case "divide":
if y == 0 {
// 如果除数为0,返回错误信息
return mcp.NewToolResultError("Cannot divide by zero"), nil
}
result = x / y
}
// 将计算结果格式化为保留两位小数的字符串,并返回
return mcp.NewToolResultText(fmt.Sprintf("%.2f", result)), nil
})
// 启动服务器,通过标准输入输出进行通信
// 如果启动过程中出现错误,打印错误信息
if err := server.ServeStdio(s); err != nil {
fmt.Printf("Server error: %v\n", err)
}
}
(二)配置到客户端插件
写好MCP Server后,还得把它配置到客户端插件里,这样大语言模型才能找到它。下面是在Windows系统中,配置cline插件的MCP Server时用到的示例JSON文件:
{
"mcpServers": {
"culculate_server": {
"command": "C:\\Users\\Administrator\\go\\bin\\calculator.exe",
"args": [],
"env": {
"GOPATH": "C:\\Users\\Administrator\\go",
"GOMODCACHE": "C:\\Users\\Administrator\\go\\pkg\\mod"
}
}
}
}
这里面,“command”指定了MCP Server可执行文件的路径,“args”是运行时传递的参数,这里为空,“env”则设置了一些环境变量,比如GOPATH和GOMODCACHE,这些变量在Go项目运行时很重要。
(三)实际使用效果展示
配置完成后,我们就可以来试试效果了。在和大语言模型交互的对话框里,输入计算任务,比如“计算89989 + 4378247的结果”。大语言模型识别到这个计算任务后,会自动去调用我们配置好的MCP Server。从交互记录里可以看到,大语言模型会分析出有个叫“culculate_server”的MCP Server提供了“calculate”工具,然后根据任务要求,把“operation”设为“add”,“x”设为89989,“y”设为4378247,调用这个工具进行计算,最后返回计算结果4468236.00。
四、总结
通过上面这些步骤,咱们就成功实现了一个简单的MCP Server,它能完成基本的加减乘除运算。当然啦,这只是个开始,大家可以根据自己的实际需求,继续扩展这个MCP Server的功能。比如支持更复杂的数学运算,调用外部API获取更多数据,或者和数据库进行交互查询数据等等。要是在实现过程中遇到啥问题,欢迎在评论区留言,咱们一起讨论解决!