research-source
Analyzes specific sources to provide research on cryptocurrency tokens, identifying key information and insights for informed decision-making.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| tokenName | Yes | Name of the token | |
| tokenTicker | Yes | Ticker symbol of the token | |
| source | Yes | Single source to research |
Implementation Reference
- src/tools/researchTools.ts:531-641 (handler)Handler for 'research-source' tool: searches web for token+source, fetches top result content, stores as resource, returns summary with resource link.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:526-530 (schema)Zod input schema for 'research-source' tool defining required string parameters.{ tokenName: z.string().describe("Name of the token"), tokenTicker: z.string().describe("Ticker symbol of the token"), source: z.string().describe("Single source to research"), },
- src/tools/researchTools.ts:524-525 (registration)Registers the 'research-source' tool on the MCP server within registerResearchTools function.server.tool( "research-source",
- src/tools/index.ts:5-10 (registration)Top-level registration function that invokes registerResearchTools, thereby registering 'research-source'.export function registerAllTools( server: McpServer, storage: ResearchStorage ): void { registerResearchTools(server, storage); }