MCP 實戰:使用 Go 快速構建 MCP Server
MCP 簡介
MCP 協議(Model Context Protocol,模型上下文協議)是由 Anthropic 於 2024 年 11 月底推出的一種開放標準,旨在統一大型語言模型(LLM)與外部數據源和工具之間的通信。
-
官方地址 https://modelcontextprotocol.io
-
架構如下
MCP 協議的架構包含多個關鍵組件:Host(宿主程序)、MCP Client(MCP 客戶端)、MCP Server(MCP 服務器)、Local Data Source(本地數據源)和 Remote Service(遠程服務)。對於普通用戶而言,Host 是主要關注點;而開發者則可能更關注 MCP Server。
Host
Host 通常是與用戶直接交互的桌面應用程序,例如 Claude 客戶端、Chatbox、Cline 等。這些應用程序內置了 MCP Client,能夠通過手動配置或 Host 提供的市場安裝可用的 MCP Server。
內置的 MCP Client 可以與 MCP Server 建立連接,用於後續的 RPC 通信,協議爲 JSON RPC。
MCP Server
MCP Server 主要通過 MCP 協議暴露其功能,供 Host 調用。其功能包括提示詞模板構建和工具鏈方法調用等。MCP Server 可以提供三種主要類型的功能:
-
資源(Resources):可以被客戶端讀取的類文件數據,如 API 響應或文件內容。
-
工具(Tools):可以被 LLM 調用的函數,需要用戶批准。
-
提示(Prompts):預先編寫的模板,幫助用戶完成特定任務。
MCP Server 是 MCP 架構中的關鍵組件,它通過標準化的模型上下文協議爲 AI 應用提供豐富的上下文信息和操作能力,從而增強 LLM 的實用性和靈活性
Host 安裝
官方首推的 Host 是 Claude 客戶端,本文主要用 Cline,所以先來安裝它。
在 VSCode 搜索 Cline 安裝最新版即可(我安裝的是 v3.4.0),安裝完成後,需要做下大模型配置,我選用的是阿里雲的 deepseek-r1 滿血版。
做好 LLM 配置後,我們點擊 Cline 頂部第二個按鈕( MCP Servers ),即可看到 Cline 內置的 MCP Server 市場,是不是感覺有點像 App Store。
當然,我們今天的目標不是測試 Cline 的市場,截圖只是想讓大家感受下,MCP 協議的厲害之處。
它能將整個生態分層做好,有人做好各種 Host,然後各種擴展能力或者遠程服務,都可以通過 MCP Server 快速集成到你喜愛的 Host 中,統一的 UI。
MCP Server 構建
官方提供了 TS,Python,Java ,kotlin SDK,你可以快速構建自己的 MCP Server,我使用的是社區 Go SDK(mark3labs/mcp-go), 該 SDK 更新速度還可以。
本 MCP Server 主要實現當前時間的查詢,支持任意時區,具體代碼如下
package main
import (
"context"
"fmt"
"time"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
func main() {
// Create MCP server
s := server.NewMCPServer(
"Demo 🚀",
"1.0.0",
)
// Add tool
tool := mcp.NewTool("current time",
mcp.WithDescription("Get current time with timezone, Asia/Shanghai is default"),
mcp.WithString("timezone",
mcp.Required(),
mcp.Description("current time timezone"),
),
)
// Add tool handler
s.AddTool(tool, currentTimeHandler)
// Start the stdio server
if err := server.ServeStdio(s); err != nil {
fmt.Printf("Server error: %v\n", err)
}
}
func currentTimeHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
timezone, ok := request.Params.Arguments["timezone"].(string)
if !ok {
return mcp.NewToolResultError("timezone must be a string"), nil
}
loc, err := time.LoadLocation(timezone)
if err != nil {
return mcp.NewToolResultError(fmt.Sprintf("parse timezone with error: %v", err)), nil
}
return mcp.NewToolResultText(fmt.Sprintf(`current time is %s`, time.Now().In(loc))), nil
}
代碼解讀:
-
通過 mcp.NewTool 定義一個叫做 “current time” 的 tool,它能接受一個叫做 timezone 的參數,默認值爲 Asia/Shanghai。
-
currentTimeHandler 返回對應時區的當前時間。
-
`server.ServeStdio 表示通過標準 I/O 進行 PRC 通信。
`
通過 go build 生成一個叫做 mcp-go-server 的可執行程序,後面手動配置會用到。
配置 Server
按照下圖,進行 MCP Server 的配置。
這裏主要將我們編譯的可執行程序添加到 Cline 的配置中,點擊保存後它會幫我們啓動一個 mcp-go-server 進程,並通過 MCP 協議發現我們定義好的 “current time” 工具。
工具使用
接下來我們看看 current time 這個工具是否好用,首先點擊 Cline 上面的 “+” 號,創建一個任務。
告訴我北京時間
輸入任務後, Cline 開始與大模型交互,發現可以調用 current time tool,並攜帶大模型解析出來的 timezone 參數,通過 RPC 對 tool 進行調用,tool 返回了上海當前時間(大模型覺得上海和北京是同一時區,所以用了默認值),最後再讓大模型進行結果潤色,整個過程如下圖。
潤色結果爲 “當前北京時間是:2025 年 2 月 25 日 22:33:58(UTC+8)”。
當我繼續問它,芝加哥當前時間是多少時,它也能很快給出正確答案。
總結
到此,我們的示例已經圓滿結束。通過實踐可以看出,使用 MCP SDK 開發一個 MCP 服務非常便捷,且該服務能夠輕鬆集成到任何支持 MCP 協議的客戶端程序中,這大大降低了服務與應用程序之間的集成難度。
隨着 MCP 生態系統的不斷壯大和完善,我們有理由相信,MCP 協議在未來將展現出更加廣闊的應用前景和潛力,爲 AI 領域帶來更多創新和可能性。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/JmPxMBRZa8UhsIOQVgupLw