AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


MCP 实战:使用 Go 快速构建 MCP Server

发布日期:2025-03-13 13:31:23 浏览次数: 1539 来源:Grafana 爱好者
推荐语

快速掌握MCP协议,用Go语言构建服务器。

核心内容:
1. MCP协议简介及其在LLM通信中的作用
2. MCP协议架构的详细解析,包括Host、MCP Server等组件
3. 使用Go语言构建MCP Server的实战指南

杨芳贤
53A创始人/腾讯云(TVP)最具价值专家
MCP 简介
MCP 协议(Model Context Protocol,模型上下文协议)是由 Anthropic 于 2024 年 11 月底推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信。
  • 官方地址 https://modelcontextprotocol.io
  • 架构如下

MCP 协议的架构包含多个关键组件:Host(宿主程序)、MCP Client(MCP 客户端)、MCP Server(MCP 服务器)、Local Data Source(本地数据源)和 Remote Service(远程服务)。对于普通用户而言,Host 是主要关注点;而开发者则可能更关注 MCP Server。

Host

Host 通常是与用户直接交互的桌面应用程序,例如Claude 客户端、Chatbox、Cline 等。这些应用程序内置了 MCP Client,能够通过手动配置或 Host 提供的市场安装可用的 MCP Server。

内置的 MCP Client 可以与 MCP Server 建立连接,用于后续的 RPC 通信,协议为 JSON RPC。

MCP Server

MCP Server 主要通过 MCP 协议暴露其功能,供 Host 调用。其功能包括提示词模板构建和工具链方法调用等。MCP Server 可以提供三种主要类型的功能:

  • 资源(Resources):可以被客户端读取的类文件数据,如 API 响应或文件内容。

  • 工具(Tools):可以被 LLM 调用的函数,需要用户批准。

  • 提示(Prompts):预先编写的模板,帮助用户完成特定任务。


MCP Server 是 MCP 架构中的关键组件,它通过标准化的模型上下文协议为 AI 应用提供丰富的上下文信息和操作能力,从而增强 LLM 的实用性和灵活性

Host 安装
官方首推的 Host 是 Claude 客户端,本文主要用 Cline,所以先来安装它。
在 VSCode 搜索 Cline 安装最新版即可(我安装的是 v3.4.0),安装完成后,需要做下大模型配置,我选用的是阿里云的 deepseek-r1 满血版。
做好LLM 配置后,我们点击 Cline 顶部第二个按钮( MCP Servers ),即可看到 Cline 内置的 MCP Server 市场,是不是感觉有点像 App Store。
当然,我们今天的目标不是测试 Cline 的市场,截图只是想让大家感受下,MCP 协议的厉害之处。
它能将整个生态分层做好,有人做好各种 Host,然后各种扩展能力或者远程服务,都可以通过 MCP Server 快速集成到你喜爱的 Host 中,统一的UI。
MCP Server 构建
官方提供了 TS,Python,Java ,kotlin SDK,你可以快速构建自己的 MCP Server,我使用的是社区 Go SDK(mark3labs/mcp-go), 该 SDK 更新速度还可以。
本 MCP Server 主要实现当前时间的查询,支持任意时区,具体代码如下
package main
import (    "context"    "fmt"    "time"        "github.com/mark3labs/mcp-go/mcp"    "github.com/mark3labs/mcp-go/server")
func main() {    // Create MCP server    s := server.NewMCPServer(        "Demo ?",        "1.0.0",    )    // Add tool    tool := mcp.NewTool("current time",        mcp.WithDescription("Get current time with timezone, Asia/Shanghai is default"),        mcp.WithString("timezone",            mcp.Required(),            mcp.Description("current time timezone"),        ),    )    // Add tool handler    s.AddTool(tool, currentTimeHandler)    // Start the stdio server    if err := server.ServeStdio(s); err != nil {        fmt.Printf("Server error: %v\n", err)    }}
func currentTimeHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {    timezone, ok := request.Params.Arguments["timezone"].(string)    if !ok {        return mcp.NewToolResultError("timezone must be a string"), nil    }        loc, err := time.LoadLocation(timezone)    if err != nil {        return mcp.NewToolResultError(fmt.Sprintf("parse timezone with error: %v", err)), nil    }    return mcp.NewToolResultText(fmt.Sprintf(`current time is %s`, time.Now().In(loc))), nil}
代码解读:
  • 通过 mcp.NewTool 定义一个叫做 “current time” 的 tool,它能接受一个叫做 timezone 的参数,默认值为 Asia/Shanghai
  • currentTimeHandler 返回对应时区的当前时间。
  • server.ServeStdio 表示通过标准 I/O 进行 PRC 通信。

通过 go build 生成一个叫做 mcp-go-server 的可执行程序,后面手动配置会用到。
配置 Server
按照下图,进行 MCP Server 的配置。
这里主要将我们编译的可执行程序添加到 Cline 的配置中,点击保存后它会帮我们启动一个 mcp-go-server 进程,并通过 MCP 协议发现我们定义好的 current time” 工具
工具使用
接下来我们看看 current time 这个工具是否好用,首先点击 Cline 上面的“+”号,创建一个任务。
告诉我北京时间
输入任务后, Cline 开始与大模型交互,发现可以调用 current time tool,并携带大模型解析出来的 timezone 参数,通过 RPC 对 tool 进行调用,tool 返回了上海当前时间(大模型觉得上海和北京是同一时区,所以用了默认值),最后再让大模型进行结果润色,整个过程如下图。
润色结果为 “当前北京时间是:2025年2月25日 22:33:58(UTC+8)”。
当我继续问它,芝加哥当前时间是多少时,它也能很快给出正确答案。
总结
到此,我们的示例已经圆满结束。通过实践可以看出,使用 MCP SDK 开发一个 MCP 服务非常便捷,且该服务能够轻松集成到任何支持 MCP 协议的客户端程序中,这大大降低了服务与应用程序之间的集成难度。
随着 MCP 生态系统的不断壮大和完善,我们有理由相信,MCP 协议在未来将展现出更加广阔的应用前景和潜力,为 AI 领域带来更多创新和可能性。


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询