快速掌握MCP协议,使用Go语言构建功能强大的服务器。 核心内容: 1. MCP协议简介及其在大型语言模型通信中的关键作用 2. MCP协议架构深度解析,涵盖Host、MCP Server等核心组件 3. 基于Go语言开发MCP Server的实战操作指南
首先,我们来深入理解MCP协议究竟是什么。这场技术变革始于2024年11月,Anthropic正式推出了MCP协议——Model Context Protocol,即模型上下文协议。它的目标十分明确:为大型语言模型与外部数据源、工具之间的交互提供一套统一的通信标准。
官方地址:https://modelcontextprotocol.io,下方展示了其架构图。
从架构层面来看,MCP协议定义了若干关键角色:Host(宿主程序)、MCP Client(客户端)、MCP Server(服务器)、Local Data Source(本地数据源)以及Remote Service(远程服务)。普通用户主要关注Host,而开发者则需要将重心放在MCP Server的开发与集成上。
Host
Host是与用户直接交互的桌面应用程序——例如Claude客户端、Chatbox、Cline等。这些应用内部嵌入了MCP Client,用户可以通过手动配置或内置市场安装可用的MCP Server。一旦MCP Client与Server建立连接,双方将基于JSON RPC协议进行高效通信。
MCP Server
MCP Server的核心职责是通过MCP协议向外暴露功能,供Host调用。它能够提供三种主要类型的能力:
资源(Resources):可被客户端读取的类文件数据,比如API响应或文件内容。
工具(Tools):可被LLM调用的函数,需要经过用户审批。
提示(Prompts):预先编写的模板,帮助用户高效完成特定任务。
MCP Server是整个架构的关键节点——它通过标准化协议为AI应用提供丰富的上下文信息和操作能力,极大提升了LLM的实用性与灵活性。
在Host方面,官方首推的是Claude客户端。不过本文选用Cline进行演示。在VSCode中搜索Cline并安装最新版即可(当前使用的是v3.4.0)。安装完成后需要配置大模型,这里选用了阿里云的deepseek-r1满血版。

完成LLM配置后,点击Cline顶部的第二个按钮(MCP Servers),即可看到内置的MCP Server市场——是不是颇有App Store的感觉?

当然,今天的目的并非仅仅体验Cline的市场。更重要的是让大家直观感受MCP协议的强大之处——它把整个生态做了清晰的分层:有人负责开发各类Host,各种扩展能力或远程服务则通过MCP Server快速集成到你喜爱的Host中,从而实现统一的UI体验。
官方提供了TS、Python、Java、Kotlin SDK。本次我采用了社区Go SDK——mark3labs/mcp-go,其更新速度令人满意。下面这个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”的工具,接收一个timezone参数,默认值为Asia/Shanghai。 currentTimeHandler返回对应时区的当前时间。server.ServeStdio表示通过标准I/O进行RPC通信。
通过go build生成一个名为mcp-go-server的可执行程序,后续手动配置时会用到。
配置Server
按照下图所示的步骤进行MCP Server的配置。

将编译好的可执行程序添加到Cline的配置中,点击保存后它会自动启动一个mcp-go-server进程,并通过MCP协议发现我们定义的“current time”工具。

工具使用
接下来,我们来验证current time工具是否好用。点击Cline上方的“+”号创建一个新的任务。
告诉我北京时间
输入任务后,Cline开始与大型语言模型交互——发现可以调用current time tool,并携带由大模型解析出的timezone参数,通过RPC远程调用该工具。工具成功返回了上海当前时间(大模型认为上海与北京属于同一时区,因此使用了默认值),最后大模型对结果进行了润色。整个过程如下图所示。


润色后的结果为:“当前北京时间是:2025年2月25日 22:33:58(UTC+8)”。当继续询问芝加哥当前时间时,它也能迅速给出准确答案。

总结
至此,本次示例圆满结束。从实践体验来看,利用MCP SDK开发一个MCP服务非常便捷,并且该服务能够轻松集成到任何支持MCP协议的客户端程序中——这极大降低了服务与应用程序之间的集成难度。随着MCP生态系统持续壮大与完善,可以预见的是,MCP协议未来将展现出更加广阔的应用前景与潜力,为人工智能领域带来更多创新与可能性。
