@scavio/mcp-server 0.3.2 → 0.5.0

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 CHANGED
@@ -3,7 +3,7 @@
3
3
  ![GitHub Repo stars](https://img.shields.io/github/stars/scavio-ai/scavio-mcp?style=social)
4
4
  ![License](https://img.shields.io/github/license/scavio-ai/scavio-mcp)
5
5
 
6
- [Scavio](https://scavio.dev) is a unified [Web Search API](https://scavio.dev/docs/search-api) and MCP server that connects AI agents to Google, YouTube, Amazon, Walmart, TikTok, Instagram, and Reddit. 46 tools for web search, product lookup, video discovery, and social media data through a single [Search API](https://scavio.dev/docs/search-api) endpoint.
6
+ [Scavio](https://scavio.dev) is a unified [Web Search API](https://scavio.dev/docs/search-api) and MCP server that connects AI agents to Google, YouTube, Amazon, Walmart, TikTok, Instagram, Reddit, Twitter, and LinkedIn. 95 tools for web search, product lookup, video discovery, and social media data through a single [Search API](https://scavio.dev/docs/search-api) endpoint.
7
7
 
8
8
  ## Remote MCP Server
9
9
 
@@ -216,7 +216,21 @@ Add to settings (`Cmd+,`):
216
216
  | Tool | Description |
217
217
  |------|-------------|
218
218
  | `search_youtube` | Search videos, channels, and playlists |
219
- | `get_youtube_metadata` | Get video metadata including title, views, likes, and duration |
219
+ | `search_youtube_shorts` | Search short-form videos |
220
+ | `youtube_search_suggestions` | Get search autocomplete suggestions |
221
+ | `get_youtube_video` | Get full video details, chapters, and captions |
222
+ | `get_youtube_metadata` | Deprecated alias of `get_youtube_video` |
223
+ | `get_youtube_comments` | Get comments on a video with pagination |
224
+ | `get_youtube_comment_replies` | Get replies to a specific comment |
225
+ | `get_youtube_transcript` | Get a video transcript as plain text or SRT |
226
+ | `get_youtube_related` | Get videos related to a video |
227
+ | `search_youtube_channels` | Search channels by keyword |
228
+ | `get_youtube_channel` | Get channel profile by ID, handle, or URL |
229
+ | `get_youtube_channel_videos` | List a channel's videos |
230
+ | `get_youtube_channel_shorts` | List a channel's Shorts |
231
+ | `get_youtube_channel_community` | List a channel's community posts |
232
+ | `resolve_youtube_channel` | Resolve a handle or URL to a channel ID |
233
+ | `get_youtube_streams` | Get direct media stream URLs for a video |
220
234
 
221
235
  ### [Amazon Product API](https://scavio.dev/docs/amazon-api)
222
236
 
@@ -271,6 +285,51 @@ Add to settings (`Cmd+,`):
271
285
  |------|-------------|
272
286
  | `search_reddit` | Search Reddit posts by query with sort and pagination |
273
287
  | `get_reddit_post` | Get a full post with threaded comments by URL |
288
+ | `get_reddit_search_suggestions` | Get search autocomplete suggestions |
289
+ | `get_reddit_post_comments` | Get a post's top-level comments with pagination |
290
+ | `get_reddit_comment_replies` | Get replies to a specific comment |
291
+ | `get_reddit_subreddit` | Get subreddit metadata and subscriber count |
292
+ | `get_reddit_subreddit_posts` | List a subreddit's post feed |
293
+ | `get_reddit_user` | Get a redditor's profile |
294
+ | `get_reddit_user_posts` | List a redditor's submitted posts |
295
+ | `get_reddit_user_comments` | List a redditor's comments |
296
+ | `get_reddit_popular` | Get the site-wide popular feed |
297
+ | `get_reddit_trending` | Get current trending search queries |
298
+
299
+ ### [Twitter API](https://scavio.dev/docs/twitter-api)
300
+
301
+ | Tool | Description |
302
+ |------|-------------|
303
+ | `search_twitter` | Search tweets and people by keyword |
304
+ | `get_tweet` | Get full details for a single tweet |
305
+ | `get_tweet_comments` | Get replies to a tweet (ranked or chronological) |
306
+ | `get_tweet_retweeters` | List users who retweeted a tweet |
307
+ | `get_twitter_user` | Get a user's profile by handle |
308
+ | `get_twitter_user_tweets` | List a user's tweets |
309
+ | `get_twitter_user_replies` | List a user's tweets and replies |
310
+ | `get_twitter_user_media` | List a user's media tweets |
311
+ | `get_twitter_user_followers` | List a user's followers |
312
+ | `get_twitter_user_followings` | List accounts a user follows |
313
+ | `get_twitter_trending` | Get trending topics for a country |
314
+
315
+ ### [LinkedIn API](https://scavio.dev/docs/linkedin-api)
316
+
317
+ | Tool | Description |
318
+ |------|-------------|
319
+ | `get_linkedin_person` | Get a member's full profile |
320
+ | `get_linkedin_person_about` | Get a member's about/overview metadata |
321
+ | `get_linkedin_person_posts` | List a member's recent posts |
322
+ | `get_linkedin_person_contact` | Get a member's public contact info |
323
+ | `get_linkedin_company` | Get a company's profile |
324
+ | `get_linkedin_company_posts` | List a company's recent posts |
325
+ | `get_linkedin_company_people` | List people who work at a company |
326
+ | `get_linkedin_company_jobs` | List a company's open job listings |
327
+ | `search_linkedin_people` | Search for people by name, title, company, or school |
328
+ | `search_linkedin_jobs` | Search for jobs by keyword |
329
+ | `search_linkedin_posts` | Search for posts by keyword |
330
+ | `get_linkedin_job` | Get full details for a job listing |
331
+ | `get_linkedin_post` | Get full details for a single post |
332
+ | `get_linkedin_post_comments` | Get comments on a post |
274
333
 
275
334
  ### Account
276
335
 
@@ -282,11 +341,13 @@ Add to settings (`Cmd+,`):
282
341
 
283
342
  ## About Scavio
284
343
 
285
- [Scavio](https://scavio.dev) is a unified [Web Search API](https://scavio.dev/docs/search-api) and data API for AI agents and developers. One key, structured JSON, no scraping or proxies:
344
+ [Scavio](https://scavio.dev) is a unified [search API for AI agents](https://scavio.dev/search-api-for-ai-agents) and a data API for developers. One key, structured JSON, no scraping or proxies:
345
+
346
+ - [Google Search API](https://scavio.dev/google-search-api) — SERP results, news, images, maps, and knowledge graph
347
+ - [Amazon Product API](https://scavio.dev/amazon-product-api) and [Walmart Product API](https://scavio.dev/walmart-product-api) — product search and details
348
+ - [TikTok API](https://scavio.dev/tiktok-api), [Instagram API](https://scavio.dev/instagram-api), [Reddit API](https://scavio.dev/reddit-api), [Twitter API](https://scavio.dev/twitter-api), [LinkedIn API](https://scavio.dev/linkedin-api), and [YouTube API](https://scavio.dev/youtube-transcript-api) — social and video data
286
349
 
287
- - [Google Search API](https://scavio.dev/docs/search-api) — SERP results, news, images, maps, and knowledge graph
288
- - [Amazon Product API](https://scavio.dev/docs/amazon-api) and [Walmart API](https://scavio.dev/docs/walmart-api) — product search and details
289
- - [TikTok API](https://scavio.dev/docs/tiktok-api), [Instagram API](https://scavio.dev/docs/instagram-api), [Reddit API](https://scavio.dev/docs/reddit-api), and [YouTube API](https://scavio.dev/docs/youtube-api) — social and video data
350
+ Teams use it as a [SerpAPI alternative](https://scavio.dev/alternatives/serpapi) with structured multi-platform data — see [Tavily vs Scavio](https://scavio.dev/compare/tavily/vs-scavio) for a head-to-head comparison.
290
351
 
291
352
  Get a free [Search API](https://scavio.dev/docs/search-api) key at [scavio.dev](https://scavio.dev).
292
353
 
@@ -6,6 +6,8 @@ import { registerUsageTool } from "./usage.js";
6
6
  import { registerTiktokTools } from "./tiktok.js";
7
7
  import { registerInstagramTools } from "./instagram.js";
8
8
  import { registerRedditTools } from "./reddit.js";
9
+ import { registerTwitterTools } from "./twitter.js";
10
+ import { registerLinkedinTools } from "./linkedin.js";
9
11
  export function registerAllTools(server, getClient) {
10
12
  registerGoogleTools(server, getClient);
11
13
  registerYoutubeTools(server, getClient);
@@ -14,6 +16,8 @@ export function registerAllTools(server, getClient) {
14
16
  registerTiktokTools(server, getClient);
15
17
  registerInstagramTools(server, getClient);
16
18
  registerRedditTools(server, getClient);
19
+ registerTwitterTools(server, getClient);
20
+ registerLinkedinTools(server, getClient);
17
21
  registerUsageTool(server, getClient);
18
22
  }
19
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,SAA6B;IAC/E,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC1C,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,SAA6B;IAC/E,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC1C,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ScavioClient } from "../lib/client.js";
3
+ export declare function registerLinkedinTools(server: McpServer, getClient: () => ScavioClient): void;
@@ -0,0 +1,250 @@
1
+ import { z } from "zod";
2
+ import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
3
+ import { ApiError } from "../lib/errors.js";
4
+ function handleApiError(err) {
5
+ if (err instanceof ApiError) {
6
+ if (err.status === 429)
7
+ return { isError: true, content: [{ type: "text", text: "Rate limited. Wait and retry." }] };
8
+ if (err.status === 401)
9
+ throw new McpError(ErrorCode.InternalError, "Invalid SCAVIO_API_KEY. Check your configuration.");
10
+ return { isError: true, content: [{ type: "text", text: `Scavio API error (${err.status}): ${err.message}` }] };
11
+ }
12
+ throw new McpError(ErrorCode.InternalError, String(err));
13
+ }
14
+ export function registerLinkedinTools(server, getClient) {
15
+ server.tool("get_linkedin_person", `Get a LinkedIn member's full profile as JSON. Returns the member urn, public identifier, name, headline, location, premium/open-to-work/hiring flags, avatar, about, experiences, educations, skills, and follower/connection counts. Accepts the public identifier (vanity handle). Costs 4 credits.`, {
16
+ username: z.string().min(1)
17
+ .describe("Public identifier (vanity handle), e.g. 'williamhgates'."),
18
+ include_experiences: z.boolean().optional()
19
+ .describe("Include the work experience section (default true)."),
20
+ include_educations: z.boolean().optional()
21
+ .describe("Include the education section (default true)."),
22
+ include_skills: z.boolean().optional()
23
+ .describe("Include the skills section (default true)."),
24
+ include_certifications: z.boolean().optional()
25
+ .describe("Include the certifications section (default true)."),
26
+ include_follower_and_connection: z.boolean().optional()
27
+ .describe("Include follower and connection counts (default true)."),
28
+ }, async (params) => {
29
+ try {
30
+ const data = await getClient().post("/api/v1/linkedin/person", params);
31
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
32
+ }
33
+ catch (err) {
34
+ return handleApiError(err);
35
+ }
36
+ });
37
+ server.tool("get_linkedin_person_about", `Get about/overview metadata for a LinkedIn member as JSON, including join date, contact information, and profile photo. Provide the member urn, or a username that will be resolved to a urn. Costs 4 credits.`, {
38
+ urn: z.string().min(1).optional()
39
+ .describe("Member urn, e.g. 'ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc'."),
40
+ username: z.string().min(1).optional()
41
+ .describe("Public identifier; resolved to a urn if urn is omitted, e.g. 'williamhgates'."),
42
+ }, async (params) => {
43
+ try {
44
+ const data = await getClient().post("/api/v1/linkedin/person/about", params);
45
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
46
+ }
47
+ catch (err) {
48
+ return handleApiError(err);
49
+ }
50
+ });
51
+ server.tool("get_linkedin_person_posts", `List a LinkedIn member's recent posts as JSON. Each post includes its ID, type, text, content (images, video, article, poll), and activity counts (likes, comments, shares). Provide the member urn or a username. Use data.next_cursor as the next cursor while has_more is true. Costs 4 credits.`, {
52
+ urn: z.string().min(1).optional()
53
+ .describe("Member urn, e.g. 'ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc'."),
54
+ username: z.string().min(1).optional()
55
+ .describe("Public identifier; resolved if urn is omitted, e.g. 'williamhgates'."),
56
+ cursor: z.string().optional()
57
+ .describe("Pagination cursor (next_cursor) from a previous response."),
58
+ }, async (params) => {
59
+ try {
60
+ const data = await getClient().post("/api/v1/linkedin/person/posts", params);
61
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
62
+ }
63
+ catch (err) {
64
+ return handleApiError(err);
65
+ }
66
+ });
67
+ server.tool("get_linkedin_person_contact", `Get a LinkedIn member's public contact information as JSON. Accepts the public identifier (vanity handle). Costs 4 credits.`, {
68
+ username: z.string().min(1)
69
+ .describe("Public identifier (vanity handle), e.g. 'williamhgates'."),
70
+ }, async (params) => {
71
+ try {
72
+ const data = await getClient().post("/api/v1/linkedin/person/contact", params);
73
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
74
+ }
75
+ catch (err) {
76
+ return handleApiError(err);
77
+ }
78
+ });
79
+ server.tool("get_linkedin_company", `Get a LinkedIn company's profile as JSON. Accepts the company universal name (slug) or a LinkedIn company URL. Costs 1 credit.`, {
80
+ company: z.string().min(1)
81
+ .describe("Company universal name (slug) or LinkedIn company URL, e.g. 'microsoft'."),
82
+ }, async (params) => {
83
+ try {
84
+ const data = await getClient().post("/api/v1/linkedin/company", params);
85
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
86
+ }
87
+ catch (err) {
88
+ return handleApiError(err);
89
+ }
90
+ });
91
+ server.tool("get_linkedin_company_posts", `List a LinkedIn company's recent posts as JSON. Accepts the company slug or URL. Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
92
+ company: z.string().min(1)
93
+ .describe("Company universal name (slug) or LinkedIn company URL, e.g. 'microsoft'."),
94
+ cursor: z.string().optional()
95
+ .describe("Pagination cursor (next_cursor) from a previous response."),
96
+ count: z.number().int().positive().max(100).optional()
97
+ .describe("Number of posts to return per page (max 100)."),
98
+ }, async (params) => {
99
+ try {
100
+ const data = await getClient().post("/api/v1/linkedin/company/posts", params);
101
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
102
+ }
103
+ catch (err) {
104
+ return handleApiError(err);
105
+ }
106
+ });
107
+ server.tool("get_linkedin_company_people", `List people who work at a LinkedIn company as JSON. Provide the numeric company_id, or a company slug/url that will be resolved to a company_id. Use data.next_cursor as the next cursor while has_more is true. Costs 4 credits.`, {
108
+ company_id: z.string().min(1).optional()
109
+ .describe("Numeric company id, e.g. '1035'."),
110
+ company: z.string().min(1).optional()
111
+ .describe("Company slug/url; resolved to a company_id if company_id is omitted, e.g. 'microsoft'."),
112
+ cursor: z.string().optional()
113
+ .describe("Pagination cursor (next_cursor) from a previous response."),
114
+ }, async (params) => {
115
+ try {
116
+ const data = await getClient().post("/api/v1/linkedin/company/people", params);
117
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
118
+ }
119
+ catch (err) {
120
+ return handleApiError(err);
121
+ }
122
+ });
123
+ server.tool("get_linkedin_company_jobs", `List a LinkedIn company's open job listings as JSON. Provide the numeric company_id, or a company slug/url that will be resolved to a company_id. Use data.next_cursor as the next cursor while has_more is true. Costs 4 credits.`, {
124
+ company_id: z.string().min(1).optional()
125
+ .describe("Numeric company id, e.g. '1035'."),
126
+ company: z.string().min(1).optional()
127
+ .describe("Company slug/url; resolved to a company_id if company_id is omitted, e.g. 'microsoft'."),
128
+ cursor: z.string().optional()
129
+ .describe("Pagination cursor (next_cursor) from a previous response."),
130
+ }, async (params) => {
131
+ try {
132
+ const data = await getClient().post("/api/v1/linkedin/company/jobs", params);
133
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
134
+ }
135
+ catch (err) {
136
+ return handleApiError(err);
137
+ }
138
+ });
139
+ server.tool("search_linkedin_people", `Search LinkedIn for people as JSON. Filter by name, title, company, or school, and optionally location. Each result includes the member urn, profile URL, public identifier, name, title, location, and verified/premium/open-to-work/hiring flags. Provide at least one of search, title, company, or school. Use data.next_cursor as the next cursor while has_more is true. Costs 4 credits.`, {
140
+ search: z.string().min(1).optional()
141
+ .describe("Name to search for, e.g. 'john'."),
142
+ title: z.string().optional()
143
+ .describe("Job title filter, e.g. 'engineer'."),
144
+ company: z.string().optional()
145
+ .describe("Company filter."),
146
+ school: z.string().optional()
147
+ .describe("School filter."),
148
+ location: z.string().optional()
149
+ .describe("A geo name or id to filter by."),
150
+ cursor: z.string().optional()
151
+ .describe("Pagination cursor (next_cursor) from a previous response."),
152
+ }, async (params) => {
153
+ try {
154
+ const data = await getClient().post("/api/v1/linkedin/search/people", params);
155
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
156
+ }
157
+ catch (err) {
158
+ return handleApiError(err);
159
+ }
160
+ });
161
+ server.tool("search_linkedin_jobs", `Search LinkedIn for jobs by keyword as JSON, with optional filters for date posted, location, experience level, remote, and job type. Use data.next_cursor as the next cursor while has_more is true. Costs 4 credits.`, {
162
+ search: z.string().min(1)
163
+ .describe("Job search keyword, e.g. 'software engineer'."),
164
+ cursor: z.string().optional()
165
+ .describe("Pagination cursor (next_cursor) from a previous response."),
166
+ date_posted: z.string().optional()
167
+ .describe("Date-posted filter."),
168
+ geocode: z.string().optional()
169
+ .describe("Location geocode filter."),
170
+ experience_level: z.string().optional()
171
+ .describe("Experience-level filter."),
172
+ remote: z.string().optional()
173
+ .describe("Remote filter."),
174
+ job_type: z.string().optional()
175
+ .describe("Job-type filter."),
176
+ }, async (params) => {
177
+ try {
178
+ const data = await getClient().post("/api/v1/linkedin/search/jobs", params);
179
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
180
+ }
181
+ catch (err) {
182
+ return handleApiError(err);
183
+ }
184
+ });
185
+ server.tool("search_linkedin_posts", `Search LinkedIn for posts by keyword as JSON. Each result includes the post ID, URL, title, activity counts (likes, comments, shares), timestamp, and author details. Use data.next_cursor as the next cursor while has_more is true. Costs 4 credits.`, {
186
+ search: z.string().min(1)
187
+ .describe("Post search keyword, e.g. 'AI agents'."),
188
+ cursor: z.string().optional()
189
+ .describe("Pagination cursor (next_cursor) from a previous response."),
190
+ date_posted: z.string().optional()
191
+ .describe("Date-posted filter."),
192
+ sort_by: z.string().optional()
193
+ .describe("Sort order filter."),
194
+ content_type: z.string().optional()
195
+ .describe("Content-type filter."),
196
+ }, async (params) => {
197
+ try {
198
+ const data = await getClient().post("/api/v1/linkedin/search/posts", params);
199
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
200
+ }
201
+ catch (err) {
202
+ return handleApiError(err);
203
+ }
204
+ });
205
+ server.tool("get_linkedin_job", `Get full details for a single LinkedIn job listing as JSON. Accepts a job ID. Costs 4 credits.`, {
206
+ job_id: z.string().min(1)
207
+ .describe("Job ID, e.g. '3900000000'."),
208
+ include_skills: z.boolean().optional()
209
+ .describe("Include the required-skills section."),
210
+ }, async (params) => {
211
+ try {
212
+ const data = await getClient().post("/api/v1/linkedin/job", params);
213
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
214
+ }
215
+ catch (err) {
216
+ return handleApiError(err);
217
+ }
218
+ });
219
+ server.tool("get_linkedin_post", `Get full details for a single LinkedIn post as JSON. Accepts a post ID or activity urn. Costs 4 credits.`, {
220
+ post_id: z.string().min(1)
221
+ .describe("Post id or activity urn, e.g. '7486820977411145728'."),
222
+ }, async (params) => {
223
+ try {
224
+ const data = await getClient().post("/api/v1/linkedin/post", params);
225
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
226
+ }
227
+ catch (err) {
228
+ return handleApiError(err);
229
+ }
230
+ });
231
+ server.tool("get_linkedin_post_comments", `Get comments on a LinkedIn post as JSON. Accepts a post ID or activity urn. Use data.next_cursor as the next cursor while has_more is true. Costs 4 credits.`, {
232
+ post_id: z.string().min(1)
233
+ .describe("Post id or activity urn, e.g. '7486820977411145728'."),
234
+ cursor: z.string().optional()
235
+ .describe("Pagination cursor (next_cursor) from a previous response."),
236
+ sort_order: z.enum(["relevance", "recent"]).optional()
237
+ .describe("'relevance' or 'recent'."),
238
+ post_type: z.enum(["activity", "ugc"]).optional()
239
+ .describe("Post type: 'activity' or 'ugc'."),
240
+ }, async (params) => {
241
+ try {
242
+ const data = await getClient().post("/api/v1/linkedin/post/comments", params);
243
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
244
+ }
245
+ catch (err) {
246
+ return handleApiError(err);
247
+ }
248
+ });
249
+ }
250
+ //# sourceMappingURL=linkedin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkedin.js","sourceRoot":"","sources":["../../src/tools/linkedin.ts"],"names":[],"mappings":"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"}
@@ -42,5 +42,142 @@ export function registerRedditTools(server, getClient) {
42
42
  return handleApiError(err);
43
43
  }
44
44
  });
45
+ server.tool("get_reddit_search_suggestions", `Get Reddit search autocomplete suggestions for a query as JSON. Returns a list of suggested search strings. Use to expand a seed keyword or surface what people search for. Costs 1 credit.`, {
46
+ search: z.string().min(1).max(500)
47
+ .describe("Partial or seed search query to autocomplete."),
48
+ }, async (params) => {
49
+ try {
50
+ const data = await getClient().post("/api/v1/reddit/search/suggestions", params);
51
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
52
+ }
53
+ catch (err) {
54
+ return handleApiError(err);
55
+ }
56
+ });
57
+ server.tool("get_reddit_post_comments", `Get the top-level comments for a Reddit post as JSON. Each comment includes its ID, text, author, score, timestamp, and a reply_cursor for fetching its replies. Accepts a post fullname (t3_...). Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
58
+ post_id: z.string().min(1)
59
+ .describe("Post fullname (t3_...), e.g. 't3_1v6ngaf'."),
60
+ sort: z.enum(["HOT", "NEW", "TOP", "BEST", "CONTROVERSIAL"]).default("TOP")
61
+ .describe("Comment sort order (default 'TOP')."),
62
+ cursor: z.string().optional()
63
+ .describe("Pagination cursor (next_cursor) from a previous response."),
64
+ }, async (params) => {
65
+ try {
66
+ const data = await getClient().post("/api/v1/reddit/post/comments", params);
67
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
68
+ }
69
+ catch (err) {
70
+ return handleApiError(err);
71
+ }
72
+ });
73
+ server.tool("get_reddit_comment_replies", `Get the replies to a specific Reddit comment as JSON. Requires the post fullname and the reply_cursor from a comment in the get_reddit_post_comments response. Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
74
+ post_id: z.string().min(1)
75
+ .describe("Post fullname (t3_...), e.g. 't3_1v6ngaf'."),
76
+ cursor: z.string().min(1)
77
+ .describe("The reply_cursor from a comment in the get_reddit_post_comments response."),
78
+ sort: z.enum(["HOT", "NEW", "TOP", "BEST", "CONTROVERSIAL"]).default("TOP")
79
+ .describe("Reply sort order (default 'TOP')."),
80
+ }, async (params) => {
81
+ try {
82
+ const data = await getClient().post("/api/v1/reddit/post/comments/replies", params);
83
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
84
+ }
85
+ catch (err) {
86
+ return handleApiError(err);
87
+ }
88
+ });
89
+ server.tool("get_reddit_subreddit", `Get metadata for a subreddit as JSON, including its name, title, description, subscriber count, type, NSFW flag, icon, banner, primary color, and creation date. Accepts a subreddit name (without r/). Costs 1 credit.`, {
90
+ subreddit: z.string().min(1).max(100)
91
+ .describe("Subreddit name without r/, e.g. 'AskReddit'."),
92
+ }, async (params) => {
93
+ try {
94
+ const data = await getClient().post("/api/v1/reddit/subreddit", params);
95
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
96
+ }
97
+ catch (err) {
98
+ return handleApiError(err);
99
+ }
100
+ });
101
+ server.tool("get_reddit_subreddit_posts", `List a subreddit's post feed as JSON. Each post includes its ID, title, URL, text, author, score, comment count, timestamp, and NSFW flag. Accepts a subreddit name (without r/). Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
102
+ subreddit: z.string().min(1).max(100)
103
+ .describe("Subreddit name without r/, e.g. 'AskReddit'."),
104
+ sort: z.enum(["BEST", "HOT", "NEW", "TOP", "CONTROVERSIAL", "RISING"]).default("HOT")
105
+ .describe("Feed sort order (default 'HOT')."),
106
+ cursor: z.string().optional()
107
+ .describe("Pagination cursor (next_cursor) from a previous response."),
108
+ }, async (params) => {
109
+ try {
110
+ const data = await getClient().post("/api/v1/reddit/subreddit/posts", params);
111
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
112
+ }
113
+ catch (err) {
114
+ return handleApiError(err);
115
+ }
116
+ });
117
+ server.tool("get_reddit_user", `Get a redditor's profile as JSON, including their ID, name, employee/verified flags, account type, and whether they accept private messages. Accepts a username (without u/). Costs 1 credit.`, {
118
+ username: z.string().min(1).max(100)
119
+ .describe("Reddit username without u/, e.g. 'spez'."),
120
+ }, async (params) => {
121
+ try {
122
+ const data = await getClient().post("/api/v1/reddit/user", params);
123
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
124
+ }
125
+ catch (err) {
126
+ return handleApiError(err);
127
+ }
128
+ });
129
+ server.tool("get_reddit_user_posts", `List a redditor's submitted posts as JSON. Each post includes its ID, title, URL, subreddit, score, comment count, and timestamp. Accepts a username (without u/). Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
130
+ username: z.string().min(1).max(100)
131
+ .describe("Reddit username without u/, e.g. 'spez'."),
132
+ sort: z.enum(["HOT", "NEW", "TOP", "BEST", "CONTROVERSIAL"]).default("NEW")
133
+ .describe("Sort order (default 'NEW')."),
134
+ cursor: z.string().optional()
135
+ .describe("Pagination cursor (next_cursor) from a previous response."),
136
+ }, async (params) => {
137
+ try {
138
+ const data = await getClient().post("/api/v1/reddit/user/posts", params);
139
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
140
+ }
141
+ catch (err) {
142
+ return handleApiError(err);
143
+ }
144
+ });
145
+ server.tool("get_reddit_user_comments", `List a redditor's comments as JSON. Each comment includes its ID, text, author, the post it belongs to (ID and title), score, and timestamp. Accepts a username (without u/). Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
146
+ username: z.string().min(1).max(100)
147
+ .describe("Reddit username without u/, e.g. 'spez'."),
148
+ sort: z.enum(["HOT", "NEW", "TOP", "BEST", "CONTROVERSIAL"]).default("NEW")
149
+ .describe("Sort order (default 'NEW')."),
150
+ cursor: z.string().optional()
151
+ .describe("Pagination cursor (next_cursor) from a previous response."),
152
+ }, async (params) => {
153
+ try {
154
+ const data = await getClient().post("/api/v1/reddit/user/comments", params);
155
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
156
+ }
157
+ catch (err) {
158
+ return handleApiError(err);
159
+ }
160
+ });
161
+ server.tool("get_reddit_popular", `Get the site-wide popular feed as JSON. Each post includes its ID, title, subreddit, author, score, comment count, URL, and timestamp. Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
162
+ cursor: z.string().optional()
163
+ .describe("Pagination cursor (next_cursor) from a previous response."),
164
+ }, async (params) => {
165
+ try {
166
+ const data = await getClient().post("/api/v1/reddit/popular", params);
167
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
168
+ }
169
+ catch (err) {
170
+ return handleApiError(err);
171
+ }
172
+ });
173
+ server.tool("get_reddit_trending", `Get Reddit's current trending search queries as JSON. Each entry includes the display query and the raw query. Takes no parameters. Costs 1 credit.`, {}, async () => {
174
+ try {
175
+ const data = await getClient().post("/api/v1/reddit/trending", {});
176
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
177
+ }
178
+ catch (err) {
179
+ return handleApiError(err);
180
+ }
181
+ });
45
182
  }
46
183
  //# sourceMappingURL=reddit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reddit.js","sourceRoot":"","sources":["../../src/tools/reddit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reddit.js","sourceRoot":"","sources":["../../src/tools/reddit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ScavioClient } from "../lib/client.js";
3
+ export declare function registerTwitterTools(server: McpServer, getClient: () => ScavioClient): void;
@@ -0,0 +1,168 @@
1
+ import { z } from "zod";
2
+ import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
3
+ import { ApiError } from "../lib/errors.js";
4
+ function handleApiError(err) {
5
+ if (err instanceof ApiError) {
6
+ if (err.status === 429)
7
+ return { isError: true, content: [{ type: "text", text: "Rate limited. Wait and retry." }] };
8
+ if (err.status === 401)
9
+ throw new McpError(ErrorCode.InternalError, "Invalid SCAVIO_API_KEY. Check your configuration.");
10
+ return { isError: true, content: [{ type: "text", text: `Scavio API error (${err.status}): ${err.message}` }] };
11
+ }
12
+ throw new McpError(ErrorCode.InternalError, String(err));
13
+ }
14
+ export function registerTwitterTools(server, getClient) {
15
+ server.tool("search_twitter", `Search Twitter (X) for tweets and people as JSON. Each result includes the tweet ID, author handle, text, language, timestamp, and engagement counts (favorites, retweets, replies, quotes, bookmarks, views). Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit. Use when the user asks to find tweets or accounts about a topic.`, {
16
+ search: z.string().min(1).max(500)
17
+ .describe("Twitter search query."),
18
+ search_type: z.enum(["Top", "Latest", "People", "Photos", "Videos"]).optional()
19
+ .describe("Result category. 'Top' (default), 'Latest', 'People', 'Photos', or 'Videos'."),
20
+ cursor: z.string().optional()
21
+ .describe("Pagination cursor (next_cursor) from a previous response."),
22
+ }, async (params) => {
23
+ try {
24
+ const data = await getClient().post("/api/v1/twitter/search", params);
25
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
26
+ }
27
+ catch (err) {
28
+ return handleApiError(err);
29
+ }
30
+ });
31
+ server.tool("get_tweet", `Get full details for a single tweet as JSON. Returns the tweet ID, text, display text, timestamp, language, engagement counts (favorites, retweets, replies, quotes, bookmarks, views), source, and reply-to reference. Accepts a tweet ID. Costs 1 credit.`, {
32
+ tweet_id: z.string().min(1)
33
+ .describe("Tweet ID, e.g. '1808168603721650364'."),
34
+ }, async (params) => {
35
+ try {
36
+ const data = await getClient().post("/api/v1/twitter/tweet", params);
37
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
38
+ }
39
+ catch (err) {
40
+ return handleApiError(err);
41
+ }
42
+ });
43
+ server.tool("get_tweet_comments", `Get replies to a tweet as JSON, ranked or chronological. Each reply includes the tweet ID, author handle, text, timestamp, and engagement counts. Accepts a tweet ID. Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
44
+ tweet_id: z.string().min(1)
45
+ .describe("Tweet ID, e.g. '1808168603721650364'."),
46
+ rank: z.enum(["top", "latest"]).optional()
47
+ .describe("'top' for ranked replies (default), 'latest' for chronological."),
48
+ cursor: z.string().optional()
49
+ .describe("Pagination cursor (next_cursor) from a previous response."),
50
+ }, async (params) => {
51
+ try {
52
+ const data = await getClient().post("/api/v1/twitter/tweet/comments", params);
53
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
54
+ }
55
+ catch (err) {
56
+ return handleApiError(err);
57
+ }
58
+ });
59
+ server.tool("get_tweet_retweeters", `Get the users who retweeted a tweet as JSON. Each user includes the user ID, handle, name, description, follower/friends/statuses/media counts, and profile image. Accepts a tweet ID. Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
60
+ tweet_id: z.string().min(1)
61
+ .describe("Tweet ID, e.g. '1808168603721650364'."),
62
+ cursor: z.string().optional()
63
+ .describe("Pagination cursor (next_cursor) from a previous response."),
64
+ }, async (params) => {
65
+ try {
66
+ const data = await getClient().post("/api/v1/twitter/tweet/retweeters", params);
67
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
68
+ }
69
+ catch (err) {
70
+ return handleApiError(err);
71
+ }
72
+ });
73
+ server.tool("get_twitter_user", `Get a Twitter (X) user's profile as JSON. Returns the rest ID, handle, name, description, follower/friends/statuses/media counts, verified flag, avatar, header image, location, website, and creation date. Accepts a handle (without @). Costs 1 credit.`, {
74
+ screen_name: z.string().min(1)
75
+ .describe("A Twitter handle without the @, e.g. 'elonmusk'."),
76
+ }, async (params) => {
77
+ try {
78
+ const data = await getClient().post("/api/v1/twitter/user", params);
79
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
80
+ }
81
+ catch (err) {
82
+ return handleApiError(err);
83
+ }
84
+ });
85
+ server.tool("get_twitter_user_tweets", `List a Twitter (X) user's tweets as JSON, including a pinned tweet when present. Each tweet includes the tweet ID, text, timestamp, engagement counts, and conversation ID. Accepts a handle (without @). Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
86
+ screen_name: z.string().min(1)
87
+ .describe("A Twitter handle without the @, e.g. 'elonmusk'."),
88
+ cursor: z.string().optional()
89
+ .describe("Pagination cursor (next_cursor) from a previous response."),
90
+ }, async (params) => {
91
+ try {
92
+ const data = await getClient().post("/api/v1/twitter/user/tweets", params);
93
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
94
+ }
95
+ catch (err) {
96
+ return handleApiError(err);
97
+ }
98
+ });
99
+ server.tool("get_twitter_user_replies", `List a Twitter (X) user's tweets and replies as JSON. Each entry includes the tweet ID, text, timestamp, and engagement counts. Accepts a handle (without @). Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
100
+ screen_name: z.string().min(1)
101
+ .describe("A Twitter handle without the @, e.g. 'elonmusk'."),
102
+ cursor: z.string().optional()
103
+ .describe("Pagination cursor (next_cursor) from a previous response."),
104
+ }, async (params) => {
105
+ try {
106
+ const data = await getClient().post("/api/v1/twitter/user/replies", params);
107
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
108
+ }
109
+ catch (err) {
110
+ return handleApiError(err);
111
+ }
112
+ });
113
+ server.tool("get_twitter_user_media", `List a Twitter (X) user's media tweets (posts with photos or videos) as JSON. Each entry includes the tweet ID, text, timestamp, and engagement counts. Accepts a handle (without @). Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
114
+ screen_name: z.string().min(1)
115
+ .describe("A Twitter handle without the @, e.g. 'elonmusk'."),
116
+ cursor: z.string().optional()
117
+ .describe("Pagination cursor (next_cursor) from a previous response."),
118
+ }, async (params) => {
119
+ try {
120
+ const data = await getClient().post("/api/v1/twitter/user/media", params);
121
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
122
+ }
123
+ catch (err) {
124
+ return handleApiError(err);
125
+ }
126
+ });
127
+ server.tool("get_twitter_user_followers", `List a Twitter (X) user's followers as JSON. Each follower includes the user ID, handle, name, description, follower count, verified flag, and location. Accepts a handle (without @). Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
128
+ screen_name: z.string().min(1)
129
+ .describe("A Twitter handle without the @, e.g. 'elonmusk'."),
130
+ cursor: z.string().optional()
131
+ .describe("Pagination cursor (next_cursor) from a previous response."),
132
+ }, async (params) => {
133
+ try {
134
+ const data = await getClient().post("/api/v1/twitter/user/followers", params);
135
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
136
+ }
137
+ catch (err) {
138
+ return handleApiError(err);
139
+ }
140
+ });
141
+ server.tool("get_twitter_user_followings", `List the accounts a Twitter (X) user follows as JSON. Each account includes the user ID, handle, name, description, follower count, verified flag, and location. Accepts a handle (without @). Use data.next_cursor as the next cursor while has_more is true. Costs 1 credit.`, {
142
+ screen_name: z.string().min(1)
143
+ .describe("A Twitter handle without the @, e.g. 'elonmusk'."),
144
+ cursor: z.string().optional()
145
+ .describe("Pagination cursor (next_cursor) from a previous response."),
146
+ }, async (params) => {
147
+ try {
148
+ const data = await getClient().post("/api/v1/twitter/user/followings", params);
149
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
150
+ }
151
+ catch (err) {
152
+ return handleApiError(err);
153
+ }
154
+ });
155
+ server.tool("get_twitter_trending", `Get trending topics on Twitter (X) for a country as JSON. Each trend includes its name, description, and context. Costs 1 credit.`, {
156
+ country: z.string().optional()
157
+ .describe("Country name, e.g. 'UnitedStates' (default), 'UnitedKingdom', 'Japan'."),
158
+ }, async (params) => {
159
+ try {
160
+ const data = await getClient().post("/api/v1/twitter/trending", params);
161
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
162
+ }
163
+ catch (err) {
164
+ return handleApiError(err);
165
+ }
166
+ });
167
+ }
168
+ //# sourceMappingURL=twitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twitter.js","sourceRoot":"","sources":["../../src/tools/twitter.ts"],"names":[],"mappings":"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"}
@@ -12,37 +12,39 @@ function handleApiError(err) {
12
12
  throw new McpError(ErrorCode.InternalError, String(err));
13
13
  }
14
14
  export function registerYoutubeTools(server, getClient) {
15
- server.tool("search_youtube", `Search YouTube and return video results as JSON. Each result includes video ID, title, channel, duration, view count, and upload date. Use when the user asks to find YouTube videos on a topic.`, {
15
+ server.tool("search_youtube", `Search YouTube and return video results as JSON. Each result includes video ID, title, channel, duration, view count, and upload date; the response also groups shorts, channels, and playlists. Use data.next_cursor as the next cursor while has_more is true. Costs 2 credits. Use when the user asks to find YouTube videos on a topic.`, {
16
16
  search: z.string().min(1).max(500)
17
17
  .describe("YouTube search query."),
18
18
  sort_by: z.enum(["relevance", "date", "view_count", "rating"]).default("relevance")
19
19
  .describe("Sort order. Use 'date' for most recent, 'view_count' for most watched."),
20
- type: z.enum(["video", "channel", "playlist"]).default("video")
20
+ type: z.enum(["video", "channel", "playlist", "movie"]).default("video")
21
21
  .describe("Result type filter."),
22
22
  upload_date: z.enum(["last_hour", "today", "this_week", "this_month", "this_year"]).optional()
23
23
  .describe("Filter by upload date. Omit for all time."),
24
24
  duration: z.enum(["short", "medium", "long"]).optional()
25
25
  .describe("Filter by duration. short=<4min, medium=4-20min, long=>20min."),
26
+ features: z.array(z.enum(["hd", "4k", "subtitles", "creative_commons", "live", "360", "3d", "hdr", "vr180"])).optional()
27
+ .describe("Feature filters to require, e.g. ['hd','subtitles']."),
28
+ cursor: z.string().optional()
29
+ .describe("Pagination cursor (next_cursor) from a previous response."),
26
30
  hd: z.boolean().optional()
27
- .describe("HD videos only."),
31
+ .describe("Deprecated: use features ['hd']. HD videos only."),
28
32
  "4k": z.boolean().optional()
29
- .describe("4K videos only."),
33
+ .describe("Deprecated: use features ['4k']. 4K videos only."),
30
34
  subtitles: z.boolean().optional()
31
- .describe("Videos with subtitles/CC only."),
35
+ .describe("Deprecated: use features ['subtitles']. Videos with subtitles/CC only."),
32
36
  creative_commons: z.boolean().optional()
33
- .describe("Creative Commons licensed videos only."),
37
+ .describe("Deprecated: use features ['creative_commons']. Creative Commons licensed videos only."),
34
38
  live: z.boolean().optional()
35
- .describe("Live videos only."),
39
+ .describe("Deprecated: use features ['live']. Live videos only."),
36
40
  "360": z.boolean().optional()
37
- .describe("360-degree videos only."),
41
+ .describe("Deprecated: use features ['360']. 360-degree videos only."),
38
42
  "3d": z.boolean().optional()
39
- .describe("3D videos only."),
43
+ .describe("Deprecated: use features ['3d']. 3D videos only."),
40
44
  hdr: z.boolean().optional()
41
- .describe("HDR videos only."),
42
- location: z.boolean().optional()
43
- .describe("Videos with location metadata only."),
45
+ .describe("Deprecated: use features ['hdr']. HDR videos only."),
44
46
  vr180: z.boolean().optional()
45
- .describe("VR180 videos only."),
47
+ .describe("Deprecated: use features ['vr180']. VR180 videos only."),
46
48
  }, async (params) => {
47
49
  try {
48
50
  const data = await getClient().post("/api/v1/youtube/search", params);
@@ -52,12 +54,208 @@ export function registerYoutubeTools(server, getClient) {
52
54
  return handleApiError(err);
53
55
  }
54
56
  });
55
- server.tool("get_youtube_metadata", `Get metadata for a YouTube video by its video ID. Returns title, description, channel, duration, view count, like count, publish date, and thumbnail URLs. Use when the user has a specific video ID or URL and wants details about that video.`, {
57
+ server.tool("search_youtube_shorts", `Search YouTube Shorts and return short-form video results as JSON. Each result includes video ID, title, URL, thumbnail, view count, and upload time. Use data.next_cursor as the next cursor while has_more is true. Costs 2 credits.`, {
58
+ search: z.string().min(1).max(500)
59
+ .describe("YouTube Shorts search query."),
60
+ sort_by: z.enum(["relevance", "date", "view_count", "rating"]).default("relevance")
61
+ .describe("Sort order. Use 'date' for most recent, 'view_count' for most watched."),
62
+ cursor: z.string().optional()
63
+ .describe("Pagination cursor (next_cursor) from a previous response."),
64
+ }, async (params) => {
65
+ try {
66
+ const data = await getClient().post("/api/v1/youtube/shorts", params);
67
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
68
+ }
69
+ catch (err) {
70
+ return handleApiError(err);
71
+ }
72
+ });
73
+ server.tool("youtube_search_suggestions", `Get YouTube search autocomplete suggestions for a partial query as JSON. Returns a list of suggested search strings. Use to expand a seed keyword or surface what people search for.`, {
74
+ search: z.string().min(1).max(500)
75
+ .describe("Partial or seed search query to autocomplete."),
76
+ language: z.string().default("en")
77
+ .describe("Suggestion language code, e.g. 'en', 'es', 'fr'."),
78
+ region: z.string().default("US")
79
+ .describe("Two-letter region code, e.g. 'US', 'GB', 'IN'."),
80
+ }, async (params) => {
81
+ try {
82
+ const data = await getClient().post("/api/v1/youtube/suggestions", params);
83
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
84
+ }
85
+ catch (err) {
86
+ return handleApiError(err);
87
+ }
88
+ });
89
+ server.tool("get_youtube_video", `Get full details for a YouTube video as JSON. Returns title, author, channel, publish date, description, length in seconds, view count, keywords, thumbnail, playability status, chapters, and available captions. Accepts a video ID or a watch URL. Use when the user has a specific video and wants details about it.`, {
90
+ video_id: z.string()
91
+ .describe("YouTube video ID, e.g. 'dQw4w9WgXcQ', or a full watch URL."),
92
+ }, async (params) => {
93
+ try {
94
+ const data = await getClient().post("/api/v1/youtube/video", params);
95
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
96
+ }
97
+ catch (err) {
98
+ return handleApiError(err);
99
+ }
100
+ });
101
+ server.tool("get_youtube_metadata", `Deprecated alias of get_youtube_video, kept for backward compatibility. Get details for a YouTube video by its video ID or watch URL. Prefer get_youtube_video for new integrations.`, {
102
+ video_id: z.string()
103
+ .describe("YouTube video ID, e.g. 'dQw4w9WgXcQ', or a full watch URL."),
104
+ }, async (params) => {
105
+ try {
106
+ const data = await getClient().post("/api/v1/youtube/video", params);
107
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
108
+ }
109
+ catch (err) {
110
+ return handleApiError(err);
111
+ }
112
+ });
113
+ server.tool("get_youtube_comments", `Get comments on a YouTube video as JSON. Each comment includes its ID, text, like count, reply count, publish time, a reply_cursor for fetching its replies, and author details. Accepts a video ID. Use data.next_cursor as the next cursor while has_more is true.`, {
114
+ video_id: z.string()
115
+ .describe("YouTube video ID, e.g. 'dQw4w9WgXcQ'."),
116
+ cursor: z.string().optional()
117
+ .describe("Pagination cursor (next_cursor) from a previous response."),
118
+ }, async (params) => {
119
+ try {
120
+ const data = await getClient().post("/api/v1/youtube/comments", params);
121
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
122
+ }
123
+ catch (err) {
124
+ return handleApiError(err);
125
+ }
126
+ });
127
+ server.tool("get_youtube_comment_replies", `Get replies to a specific YouTube comment as JSON. Requires the video ID and the reply_cursor from a comment in the get_youtube_comments response. Use data.next_cursor as the next cursor while has_more is true.`, {
128
+ video_id: z.string()
129
+ .describe("YouTube video ID, e.g. 'dQw4w9WgXcQ'."),
130
+ reply_cursor: z.string()
131
+ .describe("The reply_cursor from a comment in the get_youtube_comments response."),
132
+ cursor: z.string().optional()
133
+ .describe("Pagination cursor (next_cursor) from a previous replies response."),
134
+ }, async (params) => {
135
+ try {
136
+ const data = await getClient().post("/api/v1/youtube/comments/replies", params);
137
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
138
+ }
139
+ catch (err) {
140
+ return handleApiError(err);
141
+ }
142
+ });
143
+ server.tool("get_youtube_transcript", `Get the transcript of a YouTube video as JSON. Returns the caption text for the requested language. Use format 'text' for a plain transcript or 'srt' for timed subtitles. Accepts a video ID. Costs 8 credits. Use when the user wants to read, summarize, or analyze a video's content.`, {
144
+ video_id: z.string()
145
+ .describe("YouTube video ID, e.g. 'dQw4w9WgXcQ', or a full watch URL."),
146
+ language: z.string().default("en")
147
+ .describe("Transcript language code, e.g. 'en', 'es', 'fr'."),
148
+ format: z.enum(["text", "srt"]).default("text")
149
+ .describe("'text' for a plain transcript, 'srt' for timed subtitles."),
150
+ }, async (params) => {
151
+ try {
152
+ const data = await getClient().post("/api/v1/youtube/transcript", params);
153
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
154
+ }
155
+ catch (err) {
156
+ return handleApiError(err);
157
+ }
158
+ });
159
+ server.tool("get_youtube_related", `Get videos related to a YouTube video as JSON. Each result includes video ID, title, URL, channel, thumbnail, view count, publish time, and length. Accepts a video ID. Use to discover similar or recommended videos.`, {
160
+ video_id: z.string()
161
+ .describe("YouTube video ID, e.g. 'dQw4w9WgXcQ'."),
162
+ cursor: z.string().optional()
163
+ .describe("Pagination cursor (next_cursor) from a previous response."),
164
+ }, async (params) => {
165
+ try {
166
+ const data = await getClient().post("/api/v1/youtube/related", params);
167
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
168
+ }
169
+ catch (err) {
170
+ return handleApiError(err);
171
+ }
172
+ });
173
+ server.tool("search_youtube_channels", `Search YouTube channels by keyword as JSON. Each result includes channel ID, name, handle, URL, thumbnail, subscriber count, and description. Use data.next_cursor as the next cursor while has_more is true.`, {
174
+ search: z.string().min(1).max(500)
175
+ .describe("Channel search query."),
176
+ cursor: z.string().optional()
177
+ .describe("Pagination cursor (next_cursor) from a previous response."),
178
+ }, async (params) => {
179
+ try {
180
+ const data = await getClient().post("/api/v1/youtube/channel/search", params);
181
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
182
+ }
183
+ catch (err) {
184
+ return handleApiError(err);
185
+ }
186
+ });
187
+ server.tool("get_youtube_channel", `Get a YouTube channel's profile as JSON. Returns channel ID, title, description, handle, URL, subscriber/video/view counts, country, creation date, verified flag, avatar, banner, and external links. Accepts a channel ID, an @handle, or a channel URL.`, {
188
+ channel_id: z.string()
189
+ .describe("YouTube channel ID (e.g. 'UC...'), an @handle, or a channel URL."),
190
+ }, async (params) => {
191
+ try {
192
+ const data = await getClient().post("/api/v1/youtube/channel", params);
193
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
194
+ }
195
+ catch (err) {
196
+ return handleApiError(err);
197
+ }
198
+ });
199
+ server.tool("get_youtube_channel_videos", `List a YouTube channel's videos as JSON. Each result includes video ID, title, URL, thumbnail, duration, view count, publish time, and live flag. Accepts a channel ID. Use data.next_cursor as the next cursor while has_more is true.`, {
200
+ channel_id: z.string()
201
+ .describe("YouTube channel ID, e.g. 'UC...'."),
202
+ cursor: z.string().optional()
203
+ .describe("Pagination cursor (next_cursor) from a previous response."),
204
+ }, async (params) => {
205
+ try {
206
+ const data = await getClient().post("/api/v1/youtube/channel/videos", params);
207
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
208
+ }
209
+ catch (err) {
210
+ return handleApiError(err);
211
+ }
212
+ });
213
+ server.tool("get_youtube_channel_shorts", `List a YouTube channel's Shorts as JSON. Each result includes video ID, title, URL, thumbnail, and view count. Accepts a channel ID. Use data.next_cursor as the next cursor while has_more is true.`, {
214
+ channel_id: z.string()
215
+ .describe("YouTube channel ID, e.g. 'UC...'."),
216
+ cursor: z.string().optional()
217
+ .describe("Pagination cursor (next_cursor) from a previous response."),
218
+ }, async (params) => {
219
+ try {
220
+ const data = await getClient().post("/api/v1/youtube/channel/shorts", params);
221
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
222
+ }
223
+ catch (err) {
224
+ return handleApiError(err);
225
+ }
226
+ });
227
+ server.tool("get_youtube_channel_community", `List a YouTube channel's community posts as JSON. Each post includes its ID, URL, text, author, publish time, vote count, comment count, attached images, and attachment type. Accepts a channel ID. Use data.next_cursor as the next cursor while has_more is true.`, {
228
+ channel_id: z.string()
229
+ .describe("YouTube channel ID, e.g. 'UC...'."),
230
+ cursor: z.string().optional()
231
+ .describe("Pagination cursor (next_cursor) from a previous response."),
232
+ }, async (params) => {
233
+ try {
234
+ const data = await getClient().post("/api/v1/youtube/channel/community", params);
235
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
236
+ }
237
+ catch (err) {
238
+ return handleApiError(err);
239
+ }
240
+ });
241
+ server.tool("resolve_youtube_channel", `Resolve a YouTube @handle or channel URL to its canonical channel ID and URL, returned as JSON. Use before other channel tools when you only have a handle or a vanity URL.`, {
242
+ channel: z.string()
243
+ .describe("A YouTube @handle (e.g. '@MrBeast') or a channel URL."),
244
+ }, async (params) => {
245
+ try {
246
+ const data = await getClient().post("/api/v1/youtube/channel/resolve", params);
247
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
248
+ }
249
+ catch (err) {
250
+ return handleApiError(err);
251
+ }
252
+ });
253
+ server.tool("get_youtube_streams", `Get direct media stream URLs for a YouTube video as JSON. Returns progressive and adaptive formats with itag, URL, mime type, bitrate, resolution, quality label, fps, and audio details, plus available qualities and URL expiry. Accepts a video ID. Costs 3 credits.`, {
56
254
  video_id: z.string()
57
- .describe("YouTube video ID, e.g. 'dQw4w9WgXcQ'. Extract from URL if the user provides a youtube.com link."),
255
+ .describe("YouTube video ID, e.g. 'dQw4w9WgXcQ', or a full watch URL."),
58
256
  }, async (params) => {
59
257
  try {
60
- const data = await getClient().post("/api/v1/youtube/metadata", params);
258
+ const data = await getClient().post("/api/v1/youtube/streams", params);
61
259
  return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
62
260
  }
63
261
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/tools/youtube.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/tools/youtube.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@scavio/mcp-server",
3
- "version": "0.3.2",
3
+ "version": "0.5.0",
4
4
  "mcpName": "io.github.scavio-ai/scavio-mcp",
5
- "description": "MCP server connecting AI agents to Google, YouTube, Amazon, Walmart, TikTok, Instagram, and Reddit. 46 tools for web search, product lookup, video discovery, and social media analysis.",
5
+ "description": "MCP server connecting AI agents to Google, YouTube, Amazon, Walmart, TikTok, Instagram, Reddit, Twitter, and LinkedIn. 95 tools for web search, product lookup, video discovery, and social media analysis.",
6
6
  "type": "module",
7
7
  "license": "MIT",
8
8
  "author": "Scavio",
@@ -24,6 +24,8 @@
24
24
  "walmart",
25
25
  "tiktok",
26
26
  "reddit",
27
+ "twitter",
28
+ "linkedin",
27
29
  "web-search",
28
30
  "instagram",
29
31
  "tavily-alternative",