Go开发mcp入门示例

这里只简单写了tool,关于Resources和Prompts可以参考 https://github.com/mark3labs/mcp-go/tree/main

main.go

package main

import (
	"context"
	"fmt"

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

func main() {
	// 创建一个新的MCP服务器
	s := server.NewMCPServer(
		"mcp入门示例",
		"1.0.0",
		server.WithResourceCapabilities(true, true),
		server.WithLogging(),
	)

	// 添加一个计算器工具
	calculatorTool := mcp.NewTool("calculate",
		mcp.WithDescription("执行计算"),
		mcp.WithString("operation",
			mcp.Required(),
			mcp.Description("要执行的操作(add, subtract, multiply, divide)"),
			mcp.Enum("add", "subtract", "multiply", "divide"),
		),
		mcp.WithNumber("x",
			mcp.Required(),
			mcp.Description("第一个数"),
		),
		mcp.WithNumber("y",
			mcp.Required(),
			mcp.Description("第二个数"),
		),
	)

	// 添加计算器处理程序,功能多了就是添加n个程序,类似于路由
	s.AddTool(calculatorTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
		// 使用GetArguments()方法获取参数
		arguments := request.GetArguments()

		// 安全地获取operation参数
		opValue, ok := arguments["operation"]
		if !ok {
			return mcp.NewToolResultError("Missing operation parameter"), nil
		}
		op, ok := opValue.(string)
		if !ok {
			return mcp.NewToolResultError("Operation parameter must be a string"), nil
		}

		// 安全地获取x参数
		xValue, ok := arguments["x"]
		if !ok {
			return mcp.NewToolResultError("Missing x parameter"), nil
		}
		x, ok := xValue.(float64)
		if !ok {
			// 尝试转换为float64
			if xFloat, ok := xValue.(float32); ok {
				x = float64(xFloat)
			} else if xInt, ok := xValue.(int); ok {
				x = float64(xInt)
			} else {
				return mcp.NewToolResultError("X parameter must be a number"), nil
			}
		}

		// 安全地获取y参数
		yValue, ok := arguments["y"]
		if !ok {
			return mcp.NewToolResultError("Missing y parameter"), nil
		}
		y, ok := yValue.(float64)
		if !ok {
			// 尝试转换为float64
			if yFloat, ok := yValue.(float32); ok {
				y = float64(yFloat)
			} else if yInt, ok := yValue.(int); ok {
				y = float64(yInt)
			} else {
				return mcp.NewToolResultError("Y parameter must be a number"), nil
			}
		}

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

	// 启动服务器
	if err := server.ServeStdio(s); err != nil {
		fmt.Printf("Server error: %v\n", err)
	}
}

执行go mod tidy

编译(可选),如果没有编译,后面配置mcp服务器可以直接用命令启动go run xx.go

配置mcp,这里我是用trace

image

测试一下,编辑器会自动选择对应的mcp

image

posted @ 2025-08-25 11:52  朝阳1  阅读(25)  评论(0)    收藏  举报