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。 ingFang SC", MIUI, "Hiragino Sans GB", "Microsoft YaHei", sans-serif;font-optical-sizing: inherit;font-kerning: inherit;font-feature-settings: inherit;font-variation-settings: inherit;vertical-align: baseline;display: block;margin-block-end: 1em;margin-inline: 0px;color: rgb(6, 6, 7);letter-spacing: 0.5px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">HostHost 通常是与用户直接交互的桌面应用程序,例如Claude 客户端、Chatbox、Cline 等。这些应用程序内置了 MCP Client,能够通过手动配置或 Host 提供的市场安装可用的 MCP Server。 内置的 MCP Client 可以与 MCP Server 建立连接,用于后续的 RPC 通信,协议为 JSON RPC。 ingFang SC", MIUI, "Hiragino Sans GB", "Microsoft YaHei", sans-serif;font-optical-sizing: inherit;font-kerning: inherit;font-feature-settings: inherit;font-variation-settings: inherit;vertical-align: baseline;display: block;margin-block-end: 1em;margin-inline: 0px;color: rgb(6, 6, 7);letter-spacing: 0.5px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">MCP ServerMCP Server 主要通过 MCP 协议暴露其功能,供 Host 调用。其功能包括提示词模板构建和工具链方法调用等。MCP Server 可以提供三种主要类型的功能: ingFang SC", MIUI, "Hiragino Sans GB", "Microsoft YaHei", sans-serif;font-optical-sizing: inherit;font-kerning: inherit;font-feature-settings: inherit;font-variation-settings: inherit;vertical-align: baseline;list-style: disc;display: block;margin-block-end: 1em;margin-inline: 0px;padding-inline-start: 40px;margin: 0.859em 0px 0px;color: rgb(6, 6, 7);letter-spacing: 0.5px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;" class="list-paddingleft-1">资源(Resources):可以被客户端读取的类文件数据,如 API 响应或文件内容。 工具(Tools):可以被 LLM 调用的函数,需要用户批准。 提示(Prompts):预先编写的模板,帮助用户完成特定任务。
MCP Server 是 MCP 架构中的关键组件,它通过标准化的模型上下文协议为 AI 应用提供丰富的上下文信息和操作能力,从而增强 LLM 的实用性和灵活性 官方首推的 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。官方提供了 TS,Python,Java ,kotlin SDK,你可以快速构建自己的 MCP Server,我使用的是社区 Go SDK(mark3labs/mcp-go), 该 SDK 更新速度还可以。本 MCP Server 主要实现当前时间的查询,支持任意时区,具体代码如下packagemain
import( "context" "fmt" "time" "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server")
funcmain(){ // 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 iferr := server.ServeStdio(s); err !=nil{ fmt.Printf("Server error: %v\n", err) }}
funccurrentTimeHandler(ctx context.Context, request mcp.CallToolRequest)(*mcp.CallToolResult,error) { timezone, ok := request.Params.Arguments["timezone"].(string) if!ok { returnmcp.NewToolResultError("timezone must be a string"),nil } loc, err := time.LoadLocation(timezone) iferr !=nil{ returnmcp.NewToolResultError(fmt.Sprintf("parse timezone with error: %v", err)),nil } returnmcp.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 的可执行程序,后面手动配置会用到。这里主要将我们编译的可执行程序添加到 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 领域带来更多创新和可能性。
|