如何用golang实现一个MCP Server

1,874 阅读3分钟

什么是MCP?

MCP(Model Communication Protocol)是一种用于大语言模型(LLM)与外部工具进行交互的协议。它允许大语言模型在处理用户请求时,调用外部工具(如计算器、API、数据库等)来完成特定任务。通过 MCP,大语言模型可以扩展其功能,而无需自己实现所有逻辑。MCP 的核心思想是将复杂任务分解为多个工具调用,从而提高模型的灵活性和效率。

MCP协议的golang Sdk有哪些?

目前官方没有给出对golang的实现,不过你可以在awesome-mcp-servers项目中找到基于go的SDK,如foxy-contextsmcp-gomcp-golang、当前这些库使用的golang版本均比较高,使用的时候需要注意下,目前,MCP 的 Golang 实现主要由 mark3labs/mcp-go 提供。这个库为开发者提供了一套完整的工具,用于创建和管理 MCP Server。它支持工具定义、参数处理、工具调用等功能,并且提供了丰富的配置选项和日志记录功能。

如何使用golang实现一个mcp server?

这里我们实现一个加减乘除的mcp server,让大模型在识别到要计算的任务时,首先使用mcp server来计算。


下面是mcp-go提供的一段示例代码

package main

import (
	"context"
	"fmt"

	"github.com/mark3labs/mcp-go/mcp"
	"github.com/mark3labs/mcp-go/server"
)

func main() {
	// Create a new MCP server
	s := server.NewMCPServer(
		"Calculator Demo",
		"1.0.0",
		server.WithResourceCapabilities(true, true),
		server.WithLogging(),
	)

	// Add a calculator tool
	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"),
		),
	)

	// Add the calculator handler
	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 {
				return mcp.NewToolResultError("Cannot divide by zero"), nil
			}
			result = x / y
		}

		return mcp.NewToolResultText(fmt.Sprintf("%.2f", result)), nil
	})

	// Start the server
	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"
      }
    }
  }
}

image.png

配置完成后,你可以通过对话框向大语言模型提问,例如计算 89989 + 4378247 的结果。大语言模型会自动调用 MCP Server 来完成计算任务,并返回结果。


image.png

总结

通过上述步骤,我们成功实现了一个简单的 MCP Server,它支持加、减、乘、除等基本运算。你可以根据需要扩展更多功能,例如支持更复杂的数学运算、调用外部 API 或与数据库交互等。 希望这些内容对你有帮助!如果有任何问题请留言告诉我。