140 lines
3.7 KiB
Go
140 lines
3.7 KiB
Go
package mcpTool
|
||
|
||
import (
|
||
"context"
|
||
|
||
"git.echol.cn/loser/Go-Web-Template/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
|
||
}
|