Skip to content

Commit f541e1c

Browse files
authored
feat: mcp支持创建清洗任务 (#227)
* fix: java支持mcp * fix: python支持mcp * feat: 算子接口mcp * fix: mcp支持创建清洗任务
1 parent 7d4dcb7 commit f541e1c

19 files changed

Lines changed: 386 additions & 37 deletions

File tree

backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/CreateCleaningTaskRequest.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import lombok.Getter;
88
import lombok.Setter;
9+
import org.springaicommunity.mcp.annotation.McpToolParam;
910

1011
/**
1112
* CreateCleaningTaskRequest
@@ -14,21 +15,29 @@
1415
@Getter
1516
@Setter
1617
public class CreateCleaningTaskRequest {
18+
@McpToolParam(description = "新建清洗任务名称")
19+
private String name;
1720

18-
private String name;
21+
@McpToolParam(description = "新建清洗任务描述")
22+
private String description;
1923

20-
private String description;
24+
@McpToolParam(description = "清洗任务使用的源数据集ID")
25+
private String srcDatasetId;
2126

22-
private String srcDatasetId;
27+
@McpToolParam(description = "清洗任务使用的源数据集名称")
28+
private String srcDatasetName;
2329

24-
private String srcDatasetName;
30+
@McpToolParam(description = "清洗任务创建的目标数据集名称")
31+
private String destDatasetName;
2532

26-
private String destDatasetName;
33+
@McpToolParam(description = "清洗任务创建的目标数据集类型,取值范围为TEXT/IMAGE/VIDEO/AUDIO/OTHER")
34+
private String destDatasetType;
2735

28-
private String destDatasetType;
36+
@McpToolParam(description = "清洗任务使用的模板名称,与instance参数二选一,至少指定一个,优先级更高", required = false)
37+
private String templateId;
2938

30-
private String templateId;
31-
32-
private List<OperatorInstanceDto> instance = new ArrayList<>();
39+
@McpToolParam(description = "清洗任务使用的算子列表,与templateId参数二选一,至少指定一个。" +
40+
"注意:单个任务只能使用一种归属的算子,无法混合使用,如全部使用DataMate算子或全部使用DataJuicer算子。", required = false)
41+
private List<OperatorInstanceDto> instance = new ArrayList<>();
3342
}
3443

backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/OperatorInstanceDto.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import lombok.Getter;
99
import lombok.Setter;
10+
import org.springaicommunity.mcp.annotation.McpToolParam;
1011

1112
/**
1213
* OperatorInstance
@@ -15,17 +16,22 @@
1516
@Getter
1617
@Setter
1718
public class OperatorInstanceDto {
18-
19+
@McpToolParam(description = "算子ID")
1920
private String id;
2021

22+
@McpToolParam(description = "算子名称")
2123
private String name;
2224

25+
@McpToolParam(description = "算子输入类型,取值范围为text/image/audio/video/multimodal")
2326
private String inputs;
2427

28+
@McpToolParam(description = "算子输出类型,取值范围为text/image/audio/video/multimodal")
2529
private String outputs;
2630

31+
@McpToolParam(description = "算子所属分类的所有ID组成的列表。", required = false)
2732
private List<String> categories;
2833

34+
@McpToolParam(description = "算子需要覆盖的参数", required = false)
2935
private Map<String, Object> overrides = new HashMap<>();
3036
}
3137

backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/rest/CleaningTaskController.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import com.datamate.common.interfaces.PagedResponse;
66
import lombok.RequiredArgsConstructor;
77
import org.apache.commons.lang3.StringUtils;
8+
import org.springaicommunity.mcp.annotation.McpTool;
9+
import org.springaicommunity.mcp.annotation.McpToolParam;
810
import org.springframework.web.bind.annotation.*;
911

1012
import java.util.List;
@@ -28,7 +30,9 @@ public PagedResponse<CleaningTaskDto> cleaningTasksGet(
2830
}
2931

3032
@PostMapping
31-
public CleaningTaskDto cleaningTasksPost(@RequestBody CreateCleaningTaskRequest request) {
33+
@McpTool(name = "create_cleaning_task", description = "根据模板ID或算子列表创建清洗任务。")
34+
public CleaningTaskDto cleaningTasksPost(@McpToolParam(description = "创建任务请求体,需要将参数包装在request对象中。")
35+
@RequestBody CreateCleaningTaskRequest request) {
3236
if (request.getInstance().isEmpty() && StringUtils.isNotBlank(request.getTemplateId())) {
3337
request.setInstance(cleaningTaskService.getInstanceByTemplateId(request.getTemplateId()));
3438
}

backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/rest/CleaningTemplateController.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import com.datamate.cleaning.interfaces.dto.UpdateCleaningTemplateRequest;
77
import com.datamate.common.interfaces.PagedResponse;
88
import lombok.RequiredArgsConstructor;
9+
import org.springaicommunity.mcp.annotation.McpTool;
10+
import org.springaicommunity.mcp.annotation.McpToolParam;
911
import org.springframework.web.bind.annotation.DeleteMapping;
1012
import org.springframework.web.bind.annotation.GetMapping;
1113
import org.springframework.web.bind.annotation.PathVariable;
@@ -27,10 +29,14 @@ public class CleaningTemplateController {
2729
private final CleaningTemplateService cleaningTemplateService;
2830

2931
@GetMapping
32+
@McpTool(name = "query_cleaning_template", description = "查询模板列表")
3033
public PagedResponse<CleaningTemplateDto> cleaningTemplatesGet(
31-
@RequestParam(value = "page", required = false) Integer page,
32-
@RequestParam(value = "size", required = false) Integer size,
33-
@RequestParam(value = "keyword", required = false) String keyword) {
34+
@RequestParam(value = "page", required = false)
35+
@McpToolParam(description = "页码,从0开始", required = false) Integer page,
36+
@RequestParam(value = "size", required = false)
37+
@McpToolParam(description = "每页大小", required = false) Integer size,
38+
@RequestParam(value = "keyword", required = false)
39+
@McpToolParam(description = "关键词,从名称与描述中查询", required = false) String keyword) {
3440
List<CleaningTemplateDto> templates = cleaningTemplateService.getTemplates(keyword);
3541
if (page == null || size == null) {
3642
return PagedResponse.of(templates.stream()

backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/dto/CreateDatasetRequest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import lombok.Getter;
99
import lombok.NoArgsConstructor;
1010
import lombok.Setter;
11+
import org.springaicommunity.mcp.annotation.McpToolParam;
1112

1213
import java.util.List;
1314

@@ -22,19 +23,26 @@ public class CreateDatasetRequest {
2223
/** 数据集名称 */
2324
@Size(min = 1, max = 100)
2425
@NotBlank(message = "数据集名称不能为空")
26+
@McpToolParam(description = "数据集名称")
2527
private String name;
2628
/** 数据集描述 */
2729
@Size(max = 500)
30+
@McpToolParam(description = "数据集描述", required = false)
2831
private String description;
2932
/** 数据集类型 */
3033
@NotNull(message = "数据集类型不能为空")
34+
@McpToolParam(description = "数据集类型,取值范围为TEXT/IMAGE/VIDEO/AUDIO/OTHER")
3135
private DatasetType datasetType;
3236
/** 标签列表 */
37+
@McpToolParam(description = "标签列表", required = false)
3338
private List<String> tags;
3439
/** 数据源 */
40+
@McpToolParam(description = "数据源", required = false)
3541
private String dataSource;
3642
/** 保留天数 */
43+
@McpToolParam(description = "保留天数", required = false)
3744
private Integer retentionDays;
3845
/** 数据集状态 */
46+
@McpToolParam(description = "数据集状态", required = false)
3947
private String status;
4048
}

backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/dto/DatasetPagingQuery.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import lombok.Getter;
88
import lombok.NoArgsConstructor;
99
import lombok.Setter;
10+
import org.springaicommunity.mcp.annotation.McpToolParam;
1011

1112
import java.util.ArrayList;
1213
import java.util.List;
@@ -23,20 +24,24 @@ public class DatasetPagingQuery extends PagingQuery {
2324
/**
2425
* 数据集类型过滤
2526
*/
27+
@McpToolParam(description = "数据集类型过滤,取值范围为text/image/video/audio/other", required = false)
2628
private DatasetType type;
2729

2830
/**
2931
* 标签名过滤
3032
*/
33+
@McpToolParam(description = "标签名过滤", required = false)
3134
private List<String> tags = new ArrayList<>();
3235

3336
/**
3437
* 关键词搜索(名称或描述)
3538
*/
39+
@McpToolParam(description = "关键词搜索(名称或描述)", required = false)
3640
private String keyword;
3741

3842
/**
3943
* 状态过滤
4044
*/
45+
@McpToolParam(description = "状态过滤", required = false)
4146
private DatasetStatusType status;
4247
}

backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/rest/DatasetController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import jakarta.validation.Valid;
1212
import lombok.RequiredArgsConstructor;
1313
import lombok.extern.slf4j.Slf4j;
14+
import org.springaicommunity.mcp.annotation.McpTool;
1415
import org.springframework.http.HttpStatus;
1516
import org.springframework.http.ResponseEntity;
1617
import org.springframework.web.bind.annotation.*;
@@ -34,6 +35,7 @@ public class DatasetController {
3435
* @return 分页的数据集列表
3536
*/
3637
@GetMapping
38+
@McpTool(name = "query_datasets", description = "根据参数查询满足条件的数据集列表")
3739
public PagedResponse<DatasetResponse> getDatasets(DatasetPagingQuery query) {
3840
return datasetApplicationService.getDatasets(query);
3941
}
@@ -45,6 +47,7 @@ public PagedResponse<DatasetResponse> getDatasets(DatasetPagingQuery query) {
4547
* @return 创建的数据集响应
4648
*/
4749
@PostMapping
50+
@McpTool(name = "create_dataset", description = "创建数据集")
4851
public DatasetResponse createDataset(@RequestBody @Valid CreateDatasetRequest createDatasetRequest) {
4952
Dataset dataset = datasetApplicationService.createDataset(createDatasetRequest);
5053
return DatasetConverter.INSTANCE.convertToResponse(dataset);

backend/services/main-application/src/main/resources/application.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,19 @@ spring:
6767
min-idle: 5
6868
max-wait: 1000ms
6969

70+
ai:
71+
mcp:
72+
server:
73+
enabled: true
74+
name: datamate-mcp-server
75+
protocol: STATELESS
76+
capabilities:
77+
completion: false
78+
resource: false
79+
prompt: false
80+
tool: true
81+
mcp-endpoint: /mcp
82+
7083

7184
# MyBatis配置(需在顶层,不在 spring 下)
7285
mybatis-plus:

backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/OperatorsListPostRequest.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.datamate.common.interfaces.PagingQuery;
88
import lombok.Getter;
99
import lombok.Setter;
10+
import org.springaicommunity.mcp.annotation.McpToolParam;
1011

1112
/**
1213
* OperatorsListPostRequest
@@ -15,12 +16,16 @@
1516
@Getter
1617
@Setter
1718
public class OperatorsListPostRequest extends PagingQuery {
18-
private List<List<String>> categories = new ArrayList<>();
19+
@McpToolParam(description = "算子分类id列表,每个父分类下的id放到一个列表中,最后汇总成一个大的列表", required = false)
20+
private List<List<String>> categories = new ArrayList<>();
1921

20-
private String keyword;
22+
@McpToolParam(description = "算子关键词,支持查询算子名称和算子描述关键词查询", required = false)
23+
private String keyword;
2124

22-
private String labelName;
25+
@McpToolParam(description = "算子关联的标签名称,当前暂不支持", required = false)
26+
private String labelName;
2327

24-
private Boolean isStar;
28+
@McpToolParam(description = "算子是否被收藏", required = false)
29+
private Boolean isStar;
2530
}
2631

backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/CategoryController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.datamate.operator.interfaces.dto.CategoryTreePagedResponse;
77
import com.datamate.operator.interfaces.dto.CategoryTreeResponse;
88
import lombok.RequiredArgsConstructor;
9+
import org.springaicommunity.mcp.annotation.McpTool;
910
import org.springframework.web.bind.annotation.GetMapping;
1011
import org.springframework.web.bind.annotation.RequestMapping;
1112
import org.springframework.web.bind.annotation.RestController;
@@ -22,6 +23,8 @@ public class CategoryController {
2223
private final OperatorRepository operatorRepo;
2324

2425
@GetMapping("/tree")
26+
@McpTool(name = "query_category_tree",
27+
description = "算子树状分类查询,获取包含分组维度(如语言、模态)及资源统计数量的分页层级分类数据。")
2528
public PagedResponse<CategoryTreeResponse> categoryTreeGet() {
2629
List<CategoryTreeResponse> allCategories = categoryService.getAllCategories();
2730
return CategoryTreePagedResponse.of(allCategories, operatorRepo.countOperatorByStar(true));

0 commit comments

Comments
 (0)