如何用 go 搭建 MCP 服務
- 什麼是 MCP?
MCP 是 “模型上下文協議(Model Context Protocol)” 的簡稱,用一句簡單通俗易懂的話描述:
是一種讓 AI 模型能夠無縫連接到外部工具和數據源的標準化方式。想象它就像 AI 的“萬能接口”,能讓 AI 像用 USB 線連接設備一樣,輕鬆調用其他程序或服務。
- 官方 MCP 架構圖
-
MCP Hosts: 是指 LLM 啓動連接的應用程序, 如 Cursor、Claude Desktop、IDE 或 AI 工具。
-
MCP Clients: 維護與服務器一對一連接的協議客戶端。
-
MCP Servers: 通過標準的 Model Context Protocol 給 Client 提供特定的功能。
-
Local Data Sources: 本地的文件、數據庫和 API。
-
Remote Service: 外部的文件、數據庫和 API。
3.MCP 原理圖
順便貼一下我用 mermaid 畫的 MCP 原理圖 mermaid:
```mermaid
sequenceDiagram
autonumber
actor 用戶
participant Client as 客戶端<br>(Cursor)
participant LLM as LLM<br>(Claude-3.7)
participant MCP as MCP服務
participant 遠程 as 遠程服務<br>(Web Api)
rect rgb(255, 255, 0)
Note over Client,MCP:初始化階段
Client->>MCP:註冊並啓動MCP服務
MCP-->>Client:服務註冊成功
end
rect rgb(255, 255, 0)
Note over 用戶,遠程:交互流程
用戶->>Client:輸入內容
Client->>LLM:將用戶輸入的內容提交給LLM
Note over LLM:分析用戶內容,<br>並決定是否需要<br>調用MCP
LLM-->>LLM:
rect rgb(155, 255, 155)
alt 需要調用MCP
LLM->>Client:請求客戶端調用特定MCP工具
Client->>MCP:調用MCP服務,執行特定動作
MCP->>遠程:調用遠程Api服務
遠程-->>MCP:返回遠程結果
MCP-->>Client:返回結果給客戶端
Client->>LLM:將MCP返回結果或動作作爲上下文再次請求LLM
else 不需要調用MCP
Note over LLM:直接返回大模型輸出結果
end
end
LLM-->>Client:輸出內容給客戶端
Client-->>用戶:顯示回答內容
end
4. 編譯 go MCP 服務
---------------
* **go version**:go1.24.1
* **mcp-go 庫地址**:github.com/mark3labs/mcp-go
* **操作步驟:** 下面是一個 go MCP 服務的 demo,可以根據自己的需要添加或更改 Tool,下面是詳細操作步驟:
### 步驟 1:創建項目和 main.go Choose here javascripttypescripthtmlcssshellpythongolangjavacc++c#phprubyswiftkotlinscalarustdartelixirhaskellluaperlrsql
mkdir mcp-server cd mcp-server vim main.go #在main.go中添加如下內容
Choose here javascripttypescripthtmlcssshellpythongolangjavacc++c#phprubyswiftkotlinscalarustdartelixirhaskellluaperlrsql
package main
import ( "context" "errors" "fmt"
"github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" )
func main() { // Create a new MCP server s := server.NewMCPServer( "Calculator Demo", "1.0.0", server.WithResourceCapabilities(true, true), server.WithLogging(), server.WithRecovery(), )
// Add a calculator tool calculatorTool := mcp.NewTool("calculate", mcp.WithDescription("Perform basic arithmetic operations"), mcp.WithString("operation", mcp.Required(), mcp.Description("The operation to perform (add, subtract, multiply, divide)"), mcp.Enum("add", "subtract", "multiply", "divide"), ), mcp.WithNumber("x", mcp.Required(), mcp.Description("First number"), ), mcp.WithNumber("y", mcp.Required(), mcp.Description("Second number"), ), )
// Add the calculator handler 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 "add": result = x + y case "subtract": result = x - y case "multiply": result = x * y case "divide": if y == 0 { return nil, errors.New("Cannot divide by zero") } result = x / y }
return mcp.NewToolResultText(fmt.Sprintf("%.2f", result)), nil })
// Start the server if err := server.ServeStdio(s); err != nil { fmt.Printf("Server error: %v\n", err) } }
### 步驟 2:編譯 Choose here javascripttypescripthtmlcssshellpythongolangjavacc++c#phprubyswiftkotlinscalarustdartelixirhaskellluaperlrsql
#初始化依賴包 go mod init #加載依賴包 go mod tidy #編譯 go build -o mcpServer main.go #查看目錄文件 ls -l #查看文件路徑path pwd #如下:

### 步驟 3:在 Cursor 中配置 MCP 命令
`Command + Shift + J` 打開 Cursor 配置命令,如下圖所示,在 json 配置中添加如下內容:

{ "mcpServers": { "calculate": { "command": "/Users/xxx(你的項目路徑)/src/mcp-service/mcpServer" } } }
其中 `calculate` 表示的是本地 MCP 工具的名稱,`command`是需要執行的命令路徑。
5. 在 Cursor 中調用 MCP 服務
----------------------
使用MCP calculate工具,若 x = 120,y = 30 ,x + y 、x * y 、x /y 分別等於多少?

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/6j3q4LAOvCgUo54xE_Y5Vg