target_search
Automatically scrape and parse Target search results. Customize with query, device type, delivery ZIP, and store ID for localized product data.
Instructions
Scrape Target Search results with automatic parsing
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query for Target products | |
| jsRender | No | Should the request be opened in a headless browser, false by default | |
| deviceType | No | Device type to emulate for the request | |
| deliveryZip | No | ZIP code for delivery location | |
| storeId | No | Target store ID for local inventory |
Implementation Reference
- The TargetSearchTool class implements the tool handler logic. The register() method calls server.registerTool('target_search', ...) with the async handler that builds scrapi API params (headless html, target_search, markdown true), calls sapiClient.scrape(), strips 'suggested' and 'refinements' fields via transformResponse, and returns stringified JSON text content.
export class TargetSearchTool extends Tool { toolset = TOOLSET.ECOMMERCE; private static FIELDS_WITH_HIGH_CHAR_COUNT = ['suggested', 'refinements']; transformResponse = ({ data }: { data: object }) => { for (const fieldToRemove of TargetSearchTool.FIELDS_WITH_HIGH_CHAR_COUNT) { data = removeKeyFromNestedObject({ obj: data, keyToRemove: fieldToRemove }); } return { data: JSON.stringify(data) }; }; register = ({ server, sapiClient, auth }: ToolRegistrationArgs) => { server.registerTool( 'target_search', { description: 'Scrape Target Search results with automatic parsing', inputSchema: { query: z.string().describe('Search query for Target products'), jsRender: zodJsRender, deviceType: zodDeviceType, deliveryZip: zodDeliveryZip, storeId: zodStoreId, }, annotations: { readOnlyHint: true, openWorldHint: true, }, }, async (scrapingParams: ScrapingMCPParams, extra: ProgressExtra) => { const params = { headless: 'html', ...scrapingParams, target: SCRAPER_API_TARGETS.TARGET_SEARCH, markdown: true, } satisfies ScraperAPIParams; const { data } = await sapiClient.scrape<object>({ auth, scrapingParams: params, extra }); const { data: text } = this.transformResponse({ data }); return { content: [ { type: 'text', text, }, ], }; } ); }; } - Zod schemas for deliveryZip and storeId input fields, which are optional strings specific to this Target search tool.
const zodDeliveryZip = z.string().describe('ZIP code for delivery location').optional(); const zodStoreId = z.string().describe('Target store ID for local inventory').optional(); - src/server/sapi-base-server.ts:113-117 (registration)The server calls registerAllTools() (or registerTools()) which iterates through allTools including new TargetSearchTool() at line 81 and calls its register() method, binding it to the MCP server.
registerAllTools() { for (const tool of ScraperAPIBaseServer.allTools) { tool.register({ server: this.server, sapiClient: this.sapiClient, auth: this.auth }); } } - Helper transformResponse method that removes high-character-count fields ('suggested', 'refinements') from the scraped data and stringifies it.
transformResponse = ({ data }: { data: object }) => { for (const fieldToRemove of TargetSearchTool.FIELDS_WITH_HIGH_CHAR_COUNT) { data = removeKeyFromNestedObject({ obj: data, keyToRemove: fieldToRemove }); } return { data: JSON.stringify(data) }; - src/constants.ts:10-49 (registration)The SCRAPER_API_TARGETS enum defines TARGET_SEARCH = 'target_search' which is used as the target parameter value for the ScraperAPI call.
export enum SCRAPER_API_TARGETS { GOOGLE_SEARCH = 'google_search', GOOGLE_TRAVEL_HOTELS = 'google_travel_hotels', GOOGLE_ADS = 'google_ads', GOOGLE_LENS = 'google_lens', GOOGLE_AI_MODE = 'google_ai_mode', AMAZON_SEARCH = 'amazon_search', AMAZON_PRODUCT = 'amazon_product', AMAZON_PRICING = 'amazon_pricing', AMAZON_SELLERS = 'amazon_sellers', AMAZON_BESTSELLERS = 'amazon_bestsellers', WALMART_SEARCH = 'walmart_search', WALMART_PRODUCT = 'walmart_product', TARGET_SEARCH = 'target_search', TARGET_PRODUCT = 'target_product', TIKTOK_POST = 'tiktok_post', TIKTOK_SHOP_SEARCH = 'tiktok_shop_search', TIKTOK_SHOP_PRODUCT = 'tiktok_shop_product', TIKTOK_SHOP_URL = 'tiktok', YOUTUBE_VIDEO = 'youtube_video', YOUTUBE_METADATA = 'youtube_metadata', YOUTUBE_CHANNEL = 'youtube_channel', YOUTUBE_SUBTITLES = 'youtube_subtitles', YOUTUBE_SEARCH = 'youtube_search', REDDIT_POST = 'reddit_post', REDDIT_SUBREDDIT = 'reddit_subreddit', REDDIT_USER = 'reddit_user', BING_SEARCH = 'bing_search', CHATGPT = 'chatgpt', PERPLEXITY = 'perplexity', }