而Goland的客戶端原理就更簡單了,就是在此基礎上增加一個對話循環:

  1. 初始化:客戶端訪問服務端的接口,獲取工具,提示,資源等資源。
  2. 開始對話,客戶端接收用戶輸入,并把上述資源的上下文一起發送給大模型。
  3. 客戶端判斷通過大模型輸出判斷是否需要調用資源,如果需要就去調用,并將調用的結果返回給大模型。
  4. 大模型分析,整合結果后返回給客戶端。

有了這些知識我們就可以開始架構項目了。

這次要實現的是一個使用Go語言開發的對話助手,現在因為官方并沒有Go的我們的MCP SDK,而且他的客戶端服務器不支持遠程連接,所以這次不使用官方的架構進行開發,而是在MCP的基礎上,基于它的理念,用更簡單的定義實現。

創建 IDE

工欲善其事,必先利其器。一個好的IDE可以很大程度上提高我們的開發效率。對于Go語言來說,我最推薦使用Jetbrains的Goland,它擁有強大的功能和漂亮的UI,尤其適合開發這種有點復雜的項目。

這很多同學可能要說:這種大型的IDE太卡了,我的電腦頂不住啊!

坦白說是有這個問題,首先是mbp,另外在大型項目建立索引的時候卡了一段時間。但還沒解開的,使用Sealos Devbox就可以解決的問題。他將Goland的服務端放在遠程云端,利用云端的算力實現構建索引等CPU密集的功能,只要你本地的電腦是什么型號和情況,就可以絲滑流暢的開發。

創建開發環境

先訪問Sealos Cloud:https://hzh.sealos.run

點擊 Devbox 圖標,然后點擊“新建項目”按鈕。在“運行環境”配置中,選擇 Go 語言作為開發框架,并通過仔細調整項目所需的 CPU 核心數和內存大小。因為 Goland 需要一定的性能,建議采用 4c 8g 或者更高的配置。

滾動到配置頁面的“網絡配置”部分,配置容器端口:

配置外部訪問:

域名配置:

注意:請確保容器端口 (8080) 與 Go 應用的運行端口一致。如果在 Go 配置中了端口,這里也需要相應修改更新。

最后,點擊“創建”按鈕完成項目創建。

項目創建完成后,你可以在項目列表中看到新建的項目。每個項目的“操作”欄都提供了許多便捷的選項。

使用 Goland 連接

在項目列表中找到你的項目,在“操作”列中,點擊 VSCode 圖標旁邊的下拉箭頭,從下拉菜單中選擇 Jetbrains,就會自動跳出一個彈窗。

根據彈窗里的提示,下載好JetBrains Gateway應用,配置好SSH連接信息,選擇自己要使用的IDE(比如Go語言項目就選擇Goland),點擊彈窗底部的【開始連接】。

提示

首次連接時,DevBox 需要下載相關組件,可能需要 3-5 分鐘,等待等待即可。

組件下載完成后,自動打開Jetbrains Gateway。確認連接信息沒問題后,直接點擊“Check Connection and Continue”即可。

如果沒有自動打開Jetbrains Gateway,可能是您的瀏覽器自動阻止了彈窗,請自行開通網站的彈窗權限。

接下來Jetbrains還會跳出一個彈窗進行一系列準備工作:

準備完成后,將自動打開Goland IDE,并自動連接到Devbox開發環境。

搞定,現在你就可以在 Goland 中開始愉快的進行遠程開發了!

核心預測

代碼:https://github.com/bearslyricattack/mcpTerminal,下面我們挑一些關鍵的代碼為大家介紹一下位于:

加載MCP 服務

func NewTool() (*Tool, error) {
// Open the local server.json file
file, err := os.Open("server.json")
if err != nil {
return nil, fmt.Errorf("failed to open server.json file: %v", err)
}
defer file.Close()

// Create an instance of the Tool type
var tool Tool

// Decode the JSON file into the server struct
decoder := json.NewDecoder(file)
err = decoder.Decode(&tool)
if err != nil {
return nil, fmt.Errorf("failed to decode JSON: %v", err)
}

// Return the decoded Tool object
return &tool, nil
}

當前我們沒有使用官方 MCP 的格式,而是在本地配置了一個 json 文件,用于表征各個服務的鏈接地址,參數等信息。

迅速的

// GetPrompts generates a prompt message suitable for the assistant
func GetPrompts(tools string) string {
// Use a multi-line string for better readability
prompt := fmt.Sprintf(`
您是一位有用的助手,可以使用這些工具:%s
根據用戶的問題選擇適當的工具。
如果不需要工具,請直接回復。
重要提示:當您需要使用工具時,您必須僅使用以下確切的 JSON 對象格式進行回復,不能使用其他任何內容:
{
"name": "name",
"arguments": {
"argument-name": "value"
}
}
收到工具的響應后:
1. 將原始數據轉換為自然的對話響應
2. 保持響應簡潔但信息豐富
3. 關注最相關的信息
4. 使用用戶問題中的適當上下文
5. 避免簡單重復原始數據
請僅使用上面明確定義的工具。`, tools)
return prompt
}

首先向大模型發起請求的時候,需要為其做一些介紹,并包含需要使用的所有工具。下面是一個提示詞的示例,大家也可以持續優化提示詞,以期達到更好的效果。

對話

// Start the conversation loop
scanner := bufio.NewScanner(os.Stdin)
for {
userInput := getUserInput(scanner)
response, err := chatClient.SendMessage(userInput)
if err != nil {
log.Fatalf("Error sending message: %v", err)
}
// Process the response to check if it contains a ToolRequest
if tool.HandleToolRequest(response, mcpServers, chatClient) {
continue // If a ToolRequest is handled, continue to the next iteration
}
fmt.Println("Assistant:", response)
}

讀取模型的輸出,由模型來判斷是否需要調用。

工具調用

var request ToolRequest
// Try to unmarshal the response into a ToolRequest struct
err := json.Unmarshal([]byte(response), &request)
if err != nil {
return false // If it's not a ToolRequest, return false to continue normal processing
}

// Search for the corresponding mcpServer and send a request to it
for _, mcpServer := range mcpServers.Server {
if request.Name == mcpServer.Name {
request, _ := req.BuildRequest(mcpServer.Host, request.Arguments)
response, err := chatClient.SendMessage(request)
if err != nil {
log.Fatalf("Error sending message: %v", err)
}
fmt.Println("Assistant:", response)
return true
}
}

可能到大型模型修剪的 JSON 的輸出之后,檢索所有的 MCP Server 進行查找和工具調用。

效果

我們以平臺上現有的“獲取應用程序的日志”HTTP 接口為例子,只需要在文件配置中配置這個接口,就可以自動的成為一個可以被大模型調用的服務器,不需要做任何額外的操作:

{
"server": [
{
"name": "vlogs-server",
"version": "1.0.0",
"type": "remote",
"host": "http://ip:port/queryLogsByParams",
"description": "Get logs from the API by passing parameters.",
"args": [
{
"key": "time",
"value": "10h",
"description": "The time filter for logs (e.g., \"10h\")."
},
{
"key": "namespace",
"value": "gpu-operator",
"description": "The namespace of the application (e.g., \"gpu-operator\")."
},
{
"key": "app",
"value": "gpu-operator",
"description": "The name of the application (e.g., \"gpu-operator\")."
},
{
"key": "limit",
"value": "100",
"description": "The limit for the number of logs to retrieve. (e.g., \"20\"). if use this key, please use string type."
},
{
"key": "pod",
"value": "pod-123",
"description": "The list of pods to query."
},
{
"key": "container",
"value": "container-456",
"description": "The list of containers to query."
},
{
"key": "keyword",
"value": "error",
"description": "The keyword to filter logs by."
}
]
}
]
}

然后只需在我們的主要方法中配置大模型的uri apikey等信息我們就可以開始使用了,任何符合OpenAPI輸出格式的模型都支持。可以像與任何大模型一樣,與它以自然語言自由的對話,它會需要的時候調用我們提供的工具去執行并分析結果。

以下是幾張效果圖

可以看到效果還是非常優秀的,也有一定的穩定性,詳細優化下提示詞的話應該會有更好的效果。

總結

隨著大模型能力的不斷增強,其工程化是必然的趨勢。而MCP的思想和設計,是其工程化的一條重要道路。雖然目前其各個社區的支持強度似乎相差甚遠,但隨著時間的發展,一定會越來越多的模型和工具都支持以MCP的格式進行調用。

使用Goland的開發體驗非常的絲滑流暢的,而且連接穩定,甚至你一晚上不開發都不會斷連接。大家也可以嘗試一下,開發出屬于自己的MCP對話助手。

文章轉載自: 使用 Goland 遠程開發基于 MCP 的智能對話助手

上一篇:

使用Cursor 和 Devbox 一鍵搞定開發環境

下一篇:

3分鐘教你接入超低價 DeepSeek-V3
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費