Go - MCP SDK 新玩法:實現海報生成 MCP Server 與 DeepChat 無縫集成
DeepChat 是國內主導的一個非常優秀的智能助手,開源 2 個月,已經收穫 1k+ 的粉絲關注,最近聽說新版本已經支持 MCP,迫不及待開始嚐鮮。
但做個什麼插件好了,無意看到阿里雲的 “創意海報生成” 接口文檔,索性給 DeepChat 添加一個 “海報生成” 的功能。
構建 MCP Server
看過我前面文章的小夥伴應該知道,我以前一般使用 mark3labs/mcp-go 這個庫,但發現國內最近也出了一個 SDK,果斷使用一下。
看了 go-mcp 的代碼,用它構建 MCP Server 過程非常簡單,主要包含這三步。
-
新建 server
-
新建 tool 和對應的 handler,並將其與 server 綁定
-
啓動 server
下面我們一起看看具體的代碼實現邏輯:
- 阿里雲海報接口文檔對應 Golang SDK 快速生成
將阿里雲的接口文檔 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) {
...
}
- 創建 sse transport 和 mcp server
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 可以直接變爲雲端部署。
- MCP tool 定義
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 方法。
- tool handler 定義
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。
- tool 註冊並啓動 server
svr.RegisterTool(tool, taskHandler)
svr.Start()
服務啓動和使用
- 啓動 server
直接 go 運行從服務
$ go run tools/poster/main.go
start mcp server with sse transport, listen 127.0.0.1:8081
- 在 DeepChat MCP 管理界面,添加 sse 服務地址
添加完畢後,你在 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 服務能力,也值得關注。
參考資料
-
https://github.com/ThinkInAIXYZ/go-mcp
-
https://help.aliyun.com/zh/model-studio/creative-poster-generation
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/nEmXddRRcT0JtpdfBvKcBA