Go - MCP SDK 新玩法:實現海報生成 MCP Server 與 DeepChat 無縫集成

DeepChat 是國內主導的一個非常優秀的智能助手,開源 2 個月,已經收穫 1k+ 的粉絲關注,最近聽說新版本已經支持 MCP,迫不及待開始嚐鮮。

但做個什麼插件好了,無意看到阿里雲的 “創意海報生成” 接口文檔,索性給 DeepChat 添加一個 “海報生成” 的功能。

構建 MCP Server 

看過我前面文章的小夥伴應該知道,我以前一般使用 mark3labs/mcp-go 這個庫,但發現國內最近也出了一個 SDK,果斷使用一下。

看了 go-mcp 的代碼,用它構建 MCP Server 過程非常簡單,主要包含這三步。

  1. 新建 server

  2. 新建 tool 和對應的 handler,並將其與 server 綁定

  3. 啓動 server

下面我們一起看看具體的代碼實現邏輯:

將阿里雲的接口文檔 https://help.aliyun.com/zh/model-studio/creative-poster-generation 丟給大模型,秒出 golang SDK。

因爲接口是異步生成,此 SDK 主要包含兩個函數,分別對應任務生成和結果查詢。

// SendRequest sends a request to the Aliyun service to generate a task.
func (c *Client) SendRequest(input TaskInput) (string, error) {
    ...
}
// GetTaskStatus sends a request to the Aliyun service to get the status of a task.
func (c *Client) GetTaskStatus(taskID string) (*TaskStatusResponse, error) {
    ...
}
t, _ = transport.NewSSEServerTransport("127.0.0.1:8081")
svr, _ := server.NewServer(
    getTransport(),
    server.WithServerInfo(protocol.Implementation{
        Name:    "poster-generator",
        Version: "1.0.0",
    }),
)

這裏使用 go-mcp 提供的 sse transport,以後該 MCP server 可以直接變爲雲端部署。

tool := &protocol.Tool{
    Name:        "海報生成",
    Description: "根據用戶描述生成對應風格的海報",
    InputSchema: map[string]interface{}{
        "type""object",
        "properties": map[string]interface{}{
            "title": map[string]string{
                "type":        "string",
                "description""標題",
            },
            "sub_title": map[string]string{
                "type":        "string",
                "description""副標題",
            },
            "body_text": map[string]string{
                "type":        "string",
                "description""主要內容",
            },
            "prompt_text_zh": map[string]string{
                "type":        "string",
                "description""文生圖關鍵提示詞",
            },
            "wh_ratios": map[string]string{
                "type":        "string",
                "description""出圖畫面橫豎版,默認爲豎版",
            },
            "lora_name": map[string]string{
                "type":        "string",
                "description""文生圖lora名稱",
            },
        },
        "required": []string{"title""sub_title""body_text""prompt_text_zh"},
    },
}

這裏我們將阿里雲接口的相關參數暴露給大模型,並通過 go-mcp sdk 進行創建,但可以看到 go-mcp 目前 tool 的定義比較原始,缺少像 mcp-go mcp.WithString() 這種 helper 方法。

func taskHandler(request *protocol.CallToolRequest) (*protocol.CallToolResult, error) {
    // 發送任務
    taskID, err := postTask(request.Arguments)
    if err != nil {
        return nil, err
    }
    log.Printf("send generate task with id %#v \n", taskID)
    // 輪詢查詢任務 
    ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute)
    defer cancel()
    ticker := time.NewTicker(5 * time.Second)
    for {
        select {
        case <-ctx.Done():
            return nil, errors.New("resolve task response timeout")
        case <-ticker.C:
            resp, err := aliyunClient.GetTaskStatus(taskID)
            if err != nil {
                return nil, err
            }
            status := resp.Output.TaskStatus
            if status == "SUCCEEDED" {
                imageUrl := resp.Output.RenderURLs[0]
                log.Printf("圖片生成成功,url=%s", imageUrl)
                return &protocol.CallToolResult{
                    Content: []protocol.Content{
                        protocol.TextContent{
                            Type: "text",
                            Text: fmt.Sprintf("生成的圖片 url 爲 \"%s\"", imageUrl),
                        },
                    },
                }, nil
            } else if status == "FAILED" {
                log.Printf("任務生成失敗,error: %v", resp.Output.Message)
                return nil, errors.New("任務生成失敗")
            }
        }
    }
}

這裏我們主要實現任務發送以及任務結果查詢,當任務生成成功後,我們通過 text 類型,將圖片 URL 返回給 DeepChat。

svr.RegisterTool(tool, taskHandler)
svr.Start()

服務啓動和使用

直接 go 運行從服務

$ go run tools/poster/main.go 
start mcp server with sse transport, listen 127.0.0.1:8081

添加完畢後,你在 DeepChat 的 chatbox 可以看到對應工具。

當我們輸入海報生成相關提示詞後,大模型會對文案 / 構圖進行潤色,並自動完成參數綁定,最後調用 “海報生成” 工具,得到結果圖片。

我這裏使用的 DeepChat 版本爲 v0.0.12,它在調用 tool 的時候,展示了所有參數以及返回結果,非常清晰直觀。而且它也支持提取結果中的 url,並進行圖片展示。

提示詞 1: “馬上清明節了,請幫我生成海報,主標題,副標題以及文案自由發揮,畫面內容提示詞貼合清明主題,使用 lora "2D 插畫 1"”

測試 2: 追加評論,“生成橫板”

最後總結

今天我們通過一個實際案例,使用最新開源 golang MCP SDK(ThinkInAIXYZ/go-mcp)快速開發了一個海報生成的 MCP Server,並在 DeepChat 中成功運行。

可以看到 DeepChat 已經具備集成 MCP Server 的擴展能力,相信未來它將給我們帶來更多玩法,真正意義成爲提示效率的智能好幫手。

另外 ThinkInAIXYZ/go-mcp 此項目雖然開源時間不久,但已經具備構建完整端到端 MCP 服務能力,也值得關注。

參考資料

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