search_webofscience
Search academic papers from Web of Science database using queries, filters, and sorting options to find relevant research publications.
Instructions
Search academic papers from Web of Science database
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query string | |
| maxResults | No | Maximum number of results to return | |
| year | No | Publication year filter (e.g., "2023", "2020-2023") | |
| author | No | Author name filter | |
| journal | No | Journal name filter | |
| sortBy | No | Sort results by field | |
| sortOrder | No | Sort order: ascending or descending |
Implementation Reference
- src/mcp/handleToolCall.ts:104-126 (handler)Handler case in handleToolCall that executes the search_webofscience tool by calling the WebOfScience searcher and formatting the response.case 'search_webofscience': { const { query, maxResults, year, author, journal, sortBy, sortOrder } = args; if (!process.env.WOS_API_KEY) { throw new Error('Web of Science API key not configured. Please set WOS_API_KEY environment variable.'); } const results = await searchers.webofscience.search(query, { maxResults, year, author, journal, sortBy, sortOrder } as any); return jsonTextResponse( `Found ${results.length} Web of Science papers.\n\n${JSON.stringify( results.map((paper: Paper) => PaperFactory.toDict(paper)), null, 2 )}` ); }
- src/mcp/schemas.ts:55-67 (schema)Zod schema definition for search_webofscience input validation.export const SearchWebOfScienceSchema = z .object({ query: z.string().min(1), maxResults: z.number().int().min(1).max(50).optional().default(10), year: z.string().optional(), author: z.string().optional(), journal: z.string().optional(), sortBy: z .enum(['relevance', 'date', 'citations', 'title', 'author', 'journal']) .optional(), sortOrder: SortOrderSchema.optional() }) .strip();
- src/mcp/tools.ts:102-130 (registration)Tool registration in the TOOLS array with name, description, and inputSchema for MCP.name: 'search_webofscience', description: 'Search academic papers from Web of Science database', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'Search query string' }, maxResults: { type: 'number', minimum: 1, maximum: 50, description: 'Maximum number of results to return' }, year: { type: 'string', description: 'Publication year filter (e.g., "2023", "2020-2023")' }, author: { type: 'string', description: 'Author name filter' }, journal: { type: 'string', description: 'Journal name filter' }, sortBy: { type: 'string', enum: ['relevance', 'date', 'citations', 'title', 'author', 'journal'], description: 'Sort results by field' }, sortOrder: { type: 'string', enum: ['asc', 'desc'], description: 'Sort order: ascending or descending' } }, required: ['query'] } },
- Core search implementation in WebOfScienceSearcher class that builds query, makes API request to Clarivate WoS API, and parses results into Paper objects.async search(query: string, options: WoSSearchOptions = {}): Promise<Paper[]> { if (!this.apiKey) { throw new Error('Web of Science API key is required'); } try { const searchParams = this.buildSearchQuery(query, options); const response = await this.makeApiRequest('/documents', { method: 'GET', params: searchParams }); return this.parseSearchResponse(response.data); } catch (error) { this.handleHttpError(error, 'search'); } }
- src/mcp/searchers.ts:43-62 (helper)Instantiation of WebOfScienceSearcher and assignment to searchers.webofscience used by the handler.const wosSearcher = new WebOfScienceSearcher(process.env.WOS_API_KEY, process.env.WOS_API_VERSION); const pubmedSearcher = new PubMedSearcher(process.env.PUBMED_API_KEY); const biorxivSearcher = new BioRxivSearcher('biorxiv'); const medrxivSearcher = new MedRxivSearcher(); const semanticSearcher = new SemanticScholarSearcher(process.env.SEMANTIC_SCHOLAR_API_KEY); const iacrSearcher = new IACRSearcher(); const googleScholarSearcher = new GoogleScholarSearcher(); const sciHubSearcher = new SciHubSearcher(); const scienceDirectSearcher = new ScienceDirectSearcher(process.env.ELSEVIER_API_KEY); const springerSearcher = new SpringerSearcher( process.env.SPRINGER_API_KEY, process.env.SPRINGER_OPENACCESS_API_KEY ); const wileySearcher = new WileySearcher(process.env.WILEY_TDM_TOKEN); const scopusSearcher = new ScopusSearcher(process.env.ELSEVIER_API_KEY); const crossrefSearcher = new CrossrefSearcher(process.env.CROSSREF_MAILTO); searchers = { arxiv: arxivSearcher, webofscience: wosSearcher,