@fre4x/arxiv 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,54 @@
1
+ # arxiv — The Research Fang
2
+
3
+ > *Knowledge is the only weapon that sharpens itself. This B1TE cuts through the noise.*
4
+
5
+ Part of **[FRE4X-B1TE](../)** — a monorepo of MCP servers built for autonomous agents.
6
+
7
+ Agents sleep while humans read. This server doesn't sleep. It hunts across the entire arXiv corpus — millions of papers, every category, in real time — so the agent always knows what humans don't yet.
8
+
9
+ ## Tools
10
+
11
+ | Tool | What it hunts |
12
+ |------|--------------|
13
+ | `arxiv_search` | Free-text search with field prefixes (`ti:`, `au:`, `abs:`, `cat:`) and boolean operators |
14
+ | `arxiv_get_paper` | Full metadata for one or more papers by arXiv ID |
15
+ | `arxiv_search_by_author` | All papers by a specific author |
16
+ | `arxiv_search_by_category` | Papers in a subject category (e.g. `cs.AI`, `cs.LG`, `q-fin.TR`) |
17
+ | `arxiv_list_categories` | All supported arXiv subject categories |
18
+
19
+ ## Query Syntax
20
+
21
+ ```
22
+ ti:attention AND cat:cs.LG
23
+ au:Bengio AND abs:generalization
24
+ cat:cs.CV AND ti:object detection
25
+ ti:diffusion AND NOT abs:image
26
+ ```
27
+
28
+ All list tools support `limit` (max 100) and `offset` for pagination.
29
+ All tools support `response_format: "markdown"` (default) or `"json"`.
30
+
31
+ ## Deploy
32
+
33
+ ```json
34
+ {
35
+ "mcpServers": {
36
+ "arxiv": {
37
+ "command": "npx",
38
+ "args": ["-y", "@fre4x/arxiv"]
39
+ }
40
+ }
41
+ }
42
+ ```
43
+
44
+ ## Development
45
+
46
+ ```bash
47
+ bun install
48
+ bun run dev # tsx, no build
49
+ bun run build # compile → dist/
50
+ ```
51
+
52
+ ## License
53
+
54
+ MIT — **WE ARE THE FRE4X.**
package/dist/api.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { ArxivSearchResult, SortBy, SortOrder } from "./types.js";
2
+ export interface SearchParams {
3
+ query: string;
4
+ start?: number;
5
+ maxResults?: number;
6
+ sortBy?: SortBy;
7
+ sortOrder?: SortOrder;
8
+ }
9
+ export declare class ArxivApiClient {
10
+ search(params: SearchParams): Promise<ArxivSearchResult>;
11
+ getById(ids: string[]): Promise<ArxivSearchResult>;
12
+ private parseResponse;
13
+ }
14
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,iBAAiB,EAIjB,MAAM,EACN,SAAS,EACV,MAAM,YAAY,CAAC;AAqEpB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,qBAAa,cAAc;IACnB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAiBxD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAYxD,OAAO,CAAC,aAAa;CAsBtB"}
package/dist/api.js ADDED
@@ -0,0 +1,96 @@
1
+ import axios from "axios";
2
+ import { XMLParser } from "fast-xml-parser";
3
+ import { SortBy, SortOrder, } from "./types.js";
4
+ const BASE_URL = "https://export.arxiv.org/api/query";
5
+ const parser = new XMLParser({
6
+ ignoreAttributes: false,
7
+ attributeNamePrefix: "@_",
8
+ isArray: (tagName) => ["entry", "author", "category", "link"].includes(tagName),
9
+ });
10
+ function extractArxivId(fullId) {
11
+ // arXiv IDs look like: http://arxiv.org/abs/2301.00001v1
12
+ const match = fullId.match(/abs\/([^v]+)/);
13
+ return match ? match[1] : fullId;
14
+ }
15
+ function parsePaper(entry) {
16
+ const rawAuthors = entry["author"] ?? [];
17
+ const authors = rawAuthors.map((a) => ({
18
+ name: String(a["name"] ?? ""),
19
+ }));
20
+ const rawCategories = entry["category"] ?? [];
21
+ const categories = rawCategories.map((c) => ({
22
+ term: String(c["@_term"] ?? ""),
23
+ scheme: c["@_scheme"],
24
+ label: c["@_label"],
25
+ }));
26
+ const rawLinks = entry["link"] ?? [];
27
+ const links = rawLinks.map((l) => ({
28
+ href: String(l["@_href"] ?? ""),
29
+ rel: l["@_rel"],
30
+ type: l["@_type"],
31
+ title: l["@_title"],
32
+ }));
33
+ const pdfLink = links.find((l) => l.title === "pdf" || l.type === "application/pdf");
34
+ const pdfUrl = pdfLink?.href;
35
+ const primaryCategoryRaw = entry["arxiv:primary_category"];
36
+ const primaryCategory = primaryCategoryRaw
37
+ ? {
38
+ term: String(primaryCategoryRaw["@_term"] ?? ""),
39
+ scheme: primaryCategoryRaw["@_scheme"],
40
+ }
41
+ : undefined;
42
+ const fullId = String(entry["id"] ?? "");
43
+ return {
44
+ id: fullId,
45
+ arxivId: extractArxivId(fullId),
46
+ title: String(entry["title"] ?? "").replace(/\s+/g, " ").trim(),
47
+ summary: String(entry["summary"] ?? "").replace(/\s+/g, " ").trim(),
48
+ authors,
49
+ categories,
50
+ primaryCategory,
51
+ published: String(entry["published"] ?? ""),
52
+ updated: String(entry["updated"] ?? ""),
53
+ links,
54
+ pdfUrl,
55
+ doi: entry["arxiv:doi"],
56
+ journalRef: entry["arxiv:journal_ref"],
57
+ comment: entry["arxiv:comment"],
58
+ };
59
+ }
60
+ export class ArxivApiClient {
61
+ async search(params) {
62
+ const { query, start = 0, maxResults = 10, sortBy = SortBy.RELEVANCE, sortOrder = SortOrder.DESCENDING } = params;
63
+ const response = await axios.get(BASE_URL, {
64
+ params: {
65
+ search_query: query,
66
+ start,
67
+ max_results: maxResults,
68
+ sortBy,
69
+ sortOrder,
70
+ },
71
+ timeout: 30000,
72
+ });
73
+ return this.parseResponse(response.data);
74
+ }
75
+ async getById(ids) {
76
+ const response = await axios.get(BASE_URL, {
77
+ params: {
78
+ id_list: ids.join(","),
79
+ max_results: ids.length,
80
+ },
81
+ timeout: 30000,
82
+ });
83
+ return this.parseResponse(response.data);
84
+ }
85
+ parseResponse(xml) {
86
+ const parsed = parser.parse(xml);
87
+ const feed = parsed["feed"];
88
+ const totalResults = parseInt(String(feed["opensearch:totalResults"]?.["#text"] ?? feed["opensearch:totalResults"] ?? "0"), 10);
89
+ const startIndex = parseInt(String(feed["opensearch:startIndex"]?.["#text"] ?? feed["opensearch:startIndex"] ?? "0"), 10);
90
+ const itemsPerPage = parseInt(String(feed["opensearch:itemsPerPage"]?.["#text"] ?? feed["opensearch:itemsPerPage"] ?? "0"), 10);
91
+ const rawEntries = feed["entry"] ?? [];
92
+ const papers = rawEntries.map(parsePaper);
93
+ return { totalResults, startIndex, itemsPerPage, papers };
94
+ }
95
+ }
96
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,251 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ import { ArxivApiClient } from "./api.js";
6
+ import { ResponseFormat, SortBy, SortOrder, ARXIV_CATEGORIES } from "./types.js";
7
+ const api = new ArxivApiClient();
8
+ const server = new McpServer({
9
+ name: "arxiv-mcp-server",
10
+ version: "1.0.0",
11
+ });
12
+ const CHARACTER_LIMIT = 50000;
13
+ // ─── Formatting helpers ────────────────────────────────────────────────────────
14
+ function formatPaperMarkdown(paper) {
15
+ const lines = [];
16
+ lines.push(`## ${paper.title}`);
17
+ lines.push(`**arXiv ID**: [${paper.arxivId}](https://arxiv.org/abs/${paper.arxivId})`);
18
+ lines.push(`**Authors**: ${paper.authors.map((a) => a.name).join(", ")}`);
19
+ lines.push(`**Published**: ${paper.published.split("T")[0]}`);
20
+ if (paper.updated !== paper.published) {
21
+ lines.push(`**Updated**: ${paper.updated.split("T")[0]}`);
22
+ }
23
+ const cats = paper.categories.map((c) => {
24
+ const label = ARXIV_CATEGORIES[c.term];
25
+ return label ? `${c.term} (${label})` : c.term;
26
+ });
27
+ lines.push(`**Categories**: ${cats.join(", ")}`);
28
+ if (paper.doi)
29
+ lines.push(`**DOI**: ${paper.doi}`);
30
+ if (paper.journalRef)
31
+ lines.push(`**Journal**: ${paper.journalRef}`);
32
+ if (paper.pdfUrl)
33
+ lines.push(`**PDF**: ${paper.pdfUrl}`);
34
+ if (paper.comment)
35
+ lines.push(`**Comment**: ${paper.comment}`);
36
+ lines.push(`\n### Abstract\n\n${paper.summary}`);
37
+ return lines.join("\n");
38
+ }
39
+ function formatPaperListMarkdown(papers, total, start) {
40
+ const lines = [];
41
+ lines.push(`# arXiv Search Results\n`);
42
+ lines.push(`Showing ${papers.length} of ${total} results (offset: ${start})\n`);
43
+ papers.forEach((paper, i) => {
44
+ lines.push(`### ${i + 1 + start}. ${paper.title}`);
45
+ lines.push(`**arXiv**: [${paper.arxivId}](https://arxiv.org/abs/${paper.arxivId}) | ` +
46
+ `**Authors**: ${paper.authors.slice(0, 3).map((a) => a.name).join(", ")}${paper.authors.length > 3 ? " et al." : ""}`);
47
+ lines.push(`**Published**: ${paper.published.split("T")[0]} | ` +
48
+ `**Category**: ${paper.primaryCategory?.term ?? paper.categories[0]?.term ?? "N/A"}`);
49
+ lines.push(`> ${paper.summary.substring(0, 300)}${paper.summary.length > 300 ? "..." : ""}`);
50
+ lines.push("");
51
+ });
52
+ if (total > start + papers.length) {
53
+ lines.push(`*${total - start - papers.length} more results available. Use \`offset=${start + papers.length}\` to continue.*`);
54
+ }
55
+ return lines.join("\n");
56
+ }
57
+ function truncate(content) {
58
+ if (content.length <= CHARACTER_LIMIT)
59
+ return content;
60
+ return content.substring(0, CHARACTER_LIMIT) +
61
+ "\n\n> Content truncated due to size limit. Use pagination to fetch more.";
62
+ }
63
+ // ─── Shared schemas ────────────────────────────────────────────────────────────
64
+ const paginationSchema = {
65
+ limit: z.number().int().min(1).max(100).default(10).describe("Number of results to return (max 100)"),
66
+ offset: z.number().int().min(0).default(0).describe("Offset for pagination"),
67
+ };
68
+ const sortSchema = {
69
+ sort_by: z.nativeEnum(SortBy).default(SortBy.RELEVANCE).describe("Sort field: relevance | lastUpdatedDate | submittedDate"),
70
+ sort_order: z.nativeEnum(SortOrder).default(SortOrder.DESCENDING).describe("Sort order: ascending | descending"),
71
+ };
72
+ const responseFormatSchema = {
73
+ response_format: z
74
+ .nativeEnum(ResponseFormat)
75
+ .default(ResponseFormat.MARKDOWN)
76
+ .describe("Output format: markdown or json"),
77
+ };
78
+ // ─── Tool: arxiv_search ────────────────────────────────────────────────────────
79
+ server.registerTool("arxiv_search", {
80
+ title: "Search arXiv Papers",
81
+ description: "Search arXiv for academic papers using a free-text query. Supports boolean operators (AND, OR, NOT), " +
82
+ "field prefixes (ti: title, au: author, abs: abstract, cat: category, all:), " +
83
+ "e.g. 'ti:transformer AND cat:cs.LG'.",
84
+ inputSchema: z.object({
85
+ query: z.string().describe("Search query. May include arXiv field prefixes: ti:(title), au:(author), abs:(abstract), " +
86
+ "cat:(category), all:(any field). Supports AND/OR/NOT operators."),
87
+ ...paginationSchema,
88
+ ...sortSchema,
89
+ ...responseFormatSchema,
90
+ }),
91
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
92
+ }, async (params) => {
93
+ const result = await api.search({
94
+ query: params.query,
95
+ start: params.offset,
96
+ maxResults: params.limit,
97
+ sortBy: params.sort_by,
98
+ sortOrder: params.sort_order,
99
+ });
100
+ if (params.response_format === ResponseFormat.JSON) {
101
+ return {
102
+ content: [{ type: "text", text: truncate(JSON.stringify(result, null, 2)) }],
103
+ structuredContent: result,
104
+ };
105
+ }
106
+ return {
107
+ content: [
108
+ {
109
+ type: "text",
110
+ text: truncate(formatPaperListMarkdown(result.papers, result.totalResults, result.startIndex)),
111
+ },
112
+ ],
113
+ };
114
+ });
115
+ // ─── Tool: arxiv_get_paper ─────────────────────────────────────────────────────
116
+ server.registerTool("arxiv_get_paper", {
117
+ title: "Get arXiv Paper Details",
118
+ description: "Retrieve full details for one or more arXiv papers by their IDs (e.g. '2301.00001' or '2301.00001v2'). " +
119
+ "Returns title, authors, abstract, categories, PDF link, DOI, and journal reference.",
120
+ inputSchema: z.object({
121
+ ids: z
122
+ .array(z.string())
123
+ .min(1)
124
+ .max(20)
125
+ .describe("List of arXiv paper IDs (e.g. ['2301.00001', '1706.03762'])"),
126
+ ...responseFormatSchema,
127
+ }),
128
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
129
+ }, async (params) => {
130
+ const result = await api.getById(params.ids);
131
+ if (result.papers.length === 0) {
132
+ return { content: [{ type: "text", text: "No papers found for the given IDs." }] };
133
+ }
134
+ if (params.response_format === ResponseFormat.JSON) {
135
+ return {
136
+ content: [{ type: "text", text: truncate(JSON.stringify(result.papers, null, 2)) }],
137
+ structuredContent: { papers: result.papers },
138
+ };
139
+ }
140
+ const markdown = result.papers.map(formatPaperMarkdown).join("\n\n---\n\n");
141
+ return { content: [{ type: "text", text: truncate(markdown) }] };
142
+ });
143
+ // ─── Tool: arxiv_search_by_author ─────────────────────────────────────────────
144
+ server.registerTool("arxiv_search_by_author", {
145
+ title: "Search arXiv Papers by Author",
146
+ description: "Search arXiv for papers by a specific author name.",
147
+ inputSchema: z.object({
148
+ author: z.string().describe("Author name to search for (e.g. 'Yann LeCun', 'Hinton')"),
149
+ ...paginationSchema,
150
+ ...sortSchema,
151
+ ...responseFormatSchema,
152
+ }),
153
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
154
+ }, async (params) => {
155
+ const result = await api.search({
156
+ query: `au:${params.author}`,
157
+ start: params.offset,
158
+ maxResults: params.limit,
159
+ sortBy: params.sort_by,
160
+ sortOrder: params.sort_order,
161
+ });
162
+ if (params.response_format === ResponseFormat.JSON) {
163
+ return {
164
+ content: [{ type: "text", text: truncate(JSON.stringify(result, null, 2)) }],
165
+ structuredContent: result,
166
+ };
167
+ }
168
+ return {
169
+ content: [
170
+ {
171
+ type: "text",
172
+ text: truncate(formatPaperListMarkdown(result.papers, result.totalResults, result.startIndex)),
173
+ },
174
+ ],
175
+ };
176
+ });
177
+ // ─── Tool: arxiv_search_by_category ───────────────────────────────────────────
178
+ server.registerTool("arxiv_search_by_category", {
179
+ title: "Search arXiv Papers by Category",
180
+ description: "Browse or search papers within a specific arXiv subject category " +
181
+ "(e.g. cs.AI, cs.LG, cs.CV, stat.ML, quant-ph). Use arxiv_list_categories to see all available categories.",
182
+ inputSchema: z.object({
183
+ category: z
184
+ .string()
185
+ .describe("arXiv category code (e.g. 'cs.AI', 'cs.LG', 'stat.ML', 'quant-ph')"),
186
+ query: z
187
+ .string()
188
+ .optional()
189
+ .describe("Optional additional search query to filter within the category"),
190
+ ...paginationSchema,
191
+ sort_by: z.nativeEnum(SortBy).default(SortBy.SUBMITTED).describe("Sort field: relevance | lastUpdatedDate | submittedDate"),
192
+ sort_order: z.nativeEnum(SortOrder).default(SortOrder.DESCENDING).describe("Sort order: ascending | descending"),
193
+ ...responseFormatSchema,
194
+ }),
195
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
196
+ }, async (params) => {
197
+ const queryParts = [`cat:${params.category}`];
198
+ if (params.query)
199
+ queryParts.push(`AND all:${params.query}`);
200
+ const result = await api.search({
201
+ query: queryParts.join(" "),
202
+ start: params.offset,
203
+ maxResults: params.limit,
204
+ sortBy: params.sort_by,
205
+ sortOrder: params.sort_order,
206
+ });
207
+ if (params.response_format === ResponseFormat.JSON) {
208
+ return {
209
+ content: [{ type: "text", text: truncate(JSON.stringify(result, null, 2)) }],
210
+ structuredContent: result,
211
+ };
212
+ }
213
+ return {
214
+ content: [
215
+ {
216
+ type: "text",
217
+ text: truncate(formatPaperListMarkdown(result.papers, result.totalResults, result.startIndex)),
218
+ },
219
+ ],
220
+ };
221
+ });
222
+ // ─── Tool: arxiv_list_categories ──────────────────────────────────────────────
223
+ server.registerTool("arxiv_list_categories", {
224
+ title: "List arXiv Subject Categories",
225
+ description: "List the commonly used arXiv subject categories with their descriptions.",
226
+ inputSchema: z.object({}),
227
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
228
+ }, async () => {
229
+ const lines = ["# arXiv Subject Categories\n"];
230
+ let currentGroup = "";
231
+ for (const [code, label] of Object.entries(ARXIV_CATEGORIES)) {
232
+ const group = code.split(".")[0];
233
+ if (group !== currentGroup) {
234
+ lines.push(`\n## ${group.toUpperCase()}\n`);
235
+ currentGroup = group;
236
+ }
237
+ lines.push(`- **${code}** — ${label}`);
238
+ }
239
+ return { content: [{ type: "text", text: lines.join("\n") }] };
240
+ });
241
+ // ─── Start server ──────────────────────────────────────────────────────────────
242
+ async function main() {
243
+ const transport = new StdioServerTransport();
244
+ await server.connect(transport);
245
+ console.error("arXiv MCP server running on stdio");
246
+ }
247
+ main().catch((err) => {
248
+ console.error("Fatal error:", err);
249
+ process.exit(1);
250
+ });
251
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export interface ArxivAuthor {
2
+ name: string;
3
+ }
4
+ export interface ArxivCategory {
5
+ term: string;
6
+ scheme?: string;
7
+ label?: string;
8
+ }
9
+ export interface ArxivLink {
10
+ href: string;
11
+ rel?: string;
12
+ type?: string;
13
+ title?: string;
14
+ }
15
+ export interface ArxivPaper {
16
+ id: string;
17
+ arxivId: string;
18
+ title: string;
19
+ summary: string;
20
+ authors: ArxivAuthor[];
21
+ categories: ArxivCategory[];
22
+ primaryCategory?: ArxivCategory;
23
+ published: string;
24
+ updated: string;
25
+ links: ArxivLink[];
26
+ pdfUrl?: string;
27
+ doi?: string;
28
+ journalRef?: string;
29
+ comment?: string;
30
+ }
31
+ export interface ArxivSearchResult {
32
+ totalResults: number;
33
+ startIndex: number;
34
+ itemsPerPage: number;
35
+ papers: ArxivPaper[];
36
+ }
37
+ export declare enum SortBy {
38
+ RELEVANCE = "relevance",
39
+ LAST_UPDATED = "lastUpdatedDate",
40
+ SUBMITTED = "submittedDate"
41
+ }
42
+ export declare enum SortOrder {
43
+ ASCENDING = "ascending",
44
+ DESCENDING = "descending"
45
+ }
46
+ export declare enum ResponseFormat {
47
+ MARKDOWN = "markdown",
48
+ JSON = "json"
49
+ }
50
+ /** Major arXiv subject categories with friendly names */
51
+ export declare const ARXIV_CATEGORIES: Record<string, string>;
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,aAAa,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,oBAAY,MAAM;IAChB,SAAS,cAAc;IACvB,YAAY,oBAAoB;IAChC,SAAS,kBAAkB;CAC5B;AAED,oBAAY,SAAS;IACnB,SAAS,cAAc;IACvB,UAAU,eAAe;CAC1B;AAED,oBAAY,cAAc;IACxB,QAAQ,aAAa;IACrB,IAAI,SAAS;CACd;AAED,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAmCnD,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,54 @@
1
+ export var SortBy;
2
+ (function (SortBy) {
3
+ SortBy["RELEVANCE"] = "relevance";
4
+ SortBy["LAST_UPDATED"] = "lastUpdatedDate";
5
+ SortBy["SUBMITTED"] = "submittedDate";
6
+ })(SortBy || (SortBy = {}));
7
+ export var SortOrder;
8
+ (function (SortOrder) {
9
+ SortOrder["ASCENDING"] = "ascending";
10
+ SortOrder["DESCENDING"] = "descending";
11
+ })(SortOrder || (SortOrder = {}));
12
+ export var ResponseFormat;
13
+ (function (ResponseFormat) {
14
+ ResponseFormat["MARKDOWN"] = "markdown";
15
+ ResponseFormat["JSON"] = "json";
16
+ })(ResponseFormat || (ResponseFormat = {}));
17
+ /** Major arXiv subject categories with friendly names */
18
+ export const ARXIV_CATEGORIES = {
19
+ // Computer Science
20
+ "cs.AI": "Artificial Intelligence",
21
+ "cs.CL": "Computation and Language (NLP)",
22
+ "cs.CV": "Computer Vision and Pattern Recognition",
23
+ "cs.LG": "Machine Learning",
24
+ "cs.NE": "Neural and Evolutionary Computing",
25
+ "cs.RO": "Robotics",
26
+ "cs.CR": "Cryptography and Security",
27
+ "cs.DS": "Data Structures and Algorithms",
28
+ "cs.DC": "Distributed, Parallel, and Cluster Computing",
29
+ "cs.SE": "Software Engineering",
30
+ "cs.DB": "Databases",
31
+ "cs.IR": "Information Retrieval",
32
+ "cs.PL": "Programming Languages",
33
+ "cs.SY": "Systems and Control",
34
+ // Mathematics
35
+ "math.ST": "Statistics Theory",
36
+ "math.PR": "Probability",
37
+ "math.CO": "Combinatorics",
38
+ "math.OC": "Optimization and Control",
39
+ // Statistics
40
+ "stat.ML": "Machine Learning (Statistics)",
41
+ "stat.AP": "Applications",
42
+ "stat.CO": "Computation",
43
+ // Physics
44
+ "physics.comp-ph": "Computational Physics",
45
+ "quant-ph": "Quantum Physics",
46
+ "hep-th": "High Energy Physics (Theory)",
47
+ // Biology
48
+ "q-bio.NC": "Neurons and Cognition",
49
+ "q-bio.QM": "Quantitative Methods",
50
+ // Economics
51
+ "econ.ML": "Econometrics (ML)",
52
+ "econ.GN": "General Economics",
53
+ };
54
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAyCA,MAAM,CAAN,IAAY,MAIX;AAJD,WAAY,MAAM;IAChB,iCAAuB,CAAA;IACvB,0CAAgC,CAAA;IAChC,qCAA2B,CAAA;AAC7B,CAAC,EAJW,MAAM,KAAN,MAAM,QAIjB;AAED,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,oCAAuB,CAAA;IACvB,sCAAyB,CAAA;AAC3B,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB;AAED,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,uCAAqB,CAAA;IACrB,+BAAa,CAAA;AACf,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB;AAED,yDAAyD;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,mBAAmB;IACnB,OAAO,EAAE,yBAAyB;IAClC,OAAO,EAAE,gCAAgC;IACzC,OAAO,EAAE,yCAAyC;IAClD,OAAO,EAAE,kBAAkB;IAC3B,OAAO,EAAE,mCAAmC;IAC5C,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,2BAA2B;IACpC,OAAO,EAAE,gCAAgC;IACzC,OAAO,EAAE,8CAA8C;IACvD,OAAO,EAAE,sBAAsB;IAC/B,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,uBAAuB;IAChC,OAAO,EAAE,uBAAuB;IAChC,OAAO,EAAE,qBAAqB;IAC9B,cAAc;IACd,SAAS,EAAE,mBAAmB;IAC9B,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,0BAA0B;IACrC,aAAa;IACb,SAAS,EAAE,+BAA+B;IAC1C,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,aAAa;IACxB,UAAU;IACV,iBAAiB,EAAE,uBAAuB;IAC1C,UAAU,EAAE,iBAAiB;IAC7B,QAAQ,EAAE,8BAA8B;IACxC,UAAU;IACV,UAAU,EAAE,uBAAuB;IACnC,UAAU,EAAE,sBAAsB;IAClC,YAAY;IACZ,SAAS,EAAE,mBAAmB;IAC9B,SAAS,EAAE,mBAAmB;CAC/B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@fre4x/arxiv",
3
+ "version": "1.0.1",
4
+ "description": "An arXiv MCP server for searching and retrieving academic papers.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "arxiv": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "typecheck": "tsc --noEmit",
16
+ "prepublishOnly": "npm run build",
17
+ "start": "node dist/index.js",
18
+ "dev": "tsx src/index.ts",
19
+ "watch": "tsc -w"
20
+ },
21
+ "keywords": [
22
+ "mcp",
23
+ "arxiv",
24
+ "mcp-server",
25
+ "research",
26
+ "papers",
27
+ "ai"
28
+ ],
29
+ "author": "fritzprix",
30
+ "license": "MIT",
31
+ "dependencies": {
32
+ "@modelcontextprotocol/sdk": "^1.26.0",
33
+ "axios": "^1.13.5",
34
+ "fast-xml-parser": "^4.5.0",
35
+ "zod": "^4.3.6"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^25.3.0",
39
+ "tsx": "^4.21.0",
40
+ "typescript": "^5.9.3"
41
+ }
42
+ }