Back to MCP directory
publicPublicdnsLocal runtime

go-mcp

一个用于构建MCP服务器的类型安全、直观的Go SDK

article

README

🚀 go-mcp 介绍

go-mcp 是一个用于构建 MCP(模型上下文协议)服务器的 Go 语言 SDK,强调类型安全和直观易用的接口,能帮助开发者高效构建 MCP 服务器。

✨ 主要特性

  • 类型安全:通过代码生成确保工具和提示参数静态类型化,可在编译时捕获错误。
  • 简单直观的 API:提供自然、符合 Go 风格的接口,有效降低学习曲线。
  • 开发者友好:注重 API 的易用性,让开发者使用起来更加顺手。

🚀 快速开始

目录结构示例

项目目录结构如下:

your-project/
  cmd/temperature/
    main.go
    handler.go
  cmd/mcpgen/
    main.go

示例代码

步骤一:定义 MCP 服务器

运行 mcpgen 工具生成代码:

go run ./cmd/mcpgen

步骤二:实现 MCP 服务器逻辑

handler.go 中实现逻辑,例如温度转换工具:

package main

import (
	"context"
	"fmt"
	"math"
)

type toolHandler struct{}

func NewHandler(h *toolHandler) mcp.Handler {
	return mcp.HandlerFunc(func(ctx context.Context, req *mcp.Request) (*mcp.Response, error) {
		if req.IsPing() {
			return &mcp.Response{Id: req.Id}, nil
		}
		if req.IsCallTool() {
			content := req.GetCallTool().Content
			tool := content[0].GetTool()
			switch tool.ID {
			case "temperature-converter":
				fromUnit := string(tool.Params["from_unit"])
				toUnit := string(tool.Params["to_unit"])
				temp, err := tool.Params["temperature"].(float64)
				if err != nil {
					return nil, fmt.Errorf("invalid temperature value")
				}
				result := convertTemperature(temp, fromUnit, toUnit)
				return &mcp.Response{
					Id:    req.Id,
					Data:  mcp.NewData(map[string]interface{}{
						"result": result,
					}),
				}, nil
			default:
				return nil, fmt.Errorf("tool not found")
			}
		}
		return nil, nil
	})
}

func convertTemperature(value float64, fromUnit string, toUnit string) float64 {
	switch fromUnit {
	case "celsius":
		switch toUnit {
		case "fahrenheit":
			return (value * 9.0 / 5.0) + 32
		default:
			return value
		}
	case "fahrenheit":
		switch toUnit {
		case "celsius":
			return (value - 32) * 5.0 / 9.0
		default:
			return value
		}
	default:
		return value
	}
}

func main() {
	handler := NewHandler(new(toolHandler))
	server := mcp.NewServer(":8080", handler)
	if err := server.Start(); err != nil {
		fmt.Printf("Failed to start server: %v\n", err)
	}
}

在终端运行以下命令启动服务器:

go run ./cmd/temperature/main.go

💻 使用示例

基础用法

发送 Ping 请求

使用 curl 命令发送 Ping 请求:

curl -X POST http://localhost:8080/ping

调用温度转换工具

调用预定义的 "temperature-converter" 工具:

curl -X POST http://localhost:8080/call_tool \
  --data '{"tool_id":"temperature-converter","params":{"from_unit":"celsius","to_unit":"fahrenheit","temperature":32}}'

查看工具列表

列出所有注册的工具:

curl -X GET http://localhost:8080/tools

📚 详细文档

已支持功能

  • Ping:验证服务器连通性。
  • Tools:管理工具注册与调用。
  • Prompts:处理用户提示请求。

更多功能请参考项目文档。

📄 许可证

本项目使用 MIT 许可证,详情请见 LICENSE 文件。

help

Runtime guide

cloud

Hosted runtime

Hosted servers run from a provider-managed environment. You usually connect the MCP client to the hosted endpoint or follow the provider's authorization flow, without keeping a local process alive

  1. Open provider connection page
  2. Authorize or copy endpoint
  3. Connect from your MCP client
terminal

Local runtime / other methods

Local servers run on your own machine or infrastructure. You normally copy the server_config into your MCP client, install the required package, and provide env variables from env_schema when needed

  1. Copy server_config
  2. Install required package
  3. Fill env variables and restart client