💥新功能速递!Go 语言如何优雅地管理你的 MCP 服务器?`mcp-client-go` 来帮你!


💥新功能速递!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 服务器启动/连接方式:

  1. 通过 command 字段指定外部命令启动 (e.g., Docker):

    对于像 github 这样的 MCP 服务器,它可能以 Docker 容器的形式提供。你只需要在配置中指定 command 为 docker,然后在 args 中传入相应的 Docker 命令和参数,甚至可以通过 env 字段设置环境变量(比如 GitHub Personal Access Token)。mcp-client-go 会负责帮你启动和管理这个 Docker 容器。

  2. 通过 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 服务器的工具信息已打印完毕!")
}

代码的逻辑非常清晰:

  1. 通过 context.WithTimeout 设置一个操作超时,这是一个 Go 编程的好习惯。

  2. clients.InitByConfFile 会读取 test.json 文件,并根据里面的定义加载所有的 MCP 服务器配置。

  3. clients.RegisterMCPClient 是关键一步,它会根据配置:

    • 如果配置了 command (例如 docker),它会尝试启动相应的进程或 Docker 容器
    • 如果配置了 url,它会尝试连接到该 URL。 成功后,所有的 MCP 客户端都会被注册到内部管理器中。
  4. 最后,你可以通过 clients.GetMCPClient("客户端名称") 来获取任何一个已注册的 MCP 客户端实例,并访问其 Tools 字段,获取该 MCP 服务器所提供的所有工具信息。

这个新功能带来的好处

  • 极高的灵活性:无论是 Docker 容器还是通过 URL 暴露的服务,都能通过统一的配置进行管理。
  • 简化部署与维护:不再需要编写复杂的脚本来启动和连接不同的服务,只需维护一个简单的 JSON 配置文件。
  • 提高可移植性:项目在不同环境中部署时,只需修改配置文件,而无需改动代码。
  • 更清晰的服务管理:通过名称就能获取到对应的 MCP 客户端,代码逻辑更清晰。

强烈推荐 mcp-client-go

如果你在 Go 语言项目中需要与多个 MCP 服务器进行交互,或者希望以一种更优雅、更灵活的方式管理你的微服务依赖,那么我强烈推荐你尝试一下 mcp-client-go

它不仅仅是一个客户端库,更是一个帮助你构建健壮、可维护、易于扩展的微服务应用的利器。

快速开始

  1. 安装库

    Bash

    go 复制代码
    go get github.com/yincongcyincong/mcp-client-go
  2. 创建 test.json 配置文件(参考上述示例)。

  3. 编写 Go 代码(参考上述示例)。

  4. 运行

    Bash

    go 复制代码
    go run your_main_file.go

    (请确保你根据 test.json 的配置,预先启动了 Playwright 和 Amap 的 MCP 服务器,或者 Docker 环境已就绪。)

项目地址: github.com/yincongcyin...

希望这篇文章能帮助大家了解 mcp-client-go 的这个强大新功能。如果你有任何疑问或者使用心得,欢迎在评论区留言交流!👍


相关推荐
聚客AI14 小时前
🙈AI Agent的未来:工具调用将如何重塑智能应用?
人工智能·agent·mcp
LucianaiB18 小时前
【混元AIGC+腾讯云智能体+首创Coze核心流思维导图MCP】:打造一个文思通-智能写作助手Agent
aigc·腾讯云·ai写作·mcp·腾讯混元大模型aigc
组合缺一2 天前
搭建基于 Solon AI 的 Streamable MCP 服务并部署至阿里云百炼
java·人工智能·solon·mcp
DevYK2 天前
企业级 Agent 开发实战(二) MCP 原理深度解析及项目实战
agent·mcp
倔强的石头1063 天前
Trae x 图片素描MCP一键将普通图片转换为多风格素描效果
低代码·mcp·trae·蓝耘
大模型真好玩3 天前
深入浅出LangGraph AI Agent智能体开发教程(三)—LangGraph工具调用实战
人工智能·python·mcp
戮戮3 天前
MCP over SSE 通信过程详解:双通道架构下的高效对话
架构·大模型·mcp·大模型插件
带刺的坐椅3 天前
搭建基于 Solon AI 的 Streamable MCP 服务并部署至阿里云百炼
java·人工智能·ai·solon·mcp
伍树明4 天前
本地搭建搜索Agent(SpringAI + RAG + SearXNG + MCP)
java·spring·agent·mcp
miumiubear4 天前
DeepSeek应用技巧-通过MCP打造数据分析助手
数据挖掘·数据分析·mcp·可视化报告