
今天,ThinkInAI 團隊(前身為 GoCN 團隊)自豪地宣佈,基於 Go 語言的大模型互動協議(Model Context Protocol)SDK —— Go-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 實現,主要由官方維護的 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 的所有功能,甚至根據自己的需求進行定製和擴充套件。

Go-MCP 的架構可以抽象為三個主要層次:
-
傳輸層(Transport Layer):處理底層通訊,支援不同的傳輸協議;
-
協議層(Protocol Layer):實現所有 MCP 協議資料結構定義;
-
使用者層(User Layer):包括伺服器和客戶端實現,提供面向使用者的 API。
這種分層設計使各層彼此解耦,允許獨立演化和替換,同時保持整體功能一致性。
其中由傳輸層處理底層通訊細節,目前支援兩種主要傳輸方式:

-
HTTP SSE/POST:基於 HTTP 的伺服器傳送事件(SSE)和客戶端 POST 請求,適用於網路通訊;
-
Stdio:基於標準輸入 / 輸出流的通訊,適用於程序間通訊;
傳輸層透過統一介面抽象,使上層程式碼不需要關心具體的傳輸實現細節。這種設計允許輕鬆新增新的傳輸方式,如 Streamable HTTP、WebSocket、gRPC 等,而不影響上層程式碼。
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 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 等協議實現;
-
社群共建:積極拓展開源社群,吸引更多開發者參與貢獻,共同推動專案發展。
