@scavio/mcp-server 0.13.1 → 0.14.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/dist/lib/trim-response.d.ts +6 -0
- package/dist/lib/trim-response.js +26 -0
- package/dist/lib/trim-response.js.map +1 -0
- package/dist/tools/airbnb.js +30 -49
- package/dist/tools/airbnb.js.map +1 -1
- package/dist/tools/amazon.js +11 -18
- package/dist/tools/amazon.js.map +1 -1
- package/dist/tools/appstore.js +16 -15
- package/dist/tools/appstore.js.map +1 -1
- package/dist/tools/booking.js +28 -45
- package/dist/tools/booking.js.map +1 -1
- package/dist/tools/capterra.js +16 -15
- package/dist/tools/capterra.js.map +1 -1
- package/dist/tools/companieshouse.js +11 -10
- package/dist/tools/companieshouse.js.map +1 -1
- package/dist/tools/ebay.js +21 -30
- package/dist/tools/ebay.js.map +1 -1
- package/dist/tools/extract.js +6 -5
- package/dist/tools/extract.js.map +1 -1
- package/dist/tools/g2.js +23 -22
- package/dist/tools/g2.js.map +1 -1
- package/dist/tools/glassdoor.js +18 -17
- package/dist/tools/glassdoor.js.map +1 -1
- package/dist/tools/google.js +154 -153
- package/dist/tools/google.js.map +1 -1
- package/dist/tools/googleads.js +20 -19
- package/dist/tools/googleads.js.map +1 -1
- package/dist/tools/googleplay.js +14 -13
- package/dist/tools/googleplay.js.map +1 -1
- package/dist/tools/homedepot.js +15 -28
- package/dist/tools/homedepot.js.map +1 -1
- package/dist/tools/indeed.js +20 -39
- package/dist/tools/indeed.js.map +1 -1
- package/dist/tools/instagram.js +59 -58
- package/dist/tools/instagram.js.map +1 -1
- package/dist/tools/kuaishou.js +47 -46
- package/dist/tools/kuaishou.js.map +1 -1
- package/dist/tools/linkedin.js +26 -25
- package/dist/tools/linkedin.js.map +1 -1
- package/dist/tools/metaads.js +21 -20
- package/dist/tools/metaads.js.map +1 -1
- package/dist/tools/reddit.js +48 -47
- package/dist/tools/reddit.js.map +1 -1
- package/dist/tools/redfin.js +29 -28
- package/dist/tools/redfin.js.map +1 -1
- package/dist/tools/sec.js +36 -35
- package/dist/tools/sec.js.map +1 -1
- package/dist/tools/target.js +19 -40
- package/dist/tools/target.js.map +1 -1
- package/dist/tools/threads.js +20 -19
- package/dist/tools/threads.js.map +1 -1
- package/dist/tools/tiktok-shop.js +38 -37
- package/dist/tools/tiktok-shop.js.map +1 -1
- package/dist/tools/tiktok.js +54 -53
- package/dist/tools/tiktok.js.map +1 -1
- package/dist/tools/tripadvisor.js +20 -43
- package/dist/tools/tripadvisor.js.map +1 -1
- package/dist/tools/usage.js +3 -2
- package/dist/tools/usage.js.map +1 -1
- package/dist/tools/walmart.js +35 -34
- package/dist/tools/walmart.js.map +1 -1
- package/dist/tools/x.js +44 -43
- package/dist/tools/x.js.map +1 -1
- package/dist/tools/yelp.js +21 -20
- package/dist/tools/yelp.js.map +1 -1
- package/dist/tools/youtube.js +77 -76
- package/dist/tools/youtube.js.map +1 -1
- package/dist/tools/zillow.js +38 -53
- package/dist/tools/zillow.js.map +1 -1
- package/package.json +1 -1
package/dist/tools/instagram.js
CHANGED
|
@@ -1,91 +1,92 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { handleApiError } from "../lib/tool-error.js";
|
|
3
|
+
import { trimResponse } from "../lib/trim-response.js";
|
|
3
4
|
export function registerInstagramTools(server, getClient) {
|
|
4
|
-
server.tool("get_instagram_profile", `Get an Instagram user's profile
|
|
5
|
+
server.tool("get_instagram_profile", `Get an Instagram user's profile. 10 credits.`, {
|
|
5
6
|
username: z.string().optional()
|
|
6
|
-
.describe("
|
|
7
|
+
.describe("Handle without @, e.g. 'instagram'."),
|
|
7
8
|
user_id: z.string().optional()
|
|
8
|
-
.describe("Numeric
|
|
9
|
+
.describe("Numeric user ID from a previous request."),
|
|
9
10
|
}, async (params) => {
|
|
10
11
|
try {
|
|
11
12
|
const data = await getClient().post("/api/v1/instagram/profile", params);
|
|
12
|
-
return
|
|
13
|
+
return trimResponse(data);
|
|
13
14
|
}
|
|
14
15
|
catch (err) {
|
|
15
16
|
return handleApiError(err);
|
|
16
17
|
}
|
|
17
18
|
});
|
|
18
|
-
server.tool("get_instagram_user_posts", `List an Instagram user's posts
|
|
19
|
+
server.tool("get_instagram_user_posts", `List an Instagram user's posts. Pass pagination_token or next_max_id as cursor. 2 credits.`, {
|
|
19
20
|
username: z.string().optional()
|
|
20
|
-
.describe("
|
|
21
|
+
.describe("Handle without @."),
|
|
21
22
|
user_id: z.string().optional()
|
|
22
|
-
.describe("Numeric
|
|
23
|
+
.describe("Numeric user ID."),
|
|
23
24
|
count: z.number().int().min(1).max(50).default(12)
|
|
24
|
-
.describe("
|
|
25
|
+
.describe("Posts per page (best effort)."),
|
|
25
26
|
cursor: z.string().optional()
|
|
26
|
-
.describe("
|
|
27
|
+
.describe("pagination_token or next_max_id from previous response."),
|
|
27
28
|
}, async (params) => {
|
|
28
29
|
try {
|
|
29
30
|
const data = await getClient().post("/api/v1/instagram/user/posts", params);
|
|
30
|
-
return
|
|
31
|
+
return trimResponse(data);
|
|
31
32
|
}
|
|
32
33
|
catch (err) {
|
|
33
34
|
return handleApiError(err);
|
|
34
35
|
}
|
|
35
36
|
});
|
|
36
|
-
server.tool("get_instagram_user_reels", `List an Instagram user's Reels
|
|
37
|
+
server.tool("get_instagram_user_reels", `List an Instagram user's Reels. Paginate with next_max_id. 10 credits.`, {
|
|
37
38
|
username: z.string().optional()
|
|
38
|
-
.describe("
|
|
39
|
+
.describe("Handle without @."),
|
|
39
40
|
user_id: z.string().optional()
|
|
40
|
-
.describe("Numeric
|
|
41
|
+
.describe("Numeric user ID."),
|
|
41
42
|
count: z.number().int().min(1).max(50).default(12)
|
|
42
|
-
.describe("
|
|
43
|
+
.describe("Reels per page."),
|
|
43
44
|
cursor: z.string().optional()
|
|
44
|
-
.describe("
|
|
45
|
+
.describe("next_max_id from previous response."),
|
|
45
46
|
}, async (params) => {
|
|
46
47
|
try {
|
|
47
48
|
const data = await getClient().post("/api/v1/instagram/user/reels", params);
|
|
48
|
-
return
|
|
49
|
+
return trimResponse(data);
|
|
49
50
|
}
|
|
50
51
|
catch (err) {
|
|
51
52
|
return handleApiError(err);
|
|
52
53
|
}
|
|
53
54
|
});
|
|
54
|
-
server.tool("get_instagram_user_tagged", `List posts an Instagram user is tagged in
|
|
55
|
+
server.tool("get_instagram_user_tagged", `List posts an Instagram user is tagged in. Paginate with next_max_id/more_available. 10 credits.`, {
|
|
55
56
|
username: z.string().optional()
|
|
56
|
-
.describe("
|
|
57
|
+
.describe("Handle without @."),
|
|
57
58
|
user_id: z.string().optional()
|
|
58
|
-
.describe("Numeric
|
|
59
|
+
.describe("Numeric user ID."),
|
|
59
60
|
count: z.number().int().min(1).max(50).default(12)
|
|
60
|
-
.describe("
|
|
61
|
+
.describe("Posts per page."),
|
|
61
62
|
cursor: z.string().optional()
|
|
62
|
-
.describe("
|
|
63
|
+
.describe("next_max_id from previous response."),
|
|
63
64
|
}, async (params) => {
|
|
64
65
|
try {
|
|
65
66
|
const data = await getClient().post("/api/v1/instagram/user/tagged", params);
|
|
66
|
-
return
|
|
67
|
+
return trimResponse(data);
|
|
67
68
|
}
|
|
68
69
|
catch (err) {
|
|
69
70
|
return handleApiError(err);
|
|
70
71
|
}
|
|
71
72
|
});
|
|
72
|
-
server.tool("get_instagram_user_stories", `Get an Instagram user's
|
|
73
|
+
server.tool("get_instagram_user_stories", `Get an Instagram user's active stories. Not paginated. 10 credits.`, {
|
|
73
74
|
username: z.string().optional()
|
|
74
|
-
.describe("
|
|
75
|
+
.describe("Handle without @."),
|
|
75
76
|
user_id: z.string().optional()
|
|
76
|
-
.describe("Numeric
|
|
77
|
+
.describe("Numeric user ID."),
|
|
77
78
|
}, async (params) => {
|
|
78
79
|
try {
|
|
79
80
|
const data = await getClient().post("/api/v1/instagram/user/stories", params);
|
|
80
|
-
return
|
|
81
|
+
return trimResponse(data);
|
|
81
82
|
}
|
|
82
83
|
catch (err) {
|
|
83
84
|
return handleApiError(err);
|
|
84
85
|
}
|
|
85
86
|
});
|
|
86
|
-
server.tool("get_instagram_post", `Get a single Instagram post
|
|
87
|
+
server.tool("get_instagram_post", `Get a single Instagram post/reel. Provide url, media_id, or shortcode. media_type: 1=image, 2=video, 8=carousel. 8 credits.`, {
|
|
87
88
|
url: z.string().optional()
|
|
88
|
-
.describe("
|
|
89
|
+
.describe("Post URL."),
|
|
89
90
|
media_id: z.string().optional()
|
|
90
91
|
.describe("Numeric media ID."),
|
|
91
92
|
shortcode: z.string().optional()
|
|
@@ -93,105 +94,105 @@ export function registerInstagramTools(server, getClient) {
|
|
|
93
94
|
}, async (params) => {
|
|
94
95
|
try {
|
|
95
96
|
const data = await getClient().post("/api/v1/instagram/post", params);
|
|
96
|
-
return
|
|
97
|
+
return trimResponse(data);
|
|
97
98
|
}
|
|
98
99
|
catch (err) {
|
|
99
100
|
return handleApiError(err);
|
|
100
101
|
}
|
|
101
102
|
});
|
|
102
|
-
server.tool("get_instagram_post_comments", `Get comments on an Instagram post
|
|
103
|
+
server.tool("get_instagram_post_comments", `Get comments on an Instagram post. Provide shortcode or url (not media_id). Paginate with next_min_id. 10 credits.`, {
|
|
103
104
|
shortcode: z.string().optional()
|
|
104
|
-
.describe("Post shortcode
|
|
105
|
+
.describe("Post shortcode."),
|
|
105
106
|
url: z.string().optional()
|
|
106
|
-
.describe("
|
|
107
|
+
.describe("Post URL."),
|
|
107
108
|
cursor: z.string().optional()
|
|
108
|
-
.describe("
|
|
109
|
+
.describe("next_min_id from previous response."),
|
|
109
110
|
sort_order: z.enum(["popular", "newest"]).default("popular")
|
|
110
|
-
.describe("
|
|
111
|
+
.describe("Sort order (best effort)."),
|
|
111
112
|
}, async (params) => {
|
|
112
113
|
try {
|
|
113
114
|
const data = await getClient().post("/api/v1/instagram/post/comments", params);
|
|
114
|
-
return
|
|
115
|
+
return trimResponse(data);
|
|
115
116
|
}
|
|
116
117
|
catch (err) {
|
|
117
118
|
return handleApiError(err);
|
|
118
119
|
}
|
|
119
120
|
});
|
|
120
|
-
server.tool("get_instagram_comment_replies", `Get replies to
|
|
121
|
+
server.tool("get_instagram_comment_replies", `Get replies to an Instagram comment. Requires media_id (from get_instagram_post) and comment_id (pk from get_instagram_post_comments). 8 credits.`, {
|
|
121
122
|
media_id: z.string()
|
|
122
|
-
.describe("
|
|
123
|
+
.describe("Post media ID (from get_instagram_post)."),
|
|
123
124
|
comment_id: z.string()
|
|
124
|
-
.describe("
|
|
125
|
+
.describe("Comment pk from get_instagram_post_comments."),
|
|
125
126
|
cursor: z.string().optional()
|
|
126
|
-
.describe("
|
|
127
|
+
.describe("next_min_child_id from previous response."),
|
|
127
128
|
}, async (params) => {
|
|
128
129
|
try {
|
|
129
130
|
const data = await getClient().post("/api/v1/instagram/post/comments/replies", params);
|
|
130
|
-
return
|
|
131
|
+
return trimResponse(data);
|
|
131
132
|
}
|
|
132
133
|
catch (err) {
|
|
133
134
|
return handleApiError(err);
|
|
134
135
|
}
|
|
135
136
|
});
|
|
136
|
-
server.tool("search_instagram_users", `Search Instagram users by keyword
|
|
137
|
+
server.tool("search_instagram_users", `Search Instagram users by keyword. Pagination via rank_token is best effort. 10 credits.`, {
|
|
137
138
|
keyword: z.string().min(1).max(500)
|
|
138
139
|
.describe("Search query."),
|
|
139
140
|
cursor: z.string().optional()
|
|
140
|
-
.describe("
|
|
141
|
+
.describe("rank_token from previous response."),
|
|
141
142
|
}, async (params) => {
|
|
142
143
|
try {
|
|
143
144
|
const data = await getClient().post("/api/v1/instagram/search/users", params);
|
|
144
|
-
return
|
|
145
|
+
return trimResponse(data);
|
|
145
146
|
}
|
|
146
147
|
catch (err) {
|
|
147
148
|
return handleApiError(err);
|
|
148
149
|
}
|
|
149
150
|
});
|
|
150
|
-
server.tool("search_instagram_hashtags", `Search Instagram hashtags by keyword
|
|
151
|
+
server.tool("search_instagram_hashtags", `Search Instagram hashtags by keyword. Pagination via rank_token is best effort. 10 credits.`, {
|
|
151
152
|
keyword: z.string().min(1).max(500)
|
|
152
153
|
.describe("Search query."),
|
|
153
154
|
cursor: z.string().optional()
|
|
154
|
-
.describe("
|
|
155
|
+
.describe("rank_token from previous response."),
|
|
155
156
|
}, async (params) => {
|
|
156
157
|
try {
|
|
157
158
|
const data = await getClient().post("/api/v1/instagram/search/hashtags", params);
|
|
158
|
-
return
|
|
159
|
+
return trimResponse(data);
|
|
159
160
|
}
|
|
160
161
|
catch (err) {
|
|
161
162
|
return handleApiError(err);
|
|
162
163
|
}
|
|
163
164
|
});
|
|
164
|
-
server.tool("get_instagram_user_followers", `Get an Instagram user's
|
|
165
|
+
server.tool("get_instagram_user_followers", `Get an Instagram user's followers. Paginate with next_max_id/has_more. 10 credits.`, {
|
|
165
166
|
username: z.string().optional()
|
|
166
|
-
.describe("
|
|
167
|
+
.describe("Handle without @."),
|
|
167
168
|
user_id: z.string().optional()
|
|
168
|
-
.describe("Numeric
|
|
169
|
+
.describe("Numeric user ID."),
|
|
169
170
|
count: z.number().int().min(1).max(100).default(12)
|
|
170
|
-
.describe("
|
|
171
|
+
.describe("Users per page."),
|
|
171
172
|
cursor: z.string().optional()
|
|
172
|
-
.describe("
|
|
173
|
+
.describe("next_max_id from previous response."),
|
|
173
174
|
}, async (params) => {
|
|
174
175
|
try {
|
|
175
176
|
const data = await getClient().post("/api/v1/instagram/user/followers", params);
|
|
176
|
-
return
|
|
177
|
+
return trimResponse(data);
|
|
177
178
|
}
|
|
178
179
|
catch (err) {
|
|
179
180
|
return handleApiError(err);
|
|
180
181
|
}
|
|
181
182
|
});
|
|
182
|
-
server.tool("get_instagram_user_followings", `Get
|
|
183
|
+
server.tool("get_instagram_user_followings", `Get accounts an Instagram user follows. Paginate with next_max_id/has_more. 10 credits.`, {
|
|
183
184
|
username: z.string().optional()
|
|
184
|
-
.describe("
|
|
185
|
+
.describe("Handle without @."),
|
|
185
186
|
user_id: z.string().optional()
|
|
186
|
-
.describe("Numeric
|
|
187
|
+
.describe("Numeric user ID."),
|
|
187
188
|
count: z.number().int().min(1).max(100).default(12)
|
|
188
|
-
.describe("
|
|
189
|
+
.describe("Users per page."),
|
|
189
190
|
cursor: z.string().optional()
|
|
190
|
-
.describe("
|
|
191
|
+
.describe("next_max_id from previous response."),
|
|
191
192
|
}, async (params) => {
|
|
192
193
|
try {
|
|
193
194
|
const data = await getClient().post("/api/v1/instagram/user/followings", params);
|
|
194
|
-
return
|
|
195
|
+
return trimResponse(data);
|
|
195
196
|
}
|
|
196
197
|
catch (err) {
|
|
197
198
|
return handleApiError(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instagram.js","sourceRoot":"","sources":["../../src/tools/instagram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"instagram.js","sourceRoot":"","sources":["../../src/tools/instagram.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/kuaishou.js
CHANGED
|
@@ -1,127 +1,128 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { handleApiError } from "../lib/tool-error.js";
|
|
3
|
+
import { trimResponse } from "../lib/trim-response.js";
|
|
3
4
|
// Kuaishou is priced PER ENDPOINT off four upstream price points, so every tool
|
|
4
5
|
// carries its own cost line. A single platform-wide "costs N credits" claim is
|
|
5
6
|
// wrong by up to 40x, which is why this sentence is appended everywhere rather
|
|
6
7
|
// than stated once.
|
|
7
|
-
const PRICING = "
|
|
8
|
+
const PRICING = "";
|
|
8
9
|
// This is CHINA Kuaishou (kuaishou.com). Our upstream source does not serve
|
|
9
10
|
// Kwai international (kwai.com): a real kwai.com id returns an empty envelope and
|
|
10
11
|
// still bills, so the distinction goes in the description, not a comment.
|
|
11
|
-
const NOT_KWAI = "
|
|
12
|
-
const CURSOR_DESC = "
|
|
13
|
-
const SEARCH_CURSOR_DESC = "
|
|
14
|
-
const KEYWORD_DESC = "Search keyword
|
|
12
|
+
const NOT_KWAI = "China kuaishou.com only, not Kwai international.";
|
|
13
|
+
const CURSOR_DESC = "data.pcursor from previous response (NOT next_cursor). 'no_more' = last page.";
|
|
14
|
+
const SEARCH_CURSOR_DESC = "data.pcursor (NOT next_cursor or recoPcursor). 'no_more' = last page.";
|
|
15
|
+
const KEYWORD_DESC = "Search keyword. Chinese keywords recommended (Chinese-language platform).";
|
|
15
16
|
export function registerKuaishouTools(server, getClient) {
|
|
16
|
-
server.tool("get_kuaishou_profile", `Get
|
|
17
|
+
server.tool("get_kuaishou_profile", `Get a Kuaishou creator profile. 10 credits (resolve_kuaishou_user is 1cr, get_kuaishou_video is 2cr and includes follower count). ${NOT_KWAI}`, {
|
|
17
18
|
user_id: z.string().min(1)
|
|
18
|
-
.describe("
|
|
19
|
+
.describe("User id (numeric or alphanumeric form both work)."),
|
|
19
20
|
}, async (params) => {
|
|
20
21
|
try {
|
|
21
22
|
const data = await getClient().post("/api/v1/kuaishou/profile", params);
|
|
22
|
-
return
|
|
23
|
+
return trimResponse(data);
|
|
23
24
|
}
|
|
24
25
|
catch (err) {
|
|
25
26
|
return handleApiError(err);
|
|
26
27
|
}
|
|
27
28
|
});
|
|
28
|
-
server.tool("get_kuaishou_user_posts", `List a Kuaishou
|
|
29
|
+
server.tool("get_kuaishou_user_posts", `List a Kuaishou creator's posts. photo_id in feeds is rounded (>2^53); use share_info for exact ids. 1 credit/page. ${NOT_KWAI}`, {
|
|
29
30
|
user_id: z.string().min(1)
|
|
30
|
-
.describe("
|
|
31
|
+
.describe("User id."),
|
|
31
32
|
cursor: z.string().optional()
|
|
32
33
|
.describe(CURSOR_DESC),
|
|
33
34
|
}, async (params) => {
|
|
34
35
|
try {
|
|
35
36
|
const data = await getClient().post("/api/v1/kuaishou/user/posts", params);
|
|
36
|
-
return
|
|
37
|
+
return trimResponse(data);
|
|
37
38
|
}
|
|
38
39
|
catch (err) {
|
|
39
40
|
return handleApiError(err);
|
|
40
41
|
}
|
|
41
42
|
});
|
|
42
|
-
server.tool("get_kuaishou_user_live", `Check
|
|
43
|
+
server.tool("get_kuaishou_user_live", `Check if a Kuaishou creator is live. Offline = absent liveStream (still billed). 1 credit. ${NOT_KWAI}`, {
|
|
43
44
|
user_id: z.string().min(1)
|
|
44
|
-
.describe("
|
|
45
|
+
.describe("User id."),
|
|
45
46
|
}, async (params) => {
|
|
46
47
|
try {
|
|
47
48
|
const data = await getClient().post("/api/v1/kuaishou/user/live", params);
|
|
48
|
-
return
|
|
49
|
+
return trimResponse(data);
|
|
49
50
|
}
|
|
50
51
|
catch (err) {
|
|
51
52
|
return handleApiError(err);
|
|
52
53
|
}
|
|
53
54
|
});
|
|
54
|
-
server.tool("resolve_kuaishou_user", `
|
|
55
|
+
server.tool("resolve_kuaishou_user", `Resolve a Kuaishou share link to a user_id. kuaishou.com/v.kuaishou.com only (not kwai.com). 1 credit.`, {
|
|
55
56
|
share_link: z.string().url()
|
|
56
|
-
.describe("
|
|
57
|
+
.describe("kuaishou.com or v.kuaishou.com URL. kwai.com not supported."),
|
|
57
58
|
}, async (params) => {
|
|
58
59
|
try {
|
|
59
60
|
const data = await getClient().post("/api/v1/kuaishou/user/resolve", params);
|
|
60
|
-
return
|
|
61
|
+
return trimResponse(data);
|
|
61
62
|
}
|
|
62
63
|
catch (err) {
|
|
63
64
|
return handleApiError(err);
|
|
64
65
|
}
|
|
65
66
|
});
|
|
66
|
-
server.tool("get_kuaishou_video", `Get
|
|
67
|
+
server.tool("get_kuaishou_video", `Get a Kuaishou video by photo_id or URL. Includes author follower count (saves 10cr profile call). camelCase fields (unlike feed endpoints). Pass photo_id or url. 2 credits. ${NOT_KWAI}`, {
|
|
67
68
|
photo_id: z.string().min(1).optional()
|
|
68
|
-
.describe("
|
|
69
|
+
.describe("Photo/video id (numeric or alphanumeric). Use share_info from feeds, not rounded photo_id. Either this or url required."),
|
|
69
70
|
url: z.string().url().optional()
|
|
70
|
-
.describe("
|
|
71
|
+
.describe("kuaishou.com video URL. Either this or photo_id required."),
|
|
71
72
|
}, async (params) => {
|
|
72
73
|
try {
|
|
73
74
|
const data = await getClient().post("/api/v1/kuaishou/video", params);
|
|
74
|
-
return
|
|
75
|
+
return trimResponse(data);
|
|
75
76
|
}
|
|
76
77
|
catch (err) {
|
|
77
78
|
return handleApiError(err);
|
|
78
79
|
}
|
|
79
80
|
});
|
|
80
|
-
server.tool("get_kuaishou_video_comments", `Get
|
|
81
|
+
server.tool("get_kuaishou_video_comments", `Get comments on a Kuaishou video. Check data.subCommentsMap first (free pre-loaded replies) before calling get_kuaishou_comment_replies. 1 credit/page. ${NOT_KWAI}`, {
|
|
81
82
|
photo_id: z.string().min(1)
|
|
82
|
-
.describe("
|
|
83
|
+
.describe("Photo id (no URL form). Use exact id from share_info, not rounded photo_id."),
|
|
83
84
|
cursor: z.string().optional()
|
|
84
85
|
.describe(CURSOR_DESC),
|
|
85
86
|
}, async (params) => {
|
|
86
87
|
try {
|
|
87
88
|
const data = await getClient().post("/api/v1/kuaishou/video/comments", params);
|
|
88
|
-
return
|
|
89
|
+
return trimResponse(data);
|
|
89
90
|
}
|
|
90
91
|
catch (err) {
|
|
91
92
|
return handleApiError(err);
|
|
92
93
|
}
|
|
93
94
|
});
|
|
94
|
-
server.tool("get_kuaishou_comment_replies", `
|
|
95
|
+
server.tool("get_kuaishou_comment_replies", `Get replies to a Kuaishou comment. Wrong root_comment_id silently returns empty (still billed). Only call when subCommentCount > 0. 1 credit/page. ${NOT_KWAI}`, {
|
|
95
96
|
photo_id: z.string().min(1)
|
|
96
|
-
.describe("
|
|
97
|
+
.describe("Photo id from the same video_comments response."),
|
|
97
98
|
root_comment_id: z.string().min(1)
|
|
98
|
-
.describe("
|
|
99
|
+
.describe("comment_id from rootComments[]. Must match photo_id's video."),
|
|
99
100
|
cursor: z.string().optional()
|
|
100
101
|
.describe(CURSOR_DESC),
|
|
101
102
|
count: z.number().int().min(1).max(50).optional()
|
|
102
|
-
.describe("Replies per page, 1-50.
|
|
103
|
+
.describe("Replies per page, 1-50."),
|
|
103
104
|
}, async (params) => {
|
|
104
105
|
try {
|
|
105
106
|
const data = await getClient().post("/api/v1/kuaishou/video/sub-comments", params);
|
|
106
|
-
return
|
|
107
|
+
return trimResponse(data);
|
|
107
108
|
}
|
|
108
109
|
catch (err) {
|
|
109
110
|
return handleApiError(err);
|
|
110
111
|
}
|
|
111
112
|
});
|
|
112
|
-
server.tool("get_kuaishou_videos_batch", `
|
|
113
|
+
server.tool("get_kuaishou_videos_batch", `Batch lookup up to 20 Kuaishou videos. 40 CREDITS FLAT regardless of count (get_kuaishou_video is 2cr each, cheaper below ~20). Missing ids silently omitted. Match on originalPhotoId not rounded photo_id. ${NOT_KWAI}`, {
|
|
113
114
|
photo_ids: z.array(z.string().min(1)).min(1).max(20)
|
|
114
|
-
.describe("1
|
|
115
|
+
.describe("1-20 photo ids (numeric form). >20 rejected."),
|
|
115
116
|
}, async (params) => {
|
|
116
117
|
try {
|
|
117
118
|
const data = await getClient().post("/api/v1/kuaishou/videos/batch", params);
|
|
118
|
-
return
|
|
119
|
+
return trimResponse(data);
|
|
119
120
|
}
|
|
120
121
|
catch (err) {
|
|
121
122
|
return handleApiError(err);
|
|
122
123
|
}
|
|
123
124
|
});
|
|
124
|
-
server.tool("search_kuaishou", `
|
|
125
|
+
server.tool("search_kuaishou", `Mixed search on Kuaishou (videos, users, live, promos). Filter on itemType: 5=video, 4=user, 6=live, 9=related, 25=ad. Slow (~20s); prefer search_kuaishou_videos/users/live for speed. 10 credits/page. ${NOT_KWAI}`, {
|
|
125
126
|
keyword: z.string().min(1).max(200)
|
|
126
127
|
.describe(KEYWORD_DESC),
|
|
127
128
|
cursor: z.string().optional()
|
|
@@ -129,13 +130,13 @@ export function registerKuaishouTools(server, getClient) {
|
|
|
129
130
|
}, async (params) => {
|
|
130
131
|
try {
|
|
131
132
|
const data = await getClient().post("/api/v1/kuaishou/search", params);
|
|
132
|
-
return
|
|
133
|
+
return trimResponse(data);
|
|
133
134
|
}
|
|
134
135
|
catch (err) {
|
|
135
136
|
return handleApiError(err);
|
|
136
137
|
}
|
|
137
138
|
});
|
|
138
|
-
server.tool("search_kuaishou_videos", `Search Kuaishou
|
|
139
|
+
server.tool("search_kuaishou_videos", `Search Kuaishou videos by keyword. Filter on itemType=5 (item.feed). Use share_info for exact ids. Faster than search_kuaishou. 10 credits/page. ${NOT_KWAI}`, {
|
|
139
140
|
keyword: z.string().min(1).max(200)
|
|
140
141
|
.describe(KEYWORD_DESC),
|
|
141
142
|
cursor: z.string().optional()
|
|
@@ -143,13 +144,13 @@ export function registerKuaishouTools(server, getClient) {
|
|
|
143
144
|
}, async (params) => {
|
|
144
145
|
try {
|
|
145
146
|
const data = await getClient().post("/api/v1/kuaishou/search/videos", params);
|
|
146
|
-
return
|
|
147
|
+
return trimResponse(data);
|
|
147
148
|
}
|
|
148
149
|
catch (err) {
|
|
149
150
|
return handleApiError(err);
|
|
150
151
|
}
|
|
151
152
|
});
|
|
152
|
-
server.tool("search_kuaishou_users", `
|
|
153
|
+
server.tool("search_kuaishou_users", `Search Kuaishou users/creators. Returns user_id needed for profile/posts/live endpoints. Filter on itemType=4. No server-side follower/verified filter. 10 credits/page. ${NOT_KWAI}`, {
|
|
153
154
|
keyword: z.string().min(1).max(200)
|
|
154
155
|
.describe(KEYWORD_DESC),
|
|
155
156
|
cursor: z.string().optional()
|
|
@@ -157,13 +158,13 @@ export function registerKuaishouTools(server, getClient) {
|
|
|
157
158
|
}, async (params) => {
|
|
158
159
|
try {
|
|
159
160
|
const data = await getClient().post("/api/v1/kuaishou/search/users", params);
|
|
160
|
-
return
|
|
161
|
+
return trimResponse(data);
|
|
161
162
|
}
|
|
162
163
|
catch (err) {
|
|
163
164
|
return handleApiError(err);
|
|
164
165
|
}
|
|
165
166
|
});
|
|
166
|
-
server.tool("search_kuaishou_live", `Search Kuaishou
|
|
167
|
+
server.tool("search_kuaishou_live", `Search Kuaishou live streams currently on air. Filter on itemType=6. Data is a snapshot (URLs expire when broadcast ends). likeCount/audienceCount are strings ("629.1k"), not ints. 10 credits/page (get_kuaishou_user_live is 1cr for a single user). ${NOT_KWAI}`, {
|
|
167
168
|
keyword: z.string().min(1).max(200)
|
|
168
169
|
.describe(KEYWORD_DESC),
|
|
169
170
|
cursor: z.string().optional()
|
|
@@ -171,33 +172,33 @@ export function registerKuaishouTools(server, getClient) {
|
|
|
171
172
|
}, async (params) => {
|
|
172
173
|
try {
|
|
173
174
|
const data = await getClient().post("/api/v1/kuaishou/search/live", params);
|
|
174
|
-
return
|
|
175
|
+
return trimResponse(data);
|
|
175
176
|
}
|
|
176
177
|
catch (err) {
|
|
177
178
|
return handleApiError(err);
|
|
178
179
|
}
|
|
179
180
|
});
|
|
180
|
-
server.tool("get_kuaishou_tag_feed", `
|
|
181
|
+
server.tool("get_kuaishou_tag_feed", `Get Kuaishou hashtag feed. Send tag WITHOUT '#'. Check tagInfo.name (near-miss resolves to different tag). No sort param. 1 credit/page. ${NOT_KWAI}`, {
|
|
181
182
|
tag: z.string().min(1).max(200)
|
|
182
|
-
.describe("
|
|
183
|
+
.describe("Tag text without '#'. Chinese tags recommended."),
|
|
183
184
|
cursor: z.string().optional()
|
|
184
185
|
.describe(CURSOR_DESC),
|
|
185
186
|
}, async (params) => {
|
|
186
187
|
try {
|
|
187
188
|
const data = await getClient().post("/api/v1/kuaishou/tag/feed", params);
|
|
188
|
-
return
|
|
189
|
+
return trimResponse(data);
|
|
189
190
|
}
|
|
190
191
|
catch (err) {
|
|
191
192
|
return handleApiError(err);
|
|
192
193
|
}
|
|
193
194
|
});
|
|
194
|
-
server.tool("get_kuaishou_trending", `
|
|
195
|
+
server.tool("get_kuaishou_trending", `Get a Kuaishou trending leaderboard. Each board has a different response shape. Non-empty ksOrderId = promoted slot. 1 credit. ${NOT_KWAI}`, {
|
|
195
196
|
board: z.enum(["hot", "live", "shopping", "brand", "music"]).optional()
|
|
196
|
-
.describe("
|
|
197
|
+
.describe("Board: 'hot' (default), 'live', 'shopping', 'brand', 'music'."),
|
|
197
198
|
}, async (params) => {
|
|
198
199
|
try {
|
|
199
200
|
const data = await getClient().post("/api/v1/kuaishou/trending", params);
|
|
200
|
-
return
|
|
201
|
+
return trimResponse(data);
|
|
201
202
|
}
|
|
202
203
|
catch (err) {
|
|
203
204
|
return handleApiError(err);
|