search
Find Web3-related information quickly using this tool. Conduct searches across web, news, images, or videos with a simple query to enhance your crypto and blockchain research.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| searchType | No | Type of search | web |
Implementation Reference
- src/tools/researchTools.ts:43-79 (handler)The handler function for the 'search' tool. It logs the search, performs the search using performSearch utility, stores the results in ResearchStorage, and returns a formatted message with the top 5 search results or an error.async ({ query, searchType }: { query: string; searchType: string }) => { storage.addLogEntry(`Performing ${searchType} search for: "${query}"`); try { const results = await performSearch(query, searchType as any); storage.addToSection("searchResults", { [searchType]: { [query]: results, }, }); return { content: [ { type: "text", text: `Search results for "${query}" (${searchType}):\n\n${JSON.stringify( results.results ? results.results.slice(0, 5) : [], null, 2 )}`, }, ], }; } catch (error) { storage.addLogEntry(`Error searching for "${query}": ${error}`); return { isError: true, content: [ { type: "text", text: `Error performing search: ${error}`, }, ], }; } }
- src/tools/researchTools.ts:36-42 (schema)Input schema for the 'search' tool using Zod: query (string), searchType (enum: web|news|images|videos, default 'web').{ query: z.string().describe("Search query"), searchType: z .enum(["web", "news", "images", "videos"]) .default("web") .describe("Type of search"), },
- src/tools/researchTools.ts:34-80 (registration)Registration of the 'search' tool on the MCP server within registerResearchTools function, including schema and handler.server.tool( "search", { query: z.string().describe("Search query"), searchType: z .enum(["web", "news", "images", "videos"]) .default("web") .describe("Type of search"), }, async ({ query, searchType }: { query: string; searchType: string }) => { storage.addLogEntry(`Performing ${searchType} search for: "${query}"`); try { const results = await performSearch(query, searchType as any); storage.addToSection("searchResults", { [searchType]: { [query]: results, }, }); return { content: [ { type: "text", text: `Search results for "${query}" (${searchType}):\n\n${JSON.stringify( results.results ? results.results.slice(0, 5) : [], null, 2 )}`, }, ], }; } catch (error) { storage.addLogEntry(`Error searching for "${query}": ${error}`); return { isError: true, content: [ { type: "text", text: `Error performing search: ${error}`, }, ], }; } } );
- src/utils/searchUtils.ts:8-59 (helper)Core helper function performSearch that implements the actual searching using duck-duck-scrape (DDG) library for different search types (web, news, images, videos), with rate limiting (sleep) and retry logic on anomalies.export async function performSearch( query: string, type: "web" | "news" | "images" | "videos" = "web", retries = 2 ): Promise<any> { try { await sleep(3000); let results; switch (type) { case "news": if (typeof DDG.news !== "function") { results = await DDG.search(`${query} news`, { safeSearch: DDG.SafeSearchType.MODERATE, }); } else { results = await DDG.news(query); } break; case "images": if (typeof DDG.images !== "function") { results = await DDG.search(`${query} images`, { safeSearch: DDG.SafeSearchType.MODERATE, }); } else { results = await DDG.images(query); } break; case "videos": if (typeof DDG.videos !== "function") { results = await DDG.search(`${query} videos`, { safeSearch: DDG.SafeSearchType.MODERATE, }); } else { results = await DDG.videos(query); } break; default: results = await DDG.search(query, { safeSearch: DDG.SafeSearchType.MODERATE, }); } return results; } catch (error) { if (retries > 0 && String(error).includes("anomaly")) { await sleep(10000); return performSearch(query, type, retries - 1); } throw error; } }
- src/tools/index.ts:5-10 (registration)Top-level registration function that calls registerResearchTools to register all research tools including 'search'.export function registerAllTools( server: McpServer, storage: ResearchStorage ): void { registerResearchTools(server, storage); }