{"record":{"id":"dbf5452b9a23af60","repo":"alibaba/nacos","slug":"parameter-missing-dbf545","errorCode":"PARAMETER_MISSING","errorMessage":"parameters `mcpName` can't be empty or null","messagePattern":"parameters `mcpName` can't be empty or null","errorType":"exception","errorClass":"NacosApiException","httpStatus":400,"severity":"warning","filePath":"ai/src/main/java/com/alibaba/nacos/ai/remote/handler/McpServerEndpointRequestHandler.java","lineNumber":104,"sourceCode":"    @ExtractorManager.Extractor(rpcExtractor = McpServerRequestParamExtractor.class)\n    @Secured(action = ActionTypes.WRITE, signType = SignType.AI)\n    public McpServerEndpointResponse handle(McpServerEndpointRequest request, RequestMeta meta)\n        throws NacosException {\n        McpRequestUtil.fillNamespaceId(request);\n        try {\n            checkParameters(request);\n            Instance instance = buildInstance(request);\n            return doHandler(request, instance, meta);\n        } catch (NacosException e) {\n            McpServerEndpointResponse response = new McpServerEndpointResponse();\n            response.setErrorInfo(e.getErrCode(), e.getErrMsg());\n            return response;\n        }\n    }\n    \n    private void checkParameters(McpServerEndpointRequest request) throws NacosApiException {\n        if (StringUtils.isBlank(request.getMcpName())) {\n            throw new NacosApiException(NacosException.INVALID_PARAM, ErrorCode.PARAMETER_MISSING,\n                \"parameters `mcpName` can't be empty or null\");\n        }\n    }\n    \n    private McpServerEndpointResponse doHandler(McpServerEndpointRequest request, Instance instance,\n        RequestMeta meta)\n        throws NacosException {\n        McpServerIndexData indexData = mcpServerIndex.getMcpServerByName(request.getNamespaceId(),\n            request.getMcpName());\n        if (null == indexData) {\n            throw new NacosApiException(NacosException.NOT_FOUND, ErrorCode.MCP_SERVER_NOT_FOUND,\n                String.format(\"MCP server `%s` not found in namespaceId: `%s`\",\n                    request.getMcpName(),\n                    request.getNamespaceId()));\n        }\n        McpServerDetailInfo mcpServer =\n            mcpServerOperationService.getMcpServerDetail(request.getNamespaceId(),\n                indexData.getId(), null, request.getVersion());","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/ai/src/main/java/com/alibaba/nacos/ai/remote/handler/McpServerEndpointRequestHandler.java#L86-L122","documentation":"Thrown by McpServerEndpointRequestHandler.checkParameters() when the gRPC McpServerEndpointRequest.mcpName is blank. The handler validates mcpName before looking up the server. Because handle() wraps the call in try/catch(NacosException), the exception is not propagated to the gRPC transport; it is placed into the McpServerEndpointResponse via setErrorInfo and returned as a normal response carrying the error code and message.","triggerScenarios":"A gRPC client sending McpServerEndpointRequest with mcpName null/empty/whitespace to register or deregister an MCP server endpoint (since 3.0.3). The response will carry errCode INVALID_PARAM and the PARAMETER_MISSING detail.","commonSituations":"An MCP server SDK client that builds the request from config that did not set the server name; a migration where the field was renamed; a test harness that sends a minimal request.","solutions":["Set McpServerEndpointRequest.mcpName to the target MCP server's name before sending.","After the call, inspect McpServerEndpointResponse error info (isSuccess / errCode) rather than relying on an exception.","Validate mcpName client-side before invoking the request to avoid the round-trip."],"exampleFix":"// before\nMcpServerEndpointRequest req = new McpServerEndpointRequest();\nreq.setType(AiRemoteConstants.REGISTER_ENDPOINT);\nreq.setAddress(\"10.0.0.1\"); req.setPort(8080);\n// mcpName not set -> response error PARAMETER_MISSING\n\n// after\nreq.setNamespaceId(\"public\");\nreq.setMcpName(\"my-mcp-server\");","handlingStrategy":"validation","validationCode":"if (StringUtils.isBlank(request.getMcpName())) {\n    throw new IllegalArgumentException(\"McpServerEndpointRequest.mcpName must not be blank\");\n}","typeGuard":null,"tryCatchPattern":"McpServerEndpointResponse resp = handler.handle(request, meta);\nif (resp.getErrCode() != 0) {\n    // handle PARAMETER_MISSING for blank mcpName without an exception\n    handleClientError(resp.getErrCode(), resp.getErrMsg());\n}","preventionTips":["Validate mcpName client-side before sending the gRPC request.","Check McpServerEndpointResponse error info after every call; the handler returns errors inside the response, not as exceptions.","Reuse the AiRemoteConstants for type values rather than raw strings."],"tags":["ai","mcp-server","grpc","validation","parameter","endpoint"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}