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
2
3
1. 工具(Tools): 供AI模型调用的函数或操作,例如查询数据库、发送邮件、执行代码等。
2. 资源(Resources): 供用户或AI模型使用的上下文和数据,例如API回复、文件内容等。
3. 提示(Prompts): 用于完成特定任务的预定义提示模板。

客户端

客户端与服务端主要的传输方式是 streamableHTTP(远端)与stdio(本地), 在设计中,应该使用一个统一的结构体来完成不同方式的抽象,借鉴go-MCP中的client结构体设计,Client结构体通过transport transport.Interface字段持有传输层实例。NewClient函数接受任何实现了该接口的传输对象.这样就完成了依赖倒置

1
2
3
4
5
6
7
8
9
10
11
12
13
type Client struct {  
transport transport.Interface
initialized bool
notifications []func(mcp.JSONRPCNotification)
notifyMu sync.RWMutex
requestID atomic.Int64
clientCapabilities mcp.ClientCapabilities
serverCapabilities mcp.ServerCapabilities
protocolVersion string
samplingHandler SamplingHandler
rootsHandler RootsHandler
elicitationHandler ElicitationHandler
}

为了完成一个完备的客户端,其应该具备下面功能

生命周期管理

  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
type MCPServer struct {
// 线程安全锁
resourcesMu sync.RWMutex
resourceMiddlewareMu sync.RWMutex
promptsMu sync.RWMutex
toolsMu sync.RWMutex
toolMiddlewareMu sync.RWMutex
notificationHandlersMu sync.RWMutex
capabilitiesMu sync.RWMutex
toolFiltersMu sync.RWMutex
tasksMu sync.RWMutex

// 服务器元数据
name string
version string
instructions string

// 实体注册表
resources map[string]resourceEntry
resourceTemplates map[string]resourceTemplateEntry
prompts map[string]mcp.Prompt
promptHandlers map[string]PromptHandlerFunc
tools map[string]ServerTool
taskTools map[string]ServerTaskTool

// 中间件和过滤器
toolHandlerMiddlewares []ToolHandlerMiddleware
resourceHandlerMiddlewares []ResourceHandlerMiddleware
toolFilters []ToolFilterFunc

// 通知处理
notificationHandlers map[string]NotificationHandlerFunc

// 补全提供者
promptCompletionProvider PromptCompletionProvider
resourceCompletionProvider ResourceCompletionProvider

// 能力配置
capabilities serverCapabilities
paginationLimit *int

// 会话管理
sessions sync.Map

// 钩子
hooks *Hooks
taskHooks *TaskHooks

// 任务系统
tasks map[string]*taskEntry
expiredTasks map[string]time.Time
maxConcurrentTasks *int
activeTasks int
}

主要功能组件

实体注册表

  • tools: 存储工具及其处理函数
  • taskTools: 存储异步任务工具
  • resources: 存储资源及其处理函数
  • resourceTemplates: 存储资源模板
  • prompts: 存储提示及其处理函数

会话管理

  • sessions: 使用 sync.Map 存储所有活跃会话

能力协商

  • capabilities: 配置服务器支持的功能(工具、资源、提示、日志等)

中间件系统

  • toolHandlerMiddlewares: 工具处理中间件链
  • resourceHandlerMiddlewares: 资源处理中间件链
  • toolFilters: 工具过滤器函数

任务系统

  • tasks: 存储异步任务状态
  • expiredTasks: 跟踪已过期任务
  • maxConcurrentTasks: 并发任务限制

核心功能实现逻辑

TODO:


本站由 Edison.Chen 创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。