MCP协议以及其中的客户端和服务器

首先附上up画的对我启发极大的一张图片。这张图片中讲了各大部件之间的关系。
MCP采用**客户端-服务器(Client-Server)**架构模式:
Host(主机)/LLM 应用: 代表大型语言模型应用程序,例如Claude Desktop、Cursor等,它们是发起连接的一方。
Client(客户端): 在Host应用程序内部负责与MCP服务器建立连接,其实可以理解成Agent与MCP协议的集合。
MCP Server(MCP服务器): 提供工具和数据访问能力供LLM使用。MCP服务器可以作为本地应用运行在用户设备上,也可以部署到远程服务器。每个MCP服务器都提供一组特定的工具(Tools)、资源(Resources)和提示(Prompts),国内ModelScope\阿里\火山,都提供了额这种服务.
1 | 1. 工具(Tools): 供AI模型调用的函数或操作,例如查询数据库、发送邮件、执行代码等。 |
客户端
客户端与服务端主要的传输方式是 streamableHTTP(远端)与stdio(本地), 在设计中,应该使用一个统一的结构体来完成不同方式的抽象,借鉴go-MCP中的client结构体设计,Client结构体通过transport transport.Interface字段持有传输层实例。NewClient函数接受任何实现了该接口的传输对象.这样就完成了依赖倒置
1 | type Client struct { |
为了完成一个完备的客户端,其应该具备下面功能
生命周期管理
- Start(): 启动与服务器的连接,设置通知处理器和双向通信处理器
- Close(): 关闭客户端和传输层连接
协议初始化
- Initialize(): 与服务器协商协议版本和能力,发送初始化通知 5
MCP操作方法
Client结构体实现了完整的MCP协议操作:
| 操作类别 | 方法 | 功能 |
|---|---|---|
| 资源 | ListResources/ListResourcesByPage | 列出服务器资源 |
| ListResourceTemplates/ListResourceTemplatesByPage | 列出资源模板 | |
| ReadResource | 读取特定资源 | |
| Subscribe/Unsubscribe | 订阅/取消资源变更通知 | |
| 提示 | ListPrompts/ListPromptsByPage | 列出可用提示 |
| GetPrompt | 获取特定提示 | |
| 工具 | ListTools/ListToolsByPage | 列出可用工具 |
| CallTool | 调用特定工具 | |
| 其他 | SetLevel | 设置服务器日志级别 |
| Complete | 请求参数补全选项 | |
| Ping | 检查服务器存活状态 | |
| RootListChanges | 发送根列表变更通知 |
通知处理
- OnNotification(): 注册通知处理器,支持多个处理器
- OnConnectionLost(): 注册连接丢失处理器
双向通信处理
- handleIncomingRequest(): 处理来自服务器的请求(如sampling、elicitation、ping、listRoots)
核心请求处理
- sendRequest(): 发送JSON-RPC请求并等待响应,处理请求ID生成和错误检查
服务端
服务端侧应该提供工具\ prompt的介绍\ 资源, 仍然以go-mcp为例, 来介绍一个基本实现
Server侧的核心结构体是 MCPServer,定义在 server/server.go 中
MCPServer 核心结构体
MCPServer 是server包的核心结构体,负责管理MCP协议的所有服务器端功能 1 :
1 | type MCPServer struct { |
主要功能组件
实体注册表
- tools: 存储工具及其处理函数
- taskTools: 存储异步任务工具
- resources: 存储资源及其处理函数
- resourceTemplates: 存储资源模板
- prompts: 存储提示及其处理函数
会话管理
- sessions: 使用
sync.Map存储所有活跃会话
能力协商
- capabilities: 配置服务器支持的功能(工具、资源、提示、日志等)
中间件系统
- toolHandlerMiddlewares: 工具处理中间件链
- resourceHandlerMiddlewares: 资源处理中间件链
- toolFilters: 工具过滤器函数
任务系统
- tasks: 存储异步任务状态
- expiredTasks: 跟踪已过期任务
- maxConcurrentTasks: 并发任务限制
核心功能实现逻辑
TODO: