{"record":{"id":"022286bd8fa084bc","repo":"alibaba/nacos","slug":"10000-022286","errorCode":"10000","errorMessage":"Required parameter 'serverSpecification' type McpServerBasicInfo is not present","messagePattern":"Required parameter 'serverSpecification' type McpServerBasicInfo is not present","errorType":"validation","errorClass":"NacosApiException","httpStatus":400,"severity":"error","filePath":"ai/src/main/java/com/alibaba/nacos/ai/form/mcp/admin/McpDetailForm.java","lineNumber":48,"sourceCode":" */\npublic class McpDetailForm extends McpForm {\n    \n    @Serial\n    private static final long serialVersionUID = 8016131725604983670L;\n    \n    private String serverSpecification;\n    \n    private String toolSpecification;\n    \n    private String resourceSpecification;\n    \n    private String endpointSpecification;\n    \n    @Override\n    public void validate() throws NacosApiException {\n        fillDefaultValue();\n        if (StringUtils.isEmpty(serverSpecification)) {\n            throw new NacosApiException(NacosException.INVALID_PARAM, ErrorCode.PARAMETER_MISSING,\n                \"Required parameter 'serverSpecification' type McpServerBasicInfo is not present\");\n        }\n    }\n    \n    public String getServerSpecification() {\n        return serverSpecification;\n    }\n    \n    public void setServerSpecification(String serverSpecification) {\n        this.serverSpecification = serverSpecification;\n    }\n    \n    public String getToolSpecification() {\n        return toolSpecification;\n    }\n    \n    public void setToolSpecification(String toolSpecification) {\n        this.toolSpecification = toolSpecification;","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/ai/src/main/java/com/alibaba/nacos/ai/form/mcp/admin/McpDetailForm.java#L30-L66","documentation":"Thrown by McpDetailForm.validate() when serverSpecification is empty. serverSpecification is a JSON-serialized McpServerBasicInfo string (the form stores it as String, not the typed object). This guards MCP server create/update endpoints. Maps to code 10000 (PARAMETER_MISSING), HTTP 400.","triggerScenarios":"Calling POST /v3/admin/ai/mcp (create) or PUT (update) without the serverSpecification field, or with an empty string. The form also has optional toolSpecification/resourceSpecification/endpointSpecification JSON strings.","commonSituations":"Client sends only toolSpecification but forgets the mandatory server block; JSON body used instead of form params so the field is unbound; a copy-paste from an older API that named the field differently.","solutions":["Provide serverSpecification as a JSON string conforming to McpServerBasicInfo in the form-encoded body.","Verify the field name is exactly `serverSpecification` and Content-Type is form-encoded.","Use the console or maintainer client to generate a correct payload example, then mirror it."],"exampleFix":"// before\ncurl -X POST 'http://host/v3/admin/ai/mcp' -d 'mcpName=myMcp'\n// after\ncurl -X POST 'http://host/v3/admin/ai/mcp' --data-urlencode 'serverSpecification={\"name\":\"myMcp\",\"protocol\":\"stdio\"}'","handlingStrategy":"validation","validationCode":"if (serverSpecification == null || serverSpecification.isEmpty()) {\n    throw new IllegalArgumentException(\"serverSpecification (McpServerBasicInfo JSON) required\");\n}","typeGuard":"static boolean hasServerSpec(String json) {\n    return json != null && !json.isEmpty();\n}","tryCatchPattern":"catch (NacosApiException e) {\n    if (e.getErrCode() == 10000 && e.getMessage().contains(\"serverSpecification\")) { /* add JSON */ }\n}","preventionTips":["Build serverSpecification from a typed McpServerBasicInfo then serialize to JSON.","Validate the JSON parses before sending."],"tags":["validation","ai","mcp","parameter","http","api"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}