@scavio/mcp-server 0.5.0 → 0.7.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 +36 -12
- package/dist/tools/index.js +4 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/tiktok-shop.d.ts +3 -0
- package/dist/tools/tiktok-shop.js +159 -0
- package/dist/tools/tiktok-shop.js.map +1 -0
- package/dist/tools/{twitter.d.ts → x.d.ts} +1 -1
- package/dist/tools/{twitter.js → x.js} +28 -28
- package/dist/tools/x.js.map +1 -0
- package/package.json +3 -3
- package/dist/tools/twitter.js.map +0 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|

|
|
4
4
|

|
|
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, Reddit,
|
|
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, X, LinkedIn, and TikTok Shop. 103 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
|
|
|
@@ -296,23 +296,23 @@ Add to settings (`Cmd+,`):
|
|
|
296
296
|
| `get_reddit_popular` | Get the site-wide popular feed |
|
|
297
297
|
| `get_reddit_trending` | Get current trending search queries |
|
|
298
298
|
|
|
299
|
-
### [
|
|
299
|
+
### [X API](https://scavio.dev/docs/x-search)
|
|
300
300
|
|
|
301
301
|
| Tool | Description |
|
|
302
302
|
|------|-------------|
|
|
303
|
-
| `
|
|
303
|
+
| `search_x` | Search tweets and people by keyword |
|
|
304
304
|
| `get_tweet` | Get full details for a single tweet |
|
|
305
305
|
| `get_tweet_comments` | Get replies to a tweet (ranked or chronological) |
|
|
306
306
|
| `get_tweet_retweeters` | List users who retweeted a tweet |
|
|
307
|
-
| `
|
|
308
|
-
| `
|
|
309
|
-
| `
|
|
310
|
-
| `
|
|
311
|
-
| `
|
|
312
|
-
| `
|
|
313
|
-
| `
|
|
307
|
+
| `get_x_user` | Get a user's profile by handle |
|
|
308
|
+
| `get_x_user_tweets` | List a user's tweets |
|
|
309
|
+
| `get_x_user_replies` | List a user's tweets and replies |
|
|
310
|
+
| `get_x_user_media` | List a user's media tweets |
|
|
311
|
+
| `get_x_user_followers` | List a user's followers |
|
|
312
|
+
| `get_x_user_followings` | List accounts a user follows |
|
|
313
|
+
| `get_x_trending` | Get trending topics for a country |
|
|
314
314
|
|
|
315
|
-
### [LinkedIn API](https://scavio.dev/docs/linkedin-
|
|
315
|
+
### [LinkedIn API](https://scavio.dev/docs/linkedin-person)
|
|
316
316
|
|
|
317
317
|
| Tool | Description |
|
|
318
318
|
|------|-------------|
|
|
@@ -331,6 +331,30 @@ Add to settings (`Cmd+,`):
|
|
|
331
331
|
| `get_linkedin_post` | Get full details for a single post |
|
|
332
332
|
| `get_linkedin_post_comments` | Get comments on a post |
|
|
333
333
|
|
|
334
|
+
### [TikTok Shop API](https://scavio.dev/docs/tiktok-shop-search)
|
|
335
|
+
|
|
336
|
+
| Tool | Description |
|
|
337
|
+
|------|-------------|
|
|
338
|
+
| `search_tiktok_shop` | Search TikTok Shop products by keyword (US catalog, exact prices) |
|
|
339
|
+
| `get_tiktok_shop_search_suggestions` | Keyword autocomplete for a partial query, 8 regions |
|
|
340
|
+
| `get_tiktok_shop_product` | Full product detail (no price; ~44% of search IDs resolve) |
|
|
341
|
+
| `get_tiktok_shop_product_reviews` | Paginated product reviews, up to 200 per call |
|
|
342
|
+
| `get_tiktok_shop_categories` | The global category tree (28 top-level, 240 nodes) |
|
|
343
|
+
| `get_tiktok_shop_category_products` | List products under a category ID, with exact prices |
|
|
344
|
+
| `get_tiktok_shop_shop_products` | List a seller's catalog, 30 per page, with exact prices |
|
|
345
|
+
| `resolve_tiktok_shop_url` | Resolve a TikTok Shop URL or share link to a product/shop ID |
|
|
346
|
+
|
|
347
|
+
Two things to know: `get_tiktok_shop_product` does not return a price (TikTok masks it on the
|
|
348
|
+
product page upstream) - exact prices come from `search_tiktok_shop`,
|
|
349
|
+
`get_tiktok_shop_shop_products` and `get_tiktok_shop_category_products`. And only about 44% of the
|
|
350
|
+
product IDs returned by search resolve on `get_tiktok_shop_product` (11 of 25 measured), because
|
|
351
|
+
upstream has no detail data for the rest. That miss is signalled by the HTTP 404 status, not by any
|
|
352
|
+
field in the response body, and it is a normal outcome rather than an error to retry - the tool
|
|
353
|
+
returns it as a plain result with `status: "no_detail_data"` so agents skip the product instead of
|
|
354
|
+
looping. For an id that will not resolve, `get_tiktok_shop_product_reviews` is often still usable:
|
|
355
|
+
across 8 measured ids that failed on detail, 8 of 8 returned HTTP 200 on reviews and 7 of 8 returned
|
|
356
|
+
at least one review.
|
|
357
|
+
|
|
334
358
|
### Account
|
|
335
359
|
|
|
336
360
|
| Tool | Description |
|
|
@@ -345,7 +369,7 @@ Add to settings (`Cmd+,`):
|
|
|
345
369
|
|
|
346
370
|
- [Google Search API](https://scavio.dev/google-search-api) — SERP results, news, images, maps, and knowledge graph
|
|
347
371
|
- [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), [
|
|
372
|
+
- [TikTok API](https://scavio.dev/tiktok-api), [Instagram API](https://scavio.dev/instagram-api), [Reddit API](https://scavio.dev/reddit-api), [X API](https://scavio.dev/x-api), [LinkedIn API](https://scavio.dev/linkedin-api), and [YouTube API](https://scavio.dev/youtube-transcript-api) — social and video data
|
|
349
373
|
|
|
350
374
|
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.
|
|
351
375
|
|
package/dist/tools/index.js
CHANGED
|
@@ -4,9 +4,10 @@ import { registerAmazonTools } from "./amazon.js";
|
|
|
4
4
|
import { registerWalmartTools } from "./walmart.js";
|
|
5
5
|
import { registerUsageTool } from "./usage.js";
|
|
6
6
|
import { registerTiktokTools } from "./tiktok.js";
|
|
7
|
+
import { registerTiktokShopTools } from "./tiktok-shop.js";
|
|
7
8
|
import { registerInstagramTools } from "./instagram.js";
|
|
8
9
|
import { registerRedditTools } from "./reddit.js";
|
|
9
|
-
import {
|
|
10
|
+
import { registerXTools } from "./x.js";
|
|
10
11
|
import { registerLinkedinTools } from "./linkedin.js";
|
|
11
12
|
export function registerAllTools(server, getClient) {
|
|
12
13
|
registerGoogleTools(server, getClient);
|
|
@@ -14,9 +15,10 @@ export function registerAllTools(server, getClient) {
|
|
|
14
15
|
registerAmazonTools(server, getClient);
|
|
15
16
|
registerWalmartTools(server, getClient);
|
|
16
17
|
registerTiktokTools(server, getClient);
|
|
18
|
+
registerTiktokShopTools(server, getClient);
|
|
17
19
|
registerInstagramTools(server, getClient);
|
|
18
20
|
registerRedditTools(server, getClient);
|
|
19
|
-
|
|
21
|
+
registerXTools(server, getClient);
|
|
20
22
|
registerLinkedinTools(server, getClient);
|
|
21
23
|
registerUsageTool(server, getClient);
|
|
22
24
|
}
|
package/dist/tools/index.js.map
CHANGED
|
@@ -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;AAClD,OAAO,EAAE,
|
|
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,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,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,uBAAuB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC1C,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
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
|
+
const REGIONS_FULL = ["US", "GB", "SG", "MY", "PH", "TH", "VN", "ID"];
|
|
15
|
+
const REGIONS_LISTING = ["US", "GB"];
|
|
16
|
+
export function registerTiktokShopTools(server, getClient) {
|
|
17
|
+
server.tool("search_tiktok_shop", `Search TikTok Shop products by keyword as JSON (US catalog only). Returns up to 30 products per page, each with the product ID, title, product URL, image, exact price (current, original, discount, savings, min/max across variants), rating, sold count, variant count, brand and shop. This is one of the endpoints that carries exact prices; get_tiktok_shop_product does not. Use data.next_cursor as the next cursor while has_more is true, and dedupe by product_id across pages. Product IDs returned here are not guaranteed to resolve on get_tiktok_shop_product: only about 44% do, because upstream has no detail data for the rest. Treat search as a standalone source of product and price data, not as the first step of a reliable search-to-detail pipeline. Costs 1 credit.`, {
|
|
18
|
+
search: z.string().min(1).max(200)
|
|
19
|
+
.describe("Keyword to search the TikTok Shop catalog, e.g. 'phone case'."),
|
|
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/tiktok-shop/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_tiktok_shop_search_suggestions", `Get TikTok Shop keyword autocomplete and expansion for a partial query as JSON, in any of 8 marketplace regions. Returns a plain list of suggestion strings (20 to 50). Suggestions are not guaranteed prefix matches: a misspelling returns typo corrections, and results can include brand and shop names. Costs 1 credit.`, {
|
|
32
|
+
search: z.string().min(1).max(100)
|
|
33
|
+
.describe("Partial keyword to expand, e.g. 'wireless'."),
|
|
34
|
+
region: z.enum(REGIONS_FULL).optional()
|
|
35
|
+
.describe("Marketplace region: US (default), GB, SG, MY, PH, TH, VN, or ID."),
|
|
36
|
+
}, async (params) => {
|
|
37
|
+
try {
|
|
38
|
+
const data = await getClient().post("/api/v1/tiktok-shop/search/suggestions", params);
|
|
39
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
return handleApiError(err);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
server.tool("get_tiktok_shop_product", `Get full TikTok Shop product detail as JSON: title, plain-text description, images, variants with stock and dimensions, shipping, full shop profile (followers, shop rating, sold count), category path, breadcrumbs and top reviews. Two hard limits you must plan for. First, this endpoint does NOT return a price: TikTok masks prices on the product page upstream, so read exact prices from search_tiktok_shop, get_tiktok_shop_shop_products or get_tiktok_shop_category_products instead. Second, only about 44% of the product IDs returned by search_tiktok_shop resolve here (11 of 25 measured), because upstream has no detail data for the rest. That miss is identified by the HTTP 404 status, never by a field in the body. A 404 is a NORMAL outcome, not an error and not a transient failure: this tool returns it as a plain (non-error) result with status "no_detail_data", so do not retry it, do not treat it as a broken tool, and do not switch region hoping to recover it; skip that product and move on. Search to product is not a reliable pipeline. When you still need data about an unresolvable product, try get_tiktok_shop_product_reviews: in a measured sample of 8 IDs that this endpoint could not resolve, all 8 returned HTTP 200 on reviews and 7 of 8 returned at least one review. Costs 1 credit (a 404 is billed, since the lookup still ran).`, {
|
|
46
|
+
product_id: z.string().regex(/^\d{6,25}$/)
|
|
47
|
+
.describe("TikTok Shop product ID, e.g. '1732293553906094315'."),
|
|
48
|
+
region: z.enum(REGIONS_FULL).optional()
|
|
49
|
+
.describe("Marketplace region: US (default), GB, SG, MY, PH, TH, VN, or ID."),
|
|
50
|
+
}, async (params) => {
|
|
51
|
+
try {
|
|
52
|
+
const data = await getClient().post("/api/v1/tiktok-shop/product", params);
|
|
53
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
// A 404 means upstream carries no detail data for this product id. It is the
|
|
57
|
+
// expected outcome for roughly 56% of ids that search returns, so it must NOT be
|
|
58
|
+
// surfaced as isError: clients read isError as a tool failure and retry, which is
|
|
59
|
+
// exactly what this endpoint must not do. Genuine failures still go to handleApiError.
|
|
60
|
+
if (err instanceof ApiError && err.status === 404) {
|
|
61
|
+
return {
|
|
62
|
+
content: [{
|
|
63
|
+
type: "text",
|
|
64
|
+
text: JSON.stringify({
|
|
65
|
+
status: "no_detail_data",
|
|
66
|
+
http_status: 404,
|
|
67
|
+
product_id: params.product_id,
|
|
68
|
+
region: params.region ?? "US",
|
|
69
|
+
message: "No detail data exists upstream for this product id. This is a normal outcome for about 56% of ids returned by search_tiktok_shop, not a failure.",
|
|
70
|
+
retryable: false,
|
|
71
|
+
next_step: "Skip this product. Do not retry and do not change region. For an unresolvable id, get_tiktok_shop_product_reviews often still returns data; exact prices come from search_tiktok_shop, get_tiktok_shop_shop_products or get_tiktok_shop_category_products.",
|
|
72
|
+
}, null, 2),
|
|
73
|
+
}],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return handleApiError(err);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
server.tool("get_tiktok_shop_product_reviews", `Get paginated TikTok Shop product reviews as JSON, up to 200 per call. Each review includes the review ID, star rating, text, ISO timestamp, masked reviewer name, images, verified-purchase and incentivized flags, variant and country. Also returns the star distribution and total_reviews. total_reviews drifts between calls and must not be used to compute a page count: page with has_more instead. Reviews often work for products that get_tiktok_shop_product cannot resolve, which makes this a useful fallback detail source: in a measured sample of 8 product IDs that failed on get_tiktok_shop_product, 8 of 8 returned HTTP 200 here and 7 of 8 returned at least one review (counts 15, 0, 2, 20, 4, 6, 20, 11). That is a small sample, not a guarantee. Costs 1 credit.`, {
|
|
80
|
+
product_id: z.string().regex(/^\d{6,25}$/)
|
|
81
|
+
.describe("TikTok Shop product ID, e.g. '1732293553906094315'."),
|
|
82
|
+
page: z.number().int().min(1).max(500).optional()
|
|
83
|
+
.describe("1-based page number (default 1)."),
|
|
84
|
+
page_size: z.number().int().min(1).max(200).optional()
|
|
85
|
+
.describe("Reviews per page, 1-200 (default 20)."),
|
|
86
|
+
sort: z.enum(["relevant", "recent"]).optional()
|
|
87
|
+
.describe("'relevant' (default) returns text-complete, image-heavy reviews; 'recent' is fresher but far more text-sparse."),
|
|
88
|
+
rating: z.number().int().min(1).max(5).optional()
|
|
89
|
+
.describe("Only reviews with this star rating (1-5)."),
|
|
90
|
+
has_media: z.boolean().optional()
|
|
91
|
+
.describe("Only reviews with a photo or video (default false). Wins over verified_only if both are set."),
|
|
92
|
+
verified_only: z.boolean().optional()
|
|
93
|
+
.describe("Only verified purchases (default false)."),
|
|
94
|
+
region: z.enum(REGIONS_FULL).optional()
|
|
95
|
+
.describe("Marketplace region: US (default), GB, SG, MY, PH, TH, VN, or ID."),
|
|
96
|
+
}, async (params) => {
|
|
97
|
+
try {
|
|
98
|
+
const data = await getClient().post("/api/v1/tiktok-shop/product/reviews", params);
|
|
99
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
return handleApiError(err);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
server.tool("get_tiktok_shop_categories", `Get the global TikTok Shop category tree as JSON: 28 top-level categories, 240 nodes, exactly two levels deep. Each node has a category ID, English name, slug, level, parent ID and image. Category IDs are identical in every region and names are always English. Takes no parameters. Use the returned IDs with get_tiktok_shop_category_products. Costs 1 credit.`, {}, async () => {
|
|
106
|
+
try {
|
|
107
|
+
const data = await getClient().post("/api/v1/tiktok-shop/categories", {});
|
|
108
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
return handleApiError(err);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
server.tool("get_tiktok_shop_category_products", `List TikTok Shop products under a category ID from get_tiktok_shop_categories as JSON, with exact prices (this is one of the endpoints that carries real prices, unlike get_tiktok_shop_product). Level 1 and level 2 category IDs both work. Page size is inconsistent upstream (15 to 20 per page), so always paginate with data.next_cursor rather than assuming a fixed page size. Category listings are shallow: after a few pages the source stops returning new products and has_more turns false, which is the end of the listing rather than an error. Costs 1 credit.`, {
|
|
115
|
+
category_id: z.string().regex(/^\d{4,20}$/)
|
|
116
|
+
.describe("Category ID from get_tiktok_shop_categories, e.g. '601450'. Level 1 or 2 both work."),
|
|
117
|
+
cursor: z.string().optional()
|
|
118
|
+
.describe("Pagination cursor (next_cursor) from a previous response."),
|
|
119
|
+
region: z.enum(REGIONS_LISTING).optional()
|
|
120
|
+
.describe("Marketplace region: US (default) or GB only. GB coverage is intermittent upstream and answers 502 when unavailable."),
|
|
121
|
+
}, async (params) => {
|
|
122
|
+
try {
|
|
123
|
+
const data = await getClient().post("/api/v1/tiktok-shop/category/products", params);
|
|
124
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
return handleApiError(err);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
server.tool("get_tiktok_shop_shop_products", `List a TikTok Shop seller's product catalog as JSON, 30 per page, with exact prices (this is one of the endpoints that carries real prices, unlike get_tiktok_shop_product). Accepts a shop ID (also called seller ID elsewhere on TikTok). Use data.next_cursor as the next cursor while has_more is true. Shop follower count, location and shop-level rating are not available here; call get_tiktok_shop_product for the full shop profile. Costs 1 credit.`, {
|
|
131
|
+
shop_id: z.string().regex(/^\d{6,25}$/)
|
|
132
|
+
.describe("TikTok Shop seller ID, e.g. '7495514739648989419'."),
|
|
133
|
+
cursor: z.string().optional()
|
|
134
|
+
.describe("Pagination cursor (next_cursor) from a previous response."),
|
|
135
|
+
region: z.enum(REGIONS_FULL).optional()
|
|
136
|
+
.describe("Marketplace region: US (default), GB, SG, MY, PH, TH, VN, or ID."),
|
|
137
|
+
}, async (params) => {
|
|
138
|
+
try {
|
|
139
|
+
const data = await getClient().post("/api/v1/tiktok-shop/shop/products", params);
|
|
140
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
return handleApiError(err);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
server.tool("resolve_tiktok_shop_url", `Resolve any TikTok Shop URL or share link to a product_id or shop_id as JSON, ready to pass to the other TikTok Shop tools. Accepts shop.tiktok.com product and store pages, tiktok.com/view/product and /view/shop links, affiliate-*.tiktok.com share links, and vt.tiktok.com or tiktok.com/t short links. Returns the type ('product' or 'shop'), the ID, a canonical shop.tiktok.com URL, and how it was resolved. Note that a product_id resolved from a link is not guaranteed to resolve on get_tiktok_shop_product either; prices always come from the listing tools. Costs 1 credit.`, {
|
|
147
|
+
url: z.string().url().max(2000)
|
|
148
|
+
.describe("A TikTok Shop URL or share link, e.g. 'https://vt.tiktok.com/ZT2AHoGsE/'."),
|
|
149
|
+
}, async (params) => {
|
|
150
|
+
try {
|
|
151
|
+
const data = await getClient().post("/api/v1/tiktok-shop/resolve", params);
|
|
152
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
return handleApiError(err);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=tiktok-shop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiktok-shop.js","sourceRoot":"","sources":["../../src/tools/tiktok-shop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAAC,EAAE,CAAC;QACrH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,mDAAmD,CAAC,CAAC;QACzH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IAClH,CAAC;IACD,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAC/E,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,IAAI,CAAU,CAAC;AAE9C,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,SAA6B;IACtF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,owBAAowB,EACpwB;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;aAC/B,QAAQ,CAAC,+DAA+D,CAAC;QAC5E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC1B,QAAQ,CAAC,2DAA2D,CAAC;KACzE,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC,IAAI,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;YAC1E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oCAAoC,EACpC,8TAA8T,EAC9T;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;aAC/B,QAAQ,CAAC,6CAA6C,CAAC;QAC1D,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;aACpC,QAAQ,CAAC,kEAAkE,CAAC;KAChF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC,IAAI,CAAC,wCAAwC,EAAE,MAAM,CAAC,CAAC;YACtF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,k0CAAk0C,EACl0C;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;aACvC,QAAQ,CAAC,qDAAqD,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;aACpC,QAAQ,CAAC,kEAAkE,CAAC;KAChF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;YAC3E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,6EAA6E;YAC7E,iFAAiF;YACjF,kFAAkF;YAClF,uFAAuF;YACvF,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAClD,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,MAAM,EAAE,gBAAgB;gCACxB,WAAW,EAAE,GAAG;gCAChB,UAAU,EAAE,MAAM,CAAC,UAAU;gCAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;gCAC7B,OAAO,EAAE,kJAAkJ;gCAC3J,SAAS,EAAE,KAAK;gCAChB,SAAS,EAAE,4PAA4P;6BACxQ,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ,CAAC;iBACH,CAAC;YACJ,CAAC;YACD,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iCAAiC,EACjC,+vBAA+vB,EAC/vB;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;aACvC,QAAQ,CAAC,qDAAqD,CAAC;QAClE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;aAC9C,QAAQ,CAAC,kCAAkC,CAAC;QAC/C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;aACnD,QAAQ,CAAC,uCAAuC,CAAC;QACpD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;aAC5C,QAAQ,CAAC,gHAAgH,CAAC;QAC7H,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;aAC9C,QAAQ,CAAC,2CAA2C,CAAC;QACxD,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;aAC9B,QAAQ,CAAC,8FAA8F,CAAC;QAC3G,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;aAClC,QAAQ,CAAC,0CAA0C,CAAC;QACvD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;aACpC,QAAQ,CAAC,kEAAkE,CAAC;KAChF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC,IAAI,CAAC,qCAAqC,EAAE,MAAM,CAAC,CAAC;YACnF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,4BAA4B,EAC5B,wWAAwW,EACxW,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,CAAC,CAAC;YAC1E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mCAAmC,EACnC,ijBAAijB,EACjjB;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;aACxC,QAAQ,CAAC,qFAAqF,CAAC;QAClG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC1B,QAAQ,CAAC,2DAA2D,CAAC;QACxE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE;aACvC,QAAQ,CAAC,qHAAqH,CAAC;KACnI,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC,IAAI,CAAC,uCAAuC,EAAE,MAAM,CAAC,CAAC;YACrF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,+BAA+B,EAC/B,icAAic,EACjc;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;aACpC,QAAQ,CAAC,oDAAoD,CAAC;QACjE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC1B,QAAQ,CAAC,2DAA2D,CAAC;QACxE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;aACpC,QAAQ,CAAC,kEAAkE,CAAC;KAChF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC,IAAI,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAC;YACjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,gkBAAgkB,EAChkB;QACE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;aAC5B,QAAQ,CAAC,2EAA2E,CAAC;KACzF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;YAC3E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { ScavioClient } from "../lib/client.js";
|
|
3
|
-
export declare function
|
|
3
|
+
export declare function registerXTools(server: McpServer, getClient: () => ScavioClient): void;
|
|
@@ -11,17 +11,17 @@ function handleApiError(err) {
|
|
|
11
11
|
}
|
|
12
12
|
throw new McpError(ErrorCode.InternalError, String(err));
|
|
13
13
|
}
|
|
14
|
-
export function
|
|
15
|
-
server.tool("
|
|
14
|
+
export function registerXTools(server, getClient) {
|
|
15
|
+
server.tool("search_x", `Search 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
16
|
search: z.string().min(1).max(500)
|
|
17
|
-
.describe("
|
|
17
|
+
.describe("X search query."),
|
|
18
18
|
search_type: z.enum(["Top", "Latest", "People", "Photos", "Videos"]).optional()
|
|
19
19
|
.describe("Result category. 'Top' (default), 'Latest', 'People', 'Photos', or 'Videos'."),
|
|
20
20
|
cursor: z.string().optional()
|
|
21
21
|
.describe("Pagination cursor (next_cursor) from a previous response."),
|
|
22
22
|
}, async (params) => {
|
|
23
23
|
try {
|
|
24
|
-
const data = await getClient().post("/api/v1/
|
|
24
|
+
const data = await getClient().post("/api/v1/x/search", params);
|
|
25
25
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
26
26
|
}
|
|
27
27
|
catch (err) {
|
|
@@ -33,7 +33,7 @@ export function registerTwitterTools(server, getClient) {
|
|
|
33
33
|
.describe("Tweet ID, e.g. '1808168603721650364'."),
|
|
34
34
|
}, async (params) => {
|
|
35
35
|
try {
|
|
36
|
-
const data = await getClient().post("/api/v1/
|
|
36
|
+
const data = await getClient().post("/api/v1/x/tweet", params);
|
|
37
37
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
38
38
|
}
|
|
39
39
|
catch (err) {
|
|
@@ -49,7 +49,7 @@ export function registerTwitterTools(server, getClient) {
|
|
|
49
49
|
.describe("Pagination cursor (next_cursor) from a previous response."),
|
|
50
50
|
}, async (params) => {
|
|
51
51
|
try {
|
|
52
|
-
const data = await getClient().post("/api/v1/
|
|
52
|
+
const data = await getClient().post("/api/v1/x/tweet/comments", params);
|
|
53
53
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
54
54
|
}
|
|
55
55
|
catch (err) {
|
|
@@ -63,101 +63,101 @@ export function registerTwitterTools(server, getClient) {
|
|
|
63
63
|
.describe("Pagination cursor (next_cursor) from a previous response."),
|
|
64
64
|
}, async (params) => {
|
|
65
65
|
try {
|
|
66
|
-
const data = await getClient().post("/api/v1/
|
|
66
|
+
const data = await getClient().post("/api/v1/x/tweet/retweeters", params);
|
|
67
67
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
68
68
|
}
|
|
69
69
|
catch (err) {
|
|
70
70
|
return handleApiError(err);
|
|
71
71
|
}
|
|
72
72
|
});
|
|
73
|
-
server.tool("
|
|
73
|
+
server.tool("get_x_user", `Get an 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
74
|
screen_name: z.string().min(1)
|
|
75
|
-
.describe("
|
|
75
|
+
.describe("An X handle without the @, e.g. 'elonmusk'."),
|
|
76
76
|
}, async (params) => {
|
|
77
77
|
try {
|
|
78
|
-
const data = await getClient().post("/api/v1/
|
|
78
|
+
const data = await getClient().post("/api/v1/x/user", params);
|
|
79
79
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
80
80
|
}
|
|
81
81
|
catch (err) {
|
|
82
82
|
return handleApiError(err);
|
|
83
83
|
}
|
|
84
84
|
});
|
|
85
|
-
server.tool("
|
|
85
|
+
server.tool("get_x_user_tweets", `List an 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
86
|
screen_name: z.string().min(1)
|
|
87
|
-
.describe("
|
|
87
|
+
.describe("An X handle without the @, e.g. 'elonmusk'."),
|
|
88
88
|
cursor: z.string().optional()
|
|
89
89
|
.describe("Pagination cursor (next_cursor) from a previous response."),
|
|
90
90
|
}, async (params) => {
|
|
91
91
|
try {
|
|
92
|
-
const data = await getClient().post("/api/v1/
|
|
92
|
+
const data = await getClient().post("/api/v1/x/user/tweets", params);
|
|
93
93
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
94
94
|
}
|
|
95
95
|
catch (err) {
|
|
96
96
|
return handleApiError(err);
|
|
97
97
|
}
|
|
98
98
|
});
|
|
99
|
-
server.tool("
|
|
99
|
+
server.tool("get_x_user_replies", `List an 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
100
|
screen_name: z.string().min(1)
|
|
101
|
-
.describe("
|
|
101
|
+
.describe("An X handle without the @, e.g. 'elonmusk'."),
|
|
102
102
|
cursor: z.string().optional()
|
|
103
103
|
.describe("Pagination cursor (next_cursor) from a previous response."),
|
|
104
104
|
}, async (params) => {
|
|
105
105
|
try {
|
|
106
|
-
const data = await getClient().post("/api/v1/
|
|
106
|
+
const data = await getClient().post("/api/v1/x/user/replies", params);
|
|
107
107
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
108
108
|
}
|
|
109
109
|
catch (err) {
|
|
110
110
|
return handleApiError(err);
|
|
111
111
|
}
|
|
112
112
|
});
|
|
113
|
-
server.tool("
|
|
113
|
+
server.tool("get_x_user_media", `List an 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
114
|
screen_name: z.string().min(1)
|
|
115
|
-
.describe("
|
|
115
|
+
.describe("An X handle without the @, e.g. 'elonmusk'."),
|
|
116
116
|
cursor: z.string().optional()
|
|
117
117
|
.describe("Pagination cursor (next_cursor) from a previous response."),
|
|
118
118
|
}, async (params) => {
|
|
119
119
|
try {
|
|
120
|
-
const data = await getClient().post("/api/v1/
|
|
120
|
+
const data = await getClient().post("/api/v1/x/user/media", params);
|
|
121
121
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
122
122
|
}
|
|
123
123
|
catch (err) {
|
|
124
124
|
return handleApiError(err);
|
|
125
125
|
}
|
|
126
126
|
});
|
|
127
|
-
server.tool("
|
|
127
|
+
server.tool("get_x_user_followers", `List an 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
128
|
screen_name: z.string().min(1)
|
|
129
|
-
.describe("
|
|
129
|
+
.describe("An X handle without the @, e.g. 'elonmusk'."),
|
|
130
130
|
cursor: z.string().optional()
|
|
131
131
|
.describe("Pagination cursor (next_cursor) from a previous response."),
|
|
132
132
|
}, async (params) => {
|
|
133
133
|
try {
|
|
134
|
-
const data = await getClient().post("/api/v1/
|
|
134
|
+
const data = await getClient().post("/api/v1/x/user/followers", params);
|
|
135
135
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
136
136
|
}
|
|
137
137
|
catch (err) {
|
|
138
138
|
return handleApiError(err);
|
|
139
139
|
}
|
|
140
140
|
});
|
|
141
|
-
server.tool("
|
|
141
|
+
server.tool("get_x_user_followings", `List the accounts an 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
142
|
screen_name: z.string().min(1)
|
|
143
|
-
.describe("
|
|
143
|
+
.describe("An X handle without the @, e.g. 'elonmusk'."),
|
|
144
144
|
cursor: z.string().optional()
|
|
145
145
|
.describe("Pagination cursor (next_cursor) from a previous response."),
|
|
146
146
|
}, async (params) => {
|
|
147
147
|
try {
|
|
148
|
-
const data = await getClient().post("/api/v1/
|
|
148
|
+
const data = await getClient().post("/api/v1/x/user/followings", params);
|
|
149
149
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
150
150
|
}
|
|
151
151
|
catch (err) {
|
|
152
152
|
return handleApiError(err);
|
|
153
153
|
}
|
|
154
154
|
});
|
|
155
|
-
server.tool("
|
|
155
|
+
server.tool("get_x_trending", `Get trending topics on X for a country as JSON. Each trend includes its name, description, and context. Costs 1 credit.`, {
|
|
156
156
|
country: z.string().optional()
|
|
157
157
|
.describe("Country name, e.g. 'UnitedStates' (default), 'UnitedKingdom', 'Japan'."),
|
|
158
158
|
}, async (params) => {
|
|
159
159
|
try {
|
|
160
|
-
const data = await getClient().post("/api/v1/
|
|
160
|
+
const data = await getClient().post("/api/v1/x/trending", params);
|
|
161
161
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
162
162
|
}
|
|
163
163
|
catch (err) {
|
|
@@ -165,4 +165,4 @@ export function registerTwitterTools(server, getClient) {
|
|
|
165
165
|
}
|
|
166
166
|
});
|
|
167
167
|
}
|
|
168
|
-
//# sourceMappingURL=
|
|
168
|
+
//# sourceMappingURL=x.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x.js","sourceRoot":"","sources":["../../src/tools/x.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
|
+
"version": "0.7.0",
|
|
4
4
|
"mcpName": "io.github.scavio-ai/scavio-mcp",
|
|
5
|
-
"description": "MCP server connecting AI agents to Google, YouTube, Amazon, Walmart, TikTok, Instagram, Reddit,
|
|
5
|
+
"description": "MCP server connecting AI agents to Google, YouTube, Amazon, Walmart, TikTok, Instagram, Reddit, X, LinkedIn, and TikTok Shop. 103 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,7 +24,7 @@
|
|
|
24
24
|
"walmart",
|
|
25
25
|
"tiktok",
|
|
26
26
|
"reddit",
|
|
27
|
-
"
|
|
27
|
+
"x",
|
|
28
28
|
"linkedin",
|
|
29
29
|
"web-search",
|
|
30
30
|
"instagram",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twitter.js","sourceRoot":"","sources":["../../src/tools/twitter.ts"],"names":[],"mappings":"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"}
|