tiktok_shop_url
Scrape TikTok Shop pages by URL to extract product data. Optionally render with a headless browser for dynamic content.
Instructions
Scrape TikTok Shop page by URL
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | TikTok Shop URL (e.g., "https://www.tiktok.com/shop/s?q=HEADPHONES") | |
| jsRender | No | Should the request be opened in a headless browser, false by default |
Implementation Reference
- The TiktokShopUrlTool class contains the handler logic. The register method defines the tool name 'tiktok_shop_url', input schema (url, jsRender), and the async handler that calls sapiClient.scrape with target SCRAPER_API_TARGETS.TIKTOK_SHOP_URL.
export class TiktokShopUrlTool extends Tool { toolset = TOOLSET.ECOMMERCE; transformResponse = ({ data }: { data: object }) => { return { data: JSON.stringify(data) }; }; register = ({ server, sapiClient, auth }: ToolRegistrationArgs) => { server.registerTool( 'tiktok_shop_url', { description: 'Scrape TikTok Shop page by URL', inputSchema: { url: z.string().describe('TikTok Shop URL (e.g., "https://www.tiktok.com/shop/s?q=HEADPHONES")'), jsRender: zodJsRender, }, annotations: { readOnlyHint: true, openWorldHint: true, }, }, async (scrapingParams: ScrapingMCPParams, extra: ProgressExtra) => { const params = { ...scrapingParams, target: SCRAPER_API_TARGETS.TIKTOK_SHOP_URL, } satisfies ScraperAPIParams; const { data } = await sapiClient.scrape<object>({ auth, scrapingParams: params, extra }); return { content: [ { type: 'text', text: JSON.stringify(data), }, ], }; } ); }; } - Input schema for the tool: url (string with example TikTok Shop URL) and jsRender (optional boolean from zodJsRender).
{ description: 'Scrape TikTok Shop page by URL', inputSchema: { url: z.string().describe('TikTok Shop URL (e.g., "https://www.tiktok.com/shop/s?q=HEADPHONES")'), jsRender: zodJsRender, }, annotations: { readOnlyHint: true, openWorldHint: true, }, }, - src/tools/tiktok-shop-url/tiktok-shop-url-tool.ts:15-47 (registration)The register method registers the tool name 'tiktok_shop_url' with the MCP server via server.registerTool().
register = ({ server, sapiClient, auth }: ToolRegistrationArgs) => { server.registerTool( 'tiktok_shop_url', { description: 'Scrape TikTok Shop page by URL', inputSchema: { url: z.string().describe('TikTok Shop URL (e.g., "https://www.tiktok.com/shop/s?q=HEADPHONES")'), jsRender: zodJsRender, }, annotations: { readOnlyHint: true, openWorldHint: true, }, }, async (scrapingParams: ScrapingMCPParams, extra: ProgressExtra) => { const params = { ...scrapingParams, target: SCRAPER_API_TARGETS.TIKTOK_SHOP_URL, } satisfies ScraperAPIParams; const { data } = await sapiClient.scrape<object>({ auth, scrapingParams: params, extra }); return { content: [ { type: 'text', text: JSON.stringify(data), }, ], }; } ); }; - src/server/sapi-base-server.ts:27-97 (registration)TiktokShopUrlTool is imported and instantiated at line 86 in the allTools array, then registered when the server starts via registerTools/registerAllTools.
TiktokShopUrlTool, WalmartSearchTool, WalmartProductTool, YoutubeMetadataTool, YoutubeChannelTool, YoutubeSubtitlesTool, YoutubeSearchTool, ScrapeAsMarkdownTool, ScreenshotTool, } from '../tools'; import { Tool } from '../tools/tool'; import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; import { TOOLSET } from '../constants'; export class ScraperAPIBaseServer { server: McpServer; sapiClient: ScraperApiClient; auth: string = ''; constructor({ auth, toolsets = [] }: { auth: string; toolsets: TOOLSET[] }) { this.server = new McpServer({ name: 'decodo', version: PACKAGE_VERSION, }); this.sapiClient = new ScraperApiClient({}); this.auth = auth; this.registerTools({ toolsets }); this.registerResources(); } connect(transport: StdioServerTransport | StreamableHTTPServerTransport) { this.server.connect(transport); } static allTools: Tool[] = [ new ScrapeAsMarkdownTool(), new ScreenshotTool(), new GoogleSearchTool(), new GoogleAdsTool(), new GoogleLensTool(), new GoogleAiModeTool(), new GoogleTravelHotelsTool(), new AmazonSearchTool(), new AmazonProductTool(), new AmazonPricingTool(), new AmazonSellersTool(), new AmazonBestsellersTool(), new WalmartSearchTool(), new WalmartProductTool(), new TargetSearchTool(), new TargetProductTool(), new TiktokPostTool(), new TiktokShopSearchTool(), new TiktokShopProductTool(), new TiktokShopUrlTool(), new YoutubeMetadataTool(), new YoutubeChannelTool(), new YoutubeSubtitlesTool(), new YoutubeSearchTool(), new RedditPostTool(), new RedditSubredditTool(), new RedditUserTool(), new BingSearchTool(), new ChatGPTTool(), new PerplexityTool(), ]; - src/zod/zod-types.ts:10-13 (helper)The zodJsRender schema used as an optional input parameter for the tool.
export const zodJsRender = z .boolean() .describe('Should the request be opened in a headless browser, false by default') .optional();