菜单

模拟服务器实现

相关源文件

本文介绍了MCP Go SDK中为测试和开发目的而提供的模拟服务器实现。SDK包含多种模拟服务器实现:一个独立的基于stdio的模拟服务器以及用于传输层测试的嵌入式模拟服务器。

有关MCP服务器的一般测试信息,请参阅服务器测试。有关MCP客户端的测试信息,请参阅客户端测试

概述

MCP Go SDK提供了多个模拟服务器实现,以方便测试和开发

  • 独立的Stdio模拟服务器:一个完整的可执行模拟服务器,用于stdio传输测试
  • HTTP模拟服务器:嵌入在测试中,用于可流式HTTP传输验证
  • SSE模拟服务器:嵌入在测试中,用于服务器发送事件(Server-Sent Events)传输验证

这些模拟服务器实现了核心的MCP协议方法,并提供了用于特定传输测试场景的调试工具。

独立的Stdio模拟服务器

独立的模拟服务器实现为一个可执行程序,通过标准输入/输出流进行通信。它提供了一个完整的MCP服务器实现,包含所有标准协议方法的模拟响应。

来源:testdata/mockstdio_server.go1-179

核心协议实现

模拟服务器实现了JSONRPCRequestJSONRPCResponse结构,并为所有标准MCP方法提供了处理程序

方法响应目的
initialize服务器能力和信息协议初始化
ping空响应连接测试
resources/list模拟资源列表资源发现
resources/read模拟资源内容资源访问
prompts/list模拟提示列表提示发现
prompts/get模拟提示消息提示检索
tools/list模拟工具列表工具发现
tools/call模拟工具结果工具执行

来源:testdata/mockstdio_server.go52-143

调试方法

模拟服务器包含用于传输测试的特殊调试方法

  • debug/echo:将原始请求作为响应结果返回
  • debug/echo_notification:回显请求并向客户端发送通知
  • debug/echo_error_string:返回一个错误响应,其中请求被序列化为错误消息

来源:testdata/mockstdio_server.go145-175

测试模拟服务器

HTTP模拟服务器

HTTP模拟服务器在可流式HTTP传输测试中实现,提供基于会话的HTTP通信测试。

来源:client/transport/streamable_http_test.go20-130

HTTP模拟服务器通过Mcp-Session-Id头部实现了会话管理,并支持与stdio服务器相同的调试方法,同时具有HTTP特定的响应处理。

SSE模拟服务器

SSE模拟服务器提供服务器发送事件(Server-Sent Events)功能,用于测试实时通信能力。

来源:client/transport/sse_test.go21-130

SSE服务器使用两个端点

  • 根端点:建立SSE连接并发送端点信息
  • 消息端点:处理JSON-RPC请求并通过SSE事件发送响应

模拟服务器能力

标准MCP响应

所有模拟服务器都为标准MCP协议方法提供一致的响应

初始化响应

来源:testdata/mockstdio_server.go54-72

资源列表响应

来源:testdata/mockstdio_server.go76-83

错误处理

模拟服务器为未知方法实现了正确的JSON-RPC错误响应

来源:testdata/mockstdio_server.go168-174

测试中的用法

传输测试

模拟服务器主要用于测试不同的传输机制

  • Stdio传输:使用独立的模拟服务器作为子进程
  • HTTP传输:在测试函数中使用嵌入式HTTP模拟服务器
  • SSE传输:在测试函数中使用嵌入式SSE模拟服务器

测试场景

模拟服务器支持的常见测试场景包括

  1. 基本请求/响应:验证正确的JSON-RPC通信
  2. 通知处理:测试服务器发起的通知
  3. 错误响应:验证错误处理机制
  4. 并发请求:测试多个同时进行的请求
  5. 超时处理:验证正确的超时行为

来源:client/transport/streamable_http_test.go132-416 client/transport/sse_test.go132-524

实现细节

请求处理

所有模拟服务器都遵循类似的请求处理模式

  1. 输入解析:解析传入的JSON-RPC请求
  2. 方法路由:根据方法名称路由到相应的处理程序
  3. 响应生成:生成适当的模拟响应
  4. 输出序列化:序列化并发送JSON-RPC响应

来源:testdata/mockstdio_server.go46-78

通知支持

模拟服务器支持向客户端发送通知,这对于测试双向通信特别有用

  • Stdio:在响应后立即将通知JSON写入标准输出
  • HTTP:通过可流式响应中的SSE事件发送通知
  • SSE:作为独立的SSE消息事件发送通知

来源:testdata/mockstdio_server.go147-156 client/transport/sse_test.go87-96