最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你學會使用Go語言實現(xiàn)自己的MCP服務端

 更新時間:2025年04月21日 08:24:40   作者:nil  
這篇文章將帶大家速覽MCP的核心概念,并以Go語言為例,介紹如何開發(fā)MCP服務端和客戶端,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下

最近這段時間,AI領域里有一個非常熱門的概念——MCP(模型上下文協(xié)議) 。Anthropic推出的這一開放標準旨在為大型語言模型和AI助手提供統(tǒng)一的接口,使其能夠輕松操作外部工具并完成更復雜的任務。

本文將帶你速覽MCP的核心概念,并以Go語言為例,介紹如何開發(fā)MCP服務端和客戶端,并且用cursor和vscode調(diào)用自己開發(fā)的MCP服務器。

為什么MCP如此重要?

在過去,如果想要讓AI處理特定的數(shù)據(jù),通常只能依賴于預訓練數(shù)據(jù)或者手動上傳數(shù)據(jù),這既麻煩又低效。即便對于強大的AI模型而言,也存在數(shù)據(jù)隔離的問題,無法直接訪問新的數(shù)據(jù)源,每次更新數(shù)據(jù)都需要重新訓練或上傳?,F(xiàn)在,MCP解決了這個問題,它使得AI不再局限于靜態(tài)知識庫,而是能夠像人類一樣調(diào)用搜索引擎、訪問本地文件、連接API服務等,極大提升了AI的動態(tài)交互能力。

MCP總體架構

MCP的核心是“客戶端-服務器”架構,其中MCP客戶端可以連接到多個服務器??蛻舳耸侵赶Mㄟ^MCP訪問數(shù)據(jù)的應用程序,如CLI工具、IDE插件或AI應用。

GO 構建MCP服務端

package main

import (
	"context"
	"errors"
	"github.com/mark3labs/mcp-go/mcp"
	"github.com/mark3labs/mcp-go/server"
	"log"
)

func main() {
	s := server.NewMCPServer("CalculatorServer", "1.0.0")

	// 添加工具
	calculatorTool := mcp.NewTool("calculate",
		mcp.WithDescription("執(zhí)行基本的算術運算"),
		mcp.WithString("operation",
			mcp.Required(),
			mcp.Description("要執(zhí)行的算術運算類型"),
			mcp.Enum("multiply", "divide"),
		),
		mcp.WithNumber("x",
			mcp.Required(),
			mcp.Description("第一個數(shù)字"),
		),
		mcp.WithNumber("y",
			mcp.Required(),
			mcp.Description("第二個數(shù)字"),
		),
	)

	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 "multiply":
			result = x * y
		case "divide":
			if y == 0 {
				return nil, errors.New("不允許除以零")
			}
			result = x / y
		}

		return mcp.FormatNumberResult(result), nil
	})

	//sseServer := server.NewSSEServer(s, server.WithBaseURL("http://localhost:8082"))
	//log.Printf("SSE server listening on :8082")
	//if err := sseServer.Start(":8082"); err != nil {
	//	log.Fatalf("Server error: %v", err)
	//}
	// 啟動基于 stdio 的服務器
	if err := server.ServeStdio(s); err != nil {
		log.Printf("Server error: %v\n", err)
	}
}

執(zhí)行go build -o mcp-server main.go命令,生成服務器端可執(zhí)行文件

GO 構建MCP服務端

package main

import (
	"context"
	"fmt"
	"os"
	"strconv"
	"time"

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

func main() {
	if len(os.Args) < 2 {
		fmt.Println("請?zhí)峁┲辽僖粋€參數(shù)。")
		return
	}
	// 輸出程序名稱
	// 遍歷并輸出所有參數(shù)
	a, _ := strconv.ParseFloat(os.Args[1], 64)
	b, _ := strconv.ParseFloat(os.Args[2], 64)
        // 這里的路徑是上面編譯的mcp-server可執(zhí)行文件
	mcpClient, err := client.NewStdioMCPClient("/Users/yourusername/Workspace/go/src/mcp-server/mcp-server", []string{})
	if err != nil {
		panic(err)
	}
	defer mcpClient.Close()

	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	initRequest := mcp.InitializeRequest{}
	initRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION
	initRequest.Params.ClientInfo = mcp.Implementation{
		Name:    "Client Demo",
		Version: "1.0.0",
	}

	initResult, err := mcpClient.Initialize(ctx, initRequest)
	if err != nil {
		panic(err)
	}
	fmt.Printf("初始化成功,服務器信息: %s %s\n", initResult.ServerInfo.Name, initResult.ServerInfo.Version)

	// 調(diào)用工具
	toolRequest := mcp.CallToolRequest{
		Request: mcp.Request{
			Method: "tools/call",
		},
	}
	toolRequest.Params.Name = "calculate"
	toolRequest.Params.Arguments = map[string]any{
		"operation": "multiply",
		"x":         a,
		"y":         b,
	}

	result, err := mcpClient.CallTool(ctx, toolRequest)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%f * %f = %s\n", a, b, result.Content[0].(mcp.TextContent).Text)
}

運行客戶端

go run main.go 4 6

初始化成功,服務器信息: CalculatorServer 1.0.0
4.000000 * 6.000000 = 24.00

vs code調(diào)用 GO MCP服務端

vscode 主要是通過cline插件運行MCP服務

安裝cline插件

配置cline插件的MCP服務

增加如下配置

{
  "mcpServers": {
    "mcp-calculator-server": {
      "command": "/Users/yourusername/Workspace/go/src/mcp-server/mcp-server"
    }
  }
}

配置成功后即可看到如下信息

cursor 調(diào)用 GO MCP服務端

配置MCP服務器調(diào)用

添加如下配置

{
  "mcpServers": {
    "mcp-calculator-server": {
      "command": "/Users/yourusername/Workspace/go/src/mcp-server/mcp-server"
    }
  }
}

配置成功后,看到如下信息

然后去聊天對話框中問大模型,可以看到它調(diào)用了自定義的MCP服務

總結

本文以 Go 語言為例,教你開發(fā) MCP 服務端與客戶端,并用 Cursor 和 VSCode 調(diào)用。

到此這篇關于一文帶你學會使用Go語言實現(xiàn)自己的MCP服務端的文章就介紹到這了,更多相關Go實現(xiàn)MCP服務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go 語言下基于Redis分布式鎖的實現(xiàn)方式

    Go 語言下基于Redis分布式鎖的實現(xiàn)方式

    本篇文章將詳細介紹如何正確地實現(xiàn)Redis分布式鎖,下面通過一個項目基于 Redis 的分布式鎖能夠提供哪些分布鎖特性,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2021-06-06
  • Go語言項目中使用Viper獲取配置信息詳解

    Go語言項目中使用Viper獲取配置信息詳解

    Viper是Go應用的完整配置解決方案,它能處理所有類型的配置需求和配置格式,這篇文章主要介紹了Go項目中使用Viper獲取配置信息,需要的可以參考下
    2024-04-04
  • go語言中bufferio字段的實現(xiàn)

    go語言中bufferio字段的實現(xiàn)

    Go語言的bufio包通過緩沖區(qū)減少系統(tǒng)調(diào)用,提升I/O效率,它封裝Reader和Writer接口,提供Read/Write等高效方法,具有一定的參考價值,感興趣的可以了解一下
    2025-06-06
  • Go語言中日志管理詳解之從log到zap

    Go語言中日志管理詳解之從log到zap

    在軟件開發(fā)的世界里,日志就像是應用程序的黑匣子,記錄著程序運行過程中的關鍵信息,幫助開發(fā)者在遇到問題時快速定位和解決,在Go語言生態(tài)中,日志管理有著豐富的工具和方案,這篇文章主要介紹了Go語言中日志管理詳解之從log到zap的相關資料,需要的朋友可以參考下
    2026-04-04
  • golang實現(xiàn)可中斷的流式下載功能

    golang實現(xiàn)可中斷的流式下載功能

    這篇文章主要給大家介紹了golang實現(xiàn)可中斷的流式下載,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • Golang 二維切片代碼示例

    Golang 二維切片代碼示例

    本文主要介紹了Golang 二維切片代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-10-10
  • Golang實現(xiàn)簡易的rpc調(diào)用

    Golang實現(xiàn)簡易的rpc調(diào)用

    RPC指(Remote Procedure Call Protocol)遠程過程調(diào)用協(xié)議。本文將實現(xiàn)利用Golang進行rpc調(diào)用(只實現(xiàn)一個rpc框架基本的功能,不對性能做保證),需要的可以參考一下
    2023-03-03
  • Go語言自定義linter靜態(tài)檢查工具

    Go語言自定義linter靜態(tài)檢查工具

    這篇文章主要介紹了Go語言自定義linter靜態(tài)檢查工具,Go語言是一門編譯型語言,編譯器將高級語言翻譯成機器語言,會先對源代碼做詞法分析,詞法分析是將字符序列轉換為Token序列的過程,文章詳細介紹需要的小伙伴可以參考一下
    2022-05-05
  • Golang標準庫之errors包應用方式

    Golang標準庫之errors包應用方式

    Go語言的errors包提供了基礎的錯誤處理能力,允許通過errors.New創(chuàng)建自定義error對象,error在Go中是一個接口,通過實現(xiàn)Error方法來定義錯誤文本,對錯誤的比較通常基于對象地址,而非文本內(nèi)容,因此即使兩個錯誤文本相同
    2024-10-10
  • 十個Go map面試??紗栴}合集

    十個Go map面試??紗栴}合集

    go面試中,map相關知識點問的比較多,這篇文章主要為大家整理歸納了10個??嫉膯栴},文中的示例代碼講解詳細,希望對大家有一定的幫助
    2023-07-07

最新評論

隆安县| 简阳市| 莫力| 徐汇区| 平山县| 叶城县| 秀山| 道孚县| 永吉县| 汾西县| 柳江县| 长海县| 加查县| 武强县| 高青县| 连城县| 古田县| 龙岩市| 东源县| 乐山市| 绥阳县| 思茅市| 台中县| 辽宁省| 永德县| 金寨县| 正镶白旗| 广平县| 阿瓦提县| 金乡县| 泸州市| 太仆寺旗| 白水县| 五河县| 临沧市| 陈巴尔虎旗| 福清市| 宁陕县| 高阳县| 五大连池市| 清苑县|