UNPKG

@futurelab-studio/latest-science-mcp

Version:

MCP Server for Scientific Paper Harvesting from arXiv and OpenAlex

48 lines 1.73 kB
import { z } from 'zod'; import { ArxivDriver } from '../drivers/arxiv-driver.js'; import { OpenAlexDriver } from '../drivers/openalex-driver.js'; import { logInfo, logError } from '../core/logger.js'; import { DEFAULT_PAPER_COUNT, MAX_PAPER_COUNT } from '../config/constants.js'; // Zod schema for input validation export const fetchLatestSchema = z.object({ source: z.enum(['arxiv', 'openalex']), category: z.string().min(1), count: z.number().min(1).max(MAX_PAPER_COUNT).default(DEFAULT_PAPER_COUNT) }); /** * MCP tool: fetch_latest * Fetches the latest papers from arXiv or OpenAlex for a given category */ export async function fetchLatest(input, rateLimiter) { try { logInfo('fetch_latest tool called', { source: input.source, category: input.category, count: input.count }); let papers; if (input.source === 'arxiv') { const driver = new ArxivDriver(rateLimiter); papers = await driver.fetchLatest(input.category, input.count); } else { const driver = new OpenAlexDriver(rateLimiter); papers = await driver.fetchLatest(input.category, input.count); } logInfo('fetch_latest completed successfully', { source: input.source, category: input.category, papersReturned: papers.length }); return { content: papers }; } catch (error) { logError('fetch_latest tool failed', { error: error instanceof Error ? error.message : error, source: input.source, category: input.category }); throw error; } } //# sourceMappingURL=fetch-latest.js.map