composio-scavio 0.2.0 → 0.3.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 +54 -7
- package/dist/index.cjs +630 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -2
- package/dist/index.d.ts +5 -2
- package/dist/index.js +630 -27
- package/dist/index.js.map +1 -1
- package/package.json +11 -5
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Scavio tools for Composio.\n *\n * Scavio is a single Search API over Google, YouTube, Amazon, Walmart, Reddit, TikTok,\n * TikTok Shop, Instagram, X and LinkedIn. This toolkit exposes the Google, YouTube,\n * Amazon, Walmart, Reddit, TikTok and Instagram endpoints as a Composio custom toolkit.\n * Build it with `buildScavioToolkit()` and bind it to a session:\n *\n * import { Composio } from \"@composio/core\";\n * import { buildScavioToolkit } from \"@scavio/composio\";\n *\n * const composio = new Composio();\n * const scavio = buildScavioToolkit({ apiKey: process.env.SCAVIO_API_KEY });\n * const session = await composio.create(\"user_1\", {\n * experimental: { customToolkits: [scavio] },\n * });\n * const out = await session.execute(\"LOCAL_SCAVIO_GOOGLE_SEARCH\", { query: \"ai agents\" });\n *\n * Each provider is gated by an `enable*` flag so an agent only sees the tools it needs.\n */\nimport {\n experimental_createTool,\n experimental_createToolkit,\n} from \"@composio/core\";\nimport { Scavio } from \"scavio\";\nimport { z } from \"zod\";\n\nexport interface BuildScavioToolkitOptions {\n /** Scavio API key. Falls back to the SCAVIO_API_KEY env var. */\n apiKey?: string;\n enableGoogle?: boolean;\n enableAmazon?: boolean;\n enableWalmart?: boolean;\n enableYoutube?: boolean;\n enableReddit?: boolean;\n enableTiktok?: boolean;\n enableInstagram?: boolean;\n /** Register every tool, ignoring the individual flags. */\n all?: boolean;\n}\n\nconst str = (d: string) => z.string().describe(d);\nconst ostr = (d: string) => z.string().optional().describe(d);\nconst onum = (d: string) => z.number().optional().describe(d);\nconst obool = (d: string) => z.boolean().optional().describe(d);\n\n// The Scavio SDK types several option fields as string-literal unions (e.g.\n// sort orders, device profiles). Tool schemas keep them as free-form strings so\n// the agent stays flexible and the API validates the value; this extracts an SDK\n// method's options type so a validated input can be handed through unchanged.\ntype SdkOpts<M> = M extends (o: infer O) => unknown ? O : never;\n\ninterface GoogleSearchArgs {\n query: string;\n countryCode?: string;\n language?: string;\n page?: number;\n device?: string;\n nfpr?: boolean;\n}\n\n/** Map the public Google args to the v2 SERP wire params the SDK expects. */\nfunction googleSearchParams(i: GoogleSearchArgs): { query: string; [key: string]: unknown } {\n const params: { query: string; [key: string]: unknown } = { query: i.query };\n if (i.countryCode != null) params.gl = i.countryCode;\n if (i.language != null) params.hl = i.language;\n if (i.page != null && i.page > 1) params.start = (i.page - 1) * 10;\n if (i.device != null) params.device = i.device;\n if (i.nfpr != null) params.nfpr = i.nfpr;\n return params;\n}\n\n/**\n * Build a Composio custom toolkit exposing Scavio search tools.\n *\n * Scavio is a single Search API over Google, YouTube, Amazon, Walmart, Reddit,\n * TikTok, TikTok Shop, Instagram, X and LinkedIn; this toolkit covers the first\n * seven. Pass to `composio.create(userId, { experimental:\n * { customToolkits: [toolkit] } })`. Agent-facing slugs are prefixed `LOCAL_SCAVIO_`.\n */\nexport function buildScavioToolkit(options: BuildScavioToolkitOptions = {}) {\n const {\n apiKey,\n enableGoogle = true,\n enableAmazon = true,\n enableWalmart = true,\n enableYoutube = true,\n enableReddit = true,\n enableTiktok = true,\n enableInstagram = true,\n all = false,\n } = options;\n\n const client = new Scavio({ apiKey: apiKey ?? process.env.SCAVIO_API_KEY });\n\n function tool<T extends z.ZodTypeAny>(\n slug: string,\n name: string,\n description: string,\n inputParams: T,\n call: (input: z.infer<T>) => Promise<Record<string, unknown>>\n ) {\n return experimental_createTool(slug, {\n name,\n description,\n inputParams,\n execute: async (input: z.infer<T>) => call(input),\n });\n }\n\n const tools = [];\n\n if (all || enableGoogle) {\n tools.push(\n tool(\n \"GOOGLE_SEARCH\",\n \"Scavio Google Search\",\n \"Search Google for real-time web results (organic_results, ads, and the AI Overview when present). Costs 1 credit.\",\n z.object({\n query: str(\"The search query.\"),\n countryCode: ostr(\"Two-letter country code, e.g. 'us'.\"),\n language: ostr(\"Two-letter language code, e.g. 'en'.\"),\n page: onum(\"Result page number (1-based).\"),\n device: ostr(\"Device profile: 'desktop' or 'mobile'.\"),\n nfpr: obool(\"Disable auto-correction of the query when true.\"),\n }),\n (i) => client.google.search(googleSearchParams(i))\n )\n );\n }\n\n // Amazon moved upstream in 2026-07: sort_by, pages, category_id, merchant_id,\n // language, currency, device, zip_code and autoselect_variant no longer exist.\n // Removed rather than kept as no-ops - sort_by was verified to return the\n // identical unordered set for every value. `domain` still works on the wire\n // as a deprecated alias but is not offered: one spelling per param.\n if (all || enableAmazon) {\n tools.push(\n tool(\n \"AMAZON_SEARCH\",\n \"Scavio Amazon Search\",\n \"Search Amazon for products matching a query. Results are unsorted and cannot be filtered by category, merchant or price. Costs 1 credit.\",\n z.object({\n query: str(\"The product search query.\"),\n country: ostr(\"Marketplace country code (ISO 3166-1 alpha-2), not a domain: 'us' (default), 'gb' (the UK is gb, not uk), 'ca', 'de', 'fr', 'es', 'it', 'jp', 'in', 'au', 'br', 'mx', 'nl', 'pl', 'se', 'sg', 'ae', 'sa', 'eg', 'cn', 'be', 'tr'. An unknown code falls back to us.\"),\n page: onum(\"Result page, 1-based. One page per call, 1 credit each.\"),\n }),\n (i) => client.amazon.search(i as SdkOpts<typeof client.amazon.search>)\n ),\n tool(\n \"AMAZON_PRODUCT\",\n \"Scavio Amazon Product\",\n \"Fetch full Amazon product details by ASIN. price is the buy-box price only. Costs 1 credit.\",\n z.object({\n asin: str(\"Amazon Standard Identification Number (ASIN) of the product.\"),\n country: ostr(\"Marketplace country code (ISO 3166-1 alpha-2), not a domain: 'us' (default), 'gb' (the UK is gb, not uk), 'ca', 'de', 'fr', 'es', 'it', 'jp', 'in', 'au', 'br', 'mx', 'nl', 'pl', 'se', 'sg', 'ae', 'sa', 'eg', 'cn', 'be', 'tr'. An unknown code falls back to us.\"),\n }),\n (i) => client.amazon.product(i as SdkOpts<typeof client.amazon.product>)\n ),\n tool(\n \"AMAZON_OFFERS\",\n \"Scavio Amazon Offers\",\n \"List every seller offer for one Amazon ASIN: price, seller, condition, shipping, and which offer holds the buy box. Page 1 only. Use this instead of AMAZON_PRODUCT when comparing sellers or checking who owns the buy box. Costs 1 credit.\",\n z.object({\n asin: str(\"Amazon Standard Identification Number (ASIN) of the product.\"),\n country: ostr(\"Marketplace country code (ISO 3166-1 alpha-2), not a domain: 'us' (default), 'gb' (the UK is gb, not uk), 'ca', 'de', 'fr', 'es', 'it', 'jp', 'in', 'au', 'br', 'mx', 'nl', 'pl', 'se', 'sg', 'ae', 'sa', 'eg', 'cn', 'be', 'tr'. An unknown code falls back to us.\"),\n }),\n (i) => client.amazon.offers(i as SdkOpts<typeof client.amazon.offers>)\n )\n );\n }\n\n if (all || enableWalmart) {\n tools.push(\n tool(\n \"WALMART_SEARCH\",\n \"Scavio Walmart Search\",\n \"Search Walmart for products matching a query. Costs 1 credit.\",\n z.object({\n query: str(\"The product search query.\"),\n domain: ostr(\"Walmart domain.\"),\n device: ostr(\"Device profile: 'desktop' or 'mobile'.\"),\n sort_by: ostr(\"Sort order for results.\"),\n start_page: onum(\"First page to return.\"),\n min_price: onum(\"Minimum price filter.\"),\n max_price: onum(\"Maximum price filter.\"),\n fulfillment_speed: ostr(\"Fulfillment speed filter.\"),\n fulfillment_type: ostr(\"Fulfillment type filter.\"),\n delivery_zip: ostr(\"Delivery ZIP/postal code.\"),\n store_id: ostr(\"Restrict to a store id.\"),\n }),\n (i) => client.walmart.search(i as SdkOpts<typeof client.walmart.search>)\n ),\n tool(\n \"WALMART_PRODUCT\",\n \"Scavio Walmart Product\",\n \"Fetch full Walmart product details by product id. Costs 1 credit.\",\n z.object({\n product_id: str(\"Walmart product id.\"),\n domain: ostr(\"Walmart domain.\"),\n device: ostr(\"Device profile: 'desktop' or 'mobile'.\"),\n delivery_zip: ostr(\"Delivery ZIP/postal code.\"),\n store_id: ostr(\"Restrict to a store id.\"),\n }),\n (i) => client.walmart.product(i as SdkOpts<typeof client.walmart.product>)\n )\n );\n }\n\n if (all || enableYoutube) {\n tools.push(\n tool(\n \"YOUTUBE_SEARCH\",\n \"Scavio YouTube Search\",\n \"Search YouTube for videos, channels, or playlists. Costs 2 credits.\",\n z.object({\n query: str(\"The video search query.\"),\n upload_date: ostr(\"Upload date filter: 'last_hour', 'today', 'this_week', 'this_month', 'this_year'.\"),\n type: ostr(\"Result type: 'video', 'channel', 'playlist', or 'movie'.\"),\n duration: ostr(\"Duration filter: 'short', 'medium', or 'long'.\"),\n sort_by: ostr(\"Sort order: 'relevance', 'date', 'view_count', or 'rating'.\"),\n features: z.array(z.string()).optional().describe(\"Feature filters, e.g. ['hd', '4k', 'subtitles', 'creative_commons', 'live', '360', '3d', 'hdr', 'vr180'].\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n hd: obool(\"Restrict to HD videos when true.\"),\n subtitles: obool(\"Restrict to videos with subtitles when true.\"),\n creative_commons: obool(\"Restrict to Creative Commons videos when true.\"),\n live: obool(\"Restrict to live videos when true.\"),\n }),\n (i) => client.youtube.search(i as SdkOpts<typeof client.youtube.search>)\n ),\n tool(\n \"YOUTUBE_SHORTS\",\n \"Scavio YouTube Shorts\",\n \"Search YouTube Shorts. Costs 2 credits.\",\n z.object({\n query: str(\"The Shorts search query.\"),\n sort_by: ostr(\"Sort order: 'relevance', 'date', 'view_count', or 'rating'.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.shorts(i as SdkOpts<typeof client.youtube.shorts>)\n ),\n tool(\n \"YOUTUBE_SUGGESTIONS\",\n \"Scavio YouTube Suggestions\",\n \"Get YouTube search autocomplete suggestions for a partial query. Costs 1 credit.\",\n z.object({\n query: str(\"The partial query to autocomplete.\"),\n language: ostr(\"Suggestion language (ISO 639-1, default 'en').\"),\n region: ostr(\"Region code (ISO 3166-1 alpha-2, default 'US').\"),\n }),\n (i) => client.youtube.suggestions(i)\n ),\n tool(\n \"YOUTUBE_VIDEO\",\n \"Scavio YouTube Video\",\n \"Fetch full metadata for a YouTube video by id or watch URL. Costs 1 credit.\",\n z.object({ video_id: str(\"YouTube video id or a full watch URL.\") }),\n (i) => client.youtube.video(i)\n ),\n tool(\n \"YOUTUBE_METADATA\",\n \"Scavio YouTube Metadata\",\n \"Fetch metadata for a YouTube video by id. Deprecated alias of YOUTUBE_VIDEO.\",\n z.object({ video_id: str(\"YouTube video id or a full watch URL.\") }),\n (i) => client.youtube.metadata(i)\n ),\n tool(\n \"YOUTUBE_COMMENTS\",\n \"Scavio YouTube Comments\",\n \"List top-level comments on a YouTube video. Costs 1 credit.\",\n z.object({\n video_id: str(\"YouTube video id or a full watch URL.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.comments(i)\n ),\n tool(\n \"YOUTUBE_COMMENT_REPLIES\",\n \"Scavio YouTube Comment Replies\",\n \"List replies to a YouTube comment using its reply cursor. Costs 1 credit.\",\n z.object({\n video_id: str(\"YouTube video id or a full watch URL.\"),\n reply_cursor: str(\"Reply cursor from a parent comment's 'reply_cursor' field.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.commentReplies(i)\n ),\n tool(\n \"YOUTUBE_TRANSCRIPT\",\n \"Scavio YouTube Transcript\",\n \"Fetch the transcript or timed captions for a YouTube video. Costs 8 credits.\",\n z.object({\n video_id: str(\"YouTube video id or a full watch URL.\"),\n language: ostr(\"Caption language code (default 'en').\"),\n format: ostr(\"'text' for a plain transcript or 'srt' for timed subtitles (default 'text').\"),\n }),\n (i) => client.youtube.transcript(i as SdkOpts<typeof client.youtube.transcript>)\n ),\n tool(\n \"YOUTUBE_RELATED\",\n \"Scavio YouTube Related\",\n \"List videos related to a YouTube video. Costs 1 credit.\",\n z.object({\n video_id: str(\"YouTube video id or a full watch URL.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.related(i)\n ),\n tool(\n \"YOUTUBE_CHANNEL_SEARCH\",\n \"Scavio YouTube Channel Search\",\n \"Search YouTube channels by keyword. Costs 1 credit.\",\n z.object({\n query: str(\"The channel search query.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.channelSearch(i)\n ),\n tool(\n \"YOUTUBE_CHANNEL\",\n \"Scavio YouTube Channel\",\n \"Fetch YouTube channel details by id, @handle, or URL. Costs 1 credit.\",\n z.object({ channel_id: str(\"YouTube channel id, @handle, or channel URL.\") }),\n (i) => client.youtube.channel(i)\n ),\n tool(\n \"YOUTUBE_CHANNEL_VIDEOS\",\n \"Scavio YouTube Channel Videos\",\n \"List videos uploaded by a YouTube channel. Costs 1 credit.\",\n z.object({\n channel_id: str(\"YouTube channel id.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.channelVideos(i)\n ),\n tool(\n \"YOUTUBE_CHANNEL_SHORTS\",\n \"Scavio YouTube Channel Shorts\",\n \"List Shorts posted by a YouTube channel. Costs 1 credit.\",\n z.object({\n channel_id: str(\"YouTube channel id.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.channelShorts(i)\n ),\n tool(\n \"YOUTUBE_CHANNEL_COMMUNITY\",\n \"Scavio YouTube Channel Community\",\n \"List community posts from a YouTube channel. Costs 1 credit.\",\n z.object({\n channel_id: str(\"YouTube channel id.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.channelCommunity(i)\n ),\n tool(\n \"YOUTUBE_CHANNEL_RESOLVE\",\n \"Scavio YouTube Channel Resolve\",\n \"Resolve a YouTube @handle or channel URL to a channel id. Costs 1 credit.\",\n z.object({ channel: str(\"A channel @handle or channel URL to resolve to a channel id.\") }),\n (i) => client.youtube.channelResolve(i)\n ),\n tool(\n \"YOUTUBE_STREAMS\",\n \"Scavio YouTube Streams\",\n \"Fetch playable or downloadable stream formats for a YouTube video. Costs 3 credits.\",\n z.object({ video_id: str(\"YouTube video id or a full watch URL.\") }),\n (i) => client.youtube.streams(i)\n )\n );\n }\n\n // /reddit/search takes ONLY query + cursor. `type` and `sort` were never real:\n // the API strips unknown fields, so they filtered nothing while making the agent\n // believe the result set was narrowed. Removed rather than kept as no-ops.\n if (all || enableReddit) {\n tools.push(\n tool(\n \"REDDIT_SEARCH\",\n \"Scavio Reddit Search\",\n \"Search Reddit posts. Returns data.results with next_cursor and has_more; page with cursor. Results cannot be filtered or sorted. Costs 1 credit.\",\n z.object({\n query: str(\"The Reddit search query.\"),\n cursor: ostr(\"Pagination cursor: pass 'next_cursor' from a prior response.\"),\n }),\n (i) => client.reddit.search(i as SdkOpts<typeof client.reddit.search>)\n ),\n tool(\n \"REDDIT_POST\",\n \"Scavio Reddit Post\",\n \"Fetch one Reddit post by URL. Returns a flat post object under data (post_id, title, text, url, subreddit, author, score, upvote_ratio, num_comments, created_at, is_nsfw, is_video, thumbnail, media); comments are NOT included. Costs 1 credit.\",\n z.object({ url: str(\"Full URL of the Reddit post.\") }),\n (i) => client.reddit.post(i)\n )\n );\n }\n\n if (all || enableTiktok) {\n tools.push(\n tool(\n \"TIKTOK_PROFILE\",\n \"Scavio TikTok Profile\",\n \"Fetch a TikTok user profile by username or secUid. Costs 1 credit.\",\n z.object({\n username: ostr(\"TikTok username (without @). Provide this or sec_user_id.\"),\n sec_user_id: ostr(\"TikTok secUid. Provide this or username.\"),\n }),\n (i) => client.tiktok.profile(i)\n ),\n tool(\n \"TIKTOK_USER_POSTS\",\n \"Scavio TikTok User Posts\",\n \"List a TikTok user's posts by secUid. Costs 1 credit.\",\n z.object({\n sec_user_id: str(\"TikTok secUid of the user.\"),\n cursor: ostr(\"Pagination cursor.\"),\n count: onum(\"Number of posts to return.\"),\n sort_type: ostr(\"Sort order for posts.\"),\n }),\n (i) => client.tiktok.userPosts(i as SdkOpts<typeof client.tiktok.userPosts>)\n ),\n tool(\n \"TIKTOK_VIDEO\",\n \"Scavio TikTok Video\",\n \"Fetch a TikTok video by id. Costs 1 credit.\",\n z.object({ video_id: str(\"TikTok video id.\") }),\n (i) => client.tiktok.video(i)\n ),\n tool(\n \"TIKTOK_VIDEO_COMMENTS\",\n \"Scavio TikTok Video Comments\",\n \"List comments on a TikTok video. Costs 1 credit.\",\n z.object({\n video_id: str(\"TikTok video id.\"),\n cursor: ostr(\"Pagination cursor.\"),\n count: onum(\"Number of comments to return.\"),\n }),\n (i) => client.tiktok.videoComments(i)\n ),\n tool(\n \"TIKTOK_COMMENT_REPLIES\",\n \"Scavio TikTok Comment Replies\",\n \"List replies to a TikTok video comment. Costs 1 credit.\",\n z.object({\n video_id: str(\"TikTok video id.\"),\n comment_id: str(\"Parent comment id.\"),\n cursor: ostr(\"Pagination cursor.\"),\n count: onum(\"Number of replies to return.\"),\n }),\n (i) => client.tiktok.commentReplies(i)\n ),\n tool(\n \"TIKTOK_SEARCH_VIDEOS\",\n \"Scavio TikTok Search Videos\",\n \"Search TikTok videos by keyword. Costs 1 credit.\",\n z.object({\n keyword: str(\"Search keyword.\"),\n cursor: ostr(\"Pagination cursor.\"),\n count: onum(\"Number of videos to return.\"),\n sort_type: ostr(\"Sort order for results.\"),\n publish_time: ostr(\"Publish-time filter.\"),\n }),\n (i) => client.tiktok.searchVideos(i as SdkOpts<typeof client.tiktok.searchVideos>)\n ),\n tool(\n \"TIKTOK_SEARCH_USERS\",\n \"Scavio TikTok Search Users\",\n \"Search TikTok users by keyword. Costs 1 credit.\",\n z.object({\n keyword: str(\"Search keyword.\"),\n cursor: ostr(\"Pagination cursor.\"),\n count: onum(\"Number of users to return.\"),\n }),\n (i) => client.tiktok.searchUsers(i)\n ),\n tool(\n \"TIKTOK_HASHTAG\",\n \"Scavio TikTok Hashtag\",\n \"Fetch a TikTok hashtag by name or id. Costs 1 credit.\",\n z.object({\n hashtag_name: ostr(\"Hashtag name (without #). Provide this or hashtag_id.\"),\n hashtag_id: ostr(\"Hashtag id. Provide this or hashtag_name.\"),\n }),\n (i) => client.tiktok.hashtag(i)\n ),\n tool(\n \"TIKTOK_HASHTAG_VIDEOS\",\n \"Scavio TikTok Hashtag Videos\",\n \"List videos for a TikTok hashtag by id. Costs 1 credit.\",\n z.object({\n hashtag_id: str(\"Hashtag id.\"),\n cursor: ostr(\"Pagination cursor.\"),\n count: onum(\"Number of videos to return.\"),\n }),\n (i) => client.tiktok.hashtagVideos(i)\n ),\n tool(\n \"TIKTOK_USER_FOLLOWERS\",\n \"Scavio TikTok User Followers\",\n \"List a TikTok user's followers by secUid. Costs 1 credit.\",\n z.object({\n sec_user_id: str(\"TikTok secUid of the user.\"),\n count: onum(\"Number of followers to return.\"),\n page_token: ostr(\"Pagination token.\"),\n min_time: onum(\"Minimum timestamp filter.\"),\n }),\n (i) => client.tiktok.userFollowers(i)\n ),\n tool(\n \"TIKTOK_USER_FOLLOWINGS\",\n \"Scavio TikTok User Followings\",\n \"List the accounts a TikTok user follows, by secUid. Costs 1 credit.\",\n z.object({\n sec_user_id: str(\"TikTok secUid of the user.\"),\n count: onum(\"Number of followings to return.\"),\n page_token: ostr(\"Pagination token.\"),\n min_time: onum(\"Minimum timestamp filter.\"),\n }),\n (i) => client.tiktok.userFollowings(i)\n )\n );\n }\n\n if (all || enableInstagram) {\n tools.push(\n tool(\n \"INSTAGRAM_PROFILE\",\n \"Scavio Instagram Profile\",\n \"Fetch an Instagram profile by username or user id. Costs 10 credits.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n }),\n (i) => client.instagram.profile(i)\n ),\n tool(\n \"INSTAGRAM_USER_POSTS\",\n \"Scavio Instagram User Posts\",\n \"List an Instagram user's posts. Costs 2 credits, the cheapest Instagram endpoint.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n count: onum(\"Number of posts to return.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.userPosts(i)\n ),\n tool(\n \"INSTAGRAM_USER_REELS\",\n \"Scavio Instagram User Reels\",\n \"List an Instagram user's reels. Costs 10 credits.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n count: onum(\"Number of reels to return.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.userReels(i)\n ),\n tool(\n \"INSTAGRAM_USER_TAGGED\",\n \"Scavio Instagram User Tagged\",\n \"List posts an Instagram user is tagged in. Costs 10 credits.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n count: onum(\"Number of tagged posts to return.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.userTagged(i)\n ),\n tool(\n \"INSTAGRAM_USER_STORIES\",\n \"Scavio Instagram User Stories\",\n \"Fetch an Instagram user's current stories. Costs 10 credits.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n }),\n (i) => client.instagram.userStories(i)\n ),\n tool(\n \"INSTAGRAM_POST\",\n \"Scavio Instagram Post\",\n \"Fetch an Instagram post by URL, media id, or shortcode. Costs 8 credits.\",\n z.object({\n url: ostr(\"Post URL. Provide one of url, media_id, or shortcode.\"),\n media_id: ostr(\"Post media id. Provide one of url, media_id, or shortcode.\"),\n shortcode: ostr(\"Post shortcode. Provide one of url, media_id, or shortcode.\"),\n }),\n (i) => client.instagram.post(i)\n ),\n tool(\n \"INSTAGRAM_POST_COMMENTS\",\n \"Scavio Instagram Post Comments\",\n \"List comments on an Instagram post by shortcode or URL. Costs 10 credits.\",\n z.object({\n shortcode: ostr(\"Post shortcode. Provide this or url.\"),\n url: ostr(\"Post URL. Provide this or shortcode.\"),\n cursor: ostr(\"Pagination cursor.\"),\n sort_order: ostr(\"Comment sort order.\"),\n }),\n (i) => client.instagram.postComments(i as SdkOpts<typeof client.instagram.postComments>)\n ),\n tool(\n \"INSTAGRAM_COMMENT_REPLIES\",\n \"Scavio Instagram Comment Replies\",\n \"List replies to an Instagram post comment. Costs 8 credits.\",\n z.object({\n media_id: str(\"Post media id.\"),\n comment_id: str(\"Parent comment id.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.commentReplies(i)\n ),\n tool(\n \"INSTAGRAM_SEARCH_USERS\",\n \"Scavio Instagram Search Users\",\n \"Search Instagram users by keyword. Costs 10 credits.\",\n z.object({\n keyword: str(\"Search keyword.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.searchUsers(i)\n ),\n tool(\n \"INSTAGRAM_SEARCH_HASHTAGS\",\n \"Scavio Instagram Search Hashtags\",\n \"Search Instagram hashtags by keyword. Costs 10 credits.\",\n z.object({\n keyword: str(\"Search keyword.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.searchHashtags(i)\n ),\n tool(\n \"INSTAGRAM_USER_FOLLOWERS\",\n \"Scavio Instagram User Followers\",\n \"List an Instagram user's followers. Costs 10 credits.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n count: onum(\"Number of followers to return.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.userFollowers(i)\n ),\n tool(\n \"INSTAGRAM_USER_FOLLOWINGS\",\n \"Scavio Instagram User Followings\",\n \"List the accounts an Instagram user follows. Costs 10 credits.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n count: onum(\"Number of followings to return.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.userFollowings(i)\n )\n );\n }\n\n return experimental_createToolkit(\"SCAVIO\", {\n name: \"Scavio\",\n description:\n \"Real-time structured search over Google, YouTube, Amazon, Walmart, Reddit, TikTok, and Instagram (part of the Scavio API, which also covers TikTok Shop, X and LinkedIn).\",\n tools,\n });\n}\n\nexport default buildScavioToolkit;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Scavio tools for Composio.\n *\n * Scavio is a single Search API over Google, YouTube, Amazon, Walmart, Reddit, TikTok,\n * TikTok Shop, Instagram, X and LinkedIn. This toolkit exposes all ten platforms as a\n * Composio custom toolkit. Build it with `buildScavioToolkit()` and bind it to a session:\n *\n * import { Composio } from \"@composio/core\";\n * import { buildScavioToolkit } from \"@scavio/composio\";\n *\n * const composio = new Composio();\n * const scavio = buildScavioToolkit({ apiKey: process.env.SCAVIO_API_KEY });\n * const session = await composio.create(\"user_1\", {\n * experimental: { customToolkits: [scavio] },\n * });\n * const out = await session.execute(\"LOCAL_SCAVIO_GOOGLE_SEARCH\", { query: \"ai agents\" });\n *\n * Each provider is gated by an `enable*` flag so an agent only sees the tools it needs.\n */\nimport {\n experimental_createTool,\n experimental_createToolkit,\n} from \"@composio/core\";\nimport { Scavio } from \"scavio\";\nimport { z } from \"zod\";\n\nexport interface BuildScavioToolkitOptions {\n /** Scavio API key. Falls back to the SCAVIO_API_KEY env var. */\n apiKey?: string;\n enableGoogle?: boolean;\n enableAmazon?: boolean;\n enableWalmart?: boolean;\n enableYoutube?: boolean;\n enableReddit?: boolean;\n enableTiktok?: boolean;\n enableTiktokShop?: boolean;\n enableInstagram?: boolean;\n enableX?: boolean;\n enableLinkedin?: boolean;\n /** Register every tool, ignoring the individual flags. */\n all?: boolean;\n}\n\nconst str = (d: string) => z.string().describe(d);\nconst ostr = (d: string) => z.string().optional().describe(d);\nconst onum = (d: string) => z.number().optional().describe(d);\nconst obool = (d: string) => z.boolean().optional().describe(d);\n\n// The Scavio SDK types several option fields as string-literal unions (e.g.\n// sort orders, device profiles). Tool schemas keep them as free-form strings so\n// the agent stays flexible and the API validates the value; this extracts an SDK\n// method's options type so a validated input can be handed through unchanged.\ntype SdkOpts<M> = M extends (o: infer O) => unknown ? O : never;\n\n// Google params shared across the v2 family. v1 (/api/v1/google) was retired on\n// 2026-08-04 and answers 410, so none of its vocabulary survives here: no\n// country_code/language/page, no light_request, no search_type. v2 speaks\n// gl/hl/start/google_domain/device natively and they are exposed as-is. `start`\n// in particular is a RESULT OFFSET, not a page number - remapping a 1-based page\n// onto it silently fetches the wrong page, so no such mapping exists.\nconst gl = ostr(\"Country of the search (ISO 3166-1 alpha-2, e.g. 'us', 'gb', 'de').\");\nconst hl = ostr(\"UI language (ISO 639-1, e.g. 'en').\");\nconst googleDomain = ostr(\"Regional Google domain, e.g. 'google.co.uk'.\");\nconst location = ostr(\"Canonical location name, e.g. 'Austin, Texas, United States'. Encoded server-side.\");\nconst device = ostr(\"Device to emulate: 'desktop' or 'mobile'.\");\nconst currency = ostr(\"Currency code (ISO 4217, e.g. 'USD').\");\nconst checkInDate = str(\"Check-in date (YYYY-MM-DD).\");\nconst checkOutDate = str(\"Check-out date (YYYY-MM-DD).\");\n\n/**\n * Build a Composio custom toolkit exposing Scavio search tools.\n *\n * Scavio is a single Search API over Google, YouTube, Amazon, Walmart, Reddit,\n * TikTok, TikTok Shop, Instagram, X and LinkedIn; this toolkit covers all ten.\n * Pass to `composio.create(userId, { experimental:\n * { customToolkits: [toolkit] } })`. Agent-facing slugs are prefixed `LOCAL_SCAVIO_`.\n */\nexport function buildScavioToolkit(options: BuildScavioToolkitOptions = {}) {\n const {\n apiKey,\n enableGoogle = true,\n enableAmazon = true,\n enableWalmart = true,\n enableYoutube = true,\n enableReddit = true,\n enableTiktok = true,\n enableTiktokShop = true,\n enableInstagram = true,\n enableX = true,\n enableLinkedin = true,\n all = false,\n } = options;\n\n const client = new Scavio({ apiKey: apiKey ?? process.env.SCAVIO_API_KEY });\n\n function tool<T extends z.ZodTypeAny>(\n slug: string,\n name: string,\n description: string,\n inputParams: T,\n call: (input: z.infer<T>) => Promise<Record<string, unknown>>\n ) {\n return experimental_createTool(slug, {\n name,\n description,\n inputParams,\n execute: async (input: z.infer<T>) => call(input),\n });\n }\n\n const tools = [];\n\n // Google runs on /api/v2/google. Responses are FLAT - the provider payload is\n // spread at the top level next to response_time and credits_used, with no\n // `data` wrapper. All 14 endpoints cost 1 credit.\n if (all || enableGoogle) {\n tools.push(\n tool(\n \"GOOGLE_SEARCH\",\n \"Scavio Google Search\",\n \"Search Google for real-time web results. Returns organic_results (each with title, link and snippet) plus knowledge_graph, related_questions, ads and the AI Overview when Google shows one. The body is flat - read organic_results at the top level, not under data. Costs 1 credit.\",\n z.object({\n query: str(\"The search query (1-500 characters).\"),\n gl,\n hl,\n google_domain: googleDomain,\n location,\n device,\n start: onum(\"Result offset, NOT a page number: 0 is page 1, 10 is page 2, up to 990.\"),\n time_period: ostr(\"Restrict results to a recent time window: 'last_hour', 'last_day', 'last_week', 'last_month', or 'last_year'.\"),\n safe: ostr(\"Turn SafeSearch on with 'active'.\"),\n nfpr: obool(\"Disable spelling correction and auto-fixes when true.\"),\n }),\n (i) => client.google.search(i as SdkOpts<typeof client.google.search>)\n ),\n tool(\n \"GOOGLE_AI_MODE\",\n \"Scavio Google AI Mode\",\n \"Ask Google AI Mode a question. Returns Google's generated answer with its cited sources - use this for a synthesized answer and GOOGLE_SEARCH for a ranked result list. Costs 1 credit.\",\n z.object({\n query: str(\"Question or prompt (1-500 characters).\"),\n gl,\n hl,\n google_domain: googleDomain,\n location,\n device,\n safe: ostr(\"Turn SafeSearch on with 'active'.\"),\n }),\n (i) => client.google.aiMode(i as SdkOpts<typeof client.google.aiMode>)\n ),\n tool(\n \"GOOGLE_MAPS_SEARCH\",\n \"Scavio Google Maps Search\",\n \"Search Google Maps for local businesses and places. Returns local results with ratings, review counts, addresses, phone numbers and place ids. Feed a place_id into GOOGLE_MAPS_PLACE or GOOGLE_MAPS_REVIEWS. Costs 1 credit.\",\n z.object({\n query: str(\"Search query, e.g. 'coffee shops in Austin' (1-500 characters).\"),\n ll: ostr(\"Map centre as '@lat,lng,zoomz'; controls which area results come from. Maps localizes by map centre, not gl.\"),\n start: onum(\"Result offset; must be a multiple of 20 (0, 20, 40, ...).\"),\n gl,\n hl,\n google_domain: googleDomain,\n }),\n (i) => client.google.mapsSearch(i)\n ),\n tool(\n \"GOOGLE_MAPS_PLACE\",\n \"Scavio Google Maps Place\",\n \"Fetch one Google Maps place in full: hours, address, phone, website, rating, price level and photos. Provide place_id or data_cid. Costs 1 credit.\",\n z.object({\n place_id: ostr(\"Place ID (starts with ChIJ). Provide this or data_cid.\"),\n data_cid: ostr(\"Numeric CID. Provide this or place_id.\"),\n }),\n (i) => client.google.mapsPlace(i)\n ),\n tool(\n \"GOOGLE_MAPS_REVIEWS\",\n \"Scavio Google Maps Reviews\",\n \"List Google Maps reviews for a place. Provide data_id or place_id. Page with next_page_token; each page costs another credit. Costs 1 credit.\",\n z.object({\n place_id: ostr(\"Place ID (starts with ChIJ). Provide this or data_id.\"),\n data_id: ostr(\"Data ID in 0xHEX:0xHEX form. Provide this or place_id.\"),\n num: onum(\"Reviews per page (1-20).\"),\n sort_by: ostr(\"Review sort order: 'relevance', 'newest', 'highest_rating', or 'lowest_rating'.\"),\n next_page_token: ostr(\"Pagination cursor from a prior response.\"),\n gl,\n hl,\n google_domain: googleDomain,\n }),\n (i) => client.google.mapsReviews(i as SdkOpts<typeof client.google.mapsReviews>)\n ),\n tool(\n \"GOOGLE_SHOPPING\",\n \"Scavio Google Shopping\",\n \"Search Google Shopping. Returns product cards with prices, merchants, ratings and catalog ids across retailers - use this for cross-retailer price comparison and AMAZON_SEARCH or WALMART_SEARCH for a single marketplace. Costs 1 credit.\",\n z.object({\n query: str(\"Product search query (1-500 characters).\"),\n min_price: onum(\"Minimum price filter.\"),\n max_price: onum(\"Maximum price filter.\"),\n sort_by: onum(\"0 = relevance, 1 = price ascending, 2 = price descending.\"),\n free_shipping: obool(\"Only items with free shipping.\"),\n on_sale: obool(\"Only items on sale.\"),\n start: onum(\"Result offset.\"),\n gl,\n hl,\n google_domain: googleDomain,\n location,\n device,\n }),\n (i) => client.google.shopping(i as SdkOpts<typeof client.google.shopping>)\n ),\n tool(\n \"GOOGLE_SHOPPING_PRODUCT\",\n \"Scavio Google Shopping Product\",\n \"Fetch one Google Shopping product: specs, reviews, and the sellers carrying it. Pass catalog_id together with query for full detail and the seller list. Costs 1 credit.\",\n z.object({\n catalog_id: ostr(\"Durable product catalog id from a shopping search.\"),\n query: ostr(\"Product query. Required when catalog_id is set.\"),\n product_id: ostr(\"Product id, as an alternative to catalog_id.\"),\n page_token: ostr(\"Immersive product page token.\"),\n sort_by: ostr(\"Seller sort order: 'base_price', 'total_price', 'promotion', or 'seller_rating'.\"),\n load_all_stores: obool(\"Load every available store.\"),\n more_stores: obool(\"Fetch additional stores.\"),\n gl,\n hl,\n google_domain: googleDomain,\n location,\n device: ostr(\"Device to emulate: 'desktop', 'mobile', or 'tablet'.\"),\n }),\n (i) => client.google.shoppingProduct(i as SdkOpts<typeof client.google.shoppingProduct>)\n ),\n tool(\n \"GOOGLE_SHOPPING_STORES\",\n \"Scavio Google Shopping Stores\",\n \"Fetch the next page of sellers for a Google Shopping product. Continuation of GOOGLE_SHOPPING_PRODUCT: pass the same catalog_id plus that response's next_page_token. Costs 1 credit.\",\n z.object({\n catalog_id: str(\"Durable product catalog id.\"),\n next_page_token: str(\"Pagination cursor from GOOGLE_SHOPPING_PRODUCT.\"),\n }),\n (i) => client.google.shoppingStores(i)\n ),\n tool(\n \"GOOGLE_FLIGHTS\",\n \"Scavio Google Flights\",\n \"Search Google Flights. Returns itineraries with prices, airlines, stops, durations and carbon emissions. Airports are IATA codes; dates are YYYY-MM-DD. Costs 1 credit.\",\n z.object({\n departure_id: str(\"Departure IATA code(s), comma-separated allowed, e.g. 'JFK'.\"),\n arrival_id: str(\"Arrival IATA code(s), comma-separated allowed, e.g. 'LHR'.\"),\n outbound_date: str(\"Outbound date (YYYY-MM-DD).\"),\n return_date: ostr(\"Return date (YYYY-MM-DD). Required when type is 1.\"),\n type: onum(\"1 = round trip (default), 2 = one way, 3 = multi-city.\"),\n adults: onum(\"Number of adults (1-9).\"),\n children: onum(\"Number of children (0-9).\"),\n infants_in_seat: onum(\"Infants in seat (0-4).\"),\n infants_on_lap: onum(\"Infants on lap (0-4).\"),\n travel_class: onum(\"1 = economy, 2 = premium economy, 3 = business, 4 = first.\"),\n stops: onum(\"0 = any, 1 = nonstop, 2 = one stop or fewer, 3 = two or fewer.\"),\n sort_by: onum(\"1 = top, 2 = price, 3 = departure, 4 = arrival, 5 = duration, 6 = emissions.\"),\n include_airlines: ostr(\"Comma-separated airline or alliance codes to include.\"),\n exclude_airlines: ostr(\"Comma-separated airline or alliance codes to exclude.\"),\n currency,\n gl,\n hl,\n }),\n (i) => client.google.flights(i)\n ),\n tool(\n \"GOOGLE_HOTELS\",\n \"Scavio Google Hotels\",\n \"Search Google Hotels. Returns properties with nightly prices, ratings, amenities and a detail_token for GOOGLE_HOTELS_DETAIL. Phrase the query as '<City> hotels'. Costs 1 credit.\",\n z.object({\n query: str(\"Search query; use a '<City> hotels' form.\"),\n check_in_date: checkInDate,\n check_out_date: checkOutDate,\n sort_by: onum(\"3 = lowest price, 8 = highest rating, 13 = most reviewed.\"),\n min_price: onum(\"Minimum nightly price.\"),\n max_price: onum(\"Maximum nightly price.\"),\n rating: onum(\"7 = 3.5+, 8 = 4.0+, 9 = 4.5+.\"),\n hotel_class: ostr(\"Comma-separated star ratings (2-5).\"),\n amenities: ostr(\"Comma-separated amenity ids.\"),\n property_types: ostr(\"Comma-separated property-type ids, e.g. '12' for vacation rentals.\"),\n free_cancellation: obool(\"Only properties with free cancellation.\"),\n eco_certified: obool(\"Only eco-certified properties.\"),\n special_offers: obool(\"Only properties with special offers.\"),\n limit: onum(\"Number of properties to return (1-20).\"),\n next_page_token: ostr(\"Pagination cursor from a prior response.\"),\n currency,\n gl,\n hl,\n }),\n (i) => client.google.hotels(i)\n ),\n tool(\n \"GOOGLE_HOTELS_DETAIL\",\n \"Scavio Google Hotels Detail\",\n \"Fetch one Google Hotels property in full: room types, per-night prices by provider, amenities, photos and reviews. Needs a detail_token from GOOGLE_HOTELS and the same stay dates. Costs 1 credit.\",\n z.object({\n detail_token: str(\"Property detail token from a hotels listing.\"),\n check_in_date: checkInDate,\n check_out_date: checkOutDate,\n currency,\n gl,\n hl,\n }),\n (i) => client.google.hotelsDetail(i)\n ),\n tool(\n \"GOOGLE_NEWS\",\n \"Scavio Google News\",\n \"Fetch Google News. Pass query to search, or a topic_token / story_token / publication_token from an earlier response to browse a topic, a full story or one publisher. Costs 1 credit.\",\n z.object({\n query: ostr(\"Keyword search.\"),\n topic_token: ostr(\"Browse a news topic.\"),\n section_token: ostr(\"Browse a topic section.\"),\n story_token: ostr(\"Fetch full coverage of one story.\"),\n publication_token: ostr(\"Browse one publication.\"),\n kgmid: ostr(\"Knowledge Graph entity id.\"),\n so: onum(\"Sort: 0 = relevance, 1 = date. Only applies with query or kgmid.\"),\n gl,\n hl,\n google_domain: googleDomain,\n }),\n (i) => client.google.news(i)\n ),\n tool(\n \"GOOGLE_TRENDS\",\n \"Scavio Google Trends\",\n \"Fetch Google Trends interest data. Comma-separate the query to compare terms, and pick the dataset with data_type: TIMESERIES for interest over time, GEO_MAP for interest by region, RELATED_QUERIES or RELATED_TOPICS for rising searches. Costs 1 credit.\",\n z.object({\n query: str(\"Search term(s); comma-separated to compare up to five.\"),\n data_type: ostr(\"Which trends dataset to return: 'TIMESERIES', 'GEO_MAP', 'GEO_MAP_0', 'RELATED_QUERIES', or 'RELATED_TOPICS'.\"),\n geo: ostr(\"Location code, e.g. 'US', 'GB', 'US-CA'. Omit for worldwide.\"),\n date: ostr(\"Time range, e.g. 'today 12-m', 'now 7-d'.\"),\n cat: ostr(\"Category id.\"),\n gprop: ostr(\"Restrict to a Google property: 'images', 'news', 'youtube', or 'froogle'.\"),\n region: ostr(\"Resolution for GEO_MAP data: 'COUNTRY', 'REGION', 'DMA', or 'CITY'.\"),\n tz: ostr(\"Timezone offset in minutes.\"),\n hl,\n }),\n (i) => client.google.trends(i as SdkOpts<typeof client.google.trends>)\n ),\n tool(\n \"GOOGLE_TRENDING\",\n \"Scavio Google Trending\",\n \"List what is trending on Google right now for one country. geo is required. Use GOOGLE_TRENDS instead when you already know the term you care about. Costs 1 credit.\",\n z.object({\n geo: str(\"Country code, e.g. 'US'.\"),\n hours: onum(\"Trending window in hours: 4, 24, 48 or 168.\"),\n cat: onum(\"Category id (0-20).\"),\n sort: ostr(\"Sort order: 'relevance', 'search_volume', 'recency', or 'title'.\"),\n status: ostr(\"Filter by trend status: 'all' or 'active'.\"),\n hl,\n }),\n (i) => client.google.trending(i as SdkOpts<typeof client.google.trending>)\n )\n );\n }\n\n // Amazon moved upstream in 2026-07: sort_by, pages, category_id, merchant_id,\n // language, currency, device, zip_code and autoselect_variant no longer exist.\n // Removed rather than kept as no-ops - sort_by was verified to return the\n // identical unordered set for every value. `domain` still works on the wire\n // as a deprecated alias but is not offered: one spelling per param.\n if (all || enableAmazon) {\n tools.push(\n tool(\n \"AMAZON_SEARCH\",\n \"Scavio Amazon Search\",\n \"Search Amazon for products matching a query. Results are unsorted and cannot be filtered by category, merchant or price. Costs 1 credit.\",\n z.object({\n query: str(\"The product search query.\"),\n country: ostr(\"Marketplace country code (ISO 3166-1 alpha-2), not a domain: 'us' (default), 'gb' (the UK is gb, not uk), 'ca', 'de', 'fr', 'es', 'it', 'jp', 'in', 'au', 'br', 'mx', 'nl', 'pl', 'se', 'sg', 'ae', 'sa', 'eg', 'cn', 'be', 'tr'. An unknown code falls back to us.\"),\n page: onum(\"Result page, 1-based. One page per call, 1 credit each.\"),\n }),\n (i) => client.amazon.search(i as SdkOpts<typeof client.amazon.search>)\n ),\n tool(\n \"AMAZON_PRODUCT\",\n \"Scavio Amazon Product\",\n \"Fetch full Amazon product details by ASIN. price is the buy-box price only. Costs 1 credit.\",\n z.object({\n asin: str(\"Amazon Standard Identification Number (ASIN) of the product.\"),\n country: ostr(\"Marketplace country code (ISO 3166-1 alpha-2), not a domain: 'us' (default), 'gb' (the UK is gb, not uk), 'ca', 'de', 'fr', 'es', 'it', 'jp', 'in', 'au', 'br', 'mx', 'nl', 'pl', 'se', 'sg', 'ae', 'sa', 'eg', 'cn', 'be', 'tr'. An unknown code falls back to us.\"),\n }),\n (i) => client.amazon.product(i as SdkOpts<typeof client.amazon.product>)\n ),\n tool(\n \"AMAZON_OFFERS\",\n \"Scavio Amazon Offers\",\n \"List every seller offer for one Amazon ASIN: price, seller, condition, shipping, and which offer holds the buy box. Page 1 only. Use this instead of AMAZON_PRODUCT when comparing sellers or checking who owns the buy box. Costs 1 credit.\",\n z.object({\n asin: str(\"Amazon Standard Identification Number (ASIN) of the product.\"),\n country: ostr(\"Marketplace country code (ISO 3166-1 alpha-2), not a domain: 'us' (default), 'gb' (the UK is gb, not uk), 'ca', 'de', 'fr', 'es', 'it', 'jp', 'in', 'au', 'br', 'mx', 'nl', 'pl', 'se', 'sg', 'ae', 'sa', 'eg', 'cn', 'be', 'tr'. An unknown code falls back to us.\"),\n }),\n (i) => client.amazon.offers(i as SdkOpts<typeof client.amazon.offers>)\n )\n );\n }\n\n if (all || enableWalmart) {\n tools.push(\n tool(\n \"WALMART_SEARCH\",\n \"Scavio Walmart Search\",\n \"Search Walmart for products matching a query. Costs 1 credit.\",\n z.object({\n query: str(\"The product search query.\"),\n domain: ostr(\"Walmart domain.\"),\n device: ostr(\"Device profile: 'desktop' or 'mobile'.\"),\n sort_by: ostr(\"Sort order for results.\"),\n start_page: onum(\"First page to return.\"),\n min_price: onum(\"Minimum price filter.\"),\n max_price: onum(\"Maximum price filter.\"),\n fulfillment_speed: ostr(\"Fulfillment speed filter.\"),\n fulfillment_type: ostr(\"Fulfillment type filter.\"),\n delivery_zip: ostr(\"Delivery ZIP/postal code.\"),\n store_id: ostr(\"Restrict to a store id.\"),\n }),\n (i) => client.walmart.search(i as SdkOpts<typeof client.walmart.search>)\n ),\n tool(\n \"WALMART_PRODUCT\",\n \"Scavio Walmart Product\",\n \"Fetch full Walmart product details by product id. Costs 1 credit.\",\n z.object({\n product_id: str(\"Walmart product id.\"),\n domain: ostr(\"Walmart domain.\"),\n device: ostr(\"Device profile: 'desktop' or 'mobile'.\"),\n delivery_zip: ostr(\"Delivery ZIP/postal code.\"),\n store_id: ostr(\"Restrict to a store id.\"),\n }),\n (i) => client.walmart.product(i as SdkOpts<typeof client.walmart.product>)\n )\n );\n }\n\n // /youtube/metadata is a deprecated alias of /youtube/video and is deliberately\n // not exposed - two tools for one endpoint only makes an agent pick wrong.\n if (all || enableYoutube) {\n tools.push(\n tool(\n \"YOUTUBE_SEARCH\",\n \"Scavio YouTube Search\",\n \"Search YouTube for videos, channels, or playlists. Costs 2 credits.\",\n z.object({\n query: str(\"The video search query.\"),\n upload_date: ostr(\"Upload date filter: 'last_hour', 'today', 'this_week', 'this_month', 'this_year'.\"),\n type: ostr(\"Result type: 'video', 'channel', 'playlist', or 'movie'.\"),\n duration: ostr(\"Duration filter: 'short', 'medium', or 'long'.\"),\n sort_by: ostr(\"Sort order: 'relevance', 'date', 'view_count', or 'rating'.\"),\n features: z.array(z.string()).optional().describe(\"Feature filters, e.g. ['hd', '4k', 'subtitles', 'creative_commons', 'live', '360', '3d', 'hdr', 'vr180'].\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n hd: obool(\"Restrict to HD videos when true.\"),\n subtitles: obool(\"Restrict to videos with subtitles when true.\"),\n creative_commons: obool(\"Restrict to Creative Commons videos when true.\"),\n live: obool(\"Restrict to live videos when true.\"),\n }),\n (i) => client.youtube.search(i as SdkOpts<typeof client.youtube.search>)\n ),\n tool(\n \"YOUTUBE_SHORTS\",\n \"Scavio YouTube Shorts\",\n \"Search YouTube Shorts. Costs 2 credits.\",\n z.object({\n query: str(\"The Shorts search query.\"),\n sort_by: ostr(\"Sort order: 'relevance', 'date', 'view_count', or 'rating'.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.shorts(i as SdkOpts<typeof client.youtube.shorts>)\n ),\n tool(\n \"YOUTUBE_SUGGESTIONS\",\n \"Scavio YouTube Suggestions\",\n \"Get YouTube search autocomplete suggestions for a partial query. Costs 1 credit.\",\n z.object({\n query: str(\"The partial query to autocomplete.\"),\n language: ostr(\"Suggestion language (ISO 639-1, default 'en').\"),\n region: ostr(\"Region code (ISO 3166-1 alpha-2, default 'US').\"),\n }),\n (i) => client.youtube.suggestions(i)\n ),\n tool(\n \"YOUTUBE_VIDEO\",\n \"Scavio YouTube Video\",\n \"Fetch full metadata for a YouTube video by id or watch URL. Costs 1 credit.\",\n z.object({ video_id: str(\"YouTube video id or a full watch URL.\") }),\n (i) => client.youtube.video(i)\n ),\n tool(\n \"YOUTUBE_COMMENTS\",\n \"Scavio YouTube Comments\",\n \"List top-level comments on a YouTube video. Costs 1 credit.\",\n z.object({\n video_id: str(\"YouTube video id or a full watch URL.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.comments(i)\n ),\n tool(\n \"YOUTUBE_COMMENT_REPLIES\",\n \"Scavio YouTube Comment Replies\",\n \"List replies to a YouTube comment using its reply cursor. Costs 1 credit.\",\n z.object({\n video_id: str(\"YouTube video id or a full watch URL.\"),\n reply_cursor: str(\"Reply cursor from a parent comment's 'reply_cursor' field.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.commentReplies(i)\n ),\n tool(\n \"YOUTUBE_TRANSCRIPT\",\n \"Scavio YouTube Transcript\",\n \"Fetch the transcript or timed captions for a YouTube video. Costs 8 credits.\",\n z.object({\n video_id: str(\"YouTube video id or a full watch URL.\"),\n language: ostr(\"Caption language code (default 'en').\"),\n format: ostr(\"'text' for a plain transcript or 'srt' for timed subtitles (default 'text').\"),\n }),\n (i) => client.youtube.transcript(i as SdkOpts<typeof client.youtube.transcript>)\n ),\n tool(\n \"YOUTUBE_RELATED\",\n \"Scavio YouTube Related\",\n \"List videos related to a YouTube video. Costs 1 credit.\",\n z.object({\n video_id: str(\"YouTube video id or a full watch URL.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.related(i)\n ),\n tool(\n \"YOUTUBE_CHANNEL_SEARCH\",\n \"Scavio YouTube Channel Search\",\n \"Search YouTube channels by keyword. Costs 1 credit.\",\n z.object({\n query: str(\"The channel search query.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.channelSearch(i)\n ),\n tool(\n \"YOUTUBE_CHANNEL\",\n \"Scavio YouTube Channel\",\n \"Fetch YouTube channel details by id, @handle, or URL. Costs 1 credit.\",\n z.object({ channel_id: str(\"YouTube channel id, @handle, or channel URL.\") }),\n (i) => client.youtube.channel(i)\n ),\n tool(\n \"YOUTUBE_CHANNEL_VIDEOS\",\n \"Scavio YouTube Channel Videos\",\n \"List videos uploaded by a YouTube channel. Costs 1 credit.\",\n z.object({\n channel_id: str(\"YouTube channel id.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.channelVideos(i)\n ),\n tool(\n \"YOUTUBE_CHANNEL_SHORTS\",\n \"Scavio YouTube Channel Shorts\",\n \"List Shorts posted by a YouTube channel. Costs 1 credit.\",\n z.object({\n channel_id: str(\"YouTube channel id.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.channelShorts(i)\n ),\n tool(\n \"YOUTUBE_CHANNEL_COMMUNITY\",\n \"Scavio YouTube Channel Community\",\n \"List community posts from a YouTube channel. Costs 1 credit.\",\n z.object({\n channel_id: str(\"YouTube channel id.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.youtube.channelCommunity(i)\n ),\n tool(\n \"YOUTUBE_CHANNEL_RESOLVE\",\n \"Scavio YouTube Channel Resolve\",\n \"Resolve a YouTube @handle or channel URL to a channel id. Costs 1 credit.\",\n z.object({ channel: str(\"A channel @handle or channel URL to resolve to a channel id.\") }),\n (i) => client.youtube.channelResolve(i)\n ),\n tool(\n \"YOUTUBE_STREAMS\",\n \"Scavio YouTube Streams\",\n \"Fetch playable or downloadable stream formats for a YouTube video. Costs 3 credits.\",\n z.object({ video_id: str(\"YouTube video id or a full watch URL.\") }),\n (i) => client.youtube.streams(i)\n )\n );\n }\n\n // /reddit/search takes ONLY query + cursor. `type` and `sort` were never real:\n // the API strips unknown fields, so they filtered nothing while making the agent\n // believe the result set was narrowed. Removed rather than kept as no-ops.\n // Sort defaults differ per endpoint (TOP for comments, HOT for a subreddit feed,\n // NEW for a user feed) and values are UPPERCASE; only the subreddit feed accepts\n // RISING. All twelve endpoints cost 1 credit.\n if (all || enableReddit) {\n tools.push(\n tool(\n \"REDDIT_SEARCH\",\n \"Scavio Reddit Search\",\n \"Search Reddit posts. Returns data.results with next_cursor and has_more; page with cursor. Results cannot be filtered or sorted. Costs 1 credit.\",\n z.object({\n query: str(\"The Reddit search query.\"),\n cursor: ostr(\"Pagination cursor: pass 'next_cursor' from a prior response.\"),\n }),\n (i) => client.reddit.search(i as SdkOpts<typeof client.reddit.search>)\n ),\n tool(\n \"REDDIT_SEARCH_SUGGESTIONS\",\n \"Scavio Reddit Search Suggestions\",\n \"Get Reddit search autocomplete suggestions for a query. Returns data.suggestions (plain strings) and total_count. Costs 1 credit.\",\n z.object({ query: str(\"The partial or full query to expand.\") }),\n (i) => client.reddit.searchSuggestions(i)\n ),\n tool(\n \"REDDIT_POST\",\n \"Scavio Reddit Post\",\n \"Fetch one Reddit post by URL or post id. Returns a FLAT post object under data (post_id, title, text, url, subreddit, author, score, upvote_ratio, num_comments, created_at, is_nsfw, is_video, thumbnail, media); comments are NOT included - call REDDIT_POST_COMMENTS for those. Costs 1 credit.\",\n z.object({\n url: ostr(\"Full URL of the Reddit post. Provide this or post_id.\"),\n post_id: ostr(\"Post fullname (t3_...) or bare id. Provide this or url.\"),\n }),\n (i) => client.reddit.post(i)\n ),\n tool(\n \"REDDIT_POST_COMMENTS\",\n \"Scavio Reddit Post Comments\",\n \"List top-level comments on a Reddit post. Returns data.comments with next_cursor and has_more; each comment carries a reply_cursor for REDDIT_COMMENT_REPLIES. Costs 1 credit.\",\n z.object({\n post_id: str(\"Post fullname (t3_...), bare id, or post URL.\"),\n sort: ostr(\"Comment sort order (UPPERCASE): 'HOT', 'NEW', 'TOP', 'BEST', or 'CONTROVERSIAL'. Defaults to TOP.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.reddit.postComments(i as SdkOpts<typeof client.reddit.postComments>)\n ),\n tool(\n \"REDDIT_COMMENT_REPLIES\",\n \"Scavio Reddit Comment Replies\",\n \"List replies to one Reddit comment. cursor is REQUIRED here and must be a comment's 'reply_cursor' from REDDIT_POST_COMMENTS, not a 'next_cursor'. Costs 1 credit.\",\n z.object({\n post_id: str(\"Post fullname (t3_...) the comment belongs to.\"),\n cursor: str(\"A comment's 'reply_cursor' from REDDIT_POST_COMMENTS. Required.\"),\n sort: ostr(\"Comment sort order (UPPERCASE): 'HOT', 'NEW', 'TOP', 'BEST', or 'CONTROVERSIAL'. Defaults to TOP.\"),\n }),\n (i) => client.reddit.commentReplies(i as SdkOpts<typeof client.reddit.commentReplies>)\n ),\n tool(\n \"REDDIT_SUBREDDIT\",\n \"Scavio Reddit Subreddit\",\n \"Fetch a subreddit's profile: title, description, subscribers, active_count, type, icon, banner and created_at. Costs 1 credit.\",\n z.object({ subreddit: str(\"Subreddit name without the r/ prefix, e.g. 'AskReddit'.\") }),\n (i) => client.reddit.subreddit(i)\n ),\n tool(\n \"REDDIT_SUBREDDIT_POSTS\",\n \"Scavio Reddit Subreddit Posts\",\n \"List posts in a subreddit feed. Returns data.posts with next_cursor and has_more. This feed shape has no text and no thumbnail - use REDDIT_POST for a post's body. Costs 1 credit.\",\n z.object({\n subreddit: str(\"Subreddit name without the r/ prefix.\"),\n sort: ostr(\"Feed sort order (UPPERCASE): 'BEST', 'HOT', 'NEW', 'TOP', 'CONTROVERSIAL', or 'RISING'. Defaults to HOT. This is the only endpoint accepting RISING.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.reddit.subredditPosts(i as SdkOpts<typeof client.reddit.subredditPosts>)\n ),\n tool(\n \"REDDIT_USER\",\n \"Scavio Reddit User\",\n \"Fetch a redditor's profile: karma split, account_type, avatar, description, verification flags and created_at. Costs 1 credit.\",\n z.object({ username: str(\"Redditor username without the u/ prefix, e.g. 'spez'.\") }),\n (i) => client.reddit.user(i)\n ),\n tool(\n \"REDDIT_USER_POSTS\",\n \"Scavio Reddit User Posts\",\n \"List posts submitted by a redditor. Returns data.posts with next_cursor and has_more. Costs 1 credit.\",\n z.object({\n username: str(\"Redditor username without the u/ prefix.\"),\n sort: ostr(\"Sort order (UPPERCASE): 'HOT', 'NEW', 'TOP', 'BEST', or 'CONTROVERSIAL'. Defaults to NEW.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.reddit.userPosts(i as SdkOpts<typeof client.reddit.userPosts>)\n ),\n tool(\n \"REDDIT_USER_COMMENTS\",\n \"Scavio Reddit User Comments\",\n \"List comments written by a redditor. Returns data.comments with next_cursor and has_more; each item nests the post it belongs to. Costs 1 credit.\",\n z.object({\n username: str(\"Redditor username without the u/ prefix.\"),\n sort: ostr(\"Sort order (UPPERCASE): 'HOT', 'NEW', 'TOP', 'BEST', or 'CONTROVERSIAL'. Defaults to NEW.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.reddit.userComments(i as SdkOpts<typeof client.reddit.userComments>)\n ),\n tool(\n \"REDDIT_POPULAR\",\n \"Scavio Reddit Popular\",\n \"List the site-wide r/popular feed. Returns data.posts with next_cursor and has_more. Costs 1 credit.\",\n z.object({ cursor: ostr(\"Pagination cursor from a prior response. Omit for page 1.\") }),\n (i) => client.reddit.popular(i)\n ),\n tool(\n \"REDDIT_TRENDING\",\n \"Scavio Reddit Trending\",\n \"List Reddit's currently trending searches. Returns data.trending (query plus raw_query) and total_count. Takes no parameters. Costs 1 credit.\",\n z.object({}),\n () => client.reddit.trending()\n )\n );\n }\n\n if (all || enableTiktok) {\n tools.push(\n tool(\n \"TIKTOK_PROFILE\",\n \"Scavio TikTok Profile\",\n \"Fetch a TikTok user profile by username or secUid. Costs 1 credit.\",\n z.object({\n username: ostr(\"TikTok username (without @). Provide this or sec_user_id.\"),\n sec_user_id: ostr(\"TikTok secUid. Provide this or username.\"),\n }),\n (i) => client.tiktok.profile(i)\n ),\n tool(\n \"TIKTOK_USER_POSTS\",\n \"Scavio TikTok User Posts\",\n \"List a TikTok user's posts by secUid. Costs 1 credit.\",\n z.object({\n sec_user_id: str(\"TikTok secUid of the user.\"),\n cursor: ostr(\"Pagination cursor.\"),\n count: onum(\"Number of posts to return.\"),\n sort_type: ostr(\"Sort order for posts.\"),\n }),\n (i) => client.tiktok.userPosts(i as SdkOpts<typeof client.tiktok.userPosts>)\n ),\n tool(\n \"TIKTOK_VIDEO\",\n \"Scavio TikTok Video\",\n \"Fetch a TikTok video by id. Costs 1 credit.\",\n z.object({ video_id: str(\"TikTok video id.\") }),\n (i) => client.tiktok.video(i)\n ),\n tool(\n \"TIKTOK_VIDEO_COMMENTS\",\n \"Scavio TikTok Video Comments\",\n \"List comments on a TikTok video. Costs 1 credit.\",\n z.object({\n video_id: str(\"TikTok video id.\"),\n cursor: ostr(\"Pagination cursor.\"),\n count: onum(\"Number of comments to return.\"),\n }),\n (i) => client.tiktok.videoComments(i)\n ),\n tool(\n \"TIKTOK_COMMENT_REPLIES\",\n \"Scavio TikTok Comment Replies\",\n \"List replies to a TikTok video comment. Costs 1 credit.\",\n z.object({\n video_id: str(\"TikTok video id.\"),\n comment_id: str(\"Parent comment id.\"),\n cursor: ostr(\"Pagination cursor.\"),\n count: onum(\"Number of replies to return.\"),\n }),\n (i) => client.tiktok.commentReplies(i)\n ),\n tool(\n \"TIKTOK_SEARCH_VIDEOS\",\n \"Scavio TikTok Search Videos\",\n \"Search TikTok videos by keyword. Costs 1 credit.\",\n z.object({\n keyword: str(\"Search keyword.\"),\n cursor: ostr(\"Pagination cursor.\"),\n count: onum(\"Number of videos to return.\"),\n sort_type: ostr(\"Sort order for results.\"),\n publish_time: ostr(\"Publish-time filter.\"),\n }),\n (i) => client.tiktok.searchVideos(i as SdkOpts<typeof client.tiktok.searchVideos>)\n ),\n tool(\n \"TIKTOK_SEARCH_USERS\",\n \"Scavio TikTok Search Users\",\n \"Search TikTok users by keyword. Costs 1 credit.\",\n z.object({\n keyword: str(\"Search keyword.\"),\n cursor: ostr(\"Pagination cursor.\"),\n count: onum(\"Number of users to return.\"),\n }),\n (i) => client.tiktok.searchUsers(i)\n ),\n tool(\n \"TIKTOK_HASHTAG\",\n \"Scavio TikTok Hashtag\",\n \"Fetch a TikTok hashtag by name or id. Costs 1 credit.\",\n z.object({\n hashtag_name: ostr(\"Hashtag name (without #). Provide this or hashtag_id.\"),\n hashtag_id: ostr(\"Hashtag id. Provide this or hashtag_name.\"),\n }),\n (i) => client.tiktok.hashtag(i)\n ),\n tool(\n \"TIKTOK_HASHTAG_VIDEOS\",\n \"Scavio TikTok Hashtag Videos\",\n \"List videos for a TikTok hashtag by id. Costs 1 credit.\",\n z.object({\n hashtag_id: str(\"Hashtag id.\"),\n cursor: ostr(\"Pagination cursor.\"),\n count: onum(\"Number of videos to return.\"),\n }),\n (i) => client.tiktok.hashtagVideos(i)\n ),\n tool(\n \"TIKTOK_USER_FOLLOWERS\",\n \"Scavio TikTok User Followers\",\n \"List a TikTok user's followers by secUid. Costs 1 credit.\",\n z.object({\n sec_user_id: str(\"TikTok secUid of the user.\"),\n count: onum(\"Number of followers to return.\"),\n page_token: ostr(\"Pagination token.\"),\n min_time: onum(\"Minimum timestamp filter.\"),\n }),\n (i) => client.tiktok.userFollowers(i)\n ),\n tool(\n \"TIKTOK_USER_FOLLOWINGS\",\n \"Scavio TikTok User Followings\",\n \"List the accounts a TikTok user follows, by secUid. Costs 1 credit.\",\n z.object({\n sec_user_id: str(\"TikTok secUid of the user.\"),\n count: onum(\"Number of followings to return.\"),\n page_token: ostr(\"Pagination token.\"),\n min_time: onum(\"Minimum timestamp filter.\"),\n }),\n (i) => client.tiktok.userFollowings(i)\n )\n );\n }\n\n // TikTok Shop: 8 endpoints, 1 credit each. Two different region enums on\n // purpose - the listing endpoints serve US and GB only, everything else serves\n // the full eight, and /tiktok-shop/search takes no region at all (US catalog).\n // Cursors are opaque blobs from a prior next_cursor; a foreign cursor 400s.\n if (all || enableTiktokShop) {\n tools.push(\n tool(\n \"TIKTOK_SHOP_SEARCH\",\n \"Scavio TikTok Shop Search\",\n \"Search TikTok Shop products by keyword (US catalog only), up to 30 per page with exact prices, ratings and shop details. One of the three endpoints that return exact prices. Paginate with next_cursor and dedupe by product_id across pages. Costs 1 credit.\",\n z.object({\n search: str(\"Search query (1-200 characters). The keyword field is named 'search', not 'query'.\"),\n cursor: ostr(\"Opaque cursor from a prior response's next_cursor.\"),\n }),\n (i) => client.tiktokShop.search(i)\n ),\n tool(\n \"TIKTOK_SHOP_SEARCH_SUGGESTIONS\",\n \"Scavio TikTok Shop Search Suggestions\",\n \"Expand a partial TikTok Shop query into keyword suggestions across 8 marketplace regions. Suggestions are not guaranteed prefix matches: a misspelling returns typo corrections, and results can include brand and shop names. Costs 1 credit.\",\n z.object({\n search: str(\"Partial query to expand (1-100 characters). The field is 'search', not 'query'.\"),\n region: ostr(\"Marketplace region: 'US' (default), 'GB', 'SG', 'MY', 'PH', 'TH', 'VN', or 'ID'.\"),\n }),\n (i) => client.tiktokShop.searchSuggestions(i as SdkOpts<typeof client.tiktokShop.searchSuggestions>)\n ),\n tool(\n \"TIKTOK_SHOP_PRODUCT\",\n \"Scavio TikTok Shop Product\",\n \"Full TikTok Shop product detail: description, images, variants with stock, shipping, shop profile, category path and top reviews. Two limits: it does NOT return a price (upstream masks it - get prices from TIKTOK_SHOP_SEARCH, TIKTOK_SHOP_SHOP_PRODUCTS or TIKTOK_SHOP_CATEGORY_PRODUCTS), and it resolves only about 44% of the product ids returned by search, so a 404 is a normal outcome to skip rather than retry. Costs 1 credit.\",\n z.object({\n product_id: str(\"TikTok Shop product id (6-25 digits).\"),\n region: ostr(\"Marketplace region: 'US' (default), 'GB', 'SG', 'MY', 'PH', 'TH', 'VN', or 'ID'.\"),\n }),\n (i) => client.tiktokShop.product(i as SdkOpts<typeof client.tiktokShop.product>)\n ),\n tool(\n \"TIKTOK_SHOP_PRODUCT_REVIEWS\",\n \"Scavio TikTok Shop Product Reviews\",\n \"Paginated TikTok Shop product reviews with text, images, star histogram and verified-purchase flags, up to 200 per call. total_reviews drifts between calls and must NOT be used to compute a page count - page with has_more instead. Often works for ids TIKTOK_SHOP_PRODUCT cannot resolve. Costs 1 credit.\",\n z.object({\n product_id: str(\"TikTok Shop product id (6-25 digits).\"),\n page: onum(\"1-based page number (1-500, default 1).\"),\n page_size: onum(\"Reviews per page (1-200, default 20).\"),\n sort: ostr(\"'relevant' (default) is text-complete and image-heavy; 'recent' is fresher but far more text-sparse.\"),\n rating: onum(\"Only reviews with this star rating (1-5).\"),\n has_media: obool(\"Only reviews with a photo or video. Shares one upstream slot with verified_only, and wins when both are set.\"),\n verified_only: obool(\"Only verified purchases. Ignored when has_media is also set.\"),\n region: ostr(\"Marketplace region: 'US' (default), 'GB', 'SG', 'MY', 'PH', 'TH', 'VN', or 'ID'.\"),\n }),\n (i) => client.tiktokShop.productReviews(i as SdkOpts<typeof client.tiktokShop.productReviews>)\n ),\n tool(\n \"TIKTOK_SHOP_CATEGORIES\",\n \"Scavio TikTok Shop Categories\",\n \"The global TikTok Shop category tree: 28 top-level categories, 240 nodes, two levels deep. Category ids are identical in every region and names are always English. Takes no parameters. Costs 1 credit.\",\n z.object({}),\n () => client.tiktokShop.categories()\n ),\n tool(\n \"TIKTOK_SHOP_CATEGORY_PRODUCTS\",\n \"Scavio TikTok Shop Category Products\",\n \"Products listed under a category id from TIKTOK_SHOP_CATEGORIES, with exact prices. Level 1 or 2 ids both work. Page size is inconsistent upstream (15 to 20), so always paginate with next_cursor; when has_more turns false after a few pages that is the end of a shallow listing, not an error. Costs 1 credit.\",\n z.object({\n category_id: str(\"Category id from TIKTOK_SHOP_CATEGORIES; level 1 or 2 both work.\"),\n cursor: ostr(\"Opaque cursor from a prior response's next_cursor.\"),\n region: ostr(\"Marketplace region, 'US' (default) or 'GB' only - not the 8-region list.\"),\n }),\n (i) => client.tiktokShop.categoryProducts(i as SdkOpts<typeof client.tiktokShop.categoryProducts>)\n ),\n tool(\n \"TIKTOK_SHOP_SHOP_PRODUCTS\",\n \"Scavio TikTok Shop Shop Products\",\n \"A shop's TikTok Shop catalog, 30 per page, with exact prices. Shop follower count, location and shop-level rating are not available here - call TIKTOK_SHOP_PRODUCT for the full shop profile. Costs 1 credit.\",\n z.object({\n shop_id: str(\"TikTok Shop seller id (also called seller_id elsewhere on TikTok).\"),\n cursor: ostr(\"Opaque cursor from a prior response's next_cursor.\"),\n region: ostr(\"Marketplace region: 'US' (default), 'GB', 'SG', 'MY', 'PH', 'TH', 'VN', or 'ID'.\"),\n }),\n (i) => client.tiktokShop.shopProducts(i as SdkOpts<typeof client.tiktokShop.shopProducts>)\n ),\n tool(\n \"TIKTOK_SHOP_RESOLVE\",\n \"Scavio TikTok Shop Resolve\",\n \"Resolve any TikTok Shop URL or share link to a product_id or shop_id, ready for the other TikTok Shop tools. Accepts shop.tiktok.com product and store pages, tiktok.com/view links, affiliate share links, and vt.tiktok.com short links. Costs 1 credit.\",\n z.object({ url: str(\"A TikTok Shop product or store URL, affiliate share link, or vt.tiktok.com short link.\") }),\n (i) => client.tiktokShop.resolve(i)\n )\n );\n }\n\n if (all || enableInstagram) {\n tools.push(\n tool(\n \"INSTAGRAM_PROFILE\",\n \"Scavio Instagram Profile\",\n \"Fetch an Instagram profile by username or user id. Costs 10 credits.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n }),\n (i) => client.instagram.profile(i)\n ),\n tool(\n \"INSTAGRAM_USER_POSTS\",\n \"Scavio Instagram User Posts\",\n \"List an Instagram user's posts. Costs 2 credits, the cheapest Instagram endpoint.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n count: onum(\"Number of posts to return.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.userPosts(i)\n ),\n tool(\n \"INSTAGRAM_USER_REELS\",\n \"Scavio Instagram User Reels\",\n \"List an Instagram user's reels. Costs 10 credits.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n count: onum(\"Number of reels to return.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.userReels(i)\n ),\n tool(\n \"INSTAGRAM_USER_TAGGED\",\n \"Scavio Instagram User Tagged\",\n \"List posts an Instagram user is tagged in. Costs 10 credits.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n count: onum(\"Number of tagged posts to return.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.userTagged(i)\n ),\n tool(\n \"INSTAGRAM_USER_STORIES\",\n \"Scavio Instagram User Stories\",\n \"Fetch an Instagram user's current stories. Costs 10 credits.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n }),\n (i) => client.instagram.userStories(i)\n ),\n tool(\n \"INSTAGRAM_POST\",\n \"Scavio Instagram Post\",\n \"Fetch an Instagram post by URL, media id, or shortcode. Costs 8 credits.\",\n z.object({\n url: ostr(\"Post URL. Provide one of url, media_id, or shortcode.\"),\n media_id: ostr(\"Post media id. Provide one of url, media_id, or shortcode.\"),\n shortcode: ostr(\"Post shortcode. Provide one of url, media_id, or shortcode.\"),\n }),\n (i) => client.instagram.post(i)\n ),\n tool(\n \"INSTAGRAM_POST_COMMENTS\",\n \"Scavio Instagram Post Comments\",\n \"List comments on an Instagram post by shortcode or URL. Costs 10 credits.\",\n z.object({\n shortcode: ostr(\"Post shortcode. Provide this or url.\"),\n url: ostr(\"Post URL. Provide this or shortcode.\"),\n cursor: ostr(\"Pagination cursor.\"),\n sort_order: ostr(\"Comment sort order.\"),\n }),\n (i) => client.instagram.postComments(i as SdkOpts<typeof client.instagram.postComments>)\n ),\n tool(\n \"INSTAGRAM_COMMENT_REPLIES\",\n \"Scavio Instagram Comment Replies\",\n \"List replies to an Instagram post comment. Costs 8 credits.\",\n z.object({\n media_id: str(\"Post media id.\"),\n comment_id: str(\"Parent comment id.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.commentReplies(i)\n ),\n tool(\n \"INSTAGRAM_SEARCH_USERS\",\n \"Scavio Instagram Search Users\",\n \"Search Instagram users by keyword. Costs 10 credits.\",\n z.object({\n keyword: str(\"Search keyword.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.searchUsers(i)\n ),\n tool(\n \"INSTAGRAM_SEARCH_HASHTAGS\",\n \"Scavio Instagram Search Hashtags\",\n \"Search Instagram hashtags by keyword. Costs 10 credits.\",\n z.object({\n keyword: str(\"Search keyword.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.searchHashtags(i)\n ),\n tool(\n \"INSTAGRAM_USER_FOLLOWERS\",\n \"Scavio Instagram User Followers\",\n \"List an Instagram user's followers. Costs 10 credits.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n count: onum(\"Number of followers to return.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.userFollowers(i)\n ),\n tool(\n \"INSTAGRAM_USER_FOLLOWINGS\",\n \"Scavio Instagram User Followings\",\n \"List the accounts an Instagram user follows. Costs 10 credits.\",\n z.object({\n username: ostr(\"Instagram username. Provide this or user_id.\"),\n user_id: ostr(\"Instagram user id. Provide this or username.\"),\n count: onum(\"Number of followings to return.\"),\n cursor: ostr(\"Pagination cursor.\"),\n }),\n (i) => client.instagram.userFollowings(i)\n )\n );\n }\n\n // X (Twitter): 11 endpoints, 1 credit each. The keyword field on search is\n // `search`, not `query`. search_type values are Capitalized while the comment\n // `rank` values are lowercase - that asymmetry is upstream's, not a typo.\n if (all || enableX) {\n tools.push(\n tool(\n \"X_SEARCH\",\n \"Scavio X Search\",\n \"Search X (Twitter) posts. Returns data.timeline with next_cursor, prev_cursor and has_more. Costs 1 credit.\",\n z.object({\n search: str(\"Search query (1-500 characters). The field is 'search', not 'query'.\"),\n search_type: ostr(\"Result category (Capitalized): 'Top' (default), 'Latest', 'People', 'Photos', or 'Videos'.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.x.search(i as SdkOpts<typeof client.x.search>)\n ),\n tool(\n \"X_TWEET\",\n \"Scavio X Tweet\",\n \"Fetch one X post by id. Returns the tweet object plus reply_to, in_reply_to_screen_name, in_reply_to_status_id, in_reply_to_user_id and sensitive. Costs 1 credit.\",\n z.object({ tweet_id: str(\"Numeric post id as a string, e.g. '1808168603721650364'.\") }),\n (i) => client.x.tweet(i)\n ),\n tool(\n \"X_TWEET_COMMENTS\",\n \"Scavio X Tweet Comments\",\n \"List replies to an X post. Returns data.timeline with next_cursor, prev_cursor and has_more. rank switches the upstream feed: 'latest' is chronological, 'top' is ranked. Costs 1 credit.\",\n z.object({\n tweet_id: str(\"Numeric post id as a string.\"),\n rank: ostr(\"Reply ordering (lowercase): 'top' (default, ranked) or 'latest' (chronological).\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.x.tweetComments(i as SdkOpts<typeof client.x.tweetComments>)\n ),\n tool(\n \"X_TWEET_RETWEETERS\",\n \"Scavio X Tweet Retweeters\",\n \"List the accounts that reposted an X post. Returns data.retweeters with next_cursor and has_more. Costs 1 credit.\",\n z.object({\n tweet_id: str(\"Numeric post id as a string.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.x.tweetRetweeters(i)\n ),\n tool(\n \"X_USER\",\n \"Scavio X User\",\n \"Fetch an X profile by handle: followers_count, friends_count, statuses_count, media_count, blue_verified, location, website, avatar, header_image and pinned_tweet_ids. Costs 1 credit.\",\n z.object({ screen_name: str(\"An X handle WITHOUT the @, e.g. 'elonmusk'.\") }),\n (i) => client.x.user(i)\n ),\n tool(\n \"X_USER_TWEETS\",\n \"Scavio X User Tweets\",\n \"List an X user's posts. Returns data.timeline plus pinned and user; there is no has_more on this endpoint, so page on next_cursor. Costs 1 credit.\",\n z.object({\n screen_name: str(\"An X handle WITHOUT the @.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.x.userTweets(i)\n ),\n tool(\n \"X_USER_REPLIES\",\n \"Scavio X User Replies\",\n \"List an X user's replies. Returns data.timeline with next_cursor and prev_cursor; no has_more. Costs 1 credit.\",\n z.object({\n screen_name: str(\"An X handle WITHOUT the @.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.x.userReplies(i)\n ),\n tool(\n \"X_USER_MEDIA\",\n \"Scavio X User Media\",\n \"List an X user's posts that carry photos or videos. Returns data.timeline with next_cursor and prev_cursor; no has_more. Costs 1 credit.\",\n z.object({\n screen_name: str(\"An X handle WITHOUT the @.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.x.userMedia(i)\n ),\n tool(\n \"X_USER_FOLLOWERS\",\n \"Scavio X User Followers\",\n \"List an X user's followers. Returns data.followers with followers_count, next_cursor and has_more. Costs 1 credit.\",\n z.object({\n screen_name: str(\"An X handle WITHOUT the @.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.x.userFollowers(i)\n ),\n tool(\n \"X_USER_FOLLOWINGS\",\n \"Scavio X User Followings\",\n \"List the accounts an X user follows. The response array is data.following (singular), not followings, and there is no following_count. Costs 1 credit.\",\n z.object({\n screen_name: str(\"An X handle WITHOUT the @.\"),\n cursor: ostr(\"Pagination cursor from a prior response.\"),\n }),\n (i) => client.x.userFollowings(i)\n ),\n tool(\n \"X_TRENDING\",\n \"Scavio X Trending\",\n \"List what is trending on X for one country. Returns data.trends with no cursor and no has_more. Costs 1 credit.\",\n z.object({ country: ostr(\"Country NAME, not an ISO code, e.g. 'UnitedStates' (the default).\") }),\n (i) => client.x.trending(i)\n )\n );\n }\n\n // LinkedIn: 9 live endpoints on three credit tiers - 1 for person, person/about,\n // company and post; 10 for the feeds, job search and post comments; 30 for job,\n // the most expensive endpoint in the API. The five retired endpoints\n // (person/contact, company/people, company/jobs, search/people, search/posts)\n // return 410 unbilled and are deliberately NOT exposed: an agent-facing tool\n // that can only fail is worse than no tool.\n if (all || enableLinkedin) {\n tools.push(\n tool(\n \"LINKEDIN_PERSON\",\n \"Scavio LinkedIn Person\",\n \"Fetch a full LinkedIn profile: headline, about, location, follower and connection counts, current_company, experiences, educations, honors_and_awards, bio_links and similar profiles. Costs 1 credit.\",\n z.object({\n username: ostr(\"Public identifier / vanity handle, e.g. 'williamhgates'. Provide this or url.\"),\n url: ostr(\"Full LinkedIn profile URL. Provide this or username.\"),\n }),\n (i) => client.linkedin.person(i)\n ),\n tool(\n \"LINKEDIN_PERSON_ABOUT\",\n \"Scavio LinkedIn Person About\",\n \"The about-only slice of a LinkedIn profile: about, headline, education_summary, experiences, educations, honors_and_awards and bio_links. Same upstream call as LINKEDIN_PERSON, shaped down. Costs 1 credit.\",\n z.object({\n username: ostr(\"Public identifier / vanity handle. Provide this or url.\"),\n url: ostr(\"Full LinkedIn profile URL. Provide this or username.\"),\n }),\n (i) => client.linkedin.personAbout(i)\n ),\n tool(\n \"LINKEDIN_PERSON_POSTS\",\n \"Scavio LinkedIn Person Posts\",\n \"A member's LinkedIn feed - their own posts, or posts they commented on or reacted to via type. 50 per page; advance with next_cursor. Costs 10 credits.\",\n z.object({\n username: ostr(\"Public identifier / vanity handle. Provide this or url.\"),\n url: ostr(\"Full LinkedIn profile URL. Provide this or username.\"),\n type: ostr(\"Which feed: 'posts' (default), 'comments' (posts they commented on), or 'reactions' (posts they reacted to).\"),\n cursor: ostr(\"Opaque cursor from a prior response's next_cursor.\"),\n }),\n (i) => client.linkedin.personPosts(i as SdkOpts<typeof client.linkedin.personPosts>)\n ),\n tool(\n \"LINKEDIN_COMPANY\",\n \"Scavio LinkedIn Company\",\n \"Fetch a LinkedIn company profile: description, website, industries, specialties, employee and follower counts, headquarters, locations, similar and affiliated companies, and featured_employees (a 4-6 person sample, the documented substitute for the retired employee directory). Costs 1 credit.\",\n z.object({\n company: ostr(\"Company universal name / slug, e.g. 'microsoft'. Provide this or url.\"),\n url: ostr(\"Full LinkedIn company URL. Provide this or company.\"),\n }),\n (i) => client.linkedin.company(i)\n ),\n tool(\n \"LINKEDIN_COMPANY_POSTS\",\n \"Scavio LinkedIn Company Posts\",\n \"Recent posts from a LinkedIn company page, 50 per page; advance with next_cursor. There is no type selector here - that is person-only. Costs 10 credits.\",\n z.object({\n company: ostr(\"Company universal name / slug. Provide this or url.\"),\n url: ostr(\"Full LinkedIn company URL. Provide this or company.\"),\n cursor: ostr(\"Opaque cursor from a prior response's next_cursor.\"),\n }),\n (i) => client.linkedin.companyPosts(i)\n ),\n tool(\n \"LINKEDIN_SEARCH_JOBS\",\n \"Scavio LinkedIn Search Jobs\",\n \"Search LinkedIn job listings, 25 per page; advance with next_cursor. Upstream rotates its result set so pages overlap - dedupe by job id. Costs 10 credits.\",\n z.object({\n search: str(\"Search keyword, e.g. 'software engineer'. The field is 'search', not 'query'.\"),\n location: ostr(\"Geographic filter; omit to search everywhere.\"),\n cursor: ostr(\"Opaque cursor from a prior response's next_cursor.\"),\n }),\n (i) => client.linkedin.searchJobs(i)\n ),\n tool(\n \"LINKEDIN_JOB\",\n \"Scavio LinkedIn Job\",\n \"Full detail for one LinkedIn job listing, including the hiring company. The most expensive endpoint in the API - about 1 in 5 ids from LINKEDIN_SEARCH_JOBS has no detail record upstream and answers 404 unbilled, so skip rather than retry. Costs 30 credits.\",\n z.object({\n job_id: ostr(\"Job listing id, e.g. '4415427228'. Provide this or url.\"),\n url: ostr(\"Full LinkedIn job URL. Provide this or job_id.\"),\n }),\n (i) => client.linkedin.job(i)\n ),\n tool(\n \"LINKEDIN_POST\",\n \"Scavio LinkedIn Post\",\n \"Full detail for one LinkedIn post: text, media, hashtags, tagged companies and people, reaction and comment counts, author, and its top visible comments. Costs 1 credit.\",\n z.object({\n post_id: ostr(\"Post id or activity urn, e.g. '7488618410256523265'. Provide this or url.\"),\n url: ostr(\"Full LinkedIn post URL. Provide this or post_id.\"),\n }),\n (i) => client.linkedin.post(i)\n ),\n tool(\n \"LINKEDIN_POST_COMMENTS\",\n \"Scavio LinkedIn Post Comments\",\n \"Comments on a LinkedIn post with their replies. This is the only LinkedIn endpoint paginated by a 1-based integer page rather than a cursor, and page size varies upstream - keep paging until a page comes back empty. Costs 10 credits.\",\n z.object({\n post_id: ostr(\"Post id or activity urn. Provide this or url.\"),\n url: ostr(\"Full LinkedIn post URL. Provide this or post_id.\"),\n page: onum(\"1-based page number (default 1). Page size varies, so page until empty.\"),\n }),\n (i) => client.linkedin.postComments(i)\n )\n );\n }\n\n return experimental_createToolkit(\"SCAVIO\", {\n name: \"Scavio\",\n description:\n \"Real-time structured search over Google (SERP, AI Mode, Maps, Shopping, Flights, Hotels, News, Trends), YouTube, Amazon, Walmart, Reddit, TikTok, TikTok Shop, Instagram, X and LinkedIn.\",\n tools,\n });\n}\n\nexport default buildScavioToolkit;\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -9,7 +9,10 @@ interface BuildScavioToolkitOptions {
|
|
|
9
9
|
enableYoutube?: boolean;
|
|
10
10
|
enableReddit?: boolean;
|
|
11
11
|
enableTiktok?: boolean;
|
|
12
|
+
enableTiktokShop?: boolean;
|
|
12
13
|
enableInstagram?: boolean;
|
|
14
|
+
enableX?: boolean;
|
|
15
|
+
enableLinkedin?: boolean;
|
|
13
16
|
/** Register every tool, ignoring the individual flags. */
|
|
14
17
|
all?: boolean;
|
|
15
18
|
}
|
|
@@ -17,8 +20,8 @@ interface BuildScavioToolkitOptions {
|
|
|
17
20
|
* Build a Composio custom toolkit exposing Scavio search tools.
|
|
18
21
|
*
|
|
19
22
|
* Scavio is a single Search API over Google, YouTube, Amazon, Walmart, Reddit,
|
|
20
|
-
* TikTok, TikTok Shop, Instagram, X and LinkedIn; this toolkit covers
|
|
21
|
-
*
|
|
23
|
+
* TikTok, TikTok Shop, Instagram, X and LinkedIn; this toolkit covers all ten.
|
|
24
|
+
* Pass to `composio.create(userId, { experimental:
|
|
22
25
|
* { customToolkits: [toolkit] } })`. Agent-facing slugs are prefixed `LOCAL_SCAVIO_`.
|
|
23
26
|
*/
|
|
24
27
|
declare function buildScavioToolkit(options?: BuildScavioToolkitOptions): _composio_core.CustomToolkit;
|
package/dist/index.d.ts
CHANGED
|
@@ -9,7 +9,10 @@ interface BuildScavioToolkitOptions {
|
|
|
9
9
|
enableYoutube?: boolean;
|
|
10
10
|
enableReddit?: boolean;
|
|
11
11
|
enableTiktok?: boolean;
|
|
12
|
+
enableTiktokShop?: boolean;
|
|
12
13
|
enableInstagram?: boolean;
|
|
14
|
+
enableX?: boolean;
|
|
15
|
+
enableLinkedin?: boolean;
|
|
13
16
|
/** Register every tool, ignoring the individual flags. */
|
|
14
17
|
all?: boolean;
|
|
15
18
|
}
|
|
@@ -17,8 +20,8 @@ interface BuildScavioToolkitOptions {
|
|
|
17
20
|
* Build a Composio custom toolkit exposing Scavio search tools.
|
|
18
21
|
*
|
|
19
22
|
* Scavio is a single Search API over Google, YouTube, Amazon, Walmart, Reddit,
|
|
20
|
-
* TikTok, TikTok Shop, Instagram, X and LinkedIn; this toolkit covers
|
|
21
|
-
*
|
|
23
|
+
* TikTok, TikTok Shop, Instagram, X and LinkedIn; this toolkit covers all ten.
|
|
24
|
+
* Pass to `composio.create(userId, { experimental:
|
|
22
25
|
* { customToolkits: [toolkit] } })`. Agent-facing slugs are prefixed `LOCAL_SCAVIO_`.
|
|
23
26
|
*/
|
|
24
27
|
declare function buildScavioToolkit(options?: BuildScavioToolkitOptions): _composio_core.CustomToolkit;
|