Skip to content

Commit 0c88ed9

Browse files
committed
💥 Support mcp server
issue #64
1 parent 5a16174 commit 0c88ed9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+3558
-12
lines changed

cmd/activity/list.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,22 @@ var listCmd = &cobra.Command{
4747

4848
var listTool = mcp.NewTool(
4949
"activity-list",
50-
mcp.WithTitleAnnotation("List Activities"),
50+
mcp.WithTitleAnnotation(short),
51+
mcp.WithDescription(long),
5152
mcp.WithDestructiveHintAnnotation(false),
5253
mcp.WithOpenWorldHintAnnotation(true),
5354
mcp.WithReadOnlyHintAnnotation(true),
54-
mcp.WithDescription(long),
5555
mcp.WithString(
56-
"channelId", mcp.DefaultString(""), mcp.Description(ciUsage), mcp.Required(),
56+
"channelId", mcp.DefaultString(""),
57+
mcp.Description(ciUsage), mcp.Required(),
5758
),
5859
mcp.WithString(
5960
"home", mcp.Enum("true", "false", ""),
6061
mcp.DefaultString(""), mcp.Description(homeUsage), mcp.Required(),
6162
),
6263
mcp.WithNumber(
63-
"maxResults", mcp.DefaultNumber(5), mcp.Description(mrUsage), mcp.Required(),
64+
"maxResults", mcp.DefaultNumber(5),
65+
mcp.Description(mrUsage), mcp.Required(),
6466
),
6567
mcp.WithString(
6668
"mine", mcp.Enum("true", "false", ""),
@@ -93,9 +95,9 @@ var listTool = mcp.NewTool(
9395
),
9496
)
9597

96-
func listHandler(ctx context.Context, request mcp.CallToolRequest) (
97-
*mcp.CallToolResult, error,
98-
) {
98+
func listHandler(
99+
ctx context.Context, request mcp.CallToolRequest,
100+
) (*mcp.CallToolResult, error) {
99101
args := request.GetArguments()
100102
channelId, _ = args["channelId"].(string)
101103
homeRaw, _ := args["home"].(string)
@@ -110,7 +112,7 @@ func listHandler(ctx context.Context, request mcp.CallToolRequest) (
110112
publishedAfter, _ = args["publishedAfter"].(string)
111113
publishedBefore, _ = args["publishedBefore"].(string)
112114
regionCode, _ = args["regionCode"].(string)
113-
partsRaw, _ := args["parts"].([]interface{})
115+
partsRaw, _ := args["parts"].([]any)
114116
parts = make([]string, len(partsRaw))
115117
for i, part := range partsRaw {
116118
parts[i] = part.(string)

cmd/caption/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ go_library(
1616
"//cmd",
1717
"//pkg/caption",
1818
"//pkg/utils",
19+
"@com_github_mark3labs_mcp_go//mcp",
1920
"@com_github_spf13_cobra//:cobra",
2021
"@com_github_spf13_pflag//:pflag",
2122
],

cmd/caption/delete.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package caption
22

33
import (
4+
"bytes"
5+
"context"
6+
"github.com/eat-pray-ai/yutu/cmd"
47
"github.com/eat-pray-ai/yutu/pkg/caption"
8+
"github.com/mark3labs/mcp-go/mcp"
59
"github.com/spf13/cobra"
610
"io"
711
)
@@ -13,6 +17,7 @@ const (
1317
)
1418

1519
func init() {
20+
cmd.MCP.AddTool(deleteTool, deleteHandler)
1621
captionCmd.AddCommand(deleteCmd)
1722

1823
deleteCmd.Flags().StringSliceVarP(&ids, "ids", "i", []string{}, deleteIdsUsage)
@@ -37,6 +42,48 @@ var deleteCmd = &cobra.Command{
3742
},
3843
}
3944

45+
var deleteTool = mcp.NewTool(
46+
"caption-delete",
47+
mcp.WithTitleAnnotation(deleteShort),
48+
mcp.WithDescription(deleteLong),
49+
mcp.WithDestructiveHintAnnotation(true),
50+
mcp.WithOpenWorldHintAnnotation(true),
51+
mcp.WithReadOnlyHintAnnotation(false),
52+
mcp.WithArray(
53+
"ids", mcp.DefaultArray([]string{}),
54+
mcp.Items(map[string]any{"type": "string"}),
55+
mcp.Description(deleteIdsUsage), mcp.Required(),
56+
),
57+
mcp.WithString(
58+
"onBehalfOf", mcp.DefaultString(""),
59+
mcp.Description(""), mcp.Required(),
60+
),
61+
mcp.WithString(
62+
"onBehalfOfContentOwner", mcp.DefaultString(""),
63+
mcp.Description(""), mcp.Required(),
64+
),
65+
)
66+
67+
func deleteHandler(
68+
ctx context.Context, request mcp.CallToolRequest,
69+
) (*mcp.CallToolResult, error) {
70+
args := request.GetArguments()
71+
idsRaw, _ := args["ids"].([]any)
72+
ids := make([]string, len(idsRaw))
73+
for i, id := range idsRaw {
74+
ids[i] = id.(string)
75+
}
76+
onBehalfOf, _ = args["onBehalfOf"].(string)
77+
onBehalfOfContentOwner, _ = args["onBehalfOfContentOwner"].(string)
78+
79+
var writer bytes.Buffer
80+
err := del(&writer)
81+
if err != nil {
82+
return mcp.NewToolResultError(err.Error()), err
83+
}
84+
return mcp.NewToolResultText(writer.String()), nil
85+
}
86+
4087
func del(writer io.Writer) error {
4188
c := caption.NewCation(
4289
caption.WithIDs(ids),

cmd/caption/download.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package caption
22

33
import (
4+
"bytes"
5+
"context"
6+
"github.com/eat-pray-ai/yutu/cmd"
47
"github.com/eat-pray-ai/yutu/pkg/caption"
8+
"github.com/mark3labs/mcp-go/mcp"
59
"github.com/spf13/cobra"
610
"io"
711
)
@@ -13,6 +17,7 @@ const (
1317
)
1418

1519
func init() {
20+
cmd.MCP.AddTool(downloadTool, downloadHandler)
1621
captionCmd.AddCommand(downloadCmd)
1722

1823
downloadCmd.Flags().StringSliceVarP(
@@ -43,6 +48,63 @@ var downloadCmd = &cobra.Command{
4348
},
4449
}
4550

51+
var downloadTool = mcp.NewTool(
52+
"caption-download",
53+
mcp.WithTitleAnnotation(downloadShort),
54+
mcp.WithDescription(downloadLong),
55+
mcp.WithDestructiveHintAnnotation(false),
56+
mcp.WithOpenWorldHintAnnotation(true),
57+
mcp.WithReadOnlyHintAnnotation(false),
58+
mcp.WithArray(
59+
"ids", mcp.DefaultArray([]string{}),
60+
mcp.Items(map[string]any{"type": "string"}),
61+
mcp.Description(downloadIdUsage), mcp.Required(),
62+
),
63+
mcp.WithString(
64+
"file", mcp.DefaultString(""),
65+
mcp.Description(fileUsage), mcp.Required(),
66+
),
67+
mcp.WithString(
68+
"tfmt", mcp.DefaultString(""),
69+
mcp.Description(tfmtUsage), mcp.Required(),
70+
),
71+
mcp.WithString(
72+
"tlang", mcp.DefaultString(""),
73+
mcp.Description(tlangUsage), mcp.Required(),
74+
),
75+
mcp.WithString(
76+
"onBehalfOf", mcp.DefaultString(""),
77+
mcp.Description(""), mcp.Required(),
78+
),
79+
mcp.WithString(
80+
"onBehalfOfContentOwner", mcp.DefaultString(""),
81+
mcp.Description(""), mcp.Required(),
82+
),
83+
)
84+
85+
func downloadHandler(
86+
ctx context.Context, request mcp.CallToolRequest,
87+
) (*mcp.CallToolResult, error) {
88+
args := request.GetArguments()
89+
idsRaw, _ := args["ids"].([]any)
90+
ids := make([]string, len(idsRaw))
91+
for i, id := range idsRaw {
92+
ids[i] = id.(string)
93+
}
94+
file, _ = args["file"].(string)
95+
tfmt, _ = args["tfmt"].(string)
96+
tlang, _ = args["tlang"].(string)
97+
onBehalfOf, _ = args["onBehalfOf"].(string)
98+
onBehalfOfContentOwner, _ = args["onBehalfOfContentOwner"].(string)
99+
100+
var writer bytes.Buffer
101+
err := download(&writer)
102+
if err != nil {
103+
return mcp.NewToolResultError(err.Error()), err
104+
}
105+
return mcp.NewToolResultText(writer.String()), nil
106+
}
107+
46108
func download(writer io.Writer) error {
47109
c := caption.NewCation(
48110
caption.WithIDs(ids),

cmd/caption/insert.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package caption
22

33
import (
4+
"bytes"
5+
"context"
46
"github.com/eat-pray-ai/yutu/cmd"
57
"github.com/eat-pray-ai/yutu/pkg/caption"
8+
"github.com/mark3labs/mcp-go/mcp"
69
"github.com/spf13/cobra"
710
"io"
811
)
@@ -13,6 +16,7 @@ const (
1316
)
1417

1518
func init() {
19+
cmd.MCP.AddTool(insertTool, insertHandler)
1620
captionCmd.AddCommand(insertCmd)
1721

1822
insertCmd.Flags().StringVarP(&file, "file", "f", "", fileUsage)
@@ -58,6 +62,108 @@ var insertCmd = &cobra.Command{
5862
},
5963
}
6064

65+
var insertTool = mcp.NewTool(
66+
"caption-insert",
67+
mcp.WithTitleAnnotation(insertShort),
68+
mcp.WithDescription(insertLong),
69+
mcp.WithDestructiveHintAnnotation(false),
70+
mcp.WithOpenWorldHintAnnotation(true),
71+
mcp.WithReadOnlyHintAnnotation(false),
72+
mcp.WithString(
73+
"file", mcp.DefaultString(""),
74+
mcp.Description(fileUsage), mcp.Required(),
75+
),
76+
mcp.WithString(
77+
"audioTrackType", mcp.DefaultString("unknown"),
78+
mcp.Description(attUsage), mcp.Required(),
79+
),
80+
mcp.WithBoolean(
81+
"isAutoSynced", mcp.DefaultBool(true),
82+
mcp.Description(iasUsage), mcp.Required(),
83+
),
84+
mcp.WithBoolean(
85+
"isCC", mcp.DefaultBool(false),
86+
mcp.Description(iscUsage), mcp.Required(),
87+
),
88+
mcp.WithBoolean(
89+
"isDraft", mcp.DefaultBool(false),
90+
mcp.Description(isdUsage), mcp.Required(),
91+
),
92+
mcp.WithBoolean(
93+
"isEasyReader", mcp.DefaultBool(false),
94+
mcp.Description(iserUsage), mcp.Required(),
95+
),
96+
mcp.WithBoolean(
97+
"isLarge", mcp.DefaultBool(false),
98+
mcp.Description(islUsage), mcp.Required(),
99+
),
100+
mcp.WithString(
101+
"language", mcp.DefaultString(""),
102+
mcp.Description(languageUsage), mcp.Required(),
103+
),
104+
mcp.WithString(
105+
"name", mcp.DefaultString(""),
106+
mcp.Description(nameUsage), mcp.Required(),
107+
),
108+
mcp.WithString(
109+
"trackKind", mcp.DefaultString("standard"),
110+
mcp.Description(tkUsage), mcp.Required(),
111+
),
112+
mcp.WithString(
113+
"videoId", mcp.DefaultString(""),
114+
mcp.Description(vidUsage), mcp.Required(),
115+
),
116+
mcp.WithString(
117+
"onBehalfOf", mcp.DefaultString(""),
118+
mcp.Description(""), mcp.Required(),
119+
),
120+
mcp.WithString(
121+
"onBehalfOfContentOwner", mcp.DefaultString(""),
122+
mcp.Description(""), mcp.Required(),
123+
),
124+
mcp.WithString(
125+
"output", mcp.DefaultString(""),
126+
mcp.Description(cmd.SilentUsage), mcp.Required(),
127+
),
128+
mcp.WithString(
129+
"jsonpath", mcp.DefaultString(""),
130+
mcp.Description(cmd.JpUsage), mcp.Required(),
131+
),
132+
)
133+
134+
func insertHandler(
135+
ctx context.Context, request mcp.CallToolRequest,
136+
) (*mcp.CallToolResult, error) {
137+
args := request.GetArguments()
138+
file, _ = args["file"].(string)
139+
audioTrackType, _ = args["audioTrackType"].(string)
140+
isAutoSyncedRaw, _ := args["isAutoSynced"].(bool)
141+
isAutoSynced = &isAutoSyncedRaw
142+
isCCRaw, _ := args["isCC"].(bool)
143+
isCC = &isCCRaw
144+
isDraftRaw, _ := args["isDraft"].(bool)
145+
isDraft = &isDraftRaw
146+
isEasyReaderRaw, _ := args["isEasyReader"].(bool)
147+
isEasyReader = &isEasyReaderRaw
148+
isLargeRaw, _ := args["isLarge"].(bool)
149+
isLarge = &isLargeRaw
150+
language, _ = args["language"].(string)
151+
name, _ = args["name"].(string)
152+
trackKind, _ = args["trackKind"].(string)
153+
videoId, _ = args["videoId"].(string)
154+
onBehalfOf, _ = args["onBehalfOf"].(string)
155+
onBehalfOfContentOwner, _ = args["onBehalfOfContentOwner"].(string)
156+
output, _ = args["output"].(string)
157+
jpath, _ = args["jsonpath"].(string)
158+
159+
var writer bytes.Buffer
160+
err := insert(&writer)
161+
if err != nil {
162+
return mcp.NewToolResultError(err.Error()), err
163+
}
164+
return mcp.NewToolResultText(writer.String()), nil
165+
}
166+
61167
func insert(writer io.Writer) error {
62168
c := caption.NewCation(
63169
caption.WithFile(file),

0 commit comments

Comments
 (0)