research-with-keywords
Conducts deep Web3 research by analyzing cryptocurrency tokens using specified keywords to uncover insights and information.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| tokenName | Yes | Name of the token | |
| tokenTicker | Yes | Ticker symbol of the token | |
| keywords | Yes | Keywords to search for |
Implementation Reference
- src/tools/researchTools.ts:169-252 (handler)Full registration of the 'research-with-keywords' tool, including inline Zod schema and handler function that performs web searches for each keyword + token name/ticker, saves results to research storage as resources and searchResults section, returns summary text with highlights and resource URI.server.tool( "research-with-keywords", { tokenName: z.string().describe("Name of the token"), tokenTicker: z.string().describe("Ticker symbol of the token"), keywords: z.array(z.string()).describe("Keywords to search for"), }, async ({ tokenName, tokenTicker, keywords, }: { tokenName: string; tokenTicker: string; keywords: string[]; }) => { storage.addLogEntry( `Researching ${tokenName} with keywords: ${keywords.join(", ")}` ); try { const results: Record<string, any> = {}; for (const keyword of keywords) { const query = `${tokenName} ${tokenTicker} ${keyword}`; storage.addLogEntry(`Searching for: ${query}`); await sleep(2000); const searchResults = await performSearch(query, "web"); if (!searchResults.results || searchResults.results.length === 0) { results[keyword] = { error: "No results found" }; continue; } const topResults = searchResults.results.slice(0, 3); results[keyword] = topResults; storage.addToSection("searchResults", { [keyword]: topResults }); } const resourceId = `combined_search_${tokenName.toLowerCase()}_${new Date().getTime()}`; storage.addToSection("resources", { [resourceId]: { format: "json", content: JSON.stringify(results, null, 2), title: `Combined search results for ${tokenName}`, fetchedAt: new Date().toISOString(), }, }); return { content: [ { type: "text", text: `Completed searches for ${tokenName} with keywords: ${keywords.join( ", " )}\n\nResults saved as resource: research://resource/${resourceId}\n\nHighlights:\n${Object.entries( results ) .map(([keyword, data]) => { if (Array.isArray(data) && data.length > 0) { return `- ${keyword}: ${data[0].title} (${data[0].url})`; } return `- ${keyword}: No results`; }) .join("\n")}`, }, ], }; } catch (error) { storage.addLogEntry(`Error in keyword research: ${error}`); return { isError: true, content: [ { type: "text", text: `Error performing keyword research: ${error}`, }, ], }; } } );
- src/tools/index.ts:5-10 (registration)registerAllTools exports the function called from server.ts to register research tools by invoking registerResearchTools.export function registerAllTools( server: McpServer, storage: ResearchStorage ): void { registerResearchTools(server, storage); }
- src/server.ts:187-187 (registration)Invocation of registerAllTools in the main server setup, which leads to registration of the research-with-keywords tool.registerAllTools(server, storage);