如何用golang实现一个MCP Server

什么是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提供的一段示例代码

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 文件:

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"
      }
    }
  }
}

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


总结

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

相关推荐
亚里随笔5 小时前
稳定且高效:GSPO如何革新大型语言模型的强化学习训练?
人工智能·机器学习·语言模型·自然语言处理·llm·rlhf
SuperherRo9 小时前
Web攻防-大模型应用&LLM安全&提示词注入&不安全输出&代码注入&直接间接&数据投毒
大模型·llm·提示词注入·不安全输出·直接·间接
堆栈future11 小时前
LangGraph实践-构建AI工作流:创建一本大模型应用开发书籍
langchain·llm·aigc
大志说编程12 小时前
LangChain框架入门15:深度解析Retrievers检索器组件
python·langchain·llm
AI大模型14 小时前
基于 Ollama 本地 LLM 大语言模型实现 ChatGPT AI 聊天系统
程序员·llm·ollama
AI大模型14 小时前
AI大模型选择指南:从ChatGPT到国产新秀,一文看懂如何选对你的AI助手
gpt·程序员·llm
郭京京15 小时前
go语言sync.Map和atomic包
go
努力还债的学术吗喽15 小时前
2020 GPT3 原文 Language Models are Few-Shot Learners 精选注解
gpt·大模型·llm·gpt-3·大语言模型·few-shot·zero-shot
一包烟电脑面前做一天17 小时前
理解MCP与LLM的协作流程:从困惑到清晰的技术实践
mcp·mcp流程·mcp协作流程
龍小南18 小时前
RAG第2章:向量数据库(理论和常见数据库)
llm