Skip to content

Develop enhance mcp client#13683

Merged
KomachiSion merged 2 commits intoalibaba:developfrom
KomachiSion:develop-enhance-mcp-client
Aug 7, 2025
Merged

Develop enhance mcp client#13683
KomachiSion merged 2 commits intoalibaba:developfrom
KomachiSion:develop-enhance-mcp-client

Conversation

@KomachiSion
Copy link
Collaborator

Please do not create a Pull Request without creating an issue first.

What is the purpose of the change

XXXXX

Brief changelog

XX

Verifying this change

XXXX

Follow this checklist to help us incorporate your contribution quickly and easily:

  • Make sure there is a Github issue filed for the change (usually before you start working on it). Trivial changes like typos do not require a Github issue. Your pull request should address just this issue, without pulling in other changes - one PR resolves one issue.
  • Format the pull request title like [ISSUE #123] Fix UnknownException when host config not exist. Each commit in the pull request should have a meaningful subject line and body.
  • Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
  • Write necessary unit-test to verify your logic correction, more mock a little better when cross module dependency exist. If the new feature or significant change is committed, please remember to add integration-test in test module.
  • Run mvn -B clean package apache-rat:check findbugs:findbugs -Dmaven.test.skip=true to make sure basic checks pass. Run mvn clean install -DskipITs to make sure unit-test pass. Run mvn clean test-compile failsafe:integration-test to make sure integration-test pass.

@KomachiSion KomachiSion added this to the 3.0.3 milestone Aug 7, 2025
@KomachiSion KomachiSion added the area/Client Related to Nacos Client SDK label Aug 7, 2025
@lingma-agents
Copy link

lingma-agents bot commented Aug 7, 2025

增强MCP客户端功能与安全性

变更概述
  • 安全增强
    • McpServerEndpointRequestHandlerQueryMcpServerRequestHandlerReleaseMcpServerRequestHandler 添加了 @Secured 注解,分别配置了写权限和读权限,signType 设置为 AI,增强了接口的安全控制。
  • 问题修复
    • McpServerEndpointRequestHandlerReleaseMcpServerRequestHandler 中添加了 try-catch 块来捕获 NacosException,并在发生异常时返回包含错误信息的响应,提升了错误处理能力。
    • QueryMcpServerRequestHandler 中增加了对 mcpName 参数为空的校验,并返回相应的错误响应,防止无效请求导致的问题。
  • 测试更新
    • 更新了 McpServerEndpointRequestHandlerTestQueryMcpServerRequestHandlerTestReleaseMcpServerRequestHandlerTest 的测试用例,增加了对异常情况的断言验证,确保错误响应的正确性。
    • 引入了 assertErrorResponse 方法用于统一验证错误响应的格式和内容,提高了测试代码的可维护性和一致性。
  • 其他
    • AiGrpcClient 中增加了日志记录,当 AI 请求执行失败时会输出警告日志,便于问题排查和监控。
变更文件
文件路径 变更说明
ai/​src/​main/​java/​com/​alibaba/​nacos/​ai/​remote/​handler/​McpServerEndpointRequestHandler.​java 添加了安全注解和异常处理逻辑,增强了接口的安全性和健壮性。
ai/​src/​main/​java/​com/​alibaba/​nacos/​ai/​remote/​handler/​QueryMcpServerRequestHandler.​java 添加了安全注解和参数校验逻辑,确保查询请求的有效性和安全性。
ai/​src/​main/​java/​com/​alibaba/​nacos/​ai/​remote/​handler/​ReleaseMcpServerRequestHandler.​java 添加了安全注解和异常处理逻辑,提升了接口的安全性和错误处理能力。
ai/​src/​test/​java/​com/​alibaba/​nacos/​ai/​remote/​handler/​McpServerEndpointRequestHandlerTest.​java 更新了测试用例,增加了对异常情况的断言验证,确保错误响应的正确性。
ai/​src/​test/​java/​com/​alibaba/​nacos/​ai/​remote/​handler/​QueryMcpServerRequestHandlerTest.​java 更新了测试用例,增加了对无效参数和服务器未找到情况的断言验证。
ai/​src/​test/​java/​com/​alibaba/​nacos/​ai/​remote/​handler/​ReleaseMcpServerRequestHandlerTest.​java 更新了测试用例,增加了对无效参数和版本冲突情况的断言验证。
client/​src/​main/​java/​com/​alibaba/​nacos/​client/​ai/​remote/​AiGrpcClient.​java 增加了日志记录,当AI请求执行失败时会输出警告日志,便于问题排查。

💡 小贴士

与 lingma-agents 交流的方式

📜 直接回复评论
直接回复本条评论,lingma-agents 将自动处理您的请求。例如:

  • 在当前代码中添加详细的注释说明。

  • 请详细介绍一下你说的 LRU 改造方案,并使用伪代码加以说明。

📜 在代码行处标记
在文件的特定位置创建评论并 @lingma-agents。例如:

  • @lingma-agents 分析这个方法的性能瓶颈并提供优化建议。

  • @lingma-agents 对这个方法生成优化代码。

📜 在讨论中提问
在任何讨论中 @lingma-agents 来获取帮助。例如:

  • @lingma-agents 请总结上述讨论并提出解决方案。

  • @lingma-agents 请根据讨论内容生成优化代码。

Copy link

@lingma-agents lingma-agents bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔎 代码评审报告

🎯 评审意见概览
严重度 数量 说明
🔴 Blocker 0 阻断性问题,需立即修复。例如:系统崩溃、关键功能不可用或严重安全漏洞。
🟠 Critical 1 严重问题,高优先级修复。例如:核心功能异常或性能瓶颈影响用户体验。
🟡 Major 0 主要问题,建议修复。例如:非核心功能缺陷或代码维护性较差。
🟢 Minor 1 次要问题,酬情优化。例如:代码格式不规范或注释缺失。

总计: 2 个问题

📋 评审意见详情
💡 代码实现建议
以下是文件级别的代码建议,聚焦于代码的可读性、可维护性和潜在问题。
☕ ai/src/main/java/com/alibaba/nacos/ai/remote/handler/ReleaseMcpServerRequestHandler.java (1 💬)
☕ client/src/main/java/com/alibaba/nacos/client/ai/remote/AiGrpcClient.java (1 💬)
🚀 架构设计建议
以下是对代码架构和设计的综合分析,聚焦于跨文件交互、系统一致性和潜在优化空间。
🔍1. 权限注解使用不一致

在多个处理器类中添加了@secured注解以增强安全性,但这些注解的使用方式和位置存在不一致性。例如,在McpServerEndpointRequestHandler和ReleaseMcpServerRequestHandler中,@secured注解被应用于handle方法上,而在QueryMcpServerRequestHandler中也做了同样的处理。虽然这看起来是合理的,但如果项目中有统一的安全性处理机制或拦截器,这种分散的权限控制可能会导致维护困难和潜在的安全漏洞。建议评估是否可以通过集中式的安全框架来管理权限,而不是在每个处理方法上单独添加注解。

📌 关键代码

@Secured(action = ActionTypes.WRITE, signType = SignType.AI)
@Secured(action = ActionTypes.READ, signType = SignType.AI)
@Secured(action = ActionTypes.WRITE, signType = SignType.AI)

⚠️ 潜在风险

可能导致权限控制逻辑分散,增加维护难度和安全风险

🔍2. 异常处理策略不一致

在McpServerEndpointRequestHandler和ReleaseMcpServerRequestHandler中,通过try-catch块捕获NacosException并构建错误响应,而在QueryMcpServerRequestHandler中则直接检查参数并返回错误响应。这种不一致的异常处理策略可能会影响系统的可维护性和一致性。建议统一异常处理机制,例如通过全局异常处理器或统一的错误响应构建方法来处理所有类型的异常。

📌 关键代码

try {
            checkParameters(request);
            Instance instance = buildInstance(request);
            return doHandler(request, instance, meta);
        } catch (NacosException e) {
            McpServerEndpointResponse response = new McpServerEndpointResponse();
            response.setErrorInfo(e.getErrCode(), e.getErrMsg());
            return response;
        }
if (StringUtils.isBlank(request.getMcpName())) {
            QueryMcpServerResponse errorResponse = new QueryMcpServerResponse();
            errorResponse.setErrorInfo(NacosException.INVALID_PARAM, "parameters `mcpName` can't be empty or null");
            return errorResponse;
        }
try {
            checkParameters(request);
            return doHandler(request, meta);
        } catch (NacosException e) {
            ReleaseMcpServerResponse response = new ReleaseMcpServerResponse();
            response.setErrorInfo(e.getErrCode(), e.getErrMsg());
            return response;
        }

⚠️ 潜在风险

可能导致异常处理逻辑混乱,影响系统的稳定性和可维护性

🔍3. 测试代码中的断言方法重复

在多个测试类中(如McpServerEndpointRequestHandlerTest、QueryMcpServerRequestHandlerTest和ReleaseMcpServerRequestHandlerTest),都定义了类似的assertErrorResponse方法用于验证错误响应。这种重复的代码不仅增加了维护成本,还可能导致不同测试类之间的行为不一致。建议将这些通用的断言方法提取到一个公共的测试工具类中,以便复用和统一管理。

📌 关键代码

private void assertErrorResponse(McpServerEndpointResponse response, int code, String message) {
        assertEquals(ResponseCode.FAIL.getCode(), response.getResultCode());
        assertEquals(code, response.getErrorCode());
        assertEquals(message, response.getMessage());
    }
assertEquals(ResponseCode.FAIL.getCode(), response.getResultCode());
        assertEquals(NacosException.INVALID_PARAM, response.getErrorCode());
        assertEquals("parameters `mcpName` can't be empty or null", response.getMessage());
private void assertErrorResponse(ReleaseMcpServerResponse response, int code, String message) {
        assertEquals(ResponseCode.FAIL.getCode(), response.getResultCode());
        assertEquals(code, response.getErrorCode());
        assertEquals(message, response.getMessage());
    }

⚠️ 潜在风险

可能导致测试代码冗余,增加维护成本和潜在的不一致性

审查详情
📒 文件清单 (7 个文件)
📝 变更: 7 个文件

📝 变更文件:

  • ai/src/main/java/com/alibaba/nacos/ai/remote/handler/McpServerEndpointRequestHandler.java
  • ai/src/main/java/com/alibaba/nacos/ai/remote/handler/QueryMcpServerRequestHandler.java
  • ai/src/main/java/com/alibaba/nacos/ai/remote/handler/ReleaseMcpServerRequestHandler.java
  • ai/src/test/java/com/alibaba/nacos/ai/remote/handler/McpServerEndpointRequestHandlerTest.java
  • ai/src/test/java/com/alibaba/nacos/ai/remote/handler/QueryMcpServerRequestHandlerTest.java
  • ai/src/test/java/com/alibaba/nacos/ai/remote/handler/ReleaseMcpServerRequestHandlerTest.java
  • client/src/main/java/com/alibaba/nacos/client/ai/remote/AiGrpcClient.java

💡 小贴士

与 lingma-agents 交流的方式

📜 直接回复评论
直接回复本条评论,lingma-agents 将自动处理您的请求。例如:

  • 在当前代码中添加详细的注释说明。

  • 请详细介绍一下你说的 LRU 改造方案,并使用伪代码加以说明。

📜 在代码行处标记
在文件的特定位置创建评论并 @lingma-agents。例如:

  • @lingma-agents 分析这个方法的性能瓶颈并提供优化建议。

  • @lingma-agents 对这个方法生成优化代码。

📜 在讨论中提问
在任何讨论中 @lingma-agents 来获取帮助。例如:

  • @lingma-agents 请总结上述讨论并提出解决方案。

  • @lingma-agents 请根据讨论内容生成优化代码。

Comment on lines +72 to +82
@Secured(action = ActionTypes.WRITE, signType = SignType.AI)
public ReleaseMcpServerResponse handle(ReleaseMcpServerRequest request, RequestMeta meta) throws NacosException {
McpRequestUtils.fillNamespaceId(request);
checkParameters(request);
return doHandler(request, meta);
try {
checkParameters(request);
return doHandler(request, meta);
} catch (NacosException e) {
ReleaseMcpServerResponse response = new ReleaseMcpServerResponse();
response.setErrorInfo(e.getErrCode(), e.getErrMsg());
return response;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

增强错误处理以提高健壮性

🟠 Critical | 🐞 Bugs

📋 问题详情

当前的handle方法在处理请求时可能会因为未捕获的异常而导致服务中断。通过添加try-catch块来捕获并处理NacosException,可以确保即使在发生异常的情况下也能返回适当的错误响应,从而提高系统的健壮性和用户体验。

💡 解决方案

建议在handle方法中添加对非NacosException的通用异常处理,以确保所有异常都能被捕获并返回适当的错误响应。

-        } catch (NacosException e) {
+        } catch (NacosException e) {
+            ReleaseMcpServerResponse response = new ReleaseMcpServerResponse();
+            response.setErrorInfo(e.getErrCode(), e.getErrMsg());
+            return response;
+        } catch (Exception e) {
+            ReleaseMcpServerResponse response = new ReleaseMcpServerResponse();
+            response.setErrorInfo(NacosException.SERVER_ERROR, "Internal server error: " + e.getMessage());
+            return response;

您的反馈对我们很重要!(建议右键在新标签页中打开以下链接)

有用意见👍无用意见👎错误意见❌

Comment on lines +326 to +329
LOGGER.warn("AI request {} execute failed, {}", request.getClass().getSimpleName(), e.getMessage());
throw e;
} catch (Exception e) {
LOGGER.warn("AI request {} execute failed. ", request.getClass().getSimpleName(), e);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

改进日志记录以提高可调试性

🟢 Minor | 🧹 Code Smells

📋 问题详情

当前的日志记录仅记录了请求类型和异常消息,但没有记录异常堆栈跟踪。这使得在调试问题时难以获取完整的上下文信息。建议在日志记录中包含异常堆栈跟踪,以便更好地理解问题的根本原因。

💡 解决方案

建议在日志记录中包含异常堆栈跟踪,以便更好地理解问题的根本原因。

-            LOGGER.warn(\"AI request {} execute failed, {}\", request.getClass().getSimpleName(), e.getMessage());
+            LOGGER.warn(\"AI request {} execute failed, {}\", request.getClass().getSimpleName(), e.getMessage(), e);
-            LOGGER.warn(\"AI request {} execute failed. \", request.getClass().getSimpleName(), e);
+            LOGGER.warn(\"AI request {} execute failed. \", request.getClass().getSimpleName(), e);

您的反馈对我们很重要!(建议右键在新标签页中打开以下链接)

有用意见👍无用意见👎错误意见❌

@github-actions
Copy link

github-actions bot commented Aug 7, 2025

Thanks for your this PR. 🙏
Please check again for your PR changes whether contains any usage/api/configuration change such as Add new API , Add new configuration, Change default value of configuration.
If so, please add or update documents(markdown type) in docs/next/ for repository nacos-group/nacos-group.github.io


感谢您提交的PR。 🙏
请再次查看您的PR内容,确认是否包含任何使用方式/API/配置参数的变更,如:新增API新增配置参数修改默认配置等操作。
如果是,请确保在提交之前,在仓库nacos-group/nacos-group.github.io中的docs/next/目录下添加或更新文档(markdown格式)。

@KomachiSion KomachiSion merged commit 5c30813 into alibaba:develop Aug 7, 2025
5 of 7 checks passed
@wuyfee
Copy link

wuyfee commented Aug 7, 2025

$\color{red}{FAILURE}$
DETAILS
✅ - docker: success
❌ - deploy (standalone & cluster & standalone_auth): failure
❌ - e2e-java-test (standalone & cluster & standalone_auth): skipped
❌ - e2e-go-test (standalone & cluster): skipped
❌ - e2e-cpp-test (standalone & cluster): skipped
❌ - e2e-csharp-test (standalone & cluster): skipped
❌ - e2e-nodejs-test (standalone & cluster): skipped
❌ - e2e-python-test (standalone & cluster): skipped
✅ - clean (standalone & cluster & standalone_auth): success

@KomachiSion KomachiSion deleted the develop-enhance-mcp-client branch August 25, 2025 06:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/Client Related to Nacos Client SDK

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants