MCP 客户端是 Model Control Protocol (MCP) 客户端接口的 Go 语言实现。它提供了一种结构化的方式来连接和与 MCP 服务器交互,允许应用程序访问资源、执行工具以及利用服务器管理的提示。本页面涵盖了客户端架构、初始化过程和主要功能。
有关服务器实现的信息,请参阅MCP 服务器。
MCP 客户端遵循分层架构,通过transport.Interface抽象了传输机制。核心Client结构体处理协议级操作,同时将通信委托给可插拔的传输实现。
MCP 客户端架构
客户端架构包括
Client结构体,实现所有 MCP 协议操作transport.Interface来源:client/client.go15-25 client/sse.go23-33 client/stdio.go11-30
MCPClient 接口:定义了所有客户端实现的契约,指定了初始化连接、管理资源、执行工具和处理提示的方法。
客户端实现:MCPClient 接口的具体实现,负责管理
传输层:抽象了客户端和服务器之间的通信细节,支持不同的传输机制,如 Server-Sent Events (SSE) 和 stdio。
设置 MCP 客户端涉及三个主要步骤:创建、启动和协议初始化。
MCP 客户端初始化序列
客户端提供特定于传输的工厂函数,以便于设置
SSE 客户端创建:
Stdio 客户端创建:
手动客户端创建:
客户端初始化流程:
启动客户端(stdio 自动启动,其他需手动)
初始化 MCP 协议:
来源:client/sse.go23-33 client/stdio.go11-30 client/client.go44-54 client/client.go124-172
MCP 客户端提供了与服务器资源、提示和工具交互的方法。
客户端可以列出、读取和订阅资源
资源管理操作流程
主要资源操作
ListResources:获取所有资源,自动处理分页ListResourcesByPage:检索单页资源ReadResource:按 ID 获取特定资源Subscribe:注册以接收资源更改通知Unsubscribe:取消资源更改通知与服务器提示系统交互的方法
ListPrompts:获取所有提示,自动处理分页ListPromptsByPage:检索单页提示GetPrompt:按 ID 获取特定提示发现和调用工具的方法
ListTools:获取所有工具,自动处理分页ListToolsByPage:检索单页工具CallTool:在服务器上执行特定工具客户端支持向服务器请求补全
Complete:请求给定输入的补全MCP 客户端以两种方式处理分页
ListResources之类的方法,迭代获取所有页面ListResourcesByPage之类的方法,赋予调用者对分页的控制权客户端使用通用的listByPage函数来处理不同资源类型之间的通用分页逻辑。
分页处理流程
客户端提供了一个线程安全的通知系统,用于处理服务器发起的消息
通知处理流程
注册通知处理程序:
线程安全:通知系统使用sync.RWMutex确保对处理程序列表的线程安全访问,允许并发通知处理,同时防止处理程序注册期间出现数据竞争。
来源:client/client.go82-90 client/client.go67-73 client/client.go20-21
MCP 客户端通过transport.Interface抽象通信,支持具有专门功能的多种传输实现
| 传输 | 工厂函数 | 用例 | 特殊功能 |
|---|---|---|---|
| SSE | NewSSEMCPClient() | 基于 HTTP 的通信 | 实时通知、自定义请求头、HTTP 客户端配置 |
| Stdio | NewStdioMCPClient() | 进程间通信 | 子进程管理、stderr 访问 |
SSE 传输提供基于 HTTP 的通信及额外功能
SSE 传输配置
特定传输辅助函数:
GetEndpoint(client):返回当前的 SSE 端点 URLWithHeaders(headers):设置静态 HTTP 请求头WithHeaderFunc(func):设置动态请求头生成函数WithHTTPClient(client):使用自定义 HTTP 客户端Stdio 传输管理子进程通信
Stdio 传输进程管理
特定传输辅助函数:
GetStderr(client):返回子进程标准错误(stderr)读取器来源:client/sse.go11-42 client/stdio.go32-43 client/transport
每个与服务器通信的客户端方法都遵循类似的模式
请求-响应处理流程
MCP 客户端提供了 Model Control Protocol 客户端接口的完整实现,提供了一种与 MCP 服务器交互的结构化方式。通过其分层架构和传输抽象,它支持不同的通信机制,同时为应用程序提供一致的 API。