paper-search-mcp-nodejs
Version:
A Node.js MCP server for searching and downloading academic papers from multiple sources, including arXiv, PubMed, bioRxiv, Web of Science, and more.
232 lines • 7.66 kB
JavaScript
import { z } from 'zod';
const SortBySchema = z.enum(['relevance', 'date', 'citations']);
const SortOrderSchema = z.enum(['asc', 'desc']);
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();
export const SearchArxivSchema = z
.object({
query: z.string().min(1),
maxResults: z.number().int().min(1).max(50).optional().default(10),
category: z.string().optional(),
author: z.string().optional(),
year: z.string().optional(),
sortBy: SortBySchema.optional(),
sortOrder: SortOrderSchema.optional()
})
.strip();
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();
export const SearchPubMedSchema = z
.object({
query: z.string().min(1),
maxResults: z.number().int().min(1).max(100).optional().default(10),
year: z.string().optional(),
author: z.string().optional(),
journal: z.string().optional(),
publicationType: z.array(z.string()).optional(),
sortBy: z.enum(['relevance', 'date']).optional()
})
.strip();
export const SearchBioRxivSchema = z
.object({
query: z.string().min(1),
maxResults: z.number().int().min(1).max(100).optional().default(10),
days: z.number().int().min(1).max(3650).optional(),
category: z.string().optional()
})
.strip();
export const SearchMedRxivSchema = SearchBioRxivSchema;
export const SearchSemanticScholarSchema = z
.object({
query: z.string().min(1),
maxResults: z.number().int().min(1).max(100).optional().default(10),
year: z.string().optional(),
fieldsOfStudy: z.array(z.string()).optional()
})
.strip();
export const SearchIACRSchema = z
.object({
query: z.string().min(1),
maxResults: z.number().int().min(1).max(50).optional().default(10),
fetchDetails: z.boolean().optional()
})
.strip();
export const DownloadPaperSchema = z
.object({
paperId: z.string().min(1),
platform: z.enum(['arxiv', 'biorxiv', 'medrxiv', 'semantic', 'iacr', 'scihub', 'springer', 'wiley']),
savePath: z.string().optional()
})
.strip();
export const SearchGoogleScholarSchema = z
.object({
query: z.string().min(1),
maxResults: z.number().int().min(1).max(20).optional().default(10),
yearLow: z.number().int().optional(),
yearHigh: z.number().int().optional(),
author: z.string().optional()
})
.strip();
export const GetPaperByDoiSchema = z
.object({
doi: z.string().min(1),
platform: z.enum(['arxiv', 'webofscience', 'all']).optional().default('all')
})
.strip();
export const SearchSciHubSchema = z
.object({
doiOrUrl: z.string().min(1),
downloadPdf: z.boolean().optional().default(false),
savePath: z.string().optional()
})
.strip();
export const CheckSciHubMirrorsSchema = z
.object({
forceCheck: z.boolean().optional().default(false)
})
.strip();
export const SearchScienceDirectSchema = z
.object({
query: z.string().min(1),
maxResults: z.number().int().min(1).max(100).optional().default(10),
year: z.string().optional(),
author: z.string().optional(),
journal: z.string().optional(),
openAccess: z.boolean().optional()
})
.strip();
export const SearchSpringerSchema = z
.object({
query: z.string().min(1),
maxResults: z.number().int().min(1).max(100).optional().default(10),
year: z.string().optional(),
author: z.string().optional(),
journal: z.string().optional(),
subject: z.string().optional(),
openAccess: z.boolean().optional(),
type: z.enum(['Journal', 'Book', 'Chapter']).optional()
})
.strip();
export const SearchWileySchema = z
.object({
query: z.string().min(1)
})
.strip();
export const SearchScopusSchema = z
.object({
query: z.string().min(1),
maxResults: z.number().int().min(1).max(25).optional().default(10),
year: z.string().optional(),
author: z.string().optional(),
journal: z.string().optional(),
affiliation: z.string().optional(),
subject: z.string().optional(),
openAccess: z.boolean().optional(),
documentType: z.enum(['ar', 'cp', 're', 'bk', 'ch']).optional()
})
.strip();
export const SearchCrossrefSchema = z
.object({
query: z.string().min(1),
maxResults: z.number().int().min(1).max(100).optional().default(10),
year: z.string().optional(),
author: z.string().optional(),
sortBy: SortBySchema.optional().default('relevance'),
sortOrder: SortOrderSchema.optional().default('desc')
})
.strip();
export const GetPlatformStatusSchema = z
.object({
validate: z.boolean().optional().default(false)
})
.strip();
export function parseToolArgs(toolName, args) {
switch (toolName) {
case 'search_papers':
return SearchPapersSchema.parse(args);
case 'search_arxiv':
return SearchArxivSchema.parse(args);
case 'search_webofscience':
return SearchWebOfScienceSchema.parse(args);
case 'search_pubmed':
return SearchPubMedSchema.parse(args);
case 'search_biorxiv':
return SearchBioRxivSchema.parse(args);
case 'search_medrxiv':
return SearchMedRxivSchema.parse(args);
case 'search_semantic_scholar':
return SearchSemanticScholarSchema.parse(args);
case 'search_iacr':
return SearchIACRSchema.parse(args);
case 'download_paper':
return DownloadPaperSchema.parse(args);
case 'search_google_scholar':
return SearchGoogleScholarSchema.parse(args);
case 'get_paper_by_doi':
return GetPaperByDoiSchema.parse(args);
case 'search_scihub':
return SearchSciHubSchema.parse(args);
case 'check_scihub_mirrors':
return CheckSciHubMirrorsSchema.parse(args);
case 'get_platform_status':
return GetPlatformStatusSchema.parse(args ?? {});
case 'search_sciencedirect':
return SearchScienceDirectSchema.parse(args);
case 'search_springer':
return SearchSpringerSchema.parse(args);
case 'search_wiley':
return SearchWileySchema.parse(args);
case 'search_scopus':
return SearchScopusSchema.parse(args);
case 'search_crossref':
return SearchCrossrefSchema.parse(args);
default:
return args;
}
}
//# sourceMappingURL=schemas.js.map