Skip to main content
Glama

search_papers

Search academic papers across multiple platforms like arXiv, PubMed, and Google Scholar using queries, filters, and sorting options.

Instructions

Search academic papers from multiple sources including arXiv, Web of Science, etc.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query string
platformNoPlatform to search (default: crossref). Options: arxiv, webofscience/wos, pubmed, biorxiv, medrxiv, semantic, iacr, googlescholar/scholar, scihub, sciencedirect, springer, scopus, crossref, or all. Note: Wiley only supports PDF download by DOI, use download_paper instead.
maxResultsNoMaximum number of results to return
yearNoYear filter (e.g., "2023", "2020-2023", "2020-")
authorNoAuthor name filter
journalNoJournal name filter
categoryNoCategory filter (e.g., cs.AI for arXiv)
daysNoNumber of days to search back (bioRxiv/medRxiv only)
fetchDetailsNoFetch detailed information (IACR only)
fieldsOfStudyNoFields of study filter (Semantic Scholar only)
sortByNoSort results by relevance, date, or citations
sortOrderNoSort order: ascending or descending

Implementation Reference

  • Handler logic for 'search_papers' tool in the main switch statement of handleToolCall function. Parses arguments, determines platform searcher, performs search, and formats results as JSON response.
    case 'search_papers': { const { query, platform, maxResults, year, author, journal, category, days, fetchDetails, fieldsOfStudy, sortBy, sortOrder } = args; const results: Record<string, any>[] = []; const searchOptions: SearchOptions = { maxResults, year, author, journal, category, days, fetchDetails, fieldsOfStudy, sortBy, sortOrder }; if (platform === 'all') { try { const platformResults = await searchers.crossref.search(query, searchOptions); results.push(...platformResults.map((paper: Paper) => PaperFactory.toDict(paper))); } catch (error) { logDebug('Error searching crossref:', error); try { const platformResults = await searchers.arxiv.search(query, searchOptions); results.push(...platformResults.map((paper: Paper) => PaperFactory.toDict(paper))); } catch (fallbackError) { logDebug('Error with arxiv fallback:', fallbackError); } } } else { const searcher = (searchers as any)[platform]; if (!searcher) { throw new Error(`Unsupported platform: ${platform}`); } const platformResults = await (searcher as PaperSource).search(query, searchOptions); results.push(...platformResults.map((paper: Paper) => PaperFactory.toDict(paper))); } return jsonTextResponse(`Found ${results.length} papers.\n\n${JSON.stringify(results, null, 2)}`); }
  • Zod schema definition for 'search_papers' tool input validation, including all parameters like query, platform, filters, etc.
    export const SearchPapersSchema = z .object({ query: z.string().min(1), platform: z .enum([ 'arxiv', 'webofscience', 'pubmed', 'wos', 'biorxiv', 'medrxiv', 'semantic', 'iacr', 'googlescholar', 'scholar', 'scihub', 'sciencedirect', 'springer', 'scopus', 'crossref', 'all' ]) .optional() .default('crossref'), maxResults: z.number().int().min(1).max(100).optional().default(10), year: z.string().optional(), author: z.string().optional(), journal: z.string().optional(), category: z.string().optional(), days: z.number().int().min(1).max(3650).optional(), fetchDetails: z.boolean().optional(), fieldsOfStudy: z.array(z.string()).optional(), sortBy: SortBySchema.optional().default('relevance'), sortOrder: SortOrderSchema.optional().default('desc') }) .strip();
  • src/mcp/tools.ts:4-70 (registration)
    Tool registration in the TOOLS array, defining name, description, and JSON schema for MCP tool registration.
    { name: 'search_papers', description: 'Search academic papers from multiple sources including arXiv, Web of Science, etc.', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'Search query string' }, platform: { type: 'string', enum: [ 'arxiv', 'webofscience', 'pubmed', 'wos', 'biorxiv', 'medrxiv', 'semantic', 'iacr', 'googlescholar', 'scholar', 'scihub', 'sciencedirect', 'springer', 'scopus', 'crossref', 'all' ], description: 'Platform to search (default: crossref). Options: arxiv, webofscience/wos, pubmed, biorxiv, medrxiv, semantic, iacr, googlescholar/scholar, scihub, sciencedirect, springer, scopus, crossref, or all. Note: Wiley only supports PDF download by DOI, use download_paper instead.' }, maxResults: { type: 'number', minimum: 1, maximum: 100, description: 'Maximum number of results to return' }, year: { type: 'string', description: 'Year filter (e.g., "2023", "2020-2023", "2020-")' }, author: { type: 'string', description: 'Author name filter' }, journal: { type: 'string', description: 'Journal name filter' }, category: { type: 'string', description: 'Category filter (e.g., cs.AI for arXiv)' }, days: { type: 'number', description: 'Number of days to search back (bioRxiv/medRxiv only)' }, fetchDetails: { type: 'boolean', description: 'Fetch detailed information (IACR only)' }, fieldsOfStudy: { type: 'array', items: { type: 'string' }, description: 'Fields of study filter (Semantic Scholar only)' }, sortBy: { type: 'string', enum: ['relevance', 'date', 'citations'], description: 'Sort results by relevance, date, or citations' }, sortOrder: { type: 'string', enum: ['asc', 'desc'], description: 'Sort order: ascending or descending' } }, required: ['query'] } },

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Dianel555/paper-search-mcp-nodejs'

If you have feedback or need assistance with the MCP directory API, please join our Discord server