作者 l 張毓 & ThinkInAI 團隊
今天,ThinkInAI 團隊(前身為 GoCN 團隊)自豪地宣布,基于 Go 語言的大模型交互協議(Model Context Protocol)SDK —— Go-MCP 正式開源!
什么是 MCP?為什么我們需要它?
在大語言模型(LLM)時代,模型與外部系統之間的連接方式正在經歷深刻變革。Model Context Protocol(MCP)正是在這一背景下應運而生的開放通信協議,旨在通過標準化手段,構建起 LLM 與外部數據資源、可調用工具之間的橋梁,從而讓 AI 應用更易構建、更強交互,徹底改變 AI 工具的連接方式以及它們與現實世界的交互范式。
那么,什么是 MCP?我們為什么需要它?
MCP(模型上下文協議)是一種標準化的通信協議,專為 AI 工具(如聊天機器人、代碼助手、AI Agent 等)與外部系統的集成而設計。它為 AI 引入了“使用工具”的能力框架,使其不僅能理解自然語言,還能主動調用系統資源、訪問數據或執行操作。MCP Server 的出現,正在重塑 AI 的能力邊界,使其從單純的對話機器演化為能夠完成實際任務的智能助手。在 MCP 出現之前,開發者若希望讓 AI 工具訪問 Gmail、Google Drive 或天氣 API 等外部系統,通常需要為每個集成單獨編寫定制邏輯,硬編碼對每一個 API 的連接方式。這不僅增加了開發成本,也阻礙了 AI 工具的可擴展性與通用性。而 MCP 的核心價值,在于為模型與系統之間的通信建立統一標準,降低接入門檻、提升開發效率。它正如 HTTP 之于 Web 應用,是支撐智能系統互聯互通的基礎協議之一。
簡單來說,MCP 把過去“一個模型對一個系統”的煙囪式集成,變成了“多模型對多能力”的標準化連接網絡。這是推動 AI 工具平臺化和生態化的關鍵一步。
業界 MCP SDK 現狀
當前業界主流的 MCP SDK 實現,主要由官方維護的 Python SDK 和 TypeScript SDK 主導。
Python SDK 憑借豐富的生態和快速迭代能力,能夠較便捷地支持多樣化功能開發。然而,作為動態語言,Python 也不可避免地帶來了類型不明確、運行時錯誤難以預防、長期維護成本高等問題。隨著大模型應用加速進入大規模生產部署階段,基于 Go 這類強類型語言所具備的高可靠性和可維護性,正在成為越來越重要的優勢。
另一方面,TypeScript SDK 則更適合用于瀏覽器或桌面端環境,作為前端 MCP 客戶端對接應用服務。但對于需要高并發處理、簡潔部署、本地運行等 MCP Server 場景而言,TypeScript 的能力和生態顯然難以勝任。
所以我們認為:當前的 MCP SDK 實現雖然優秀,但并未解決所有關鍵場景,特別是在高性能、可維護性、部署簡便性等方面存在缺口。
具體體現在:
動態語言維護成本高:Python 等語言雖然開發效率高,但類型不明確,維護難度大;
跨平臺部署復雜:JS/Python 生態部署常常伴隨依賴管理、環境沖突等問題;
無法滿足本地執行、邊緣計算等需求:這些場景更適合靜態編譯、資源占用少的語言;
交互協議仍缺閉環生態:只有 SDK,而沒有配套的工具市場、調試器、資源管理組件;缺乏完善的工具鏈、調試面板、生態工具市場等系統化組件;
ThinkInAI 開源團隊的目標
為了解決上述問題,我們基于以下理念設計了 Go-MCP:不是把 Python SDK 翻譯成 Go,而是重新定義 Go 場景下 MCP 的最佳實踐。Go-MCP 不僅是一個 SDK,更是 MCP 開源生態的補齊。
我們的目標不僅是提供高質量 SDK,更是構建完整MCP 開源生態系統,打造 MCP 的操作系統式體驗,包括:
Go-MCP SDK
實現 MCP 協議核心規范與傳輸方式,確保與所有兼容的 MCP 服務或客戶端無縫交互,適應不同應用場景和部署方式;
清晰的分層架構設計,確保代碼模塊化、可擴展、可維護,讓開發者能夠輕松理解和定制;
基于 Golang 開發,代碼清晰、強類型校驗、高度可維護;依托 Go 語言的靜態編譯和二進制產物特性,使部署變得極其簡單,無需管理復雜的依賴關系;Go 語言的高性能設計,使 SDK 具備優秀的并發處理能力和極低的資源占用。
MCP Marketplace:如今 MCP Server 已經增長到 2000+,開發質量也會有參差。怎么讓 Agent 根據相應速度、成本和相關性等因素選到更好的產品,可能需要一個類似 App store 那樣的雙邊平臺,同時這個平臺在架構上將兼具控制面與數據面。在這個雙邊平臺中:
消費側,MCP Server 使用者能夠:
瀏覽官方及社區創建的 MCP Server,按名稱、類別、標簽等進行檢索;
一鍵接入 MCP Server,自動配置或提供 API 文檔 / 代碼;
提供統一的 MCP Server 調用接口,調用在平臺上注冊的 MCP Server;
支持基于自然語言的意圖識別,自動調用符合需求的 MCP Server;
供給側,MCP Server開發者能夠:
通過登記元信息的方式注冊 MCP Server 到 Marketplace;
通過自然語言或 API 文檔自動化生成 MCP Server 并一鍵部署;
更豐富的工具生態:開發和集成更多預構建工具,使開發者能夠更快地構建功能豐富的 AI 應用;
因此 Go-MCP 只是開始,接下來我們還將構建:
?MCP 工具開發框架:方便開發者編寫 MCP Server 并發布到 Marketplace;
MCP Marketplace:支持意圖識別自動調用、服務注冊與發現、服務信息檢索、一鍵部署;
調試工具與可視化平臺:輔助開發者調試通信、模擬協議交互、分析上下行協議;
在未來的 LLM 生態中,MCP 不只是協議,而是Agent 構建的操作系統底座。我們希望通過 Go-MCP,成為這個底座的重要構件。
項目地址:https://github.com/ThinkInAIXYZ/go-mcp
快速認識 Go-MCP SDK
Go-MCP SDK 采用清晰的分層架構設計,確保代碼模塊化、可擴展性和可維護性。通過深入了解這一架構,開發者可以更好地利用 Go-MCP 的所有功能,甚至根據自己的需求進行定制和擴展。
Go-MCP 的架構可以抽象為三個主要層次:
傳輸層(Transport Layer):處理底層通信,支持不同的傳輸協議;
協議層(Protocol Layer):實現所有 MCP 協議數據結構定義;
用戶層(User Layer):包括服務器和客戶端實現,提供面向用戶的 API。
這種分層設計使各層彼此解耦,允許獨立演化和替換,同時保持整體功能一致性。
其中由傳輸層處理底層通信細節,目前支持兩種主要傳輸方式:
HTTP SSE/POST:基于 HTTP 的服務器發送事件(SSE)和客戶端 POST 請求,適用于網絡通信;
Stdio:基于標準輸入 / 輸出流的通信,適用于進程間通信;
傳輸層通過統一接口抽象,使上層代碼不需要關心具體的傳輸實現細節。這種設計允許輕松添加新的傳輸方式,如 Streamable HTTP、WebSocket、gRPC 等,而不影響上層代碼。
Go-MCP 的獨特優勢
AI 應用開發正處于加速發展階段,新技術和新方法不斷涌現。Model Context Protocol (MCP) 作為一個開放標準,正在改變 AI 應用與數據源和工具集成的方式。作為開發者,我們既需要可靠高效地實現當前協議規范,又需要適應未來的發展趨勢。因此,一個優秀的 MCP 客戶端庫,既需要完整實現協議規范,又需要具備足夠的靈活性和擴展性。
另一方面,現有的許多 MCP 實現多基于 Python 或 JavaScript,雖然這些語言生態豐富,但在性能、類型安全、本地部署和長期維護成本方面存在挑戰。隨著 AI 應用逐漸走向生產環境和大規模部署,基于 Go 語言的實現因其卓越的性能、強類型系統和出色的并發能力,以及極簡的本地部署,變得越來越有價值。
Go-MCP 的設計充分考慮了實際應用場景,特別適合對性能和可靠性有高要求的企業級應用。對于需要本地部署、邊緣計算、或微服務和 serverless 架構的場景,Go-MCP 提供了理想的解決方案。
架構穩定,靈活擴展
我們認為,MCP 作為一個開放協議,其核心功能和接口應當保持穩定,同時提供足夠的擴展性以適應不同場景。Go-MCP 采用清晰的三層架構設計,確保核心功能的穩定性和一致性:
傳輸層(Transport Layer):抽象底層通信方式,目前支持 SSE 和 Stdio 兩種傳輸方式。傳輸層通過統一接口屏蔽底層通信細節,便于增加新的傳輸方式;
協議層(Protocol Layer):包含所有 MCP 協議相關定義,實現核心功能如初始化、心跳檢測、取消操作、進度通知、根資源管理、采樣控制等。協議層確保所有消息的構造和解析符合 MCP 規范;
用戶層(User Layer):提供面向開發者的友好 API,包括客戶端和服務端實現。用戶層通過簡潔的接口封裝底層復雜性,使開發者能夠輕松集成 MCP 功能。
消息處理流程清晰,按請求、響應和通知進行分類,確保同步和異步操作的正確處理:
Client Server
| |
|------- Request (Ping, ListTools, etc) ------>|
| |
|<-------- Response (ServerInfo, etc) ---------|
| |
|<------ Notification (ToolsChanged, etc) -----|
Go-MCP 的設計也充分考慮了擴展性,支持多種擴展方式:
傳輸層擴展:可以實現自定義傳輸方式(如 Streamable HTTP、WebSocket、gRPC 等),只需實現傳輸接口即可;
協議擴展:對于新的 MCP 協議功能,可以通過擴展協議層實現支持。
在不斷更新的 AI 領域,Go-MCP 將緊跟 MCP 協議的發展,持續集成最新功能和最佳實踐,確保開發者始終能夠使用最先進的工具構建 AI 應用。
高可靠易維護
目前較為主流的 Python-SDK,雖然能借助 Python 較為豐富的生態快速實現多樣的功能,但是同時也繼承了 Python 作為動態語言所帶來的“弱類型檢驗”和“長期維護成本高”等問題。
在大模型應用快速進入大規模線上運行階段的當下,基于 Go 語言開發的 Go-MCP 充分利用了 Go 的強類型系統、并發模型和內存管理機制,提供高度可靠的 MCP 協議的實現。相比動態語言的實現,Go-MCP 具有以下優勢:
編譯時類型檢查,減少運行時錯誤;
強大的并發支持,適合處理復雜的異步通信;
高效的內存管理,減少性能消耗;
豐富的標準庫支持,減少外部依賴;
基于 Golang 寫 MCP 代碼時,開發者可以充分利用 Golang 的強類型特性進行開發。這像是為代碼繪制了一幅精確的地圖,開發者可以沿著清晰的路徑進行維護和擴展,即使在項目規模不斷擴大、功能持續迭代的情況下,依然能夠保有較高的可維護性。
同時 Go-MCP 采用模塊化設計,每個模塊職責明確,功能內聚,便于維護和擴展。同時,代碼風格遵循 Go 社區最佳實踐,使用標準工具如 gofmt 和 goimports 確保代碼質量和一致性。
極其簡便的本地部署
與 Python 的解釋執行不同,Go 語言通過靜態編譯生成二進制文件的特性,使得本地部署變得異常簡便。Go 編譯后的程序無需依賴外部環境或復雜的運行時,極大地簡化了部署流程,開發者無需擔心不同環境下的依賴沖突或版本不一致的問題,這對于本地部署的成功率至關重要。
此外,Go 語言具有出色的跨平臺兼容性、可移植性強,支持所有主流操作系統和處理器架構。這意味著無論是 Windows、Linux 還是 macOS,Go 程序都能提供一致的行為和極其簡便的部署方法。通過靜態鏈接和跨平臺編譯,Go 語言能確保在不同平臺間的統一體驗,極大地提高了開發和運維效率。
Go-MCP 將這一優勢發揮到極致,使得基于 Go-MCP 開發的本地 AI 應用的部署更加高效、簡潔,為開發者和企業提供了更多的靈活性和可控性。
特別是對于本地部署、邊緣計算、云端微服務、serverless 等需要高性能、低延遲、快速啟動的 AI 應用,Go-MCP 也保證了快速的請求響應、極低的資源占用。
快速上手
安裝
安裝 Go-MCP 非常簡單,只需使用 Go 的標準包管理工具go get命令:
go get github.com/ThinkInAIXYZ/go-mcp
這將下載并安裝 Go-MCP 及其所有依賴項。Go-MCP 需要 Go 1.18 或更高版本,以確保支持最新的語言特性和標準庫。
客戶端
看一個簡單的客戶端實現例子,展示如何創建 MCP 客戶端、連接服務器和執行基本操作:
package main
import (
"context"
"fmt"
"log"
"github.com/ThinkInAIXYZ/go-mcp/client"
"github.com/ThinkInAIXYZ/go-mcp/protocol"
"github.com/ThinkInAIXYZ/go-mcp/transport"
)
func main() {
// Create transport client (using SSE in this example)
transportClient, err := transport.NewSSEClientTransport("http://127.0.0.1:8080/sse")
if err != nil {
log.Fatalf("Failed to create transport client: %v", err)
}
// Create MCP client using transport
mcpClient, err := client.NewClient(transportClient)
if err != nil {
log.Fatalf("Failed to create MCP client: %v", err)
}
defer mcpClient.Close()
// List available tools
toolsResult, err := mcpClient.ListTools(context.Background())
if err != nil {
log.Fatalf("Failed to list tools: %v", err)
}
b, _ := json.Marshal(toolsResult.Tools)
fmt.Printf("Available tools: %+v\n", string(b))
// Call tool
callResult, err := mcpClient.CallTool(
context.Background(),
protocol.NewCallToolRequest("current time", map[string]interface{}{
"timezone": "UTC",
}))
if err != nil {
log.Fatalf("Failed to call tool: %v", err)
}
b, _ = json.Marshal(callResult)
fmt.Printf("Tool call result: %+v\n", string(b))
}
服務器
以下是構建 MCP 服務器的基本示例,展示如何創建 MCP 服務器,注冊工具處理器,處理客戶端請求:
package main
import (
"encoding/json"
"fmt"
"log"
"time"
"github.com/ThinkInAIXYZ/go-mcp/protocol"
"github.com/ThinkInAIXYZ/go-mcp/server"
"github.com/ThinkInAIXYZ/go-mcp/transport"
)
type currentTimeReq struct {
Timezone string `json:"timezone" description:"current time timezone"`
}
func main() {
// Create transport server (using SSE in this example)
transportServer, err := transport.NewSSEServerTransport("127.0.0.1:8080")
if err != nil {
log.Fatalf("Failed to create transport server: %v", err)
}
// Create MCP server using transport
mcpServer, err := server.NewServer(transportServer,
// Set server implementation information
server.WithServerInfo(protocol.Implementation{
Name: "Example MCP Server",
Version: "1.0.0",
}),
)
if err != nil {
log.Fatalf("Failed to create MCP server: %v", err)
}
// Register tool handler
tool, err := protocol.NewTool("current time", "Get current time with timezone, Asia/Shanghai is default", currentTimeReq{})
if err != nil {
log.Fatalf("Failed to create tool: %v", err)
return
}
// new tool handler and return result
handler := func(request *protocol.CallToolRequest) (*protocol.CallToolResult, error) {
req := new(currentTimeReq)
if err := json.Unmarshal(request.RawArguments, &req); err != nil {
return nil, err
}
loc, err := time.LoadLocation(req.Timezone)
if err != nil {
return nil, fmt.Errorf("parse timezone with error: %v", err)
}
text := fmt.Sprintf(`current time is %s`, time.Now().In(loc))
return &protocol.CallToolResult{
Content: []protocol.Content{
protocol.TextContent{
Type: "text",
Text: text,
},
},
}, nil
}
mcpServer.RegisterTool(tool, handler)
if err = mcpServer.Run(); err != nil {
log.Fatalf("Failed to start MCP server: %v", err)
return
}
}
同時,我們考慮到,在使用 MCP 協議的過程中,開發者需要靈活地選擇啟動服務的方式,以適應不同的應用場景。有些情況下,開發者可能希望自己控制 HTTP 服務的啟動和管理,而不僅僅是依賴 SDK 內置的默認方式。
為了解決這一需求,我們提供了一種更靈活的方式,使得開發者可以根據自己的需求選擇是否通過 SDK 內建的方式啟動 MCP Server,或者自行管理 HTTP 服務。
SDK 提供了實現 MCP 協議的 http.Handler,允許開發者在 SDK 外部自行啟動 http.Server。這種方式允許開發者在自己的服務框架中靈活配置和管理 HTTP 服務,確保與其他系統的無縫集成,同時保持對服務生命周期的更高控制。
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"time"
"github.com/ThinkInAIXYZ/go-mcp/protocol"
"github.com/ThinkInAIXYZ/go-mcp/server"
"github.com/ThinkInAIXYZ/go-mcp/transport"
)
type currentTimeReq struct {
Timezone string `json:"timezone" description:"current time timezone"`
}
func main() {
var (
messageUrl = "/message"
port = "8080"
)
// Create transport server (using SSE in this example)
transport, handler, err := transport.NewSSEServerTransportAndHandler(fmt.Sprintf("http://127.0.0.1:%s%s", port, messageUrl))
if err != nil {
log.Fatalf("Failed to create SSE transport: %v", err)
}
// Create MCP server using transport
mcpServer, err := server.NewServer(transport,
// Set server implementation information
server.WithServerInfo(protocol.Implementation{
Name: "Example MCP Server",
Version: "1.0.0",
}),
)
if err != nil {
log.Fatalf("Failed to create MCP server: %v", err)
}
// Register tool handler
tool, err := protocol.NewTool("current time", "Get current time with timezone, Asia/Shanghai is default", currentTimeReq{})
if err != nil {
log.Fatalf("Failed to create tool: %v", err)
return
}
// new tool handler and return result
toolHandler := func(request *protocol.CallToolRequest) (*protocol.CallToolResult, error) {
req := new(currentTimeReq)
if err := json.Unmarshal(request.RawArguments, &req); err != nil {
return nil, err
}
loc, err := time.LoadLocation(req.Timezone)
if err != nil {
return nil, fmt.Errorf("parse timezone with error: %v", err)
}
text := fmt.Sprintf(`current time is %s`, time.Now().In(loc))
return &protocol.CallToolResult{
Content: []protocol.Content{
protocol.TextContent{
Type: "text",
Text: text,
},
},
}, nil
}
mcpServer.RegisterTool(tool, toolHandler)
// 設置 HTTP 路由
http.Handle("/sse", handler.HandleSSE())
http.Handle(messageUrl, handler.HandleMessage())
// 啟動 HTTP 服務器
fmt.Println("Starting MCP server on :8080...")
if err := http.ListenAndServe(":"+port, nil); err != nil {
log.Fatalf("Failed to start HTTP server: %v", err)
}
}
未來展望
MCP 作為一個新興的開源協議,有著廣闊的發展前景。隨著 AI 行業的快速發展,標準化和互操作性變得越來越重要,而 Go-MCP 正是為此而生。未來,我們將繼續完善和擴展 SDK 功能,包括:
支持更多傳輸方式:計劃增加 Streamable HTTP 傳輸方式,以適應新版協議需求;
更豐富的工具生態:開發和集成更多預構建工具,使開發者能夠更快地構建功能豐富的 AI 應用;
完善 MCP 協議實現:補足 Cancellation、Progress、Roots、Sampling、Completion、Logging 等協議實現;
社區共建:積極拓展開源社區,吸引更多開發者參與貢獻,共同推動項目發展。
結語
Go-MCP 為 Go 語言開發者提供了一種便捷、高效的方式來集成和利用大模型互動的標準化協議。憑借其清晰的架構、高性能設計和豐富的功能,Go-MCP 是構建下一代 AI 應用的理想選擇。開始使用 Go-MCP,探索大模型交互的無限可能吧!
https://finance.sina.com.cn/tech/roll/2025-03-25/doc-ineqvvkv9991129.shtml
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.