用Micronaut实现的简单MCP服务器
该项目实现了一个简单的MCP(模型上下文协议)服务器, 使用HTTP SSE传输,使用 微型宇航员.
测试类使用 LangChain4j的MCP客户端 支持调用Micronaut MCP服务器并与之交互。
它做什么
服务器提供虚拟天气信息☀️ 对于一个特定的城市。
MCP服务器实现了MCP协议的一个子集,以处理对天气数据的请求。
特别是,它实现了以下操作:
initializenotifications/initializetools/listtools/call
所有MCP协议类都可以在 mcp.server.model 包裹。
有两个主要控制器协同工作,通过HTTP/SSE实现MCP通信的服务器端:
这 SseController (服务 /mcp/sse):
此控制器充当服务器发送事件(SSE)连接的入口点。 当MCP客户端想要连接时,它首先向此端点发出HTTP GET请求(/mcp/sse).
它是如何工作的:
- 它被标注为
@Controller("/mcp/sse"). - 它只有一种方法
connectSse()注释如下@Get(produces = MediaType.TEXT_EVENT_STREAM).此消息会告诉Micronaut GET请求/mcp/sse应该用这种方法处理,并且响应将是SSE流。 - 它注入
SseBroadcaster单生豆。 - 这
connectSse()方法只是调用broadcaster.getEventsPublisher()并返回结果。
它的作用:
- 它与客户端建立持久的SSE连接。
- 它将实际通过此连接向SseBroadcaster发送事件的责任委托给SseBroadcast。广播程序确保发送的第一个事件告诉客户端在哪里发送POST请求(端点事件),然后发送后续响应或通知。
这 PostController (/mcp/post):
此控制器在建立SSE连接后处理客户端发送的传入MCP命令请求。客户端学习此控制器的路径(/mcp/post)从通过SseController接收到的初始端点事件开始。
它是如何工作的:
- 它被标注为
@Controller("/mcp/post"). - 它有一种方法
handleMcpPostRequest(@Body McpRequest request)注释如下@Post(consumes = MediaType.APPLICATION_JSON)这意味着它处理HTTP POST请求/mcp/post其中正文包含符合以下条件的JSON数据McpRequest结构。 - 它还注入了
SseBroadcaster.
内部 handleMcpPostRequest:
- 它将JSON请求体反序列化为
McpRequest对象。 - 它调用一个私有助手方法
processRequest(request)根据request.method()(例如。,initialize,tools/list,tools/call). processRequest生成一个McpResponse包含结果(或错误)的对象,或null通知)。- 如果
processRequest返回响应对象,handleMcpPostRequest电话broadcaster.broadcastResponse(mcpResponse)这通过先前建立的SSE连接将实际的MCP结果发送回客户端。 - 最后,它立即返回
HttpResponse.ok()到原始POST请求。此HTTP响应只是确认服务器收到了POST请求;它不包含实际的MCP结果。
它的作用:
- 它从MCP客户端接收特定命令(如“列出可用工具”或“执行天气工具”)。它处理这些命令,生成相应的MCP响应,并使用
SseBroadcaster通过最初由管理的SSE通道异步发送该响应SseController.
这 SseBroadcaster
这 SseBroadcaster 管理SSE流,发送初始配置(端点事件),并为服务器的其他部分(如 PostController)通过该流将JSON格式的响应和通知发送回连接的客户端。
这 McpWeatherClientTest 客户端
这 McpWeatherClientTest 类是一个集成测试,用于验证MCP服务器的功能。
您可以使用以下命令运行测试类 ./gradlew test.
它的作用:
- 它启动本地服务器(通过Micronaut)。
- 它设置了一个LangChain4j AI助手(
WeatherAssistant)配置为使用Google Cloud Vertex AI的Gemini 2.0 Flash模式。 - 它配置此助手以查找和使用本地服务器通过特定协议(MCP over HTTP/SSE)提供的工具。
- 它测试客户端是否能正确发现工具。
- 它测试助手在被问及天气时是否正确使用远程天气工具。
- 它测试助手是否正确避免使用天气工具来回答简单的问候提示等无关的问题。
______________________________________________________________________
\[!注意\] 这个项目不是谷歌的官方项目。
