💥新功能速递!Go 语言如何优雅地管理你的 MCP 服务器?mcp-client-go
来帮你!
大家好,我是你们的老朋友,热衷于探索 Go 语言各种新奇好用库的 tech enthusiast!最近在 GitHub 上发现一个非常有潜力的 Go 库------yincongcyincong/mcp-client-go
)。它最近迭代了一个非常棒的功能,极大地提升了我们管理 MCP (Microservice Communication Protocol) 服务器的效率和灵活性。今天就来给大家详细介绍一下这个新功能,并强烈安利这个库!
为什么要关注 MCP 和 mcp-client-go
?
随着微服务架构的普及,我们经常需要与各种各样的服务和工具进行交互。这些服务可能是本地运行的,也可能是远程部署的,它们可能通过不同的协议进行通信(HTTP/SSE, WebSocket, 或者自定义协议)。而 MCP 协议正是为了规范这种微服务间的通信而生,旨在提供一种统一的、可扩展的方式来发现和调用服务。
然而,管理这些五花八门的 MCP 服务器本身就是个不小的挑战。手动启动、配置、管理这些服务,不仅繁琐,而且容易出错。mcp-client-go
正是为了解决这个痛点而诞生的。它提供了一个 Go 语言的客户端,让你能够以代码的方式统一管理和调用不同的 MCP 服务器。
🚀 新功能亮点:配置驱动的 MCP 服务器管理!
这次 mcp-client-go
更新的重磅功能,就是通过配置文件来灵活添加和管理 MCP 服务器!这意味着你不再需要硬编码服务器的启动命令或连接地址,一切都可以通过一个简单的 JSON 文件搞定。这大大提高了项目的可配置性和可维护性。
让我们通过一个具体的例子来看看它是怎么做到的。
示例配置:test.json
假设你需要与 GitHub 的 MCP 服务器、Playwright 的 MCP 服务器以及一个自定义的 Amap MCP 服务器进行交互。你可以这样配置 test.json
文件:
JSON
json
{
"mcpServers": {
"github": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"GITHUB_PERSONAL_ACCESS_TOKEN",
"ghcr.io/github/github-mcp-server"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>" // 请替换为你的 GitHub Token
}
},
"playwright": {
"url": "http://localhost:8931/sse" // 假设 Playwright MCP 服务器运行在 8931 端口
},
"amap-mcp-server": {
"url": "http://localhost:8000/mcp" // 假设 Amap MCP 服务器运行在 8000 端口
}
}
}
从这个配置中我们可以看出,mcp-client-go
支持两种主要的 MCP 服务器启动/连接方式:
-
通过 command 字段指定外部命令启动 (e.g., Docker):
对于像 github 这样的 MCP 服务器,它可能以 Docker 容器的形式提供。你只需要在配置中指定 command 为 docker,然后在 args 中传入相应的 Docker 命令和参数,甚至可以通过 env 字段设置环境变量(比如 GitHub Personal Access Token)。mcp-client-go 会负责帮你启动和管理这个 Docker 容器。
-
通过 url 字段连接现有服务 (HTTP/SSE):
对于已经运行的 MCP 服务器,比如 playwright 和 amap-mcp-server,你只需要提供它们的访问 url 即可。库会通过这个 URL 进行连接,并获取服务信息。
这种声明式的配置方式,让 MCP 服务器的管理变得前所未有的简单和直观!
示例代码:Go 语言中的优雅使用
配置好了 test.json
,接下来我们看看如何在 Go 代码中利用它:
Go
go
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"time"
"github.com/yincongcyincong/mcp-client-go/clients" // 引入 mcp-client-go 库
)
// 请确保在运行前,你已经按照注释启动了相应的 MCP 服务器
// For Playwright MCP Server: `npx @playwright/mcp@latest --port 8931`
// For Amap MCP Server: `uvx amap-mcp-server streamable-http` (或类似命令)
func main() {
// 1. 创建带有超时的上下文,用于控制整个操作的生命周期
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel() // 确保在 main 函数结束时取消上下文
// 2. 从配置文件初始化 MCP 服务器客户端管理器
mcs, err := clients.InitByConfFile(ctx, "./test.json")
if err != nil {
log.Fatalf("从配置文件初始化失败: %v", err)
}
// 3. 注册所有配置的 MCP 客户端
// 这一步会根据配置启动 Docker 容器或连接到 URL
errs := clients.RegisterMCPClient(ctx, mcs)
if len(errs) > 0 {
log.Fatalf("注册 MCP 客户端失败: %v", errs)
}
fmt.Println("所有 MCP 客户端已成功注册!")
// 4. 获取并使用 "github" MCP 客户端
fmt.Println("\n--- 从 GitHub MCP 客户端获取工具 ---")
c, err := clients.GetMCPClient("github")
if err != nil {
log.Fatalf("获取 GitHub 客户端失败: %v", err)
}
for _, tool := range c.Tools {
toolByte, _ := json.MarshalIndent(tool, "", " ") // 美化输出
fmt.Println(string(toolByte))
}
fmt.Println("-------------------------------------------------------")
// 5. 获取并使用 "playwright" MCP 客户端
fmt.Println("\n--- 从 Playwright MCP 客户端获取工具 ---")
c, err = clients.GetMCPClient("playwright")
if err != nil {
log.Fatalf("获取 Playwright 客户端失败: %v", err)
}
for _, tool := range c.Tools {
toolByte, _ := json.MarshalIndent(tool, "", " ")
fmt.Println(string(toolByte))
}
fmt.Println("-------------------------------------------------------")
// 6. 获取并使用 "amap-mcp-server" MCP 客户端
fmt.Println("\n--- 从 Amap MCP 客户端获取工具 ---")
c, err = clients.GetMCPClient("amap-mcp-server")
if err != nil {
log.Fatalf("获取 Amap 客户端失败: %v", err)
}
for _, tool := range c.Tools {
toolByte, _ := json.MarshalIndent(tool, "", " ")
fmt.Println(string(toolByte))
}
fmt.Println("-------------------------------------------------------")
fmt.Println("\n所有 MCP 服务器的工具信息已打印完毕!")
}
代码的逻辑非常清晰:
-
通过
context.WithTimeout
设置一个操作超时,这是一个 Go 编程的好习惯。 -
clients.InitByConfFile
会读取test.json
文件,并根据里面的定义加载所有的 MCP 服务器配置。 -
clients.RegisterMCPClient
是关键一步,它会根据配置:- 如果配置了
command
(例如docker
),它会尝试启动相应的进程或 Docker 容器。 - 如果配置了
url
,它会尝试连接到该 URL。 成功后,所有的 MCP 客户端都会被注册到内部管理器中。
- 如果配置了
-
最后,你可以通过
clients.GetMCPClient("客户端名称")
来获取任何一个已注册的 MCP 客户端实例,并访问其Tools
字段,获取该 MCP 服务器所提供的所有工具信息。
这个新功能带来的好处
- 极高的灵活性:无论是 Docker 容器还是通过 URL 暴露的服务,都能通过统一的配置进行管理。
- 简化部署与维护:不再需要编写复杂的脚本来启动和连接不同的服务,只需维护一个简单的 JSON 配置文件。
- 提高可移植性:项目在不同环境中部署时,只需修改配置文件,而无需改动代码。
- 更清晰的服务管理:通过名称就能获取到对应的 MCP 客户端,代码逻辑更清晰。
强烈推荐 mcp-client-go
!
如果你在 Go 语言项目中需要与多个 MCP 服务器进行交互,或者希望以一种更优雅、更灵活的方式管理你的微服务依赖,那么我强烈推荐你尝试一下 mcp-client-go
!
它不仅仅是一个客户端库,更是一个帮助你构建健壮、可维护、易于扩展的微服务应用的利器。
快速开始
-
安装库:
Bash
gogo get github.com/yincongcyincong/mcp-client-go
-
创建
test.json
配置文件(参考上述示例)。 -
编写 Go 代码(参考上述示例)。
-
运行:
Bash
gogo run your_main_file.go
(请确保你根据
test.json
的配置,预先启动了 Playwright 和 Amap 的 MCP 服务器,或者 Docker 环境已就绪。)
项目地址: github.com/yincongcyin...
希望这篇文章能帮助大家了解 mcp-client-go
的这个强大新功能。如果你有任何疑问或者使用心得,欢迎在评论区留言交流!👍