Initial commit
This commit is contained in:
139
server/mcp/dictionary_query.go
Normal file
139
server/mcp/dictionary_query.go
Normal file
@@ -0,0 +1,139 @@
|
||||
package mcpTool
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
|
||||
"github.com/mark3labs/mcp-go/mcp"
|
||||
)
|
||||
|
||||
func init() {
|
||||
RegisterTool(&DictionaryQuery{})
|
||||
}
|
||||
|
||||
type DictionaryPre struct {
|
||||
Type string `json:"type"`
|
||||
Desc string `json:"desc"`
|
||||
}
|
||||
|
||||
type DictionaryInfo struct {
|
||||
ID uint `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Type string `json:"type"`
|
||||
Status *bool `json:"status"`
|
||||
Desc string `json:"desc"`
|
||||
Details []DictionaryDetailInfo `json:"details"`
|
||||
}
|
||||
|
||||
type DictionaryDetailInfo struct {
|
||||
ID uint `json:"id"`
|
||||
Label string `json:"label"`
|
||||
Value string `json:"value"`
|
||||
Extend string `json:"extend"`
|
||||
Status *bool `json:"status"`
|
||||
Sort int `json:"sort"`
|
||||
}
|
||||
|
||||
type DictionaryQueryResponse struct {
|
||||
Success bool `json:"success"`
|
||||
Message string `json:"message"`
|
||||
Total int `json:"total"`
|
||||
Dictionaries []DictionaryInfo `json:"dictionaries"`
|
||||
}
|
||||
|
||||
type DictionaryQuery struct{}
|
||||
|
||||
func (d *DictionaryQuery) New() mcp.Tool {
|
||||
return mcp.NewTool("query_dictionaries",
|
||||
mcp.WithDescription("查询系统中所有的字典和字典属性,用于AI生成逻辑时了解可用的字典选项"),
|
||||
mcp.WithString("dictType",
|
||||
mcp.Description("可选:指定字典类型进行精确查询,如果不提供则返回所有字典"),
|
||||
),
|
||||
mcp.WithBoolean("includeDisabled",
|
||||
mcp.Description("是否包含已禁用的字典和字典项,默认为false(只返回启用的)"),
|
||||
),
|
||||
mcp.WithBoolean("detailsOnly",
|
||||
mcp.Description("是否只返回字典详情信息(不包含字典基本信息),默认为false"),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
func (d *DictionaryQuery) Handle(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||
args := request.GetArguments()
|
||||
|
||||
dictType := stringValue(args["dictType"])
|
||||
includeDisabled, _ := args["includeDisabled"].(bool)
|
||||
detailsOnly, _ := args["detailsOnly"].(bool)
|
||||
|
||||
dictionaries, err := fetchDictionaryList(ctx, dictType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result := make([]DictionaryInfo, 0)
|
||||
for _, dictionary := range dictionaries {
|
||||
if dictType != "" && dictionary.Type != dictType {
|
||||
continue
|
||||
}
|
||||
if !includeDisabled && dictionary.Status != nil && !*dictionary.Status {
|
||||
continue
|
||||
}
|
||||
|
||||
dictInfo, err := buildDictionaryInfo(ctx, dictionary, includeDisabled)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
result = append(result, dictInfo)
|
||||
}
|
||||
|
||||
if detailsOnly {
|
||||
details := make([]DictionaryDetailInfo, 0)
|
||||
for _, dictionary := range result {
|
||||
details = append(details, dictionary.Details...)
|
||||
}
|
||||
return textResultWithJSON("", map[string]any{
|
||||
"success": true,
|
||||
"message": "查询字典详情成功",
|
||||
"total": len(details),
|
||||
"details": details,
|
||||
})
|
||||
}
|
||||
|
||||
return textResultWithJSON("", DictionaryQueryResponse{
|
||||
Success: true,
|
||||
Message: "查询字典成功",
|
||||
Total: len(result),
|
||||
Dictionaries: result,
|
||||
})
|
||||
}
|
||||
|
||||
func buildDictionaryInfo(ctx context.Context, dictionary system.SysDictionary, includeDisabled bool) (DictionaryInfo, error) {
|
||||
exported, err := exportDictionary(ctx, dictionary.ID)
|
||||
if err != nil {
|
||||
return DictionaryInfo{}, err
|
||||
}
|
||||
|
||||
info := DictionaryInfo{
|
||||
ID: dictionary.ID,
|
||||
Name: exported.Name,
|
||||
Type: exported.Type,
|
||||
Status: exported.Status,
|
||||
Desc: exported.Desc,
|
||||
}
|
||||
|
||||
for _, detail := range exported.SysDictionaryDetails {
|
||||
if !includeDisabled && detail.Status != nil && !*detail.Status {
|
||||
continue
|
||||
}
|
||||
info.Details = append(info.Details, DictionaryDetailInfo{
|
||||
ID: detail.ID,
|
||||
Label: detail.Label,
|
||||
Value: detail.Value,
|
||||
Extend: detail.Extend,
|
||||
Status: detail.Status,
|
||||
Sort: detail.Sort,
|
||||
})
|
||||
}
|
||||
|
||||
return info, nil
|
||||
}
|
||||
Reference in New Issue
Block a user