research-token
Analyze cryptocurrency tokens by providing token name, ticker symbol, and research source to retrieve detailed information for Web3 research purposes.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| tokenName | Yes | Name of the token | |
| tokenTicker | Yes | Ticker symbol of the token | |
| source | Yes | Source to research (e.g., 'IQ Wiki', 'CoinMarketCap') |
Implementation Reference
- src/tools/researchTools.ts:643-762 (registration)The 'research-token' tool is registered here using server.tool(). The inline schema defines inputs: tokenName, tokenTicker, source. The handler performs a web search for the specified source related to the token, saves top results, fetches markdown content from the top result, stores it as a resource, and returns a summary with resource URI.server.tool( "research-token", { tokenName: z.string().describe("Name of the token"), tokenTicker: z.string().describe("Ticker symbol of the token"), source: z .string() .describe("Source to research (e.g., 'IQ Wiki', 'CoinMarketCap')"), }, async ({ tokenName, tokenTicker, source, }: { tokenName: string; tokenTicker: string; source: string; }) => { storage.addLogEntry( `Researching source: ${source} for ${tokenName} (${tokenTicker})` ); try { const query = `${tokenName} ${tokenTicker} ${source}`; const results = await performSearch(query, "web"); if (!results.results || results.results.length === 0) { storage.addLogEntry(`No results found for ${source}`); return { content: [ { type: "text", text: `No results found for ${source}`, }, ], }; } const topResults = results.results.slice(0, 3); storage.addToSection("searchResults", { [source]: topResults }); if (topResults[0] && topResults[0].url) { try { const url = topResults[0].url; storage.addLogEntry(`Fetching content from ${url}`); const content = await fetchContent(url, "markdown"); const resourceId = `${source.toLowerCase()}_${tokenName.toLowerCase()}_${new Date().getTime()}`; storage.addToSection("resources", { [resourceId]: { url, format: "markdown", content, title: topResults[0].title, source, fetchedAt: new Date().toISOString(), }, }); return { content: [ { type: "text", text: `Researched ${source} for ${tokenName} (${tokenTicker}).\n\nTop result: ${ topResults[0].title }\n\nContent saved as resource: research://resource/${resourceId}\n\nAll search results:\n${JSON.stringify( topResults, null, 2 )}`, }, ], }; } catch (error) { storage.addLogEntry( `Error fetching content from ${topResults[0].url}: ${error}` ); return { content: [ { type: "text", text: `Found search results for ${source}, but couldn't fetch content: ${error}\n\nSearch results:\n${JSON.stringify( topResults, null, 2 )}`, }, ], }; } } return { content: [ { type: "text", text: `Search results for ${source}:\n\n${JSON.stringify( topResults, null, 2 )}`, }, ], }; } catch (error) { storage.addLogEntry(`Error researching ${source}: ${error}`); return { isError: true, content: [ { type: "text", text: `Error researching ${source}: ${error}`, }, ], }; } } );
- src/tools/researchTools.ts:645-651 (schema)Zod schema for 'research-token' tool inputs.{ tokenName: z.string().describe("Name of the token"), tokenTicker: z.string().describe("Ticker symbol of the token"), source: z .string() .describe("Source to research (e.g., 'IQ Wiki', 'CoinMarketCap')"), },
- src/server.ts:187-187 (registration)Top-level registration call for all tools including 'research-token' via the tool registry chain.registerAllTools(server, storage);
- src/tools/index.ts:9-9 (registration)Intermediate registration call that invokes registerResearchTools, which registers 'research-token'.registerResearchTools(server, storage);