social-mcp 1.5.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +4 -0
- package/dist/lib/config.js +4 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/services/youtube-service.d.ts +124 -0
- package/dist/services/youtube-service.js +230 -0
- package/dist/services/youtube-service.js.map +1 -0
- package/dist/tools/youtube-tools/get-channel-info.d.ts +14 -0
- package/dist/tools/youtube-tools/get-channel-info.js +41 -0
- package/dist/tools/youtube-tools/get-channel-info.js.map +1 -0
- package/dist/tools/youtube-tools/get-comments.d.ts +16 -0
- package/dist/tools/youtube-tools/get-comments.js +36 -0
- package/dist/tools/youtube-tools/get-comments.js.map +1 -0
- package/dist/tools/youtube-tools/get-video-info.d.ts +14 -0
- package/dist/tools/youtube-tools/get-video-info.js +42 -0
- package/dist/tools/youtube-tools/get-video-info.js.map +1 -0
- package/dist/tools/youtube-tools/list-channel-videos.d.ts +18 -0
- package/dist/tools/youtube-tools/list-channel-videos.js +36 -0
- package/dist/tools/youtube-tools/list-channel-videos.js.map +1 -0
- package/dist/tools/youtube-tools/post-comment.d.ts +16 -0
- package/dist/tools/youtube-tools/post-comment.js +25 -0
- package/dist/tools/youtube-tools/post-comment.js.map +1 -0
- package/dist/tools/youtube-tools/search-videos.d.ts +18 -0
- package/dist/tools/youtube-tools/search-videos.js +39 -0
- package/dist/tools/youtube-tools/search-videos.js.map +1 -0
- package/dist/tools/youtube-tools/update-video.d.ts +22 -0
- package/dist/tools/youtube-tools/update-video.js +32 -0
- package/dist/tools/youtube-tools/update-video.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,6 +17,7 @@ An MCP (Model Context Protocol) server that lets AI assistants post and interact
|
|
|
17
17
|
| Reddit | Submit post, get posts, comment, vote, search, get user info |
|
|
18
18
|
| Threads | Get profile, create post, reply, get posts, delete post |
|
|
19
19
|
| TikTok | Query creator info, get user info, post video, photo post, get post status |
|
|
20
|
+
| YouTube | Get channel info, search videos, get video info, list channel videos, get comments, post comment, update video |
|
|
20
21
|
|
|
21
22
|
## Quick Start
|
|
22
23
|
|
|
@@ -64,7 +65,8 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
|
|
|
64
65
|
"REDDIT_PASSWORD": "your_password",
|
|
65
66
|
"THREADS_ACCESS_TOKEN": "your_token",
|
|
66
67
|
"THREADS_USER_ID": "your_user_id",
|
|
67
|
-
"TIKTOK_ACCESS_TOKEN": "your_token"
|
|
68
|
+
"TIKTOK_ACCESS_TOKEN": "your_token",
|
|
69
|
+
"YOUTUBE_ACCESS_TOKEN": "your_token"
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
}
|
|
@@ -156,6 +158,11 @@ Copy `example.env` to `.env` and fill in the credentials for the platforms you w
|
|
|
156
158
|
|----------|-------------|
|
|
157
159
|
| `TIKTOK_ACCESS_TOKEN` | OAuth 2.0 access token from the [TikTok for Developers](https://developers.tiktok.com) — requires `user.info.basic`, `video.publish`, `video.upload` scopes |
|
|
158
160
|
|
|
161
|
+
### YouTube
|
|
162
|
+
| Variable | Description |
|
|
163
|
+
|----------|-------------|
|
|
164
|
+
| `YOUTUBE_ACCESS_TOKEN` | OAuth 2.0 access token from the [Google Cloud Console](https://console.cloud.google.com) — requires `https://www.googleapis.com/auth/youtube` scope |
|
|
165
|
+
|
|
159
166
|
## Available Tools
|
|
160
167
|
|
|
161
168
|
### Telegram
|
|
@@ -234,6 +241,17 @@ Copy `example.env` to `.env` and fill in the credentials for the platforms you w
|
|
|
234
241
|
|
|
235
242
|
> **Note:** TikTok's Content Posting API requires app approval from [TikTok for Developers](https://developers.tiktok.com). Videos are pulled from a public URL by TikTok's servers rather than uploaded directly.
|
|
236
243
|
|
|
244
|
+
### YouTube
|
|
245
|
+
- **YOUTUBE_GET_CHANNEL_INFO** — Get channel info and stats (`channelId` optional — omit for your own channel)
|
|
246
|
+
- **YOUTUBE_SEARCH_VIDEOS** — Search YouTube for videos (`query`, `maxResults`, `pageToken`)
|
|
247
|
+
- **YOUTUBE_GET_VIDEO_INFO** — Get detailed info and stats for a video (`videoId`)
|
|
248
|
+
- **YOUTUBE_LIST_CHANNEL_VIDEOS** — List recent uploads from a channel (`channelId`, `maxResults`, `pageToken`)
|
|
249
|
+
- **YOUTUBE_GET_COMMENTS** — Get top-level comments on a video (`videoId`, `maxResults`)
|
|
250
|
+
- **YOUTUBE_POST_COMMENT** — Post a comment on a video (`videoId`, `text`)
|
|
251
|
+
- **YOUTUBE_UPDATE_VIDEO** — Update a video's title, description, and tags (`videoId`, `title`, `description`, `tags`, `categoryId`)
|
|
252
|
+
|
|
253
|
+
> **Note:** YouTube requires an OAuth 2.0 access token with the `https://www.googleapis.com/auth/youtube` scope. Enable the **YouTube Data API v3** in your [Google Cloud Console](https://console.cloud.google.com) project. Video uploads are not supported via this API — use the YouTube Studio or resumable upload flow directly.
|
|
254
|
+
|
|
237
255
|
## Development
|
|
238
256
|
|
|
239
257
|
```bash
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,7 @@ import { getThreadsService } from "./services/threads-service.js";
|
|
|
13
13
|
import { getTikTokService } from "./services/tiktok-service.js";
|
|
14
14
|
import { getTwitterService } from "./services/twitter-service.js";
|
|
15
15
|
import { getWhatsappService } from "./services/whatsapp-service.js";
|
|
16
|
+
import { getYouTubeService } from "./services/youtube-service.js";
|
|
16
17
|
import { getMessagesTool as discordGetMessagesTool } from "./tools/discord-tools/get-messages.js";
|
|
17
18
|
import { sendMessageTool as discordSendMessageTool } from "./tools/discord-tools/send-message.js";
|
|
18
19
|
import { createPostTool as facebookCreatePostTool } from "./tools/facebook-tools/create-post.js";
|
|
@@ -59,6 +60,13 @@ import { replyTweetTool } from "./tools/twitter-tools/reply-tweet.js";
|
|
|
59
60
|
import { searchTweetsTool } from "./tools/twitter-tools/search-tweets.js";
|
|
60
61
|
import { sendTweetTool } from "./tools/twitter-tools/send-tweet.js";
|
|
61
62
|
import { sendMessageTool as whatsappSendMessageTool } from "./tools/whatsapp-tools/send-message.js";
|
|
63
|
+
import { getChannelInfoTool as youtubeGetChannelInfoTool } from "./tools/youtube-tools/get-channel-info.js";
|
|
64
|
+
import { getCommentsTool as youtubeGetCommentsTool } from "./tools/youtube-tools/get-comments.js";
|
|
65
|
+
import { getVideoInfoTool as youtubeGetVideoInfoTool } from "./tools/youtube-tools/get-video-info.js";
|
|
66
|
+
import { listChannelVideosTool as youtubeListChannelVideosTool } from "./tools/youtube-tools/list-channel-videos.js";
|
|
67
|
+
import { postCommentTool as youtubePostCommentTool } from "./tools/youtube-tools/post-comment.js";
|
|
68
|
+
import { searchVideosTool as youtubeSearchVideosTool } from "./tools/youtube-tools/search-videos.js";
|
|
69
|
+
import { updateVideoTool as youtubeUpdateVideoTool } from "./tools/youtube-tools/update-video.js";
|
|
62
70
|
const require = createRequire(import.meta.url);
|
|
63
71
|
const { version } = require("../package.json");
|
|
64
72
|
function checkPlatform(name, init) {
|
|
@@ -88,6 +96,7 @@ async function main() {
|
|
|
88
96
|
checkPlatform("Reddit", getRedditService);
|
|
89
97
|
checkPlatform("Threads", getThreadsService);
|
|
90
98
|
checkPlatform("TikTok", getTikTokService);
|
|
99
|
+
checkPlatform("YouTube", getYouTubeService);
|
|
91
100
|
console.error("");
|
|
92
101
|
const server = new FastMCP({ name: "Social MCP Server", version });
|
|
93
102
|
// Telegram
|
|
@@ -147,6 +156,14 @@ async function main() {
|
|
|
147
156
|
server.addTool(tiktokDirectPostVideoTool);
|
|
148
157
|
server.addTool(tiktokPhotoPostTool);
|
|
149
158
|
server.addTool(tiktokGetPostStatusTool);
|
|
159
|
+
// YouTube
|
|
160
|
+
server.addTool(youtubeGetChannelInfoTool);
|
|
161
|
+
server.addTool(youtubeSearchVideosTool);
|
|
162
|
+
server.addTool(youtubeGetVideoInfoTool);
|
|
163
|
+
server.addTool(youtubeListChannelVideosTool);
|
|
164
|
+
server.addTool(youtubeGetCommentsTool);
|
|
165
|
+
server.addTool(youtubePostCommentTool);
|
|
166
|
+
server.addTool(youtubeUpdateVideoTool);
|
|
150
167
|
try {
|
|
151
168
|
await server.start({ transportType: "stdio" });
|
|
152
169
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts
CHANGED
package/dist/lib/config.js
CHANGED
|
@@ -39,5 +39,9 @@ export const config = {
|
|
|
39
39
|
baseUrl: "https://open.tiktokapis.com/v2",
|
|
40
40
|
accessToken: process.env.TIKTOK_ACCESS_TOKEN || "",
|
|
41
41
|
},
|
|
42
|
+
youtube: {
|
|
43
|
+
baseUrl: "https://www.googleapis.com/youtube/v3",
|
|
44
|
+
accessToken: process.env.YOUTUBE_ACCESS_TOKEN || "",
|
|
45
|
+
},
|
|
42
46
|
};
|
|
43
47
|
//# sourceMappingURL=config.js.map
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,SAAS,GAAG,8BAA8B,gBAAgB,EAAE,CAAC;AAEnE,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,OAAO,EAAE;QACR,OAAO,EAAE,6BAA6B;QACtC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;KAC7C;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;QACpD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE;KACzD;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACpD;IACD,SAAS,EAAE;QACV,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE;KACrD;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,6BAA6B;QACtC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACpD;IACD,MAAM,EAAE;QACP,OAAO,EAAE,0BAA0B;QACnC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE;QAC5C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;QACpD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;QAC3C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;QAC3C,SAAS,EAAE,uCAAuC;KAClD;IACD,OAAO,EAAE;QACR,OAAO,EAAE,gCAAgC;QACzC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;QACnD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;KACzC;IACD,MAAM,EAAE;QACP,OAAO,EAAE,gCAAgC;QACzC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE;KAClD;CACD,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,SAAS,GAAG,8BAA8B,gBAAgB,EAAE,CAAC;AAEnE,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,OAAO,EAAE;QACR,OAAO,EAAE,6BAA6B;QACtC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;KAC7C;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;QACpD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE;KACzD;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACpD;IACD,SAAS,EAAE;QACV,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE;KACrD;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,6BAA6B;QACtC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACpD;IACD,MAAM,EAAE;QACP,OAAO,EAAE,0BAA0B;QACnC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE;QAC5C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;QACpD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;QAC3C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;QAC3C,SAAS,EAAE,uCAAuC;KAClD;IACD,OAAO,EAAE;QACR,OAAO,EAAE,gCAAgC;QACzC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;QACnD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;KACzC;IACD,MAAM,EAAE;QACP,OAAO,EAAE,gCAAgC;QACzC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE;KAClD;IACD,OAAO,EAAE;QACR,OAAO,EAAE,uCAAuC;QAChD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;KACnD;CACD,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
export declare class YouTubeService {
|
|
2
|
+
private baseUrl;
|
|
3
|
+
private headers;
|
|
4
|
+
constructor();
|
|
5
|
+
getChannelInfo(channelId?: string): Promise<{
|
|
6
|
+
items?: {
|
|
7
|
+
id?: string | undefined;
|
|
8
|
+
snippet?: {
|
|
9
|
+
title?: string | undefined;
|
|
10
|
+
description?: string | undefined;
|
|
11
|
+
customUrl?: string | undefined;
|
|
12
|
+
publishedAt?: string | undefined;
|
|
13
|
+
country?: string | undefined;
|
|
14
|
+
thumbnails?: {
|
|
15
|
+
default?: {
|
|
16
|
+
url: string;
|
|
17
|
+
} | undefined;
|
|
18
|
+
} | undefined;
|
|
19
|
+
} | undefined;
|
|
20
|
+
statistics?: {
|
|
21
|
+
viewCount?: string | undefined;
|
|
22
|
+
subscriberCount?: string | undefined;
|
|
23
|
+
videoCount?: string | undefined;
|
|
24
|
+
} | undefined;
|
|
25
|
+
}[] | undefined;
|
|
26
|
+
}>;
|
|
27
|
+
searchVideos(query: string, maxResults?: number, pageToken?: string): Promise<{
|
|
28
|
+
items?: {
|
|
29
|
+
id?: {
|
|
30
|
+
videoId?: string | undefined;
|
|
31
|
+
channelId?: string | undefined;
|
|
32
|
+
} | undefined;
|
|
33
|
+
snippet?: {
|
|
34
|
+
publishedAt?: string | undefined;
|
|
35
|
+
channelId?: string | undefined;
|
|
36
|
+
title?: string | undefined;
|
|
37
|
+
description?: string | undefined;
|
|
38
|
+
channelTitle?: string | undefined;
|
|
39
|
+
} | undefined;
|
|
40
|
+
}[] | undefined;
|
|
41
|
+
nextPageToken?: string | undefined;
|
|
42
|
+
pageInfo?: {
|
|
43
|
+
totalResults?: number | undefined;
|
|
44
|
+
} | undefined;
|
|
45
|
+
}>;
|
|
46
|
+
getVideoInfo(videoId: string): Promise<{
|
|
47
|
+
items?: {
|
|
48
|
+
id?: string | undefined;
|
|
49
|
+
snippet?: {
|
|
50
|
+
publishedAt?: string | undefined;
|
|
51
|
+
channelId?: string | undefined;
|
|
52
|
+
title?: string | undefined;
|
|
53
|
+
description?: string | undefined;
|
|
54
|
+
channelTitle?: string | undefined;
|
|
55
|
+
tags?: string[] | undefined;
|
|
56
|
+
categoryId?: string | undefined;
|
|
57
|
+
} | undefined;
|
|
58
|
+
statistics?: {
|
|
59
|
+
viewCount?: string | undefined;
|
|
60
|
+
likeCount?: string | undefined;
|
|
61
|
+
commentCount?: string | undefined;
|
|
62
|
+
} | undefined;
|
|
63
|
+
status?: {
|
|
64
|
+
privacyStatus?: string | undefined;
|
|
65
|
+
} | undefined;
|
|
66
|
+
}[] | undefined;
|
|
67
|
+
}>;
|
|
68
|
+
listChannelVideos(channelId: string, maxResults?: number, pageToken?: string): Promise<{
|
|
69
|
+
items?: {
|
|
70
|
+
id?: {
|
|
71
|
+
videoId?: string | undefined;
|
|
72
|
+
channelId?: string | undefined;
|
|
73
|
+
} | undefined;
|
|
74
|
+
snippet?: {
|
|
75
|
+
publishedAt?: string | undefined;
|
|
76
|
+
channelId?: string | undefined;
|
|
77
|
+
title?: string | undefined;
|
|
78
|
+
description?: string | undefined;
|
|
79
|
+
channelTitle?: string | undefined;
|
|
80
|
+
} | undefined;
|
|
81
|
+
}[] | undefined;
|
|
82
|
+
nextPageToken?: string | undefined;
|
|
83
|
+
pageInfo?: {
|
|
84
|
+
totalResults?: number | undefined;
|
|
85
|
+
} | undefined;
|
|
86
|
+
}>;
|
|
87
|
+
getComments(videoId: string, maxResults?: number): Promise<{
|
|
88
|
+
items?: {
|
|
89
|
+
id?: string | undefined;
|
|
90
|
+
snippet?: {
|
|
91
|
+
topLevelComment?: {
|
|
92
|
+
id?: string | undefined;
|
|
93
|
+
snippet?: {
|
|
94
|
+
textDisplay?: string | undefined;
|
|
95
|
+
authorDisplayName?: string | undefined;
|
|
96
|
+
likeCount?: number | undefined;
|
|
97
|
+
publishedAt?: string | undefined;
|
|
98
|
+
} | undefined;
|
|
99
|
+
} | undefined;
|
|
100
|
+
totalReplyCount?: number | undefined;
|
|
101
|
+
} | undefined;
|
|
102
|
+
}[] | undefined;
|
|
103
|
+
nextPageToken?: string | undefined;
|
|
104
|
+
}>;
|
|
105
|
+
postComment(videoId: string, text: string): Promise<{
|
|
106
|
+
id?: string | undefined;
|
|
107
|
+
snippet?: {
|
|
108
|
+
topLevelComment?: {
|
|
109
|
+
snippet?: {
|
|
110
|
+
textDisplay?: string | undefined;
|
|
111
|
+
} | undefined;
|
|
112
|
+
} | undefined;
|
|
113
|
+
} | undefined;
|
|
114
|
+
}>;
|
|
115
|
+
updateVideo(videoId: string, title: string, description: string, tags?: string[], categoryId?: string): Promise<{
|
|
116
|
+
id?: string | undefined;
|
|
117
|
+
snippet?: {
|
|
118
|
+
title?: string | undefined;
|
|
119
|
+
description?: string | undefined;
|
|
120
|
+
tags?: string[] | undefined;
|
|
121
|
+
} | undefined;
|
|
122
|
+
}>;
|
|
123
|
+
}
|
|
124
|
+
export declare function getYouTubeService(): YouTubeService;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { config } from "../lib/config.js";
|
|
3
|
+
import { CredentialsError } from "../lib/errors.js";
|
|
4
|
+
import { fetchJson } from "../lib/http.js";
|
|
5
|
+
const channelSchema = z.object({
|
|
6
|
+
items: z
|
|
7
|
+
.array(z.object({
|
|
8
|
+
id: z.string().optional(),
|
|
9
|
+
snippet: z
|
|
10
|
+
.object({
|
|
11
|
+
title: z.string().optional(),
|
|
12
|
+
description: z.string().optional(),
|
|
13
|
+
customUrl: z.string().optional(),
|
|
14
|
+
publishedAt: z.string().optional(),
|
|
15
|
+
country: z.string().optional(),
|
|
16
|
+
thumbnails: z
|
|
17
|
+
.object({
|
|
18
|
+
default: z.object({ url: z.string() }).optional(),
|
|
19
|
+
})
|
|
20
|
+
.optional(),
|
|
21
|
+
})
|
|
22
|
+
.optional(),
|
|
23
|
+
statistics: z
|
|
24
|
+
.object({
|
|
25
|
+
viewCount: z.string().optional(),
|
|
26
|
+
subscriberCount: z.string().optional(),
|
|
27
|
+
videoCount: z.string().optional(),
|
|
28
|
+
})
|
|
29
|
+
.optional(),
|
|
30
|
+
}))
|
|
31
|
+
.optional(),
|
|
32
|
+
});
|
|
33
|
+
const searchSchema = z.object({
|
|
34
|
+
items: z
|
|
35
|
+
.array(z.object({
|
|
36
|
+
id: z
|
|
37
|
+
.object({
|
|
38
|
+
videoId: z.string().optional(),
|
|
39
|
+
channelId: z.string().optional(),
|
|
40
|
+
})
|
|
41
|
+
.optional(),
|
|
42
|
+
snippet: z
|
|
43
|
+
.object({
|
|
44
|
+
publishedAt: z.string().optional(),
|
|
45
|
+
channelId: z.string().optional(),
|
|
46
|
+
title: z.string().optional(),
|
|
47
|
+
description: z.string().optional(),
|
|
48
|
+
channelTitle: z.string().optional(),
|
|
49
|
+
})
|
|
50
|
+
.optional(),
|
|
51
|
+
}))
|
|
52
|
+
.optional(),
|
|
53
|
+
nextPageToken: z.string().optional(),
|
|
54
|
+
pageInfo: z
|
|
55
|
+
.object({
|
|
56
|
+
totalResults: z.number().optional(),
|
|
57
|
+
})
|
|
58
|
+
.optional(),
|
|
59
|
+
});
|
|
60
|
+
const videoSchema = z.object({
|
|
61
|
+
items: z
|
|
62
|
+
.array(z.object({
|
|
63
|
+
id: z.string().optional(),
|
|
64
|
+
snippet: z
|
|
65
|
+
.object({
|
|
66
|
+
publishedAt: z.string().optional(),
|
|
67
|
+
channelId: z.string().optional(),
|
|
68
|
+
title: z.string().optional(),
|
|
69
|
+
description: z.string().optional(),
|
|
70
|
+
channelTitle: z.string().optional(),
|
|
71
|
+
tags: z.array(z.string()).optional(),
|
|
72
|
+
categoryId: z.string().optional(),
|
|
73
|
+
})
|
|
74
|
+
.optional(),
|
|
75
|
+
statistics: z
|
|
76
|
+
.object({
|
|
77
|
+
viewCount: z.string().optional(),
|
|
78
|
+
likeCount: z.string().optional(),
|
|
79
|
+
commentCount: z.string().optional(),
|
|
80
|
+
})
|
|
81
|
+
.optional(),
|
|
82
|
+
status: z
|
|
83
|
+
.object({
|
|
84
|
+
privacyStatus: z.string().optional(),
|
|
85
|
+
})
|
|
86
|
+
.optional(),
|
|
87
|
+
}))
|
|
88
|
+
.optional(),
|
|
89
|
+
});
|
|
90
|
+
const commentThreadSchema = z.object({
|
|
91
|
+
items: z
|
|
92
|
+
.array(z.object({
|
|
93
|
+
id: z.string().optional(),
|
|
94
|
+
snippet: z
|
|
95
|
+
.object({
|
|
96
|
+
topLevelComment: z
|
|
97
|
+
.object({
|
|
98
|
+
id: z.string().optional(),
|
|
99
|
+
snippet: z
|
|
100
|
+
.object({
|
|
101
|
+
textDisplay: z.string().optional(),
|
|
102
|
+
authorDisplayName: z.string().optional(),
|
|
103
|
+
likeCount: z.number().optional(),
|
|
104
|
+
publishedAt: z.string().optional(),
|
|
105
|
+
})
|
|
106
|
+
.optional(),
|
|
107
|
+
})
|
|
108
|
+
.optional(),
|
|
109
|
+
totalReplyCount: z.number().optional(),
|
|
110
|
+
})
|
|
111
|
+
.optional(),
|
|
112
|
+
}))
|
|
113
|
+
.optional(),
|
|
114
|
+
nextPageToken: z.string().optional(),
|
|
115
|
+
});
|
|
116
|
+
const commentInsertSchema = z.object({
|
|
117
|
+
id: z.string().optional(),
|
|
118
|
+
snippet: z
|
|
119
|
+
.object({
|
|
120
|
+
topLevelComment: z
|
|
121
|
+
.object({
|
|
122
|
+
snippet: z
|
|
123
|
+
.object({
|
|
124
|
+
textDisplay: z.string().optional(),
|
|
125
|
+
})
|
|
126
|
+
.optional(),
|
|
127
|
+
})
|
|
128
|
+
.optional(),
|
|
129
|
+
})
|
|
130
|
+
.optional(),
|
|
131
|
+
});
|
|
132
|
+
const videoUpdateSchema = z.object({
|
|
133
|
+
id: z.string().optional(),
|
|
134
|
+
snippet: z
|
|
135
|
+
.object({
|
|
136
|
+
title: z.string().optional(),
|
|
137
|
+
description: z.string().optional(),
|
|
138
|
+
tags: z.array(z.string()).optional(),
|
|
139
|
+
})
|
|
140
|
+
.optional(),
|
|
141
|
+
});
|
|
142
|
+
export class YouTubeService {
|
|
143
|
+
baseUrl = config.youtube.baseUrl;
|
|
144
|
+
headers;
|
|
145
|
+
constructor() {
|
|
146
|
+
if (!config.youtube.accessToken) {
|
|
147
|
+
throw new CredentialsError("YouTube", ["YOUTUBE_ACCESS_TOKEN"]);
|
|
148
|
+
}
|
|
149
|
+
this.headers = {
|
|
150
|
+
"Content-Type": "application/json",
|
|
151
|
+
Authorization: `Bearer ${config.youtube.accessToken}`,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
async getChannelInfo(channelId) {
|
|
155
|
+
const params = new URLSearchParams({
|
|
156
|
+
part: "snippet,statistics",
|
|
157
|
+
...(channelId ? { id: channelId } : { mine: "true" }),
|
|
158
|
+
});
|
|
159
|
+
return fetchJson(`${this.baseUrl}/channels?${params}`, { method: "GET", headers: this.headers }, channelSchema);
|
|
160
|
+
}
|
|
161
|
+
async searchVideos(query, maxResults = 10, pageToken) {
|
|
162
|
+
const params = new URLSearchParams({
|
|
163
|
+
part: "snippet",
|
|
164
|
+
q: query,
|
|
165
|
+
type: "video",
|
|
166
|
+
maxResults: String(maxResults),
|
|
167
|
+
...(pageToken ? { pageToken } : {}),
|
|
168
|
+
});
|
|
169
|
+
return fetchJson(`${this.baseUrl}/search?${params}`, { method: "GET", headers: this.headers }, searchSchema);
|
|
170
|
+
}
|
|
171
|
+
async getVideoInfo(videoId) {
|
|
172
|
+
const params = new URLSearchParams({
|
|
173
|
+
part: "snippet,statistics,status",
|
|
174
|
+
id: videoId,
|
|
175
|
+
});
|
|
176
|
+
return fetchJson(`${this.baseUrl}/videos?${params}`, { method: "GET", headers: this.headers }, videoSchema);
|
|
177
|
+
}
|
|
178
|
+
async listChannelVideos(channelId, maxResults = 10, pageToken) {
|
|
179
|
+
const params = new URLSearchParams({
|
|
180
|
+
part: "snippet",
|
|
181
|
+
channelId,
|
|
182
|
+
type: "video",
|
|
183
|
+
order: "date",
|
|
184
|
+
maxResults: String(maxResults),
|
|
185
|
+
...(pageToken ? { pageToken } : {}),
|
|
186
|
+
});
|
|
187
|
+
return fetchJson(`${this.baseUrl}/search?${params}`, { method: "GET", headers: this.headers }, searchSchema);
|
|
188
|
+
}
|
|
189
|
+
async getComments(videoId, maxResults = 20) {
|
|
190
|
+
const params = new URLSearchParams({
|
|
191
|
+
part: "snippet",
|
|
192
|
+
videoId,
|
|
193
|
+
maxResults: String(maxResults),
|
|
194
|
+
order: "relevance",
|
|
195
|
+
});
|
|
196
|
+
return fetchJson(`${this.baseUrl}/commentThreads?${params}`, { method: "GET", headers: this.headers }, commentThreadSchema);
|
|
197
|
+
}
|
|
198
|
+
async postComment(videoId, text) {
|
|
199
|
+
const body = {
|
|
200
|
+
snippet: {
|
|
201
|
+
videoId,
|
|
202
|
+
topLevelComment: {
|
|
203
|
+
snippet: { textOriginal: text },
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
const params = new URLSearchParams({ part: "snippet" });
|
|
208
|
+
return fetchJson(`${this.baseUrl}/commentThreads?${params}`, { method: "POST", headers: this.headers, body: JSON.stringify(body) }, commentInsertSchema);
|
|
209
|
+
}
|
|
210
|
+
async updateVideo(videoId, title, description, tags, categoryId = "22") {
|
|
211
|
+
const body = {
|
|
212
|
+
id: videoId,
|
|
213
|
+
snippet: {
|
|
214
|
+
title,
|
|
215
|
+
description,
|
|
216
|
+
categoryId,
|
|
217
|
+
...(tags ? { tags } : {}),
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
const params = new URLSearchParams({ part: "snippet" });
|
|
221
|
+
return fetchJson(`${this.baseUrl}/videos?${params}`, { method: "PUT", headers: this.headers, body: JSON.stringify(body) }, videoUpdateSchema);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
let _instance;
|
|
225
|
+
export function getYouTubeService() {
|
|
226
|
+
if (!_instance)
|
|
227
|
+
_instance = new YouTubeService();
|
|
228
|
+
return _instance;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=youtube-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"youtube-service.js","sourceRoot":"","sources":["../../src/services/youtube-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const params: z.ZodObject<{
|
|
3
|
+
channelId: z.ZodOptional<z.ZodString>;
|
|
4
|
+
}, z.core.$strip>;
|
|
5
|
+
type Params = z.infer<typeof params>;
|
|
6
|
+
export declare const getChannelInfoTool: {
|
|
7
|
+
readonly name: "YOUTUBE_GET_CHANNEL_INFO";
|
|
8
|
+
readonly description: "Get YouTube channel information including subscriber count, view count, and video count";
|
|
9
|
+
readonly parameters: z.ZodObject<{
|
|
10
|
+
channelId: z.ZodOptional<z.ZodString>;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
readonly execute: (p: Params) => Promise<string>;
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CredentialsError } from "../../lib/errors.js";
|
|
3
|
+
import { getYouTubeService } from "../../services/youtube-service.js";
|
|
4
|
+
const params = z.object({
|
|
5
|
+
channelId: z.string().optional().describe("Channel ID to look up. Omit to get the authenticated user's own channel."),
|
|
6
|
+
});
|
|
7
|
+
export const getChannelInfoTool = {
|
|
8
|
+
name: "YOUTUBE_GET_CHANNEL_INFO",
|
|
9
|
+
description: "Get YouTube channel information including subscriber count, view count, and video count",
|
|
10
|
+
parameters: params,
|
|
11
|
+
execute: async (p) => {
|
|
12
|
+
try {
|
|
13
|
+
const result = await getYouTubeService().getChannelInfo(p.channelId);
|
|
14
|
+
const channel = result.items?.[0];
|
|
15
|
+
if (!channel)
|
|
16
|
+
return "No channel found.";
|
|
17
|
+
const s = channel.snippet;
|
|
18
|
+
const st = channel.statistics;
|
|
19
|
+
return [
|
|
20
|
+
`YouTube Channel Info:`,
|
|
21
|
+
s?.title ? `Name: ${s.title}` : null,
|
|
22
|
+
s?.customUrl ? `Handle: ${s.customUrl}` : null,
|
|
23
|
+
s?.description ? `Description: ${s.description}` : null,
|
|
24
|
+
s?.country ? `Country: ${s.country}` : null,
|
|
25
|
+
s?.publishedAt ? `Created: ${s.publishedAt}` : null,
|
|
26
|
+
st?.subscriberCount ? `Subscribers: ${st.subscriberCount}` : null,
|
|
27
|
+
st?.viewCount ? `Total views: ${st.viewCount}` : null,
|
|
28
|
+
st?.videoCount ? `Videos: ${st.videoCount}` : null,
|
|
29
|
+
channel.id ? `Channel ID: ${channel.id}` : null,
|
|
30
|
+
]
|
|
31
|
+
.filter(Boolean)
|
|
32
|
+
.join("\n");
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (error instanceof CredentialsError)
|
|
36
|
+
return `Error: ${error.message}`;
|
|
37
|
+
return `Error fetching YouTube channel info: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=get-channel-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-channel-info.js","sourceRoot":"","sources":["../../../src/tools/youtube-tools/get-channel-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;CACrH,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,yFAAyF;IACtG,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,OAAO;gBAAE,OAAO,mBAAmB,CAAC;YACzC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;YAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;YAC9B,OAAO;gBACN,uBAAuB;gBACvB,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;gBACpC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;gBAC9C,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;gBACvD,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;gBAC3C,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;gBACnD,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI;gBACjE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;gBACrD,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI;gBAClD,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;aAC/C;iBACC,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,wCAAwC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QAC3G,CAAC;IACF,CAAC;CACQ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const params: z.ZodObject<{
|
|
3
|
+
videoId: z.ZodString;
|
|
4
|
+
maxResults: z.ZodDefault<z.ZodNumber>;
|
|
5
|
+
}, z.core.$strip>;
|
|
6
|
+
type Params = z.infer<typeof params>;
|
|
7
|
+
export declare const getCommentsTool: {
|
|
8
|
+
readonly name: "YOUTUBE_GET_COMMENTS";
|
|
9
|
+
readonly description: "Get top-level comments on a YouTube video";
|
|
10
|
+
readonly parameters: z.ZodObject<{
|
|
11
|
+
videoId: z.ZodString;
|
|
12
|
+
maxResults: z.ZodDefault<z.ZodNumber>;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
readonly execute: (p: Params) => Promise<string>;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CredentialsError } from "../../lib/errors.js";
|
|
3
|
+
import { getYouTubeService } from "../../services/youtube-service.js";
|
|
4
|
+
const params = z.object({
|
|
5
|
+
videoId: z.string().describe("YouTube video ID"),
|
|
6
|
+
maxResults: z.number().int().min(1).max(100).default(20).describe("Number of comments to return (1-100)"),
|
|
7
|
+
});
|
|
8
|
+
export const getCommentsTool = {
|
|
9
|
+
name: "YOUTUBE_GET_COMMENTS",
|
|
10
|
+
description: "Get top-level comments on a YouTube video",
|
|
11
|
+
parameters: params,
|
|
12
|
+
execute: async (p) => {
|
|
13
|
+
try {
|
|
14
|
+
const result = await getYouTubeService().getComments(p.videoId, p.maxResults);
|
|
15
|
+
const items = result.items;
|
|
16
|
+
if (!items?.length)
|
|
17
|
+
return "No comments found for this video.";
|
|
18
|
+
const lines = items.map((item, i) => {
|
|
19
|
+
const c = item.snippet?.topLevelComment?.snippet;
|
|
20
|
+
const author = c?.authorDisplayName ?? "Unknown";
|
|
21
|
+
const text = c?.textDisplay ?? "";
|
|
22
|
+
const likes = c?.likeCount ?? 0;
|
|
23
|
+
const replies = item.snippet?.totalReplyCount ?? 0;
|
|
24
|
+
const date = c?.publishedAt ?? "";
|
|
25
|
+
return `${i + 1}. ${author} (${date})\n ${text}\n Likes: ${likes} | Replies: ${replies}`;
|
|
26
|
+
});
|
|
27
|
+
return [`Comments on video ${p.videoId}:`, "", ...lines].join("\n");
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error instanceof CredentialsError)
|
|
31
|
+
return `Error: ${error.message}`;
|
|
32
|
+
return `Error fetching YouTube comments: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=get-comments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-comments.js","sourceRoot":"","sources":["../../../src/tools/youtube-tools/get-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAChD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;CACzG,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,2CAA2C;IACxD,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;YAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,MAAM;gBAAE,OAAO,mCAAmC,CAAC;YAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACnC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC;gBACjD,MAAM,MAAM,GAAG,CAAC,EAAE,iBAAiB,IAAI,SAAS,CAAC;gBACjD,MAAM,IAAI,GAAG,CAAC,EAAE,WAAW,IAAI,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC;gBAChC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,IAAI,CAAC,CAAC;gBACnD,MAAM,IAAI,GAAG,CAAC,EAAE,WAAW,IAAI,EAAE,CAAC;gBAClC,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,KAAK,IAAI,SAAS,IAAI,eAAe,KAAK,eAAe,OAAO,EAAE,CAAC;YAC9F,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,qBAAqB,CAAC,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACvG,CAAC;IACF,CAAC;CACQ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const params: z.ZodObject<{
|
|
3
|
+
videoId: z.ZodString;
|
|
4
|
+
}, z.core.$strip>;
|
|
5
|
+
type Params = z.infer<typeof params>;
|
|
6
|
+
export declare const getVideoInfoTool: {
|
|
7
|
+
readonly name: "YOUTUBE_GET_VIDEO_INFO";
|
|
8
|
+
readonly description: "Get detailed information about a YouTube video including statistics and status";
|
|
9
|
+
readonly parameters: z.ZodObject<{
|
|
10
|
+
videoId: z.ZodString;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
readonly execute: (p: Params) => Promise<string>;
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CredentialsError } from "../../lib/errors.js";
|
|
3
|
+
import { getYouTubeService } from "../../services/youtube-service.js";
|
|
4
|
+
const params = z.object({
|
|
5
|
+
videoId: z.string().describe("YouTube video ID (the part after ?v= in the URL)"),
|
|
6
|
+
});
|
|
7
|
+
export const getVideoInfoTool = {
|
|
8
|
+
name: "YOUTUBE_GET_VIDEO_INFO",
|
|
9
|
+
description: "Get detailed information about a YouTube video including statistics and status",
|
|
10
|
+
parameters: params,
|
|
11
|
+
execute: async (p) => {
|
|
12
|
+
try {
|
|
13
|
+
const result = await getYouTubeService().getVideoInfo(p.videoId);
|
|
14
|
+
const video = result.items?.[0];
|
|
15
|
+
if (!video)
|
|
16
|
+
return `No video found with ID: ${p.videoId}`;
|
|
17
|
+
const s = video.snippet;
|
|
18
|
+
const st = video.statistics;
|
|
19
|
+
return [
|
|
20
|
+
`YouTube Video Info:`,
|
|
21
|
+
s?.title ? `Title: ${s.title}` : null,
|
|
22
|
+
s?.channelTitle ? `Channel: ${s.channelTitle}` : null,
|
|
23
|
+
s?.publishedAt ? `Published: ${s.publishedAt}` : null,
|
|
24
|
+
s?.description ? `Description: ${s.description.slice(0, 200)}${s.description.length > 200 ? "..." : ""}` : null,
|
|
25
|
+
s?.tags?.length ? `Tags: ${s.tags.join(", ")}` : null,
|
|
26
|
+
video.status?.privacyStatus ? `Privacy: ${video.status.privacyStatus}` : null,
|
|
27
|
+
st?.viewCount ? `Views: ${st.viewCount}` : null,
|
|
28
|
+
st?.likeCount ? `Likes: ${st.likeCount}` : null,
|
|
29
|
+
st?.commentCount ? `Comments: ${st.commentCount}` : null,
|
|
30
|
+
`URL: https://www.youtube.com/watch?v=${p.videoId}`,
|
|
31
|
+
]
|
|
32
|
+
.filter(Boolean)
|
|
33
|
+
.join("\n");
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (error instanceof CredentialsError)
|
|
37
|
+
return `Error: ${error.message}`;
|
|
38
|
+
return `Error fetching YouTube video info: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=get-video-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-video-info.js","sourceRoot":"","sources":["../../../src/tools/youtube-tools/get-video-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;CAChF,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC/B,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,gFAAgF;IAC7F,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK;gBAAE,OAAO,2BAA2B,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1D,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;YACxB,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC;YAC5B,OAAO;gBACN,qBAAqB;gBACrB,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;gBACrC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI;gBACrD,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;gBACrD,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;gBAC/G,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;gBACrD,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI;gBAC7E,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;gBAC/C,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;gBAC/C,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI;gBACxD,wCAAwC,CAAC,CAAC,OAAO,EAAE;aACnD;iBACC,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,sCAAsC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACzG,CAAC;IACF,CAAC;CACQ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const params: z.ZodObject<{
|
|
3
|
+
channelId: z.ZodString;
|
|
4
|
+
maxResults: z.ZodDefault<z.ZodNumber>;
|
|
5
|
+
pageToken: z.ZodOptional<z.ZodString>;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
type Params = z.infer<typeof params>;
|
|
8
|
+
export declare const listChannelVideosTool: {
|
|
9
|
+
readonly name: "YOUTUBE_LIST_CHANNEL_VIDEOS";
|
|
10
|
+
readonly description: "List the most recent videos uploaded to a YouTube channel";
|
|
11
|
+
readonly parameters: z.ZodObject<{
|
|
12
|
+
channelId: z.ZodString;
|
|
13
|
+
maxResults: z.ZodDefault<z.ZodNumber>;
|
|
14
|
+
pageToken: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
readonly execute: (p: Params) => Promise<string>;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CredentialsError } from "../../lib/errors.js";
|
|
3
|
+
import { getYouTubeService } from "../../services/youtube-service.js";
|
|
4
|
+
const params = z.object({
|
|
5
|
+
channelId: z.string().describe("YouTube channel ID"),
|
|
6
|
+
maxResults: z.number().int().min(1).max(50).default(10).describe("Number of videos to return (1-50)"),
|
|
7
|
+
pageToken: z.string().optional().describe("Page token for pagination"),
|
|
8
|
+
});
|
|
9
|
+
export const listChannelVideosTool = {
|
|
10
|
+
name: "YOUTUBE_LIST_CHANNEL_VIDEOS",
|
|
11
|
+
description: "List the most recent videos uploaded to a YouTube channel",
|
|
12
|
+
parameters: params,
|
|
13
|
+
execute: async (p) => {
|
|
14
|
+
try {
|
|
15
|
+
const result = await getYouTubeService().listChannelVideos(p.channelId, p.maxResults, p.pageToken);
|
|
16
|
+
const items = result.items;
|
|
17
|
+
if (!items?.length)
|
|
18
|
+
return "No videos found for this channel.";
|
|
19
|
+
const lines = items.map((item, i) => {
|
|
20
|
+
const title = item.snippet?.title ?? "Untitled";
|
|
21
|
+
const published = item.snippet?.publishedAt ?? "";
|
|
22
|
+
const videoId = item.id?.videoId;
|
|
23
|
+
const url = videoId ? `https://www.youtube.com/watch?v=${videoId}` : "N/A";
|
|
24
|
+
return `${i + 1}. ${title}\n Published: ${published}\n URL: ${url}`;
|
|
25
|
+
});
|
|
26
|
+
const next = result.nextPageToken ? `\nNext page token: ${result.nextPageToken}` : "";
|
|
27
|
+
return [`Recent videos for channel ${p.channelId}:`, "", ...lines, next].join("\n").trim();
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error instanceof CredentialsError)
|
|
31
|
+
return `Error: ${error.message}`;
|
|
32
|
+
return `Error listing YouTube channel videos: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=list-channel-videos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-channel-videos.js","sourceRoot":"","sources":["../../../src/tools/youtube-tools/list-channel-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACpD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACrG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;CACtE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACpC,IAAI,EAAE,6BAA6B;IACnC,WAAW,EAAE,2DAA2D;IACxE,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;YACnG,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,MAAM;gBAAE,OAAO,mCAAmC,CAAC;YAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACnC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,UAAU,CAAC;gBAChD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE,CAAC;gBAClD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC;gBACjC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC3E,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,mBAAmB,SAAS,aAAa,GAAG,EAAE,CAAC;YACzE,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,sBAAsB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtF,OAAO,CAAC,6BAA6B,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,yCAAyC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QAC5G,CAAC;IACF,CAAC;CACQ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const params: z.ZodObject<{
|
|
3
|
+
videoId: z.ZodString;
|
|
4
|
+
text: z.ZodString;
|
|
5
|
+
}, z.core.$strip>;
|
|
6
|
+
type Params = z.infer<typeof params>;
|
|
7
|
+
export declare const postCommentTool: {
|
|
8
|
+
readonly name: "YOUTUBE_POST_COMMENT";
|
|
9
|
+
readonly description: "Post a top-level comment on a YouTube video";
|
|
10
|
+
readonly parameters: z.ZodObject<{
|
|
11
|
+
videoId: z.ZodString;
|
|
12
|
+
text: z.ZodString;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
readonly execute: (p: Params) => Promise<string>;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CredentialsError } from "../../lib/errors.js";
|
|
3
|
+
import { getYouTubeService } from "../../services/youtube-service.js";
|
|
4
|
+
const params = z.object({
|
|
5
|
+
videoId: z.string().describe("YouTube video ID to comment on"),
|
|
6
|
+
text: z.string().min(1).describe("Comment text"),
|
|
7
|
+
});
|
|
8
|
+
export const postCommentTool = {
|
|
9
|
+
name: "YOUTUBE_POST_COMMENT",
|
|
10
|
+
description: "Post a top-level comment on a YouTube video",
|
|
11
|
+
parameters: params,
|
|
12
|
+
execute: async (p) => {
|
|
13
|
+
try {
|
|
14
|
+
const result = await getYouTubeService().postComment(p.videoId, p.text);
|
|
15
|
+
const commentId = result.id;
|
|
16
|
+
return `Comment posted successfully!\nComment ID: ${commentId ?? "unknown"}\nURL: https://www.youtube.com/watch?v=${p.videoId}`;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (error instanceof CredentialsError)
|
|
20
|
+
return `Error: ${error.message}`;
|
|
21
|
+
return `Error posting YouTube comment: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=post-comment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-comment.js","sourceRoot":"","sources":["../../../src/tools/youtube-tools/post-comment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC9D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;CAChD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,6CAA6C;IAC1D,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACxE,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,6CAA6C,SAAS,IAAI,SAAS,0CAA0C,CAAC,CAAC,OAAO,EAAE,CAAC;QACjI,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACrG,CAAC;IACF,CAAC;CACQ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const params: z.ZodObject<{
|
|
3
|
+
query: z.ZodString;
|
|
4
|
+
maxResults: z.ZodDefault<z.ZodNumber>;
|
|
5
|
+
pageToken: z.ZodOptional<z.ZodString>;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
type Params = z.infer<typeof params>;
|
|
8
|
+
export declare const searchVideosTool: {
|
|
9
|
+
readonly name: "YOUTUBE_SEARCH_VIDEOS";
|
|
10
|
+
readonly description: "Search YouTube for videos by keyword";
|
|
11
|
+
readonly parameters: z.ZodObject<{
|
|
12
|
+
query: z.ZodString;
|
|
13
|
+
maxResults: z.ZodDefault<z.ZodNumber>;
|
|
14
|
+
pageToken: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
readonly execute: (p: Params) => Promise<string>;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CredentialsError } from "../../lib/errors.js";
|
|
3
|
+
import { getYouTubeService } from "../../services/youtube-service.js";
|
|
4
|
+
const params = z.object({
|
|
5
|
+
query: z.string().min(1).describe("Search query"),
|
|
6
|
+
maxResults: z.number().int().min(1).max(50).default(10).describe("Number of results to return (1-50)"),
|
|
7
|
+
pageToken: z.string().optional().describe("Page token for pagination"),
|
|
8
|
+
});
|
|
9
|
+
export const searchVideosTool = {
|
|
10
|
+
name: "YOUTUBE_SEARCH_VIDEOS",
|
|
11
|
+
description: "Search YouTube for videos by keyword",
|
|
12
|
+
parameters: params,
|
|
13
|
+
execute: async (p) => {
|
|
14
|
+
try {
|
|
15
|
+
const result = await getYouTubeService().searchVideos(p.query, p.maxResults, p.pageToken);
|
|
16
|
+
const items = result.items;
|
|
17
|
+
if (!items?.length)
|
|
18
|
+
return "No videos found for that query.";
|
|
19
|
+
const lines = items.map((item, i) => {
|
|
20
|
+
const title = item.snippet?.title ?? "Untitled";
|
|
21
|
+
const channel = item.snippet?.channelTitle ?? "Unknown";
|
|
22
|
+
const videoId = item.id?.videoId;
|
|
23
|
+
const url = videoId ? `https://www.youtube.com/watch?v=${videoId}` : "N/A";
|
|
24
|
+
return `${i + 1}. ${title}\n Channel: ${channel}\n URL: ${url}`;
|
|
25
|
+
});
|
|
26
|
+
const total = result.pageInfo?.totalResults;
|
|
27
|
+
const next = result.nextPageToken ? `\nNext page token: ${result.nextPageToken}` : "";
|
|
28
|
+
return [`Search results for "${p.query}"${total ? ` (${total} total)` : ""}:`, "", ...lines, next]
|
|
29
|
+
.join("\n")
|
|
30
|
+
.trim();
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof CredentialsError)
|
|
34
|
+
return `Error: ${error.message}`;
|
|
35
|
+
return `Error searching YouTube: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=search-videos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-videos.js","sourceRoot":"","sources":["../../../src/tools/youtube-tools/search-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;IACjD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACtG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;CACtE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC/B,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,sCAAsC;IACnD,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;YAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,MAAM;gBAAE,OAAO,iCAAiC,CAAC;YAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACnC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,UAAU,CAAC;gBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,SAAS,CAAC;gBACxD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC;gBACjC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC3E,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,iBAAiB,OAAO,aAAa,GAAG,EAAE,CAAC;YACrE,CAAC,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;YAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,sBAAsB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtF,OAAO,CAAC,uBAAuB,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC;iBAChG,IAAI,CAAC,IAAI,CAAC;iBACV,IAAI,EAAE,CAAC;QACV,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QAC/F,CAAC;IACF,CAAC;CACQ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const params: z.ZodObject<{
|
|
3
|
+
videoId: z.ZodString;
|
|
4
|
+
title: z.ZodString;
|
|
5
|
+
description: z.ZodString;
|
|
6
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
7
|
+
categoryId: z.ZodDefault<z.ZodString>;
|
|
8
|
+
}, z.core.$strip>;
|
|
9
|
+
type Params = z.infer<typeof params>;
|
|
10
|
+
export declare const updateVideoTool: {
|
|
11
|
+
readonly name: "YOUTUBE_UPDATE_VIDEO";
|
|
12
|
+
readonly description: "Update the title, description, and tags of a YouTube video you own";
|
|
13
|
+
readonly parameters: z.ZodObject<{
|
|
14
|
+
videoId: z.ZodString;
|
|
15
|
+
title: z.ZodString;
|
|
16
|
+
description: z.ZodString;
|
|
17
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
18
|
+
categoryId: z.ZodDefault<z.ZodString>;
|
|
19
|
+
}, z.core.$strip>;
|
|
20
|
+
readonly execute: (p: Params) => Promise<string>;
|
|
21
|
+
};
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CredentialsError } from "../../lib/errors.js";
|
|
3
|
+
import { getYouTubeService } from "../../services/youtube-service.js";
|
|
4
|
+
const params = z.object({
|
|
5
|
+
videoId: z.string().describe("YouTube video ID to update"),
|
|
6
|
+
title: z.string().min(1).max(100).describe("New video title"),
|
|
7
|
+
description: z.string().max(5000).describe("New video description"),
|
|
8
|
+
tags: z.array(z.string()).optional().describe("List of tags for the video"),
|
|
9
|
+
categoryId: z.string().default("22").describe("YouTube category ID (default: 22 = People & Blogs)"),
|
|
10
|
+
});
|
|
11
|
+
export const updateVideoTool = {
|
|
12
|
+
name: "YOUTUBE_UPDATE_VIDEO",
|
|
13
|
+
description: "Update the title, description, and tags of a YouTube video you own",
|
|
14
|
+
parameters: params,
|
|
15
|
+
execute: async (p) => {
|
|
16
|
+
try {
|
|
17
|
+
const result = await getYouTubeService().updateVideo(p.videoId, p.title, p.description, p.tags, p.categoryId);
|
|
18
|
+
return [
|
|
19
|
+
`Video updated successfully!`,
|
|
20
|
+
`Video ID: ${result.id ?? p.videoId}`,
|
|
21
|
+
`Title: ${result.snippet?.title ?? p.title}`,
|
|
22
|
+
`URL: https://www.youtube.com/watch?v=${p.videoId}`,
|
|
23
|
+
].join("\n");
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (error instanceof CredentialsError)
|
|
27
|
+
return `Error: ${error.message}`;
|
|
28
|
+
return `Error updating YouTube video: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=update-video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-video.js","sourceRoot":"","sources":["../../../src/tools/youtube-tools/update-video.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAC1D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC7D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACnE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAC3E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,oDAAoD,CAAC;CACnG,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,oEAAoE;IACjF,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC,WAAW,CACnD,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,KAAK,EACP,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,UAAU,CACZ,CAAC;YACF,OAAO;gBACN,6BAA6B;gBAC7B,aAAa,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE;gBACrC,UAAU,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE;gBAC5C,wCAAwC,CAAC,CAAC,OAAO,EAAE;aACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACpG,CAAC;IACF,CAAC;CACQ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "social-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.1",
|
|
4
4
|
"description": "MCP server for posting and interacting across social media platforms: Twitter, Instagram, Facebook, WhatsApp, Discord, Telegram, Slack, LinkedIn, Reddit, Threads, and TikTok",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|