Skip to main content
Glama
README.md
# ๐Ÿง  arxiv-daily-mcp

> **A Model Context Protocol (MCP) server that wraps an arXiv CLI workflow.**
> Search arXiv in ๐Ÿ‡ฐ๐Ÿ‡ท Korean, ๐Ÿ‡จ๐Ÿ‡ณ Chinese, ๐Ÿ‡ฏ๐Ÿ‡ต Japanese, or ๐Ÿ‡บ๐Ÿ‡ธ English โ€” and save findings to a local Markdown vault.

[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org)
[![MCP](https://img.shields.io/badge/MCP-1.0+-green.svg)](https://modelcontextprotocol.io)
[![GitHub stars](https://img.shields.io/github/stars/nerin81-netizen/arxiv-daily-mcp)](https://github.com/nerin81-netizen/arxiv-daily-mcp/stargazers)

**๐ŸŒ Read in your language:** [English](README.md) ยท [ํ•œ๊ตญ์–ด](README.ko.md) ยท [ไธญๆ–‡](README.zh.md) ยท [ๆ—ฅๆœฌ่ชž](README.ja.md) ยท [Espaรฑol](README.es.md) ยท [Franรงais](README.fr.md) ยท [เคนเคฟเคจเฅเคฆเฅ€](README.hi.md) ยท [ุงู„ุนุฑุจูŠุฉ](README.ar.md)

[๐Ÿš€ Quickstart](#-quickstart) ยท [๐Ÿ›  Tools](#-tools-4) ยท [๐ŸŽฌ Demo](#-demo) ยท [๐Ÿ†š vs other arXiv MCPs](#-how-it-differs-from-existing-arxiv-mcps) ยท [๐Ÿ— Architecture](#-architecture) ยท [๐Ÿงช Development](#-development) ยท [๐ŸŒ Multilingual](#-multilingual-keywords)

---

## โœจ What this is

A simple MCP server that exposes a useful arXiv workflow as LLM-callable tools. The core idea:

> **Take a CLI script that you already run every day, and wrap it in MCP so you can invoke it with natural language from any MCP client.**

If you've ever found yourself typing the same `curl` / `python` / `arxiv` query into a terminal every morning โ€” this is what that looks like as an MCP tool.

## ๐Ÿ›  Tools (4)

| Tool | Args | Description | Example prompt |
|---|---|---|---|
| `get_today_papers` | `category`, `max_results` | Today's AI / business papers | "์˜ค๋Š˜ AI ๋…ผ๋ฌธ ์•Œ๋ ค์ค˜" |
| `search_papers` | `keyword`, `max_results` | **Multilingual** keyword search | "์—์ด์ „ํŠธ ๊ด€๋ จ ๋…ผ๋ฌธ" / "ๆ™บ่ƒฝไฝ“ ่ฎบๆ–‡" / "ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ ่ซ–ๆ–‡" |
| `save_paper_note` | `arxiv_id`, `note` | Save a paper to local `.md` vault | "์ด๊ฑฐ ๋ฉ”๋ชจํ•ด์ค˜" |
| `list_my_notes` | `keyword`, `limit` | Search / list saved notes | "๋‚ด ๋ฉ”๋ชจ ๋ณด์—ฌ์ค˜" |

### `get_today_papers(category, max_results=5)`

- `category`: `"ai"` (cs.AI+cs.CL+cs.LG) ยท `"business"` (econ.GN+q-fin) ยท `"all"` (์ „์ฒด)
- Returns: Markdown card-news list of today's submissions

### `search_papers(keyword, max_results=5)`

- `keyword`: any text in ๐Ÿ‡ฐ๐Ÿ‡ท Korean, ๐Ÿ‡จ๐Ÿ‡ณ Chinese, ๐Ÿ‡ฏ๐Ÿ‡ต Japanese, or ๐Ÿ‡บ๐Ÿ‡ธ English
- Auto-translates non-English keywords to English for arXiv search
- Returns: Markdown card-news of results, with translation note

### `save_paper_note(arxiv_id, note="")`

- `arxiv_id`: `"2507.01234"` or full URL `https://arxiv.org/abs/2507.01234`
- `note`: your commentary (optional)
- Returns: path to saved file (default: `~/memos/YYYY-MM-DD_arxiv_<id>.md`)

### `list_my_notes(keyword="", limit=10)`

- `keyword`: filter by title / content (optional)
- Returns: list of recently saved note files

## ๐Ÿš€ Quickstart

### Install

```bash
pip install arxiv-daily-mcp
```

Or from source:

```bash
git clone https://github.com/nerin81-netizen/arxiv-daily-mcp
cd arxiv-daily-mcp
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
```

### Register with your MCP client

#### Claude Desktop

`~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "arxiv-daily": {
      "command": "arxiv-daily-mcp"
    }
  }
}
```

#### Cursor / Cline

`.cursor/mcp.json` or workspace settings:

```json
{
  "mcpServers": {
    "arxiv-daily": {
      "command": "arxiv-daily-mcp"
    }
  }
}
```

#### Any MCP-compatible client

This server uses the standard `stdio` transport and exposes 4 tools via JSON-RPC โ€” it works with any client that follows the [MCP spec](https://modelcontextprotocol.io).

## ๐ŸŽฌ Demo

### Korean keyword (auto-translated to English)

```text
๐Ÿ‘ค ์—์ด์ „ํŠธ ๊ด€๋ จ ๋…ผ๋ฌธ ์ฐพ์•„์ค˜

๐Ÿค– Claude:
๐Ÿ” '์—์ด์ „ํŠธ' ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ โ€” ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด โ†’ ์˜์–ด: 'agent' (5ํŽธ)

1. **Distributed Attacks in Persistent-State AI Control**
   ๐Ÿ‘ฅ Josh Hills, Ida Caspary, Asa Cooper Stickland
   ๐Ÿ“… 2026-07-02 | ๐Ÿท๏ธ cs.AI
   ๐Ÿ”— https://arxiv.org/abs/2607.02514v1
```

### Chinese keyword

```text
๐Ÿ‘ค ๆ™บ่ƒฝไฝ“ ็›ธๅ…ณ่ฎบๆ–‡

๐Ÿค– Claude:
๐Ÿ” 'ๆ™บ่ƒฝไฝ“' ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ โ€” ๐Ÿ‡จ๐Ÿ‡ณ ไธญๆ–‡ โ†’ ์˜์–ด: 'agent' (5ํŽธ)
```

### Japanese keyword

```text
๐Ÿ‘ค ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ ่ซ–ๆ–‡ใ‚’ๆŽขใ—ใฆ

๐Ÿค– Claude:
๐Ÿ” 'ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ' ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ โ€” ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž โ†’ ์˜์–ด: 'agent' (5ํŽธ)
```

### Save + retrieve

```text
๐Ÿ‘ค ์ฒซ ๋ฒˆ์งธ ๋…ผ๋ฌธ ๋ฉ”๋ชจํ•ด์ค˜ โ€” ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ๋ณด์•ˆ ํฅ๋ฏธ๋กญ๋‹ค

๐Ÿค– Claude:
โœ… ์ €์žฅ ์™„๋ฃŒ: `~/memos/2026-07-06_arxiv_2607.02514.md`

๐Ÿ‘ค ๋‚ด ๋ฉ”๋ชจ ๋ณด์—ฌ์ค˜

๐Ÿค– Claude:
๐Ÿ“š ๋‚ด arXiv ๋…ธํŠธ (1๊ฐœ)
  ยท `2026-07-06_arxiv_2607.02514.md` โ€” Distributed Attacks in Persistent-State AI Control
```

## ๐Ÿ†š How it differs from existing arXiv MCPs

GitHub has **466+ arXiv MCP repositories** (as of 2026-07-05). The most popular, `blazickjp/arxiv-mcp-server`, is excellent โ€” but built for a different audience.

| | `blazickjp/arxiv-mcp-server` โญ 2,933 | `mcp-simple-arxiv` โญ 198 | `arxiv-daily-mcp` (this) |
|---|---|---|---|
| **Keyword languages** | ๐Ÿ‡บ๐Ÿ‡ธ English only | ๐Ÿ‡บ๐Ÿ‡ธ English only | ๐Ÿ‡ฐ๐Ÿ‡ท๐Ÿ‡จ๐Ÿ‡ณ๐Ÿ‡ฏ๐Ÿ‡ต๐Ÿ‡บ๐Ÿ‡ธ **4 languages** |
| **Output format** | JSON / raw data | Text only | **Markdown card-news** (emoji + bullets) |
| **Note archive** | โŒ | โŒ | โœ… **Local `.md` vault** |
| **Note search** | โŒ | โŒ | โœ… `list_my_notes(keyword=โ€ฆ)` |
| **Status** | Maintained | Maintained | Active (v0.1.0) |

### Three reasons it can coexist

1. **Different language audience.** The 2,933-star leader is English-only. This server is designed for non-English researchers first.
2. **Different output shape.** The leader returns raw JSON / data tables. This server returns **card-news Markdown** โ€” readable directly inside any chat UI.
3. **Different workflow.** The leader is search-and-read. This server includes **archival**: save a paper to your local Markdown vault with one sentence, then `list_my_notes` to recall it later.

## ๐ŸŒ Multilingual keywords

The translation dictionary ships with the package โ€” **no API call, no latency, no rate limit**.

| Language | Keywords |
|---|---|
| ๐Ÿ‡ฐ๐Ÿ‡ท Korean (28) | ์—์ด์ „ํŠธ, ์ธ๊ณต์ง€๋Šฅ, ๋จธ์‹ ๋Ÿฌ๋‹, ๋”ฅ๋Ÿฌ๋‹, ์ž์—ฐ์–ด์ฒ˜๋ฆฌ, ์ปดํ“จํ„ฐ๋น„์ „, ๊ฐ•ํ™”ํ•™์Šต, ์ƒ์„ฑํ˜•, ๋ณ€์••๊ธฐ, ํ™•์‚ฐ๋ชจ๋ธ, ๊ฒ€์ƒ‰์ฆ๊ฐ•, ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ, ๋กœ๋ณดํ‹ฑ์Šค, ์ถ”์ฒœ์‹œ์Šคํ…œ, ๊ทธ๋ž˜ํ”„์‹ ๊ฒฝ๋ง, ํŒŒ์šด๋ฐ์ด์…˜๋ชจ๋ธ, ๊ฑฐ๋Œ€์–ธ์–ด๋ชจ๋ธ, ํ”„๋กฌํ”„ํŠธ, ๋ฏธ์„ธ์กฐ์ •, ์ •๋ ฌ, ์•ˆ์ „์„ฑ, ํ™˜๊ฐ, ์ถ”๋ก , ๊ณ„ํš, ๋„๊ตฌ์‚ฌ์šฉ, ๋ฉ”๋ชจ๋ฆฌ, ์ฒด์ธ, โ€ฆ |
| ๐Ÿ‡จ๐Ÿ‡ณ Chinese (23) | ๆ™บ่ƒฝไฝ“, ไบบๅทฅๆ™บ่ƒฝ, ๆœบๅ™จๅญฆไน , ๆทฑๅบฆๅญฆไน , ่‡ช็„ถ่ฏญ่จ€ๅค„็†, ่ฎก็ฎ—ๆœบ่ง†่ง‰, ๅผบๅŒ–ๅญฆไน , ็”Ÿๆˆๅผ, ๅ˜ๅŽ‹ๅ™จ, ๆ‰ฉๆ•ฃๆจกๅž‹, ๅคšๆจกๆ€, ๆœบๅ™จไบบ, ๆŽจ่็ณป็ปŸ, ๅ›พ็ฅž็ป็ฝ‘็ปœ, ๅŸบ็ก€ๆจกๅž‹, ๅคง่ฏญ่จ€ๆจกๅž‹, ๆ็คบ, ๅพฎ่ฐƒ, ๅฏน้ฝ, ๆŽจ็†, ๅทฅๅ…ทไฝฟ็”จ, ้“พ, ไปฃ็† |
| ๐Ÿ‡ฏ๐Ÿ‡ต Japanese (24) | ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ, ไบบๅทฅ็Ÿฅ่ƒฝ, ๆฉŸๆขฐๅญฆ็ฟ’, ๆทฑๅฑคๅญฆ็ฟ’, ่‡ช็„ถ่จ€่ชžๅ‡ฆ็†, ใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟใƒ“ใ‚ธใƒงใƒณ, ๅผทๅŒ–ๅญฆ็ฟ’, ็”Ÿๆˆ, ๅค‰ๅœงๅ™จ, ๆ‹กๆ•ฃใƒขใƒ‡ใƒซ, ๆคœ็ดขๆ‹กๅผต, ใƒžใƒซใƒใƒขใƒผใƒ€ใƒซ, ใƒญใƒœใƒƒใƒˆ, ๆŽจ่–ฆใ‚ทใ‚นใƒ†ใƒ , ใ‚ฐใƒฉใƒ•ใƒ‹ใƒฅใƒผใƒฉใƒซใƒใƒƒใƒˆใƒฏใƒผใ‚ฏ, ๅŸบ็›คใƒขใƒ‡ใƒซ, ๅคง่ฆๆจก่จ€่ชžใƒขใƒ‡ใƒซ, ใƒ—ใƒญใƒณใƒ—ใƒˆ, ๅพฎ่ชฟๆ•ด, ใ‚ขใƒฉใ‚คใƒกใƒณใƒˆ, ๆŽจ่ซ–, ่จˆ็”ป, ใƒ„ใƒผใƒซไฝฟ็”จ, ่จ˜ๆ†ถ, ๅนป่ฆš |

**Detection algorithm:**

1. If the input contains Hangul (๊ฐ€-ํžฃ) โ†’ Korean lookup
2. Else if it contains Kana (ใ-ใƒฟ) โ†’ Japanese lookup
3. Else if it contains CJK ideographs (ไธ€-้ฟฟ) โ†’ Chinese lookup
4. Else โ†’ English (passed through unchanged)

Unknown keywords are passed through as-is โ€” so a partial match still searches arXiv directly.

## ๐Ÿ— Architecture

```
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      stdio/JSON-RPC      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  LLM Client     โ”‚ โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ โ”‚  arxiv-daily-mcp     โ”‚
โ”‚  (Claude/Cursor) โ”‚                          โ”‚  (FastMCP server)    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                                        โ”‚ urllib
                                                        โ–ผ
                                                 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                                                 โ”‚  arXiv API   โ”‚
                                                 โ”‚  export.arxivโ”‚
                                                 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                                        โ”‚
                                                        โ–ผ (save_paper_note)
                                                 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                                                 โ”‚  ./memos/    โ”‚
                                                 โ”‚  *.md vault  โ”‚
                                                 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
```

**Key design choices:**

- **stdio transport** โ€” MCP standard
- **FastMCP** โ€” Anthropic's official Python SDK
- **urllib only** โ€” zero external HTTP dependencies (works in any minimal Python environment)
- **In-process translation dictionary** โ€” no LLM call, no rate limit, no per-keyword latency
- **Configurable MEMO_DIR** โ€” set via env var for Docker / multi-user setups

## ๐Ÿงช Development

```bash
# Install dev dependencies
pip install -e ".[dev]"

# Run MCP Inspector (browser UI)
npx @modelcontextprotocol/inspector arxiv-daily-mcp

# Test stdio JSON-RPC directly
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | arxiv-daily-mcp
```

### Unit test the translation layer

```python
from arxiv_daily_mcp.server import _translate_keyword

assert _translate_keyword("์—์ด์ „ํŠธ") == ("agent", "ko")
assert _translate_keyword("ๆ™บ่ƒฝไฝ“") == ("agent", "zh")
assert _translate_keyword("ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ") == ("agent", "ja")
assert _translate_keyword("agent") == ("agent", "en")
```

## ๐ŸŒ Roadmap

- [x] v0.1.0 โ€” 4 tools, stdio, multilingual (75 keywords)
- [ ] v0.2.0 โ€” `weekly_summary` tool (Friday digest)
- [ ] v0.3.0 โ€” More categories (cs.RO, cs.CV, q-fin.ST)
- [ ] v0.4.0 โ€” PyPI release
- [ ] v1.0.0 โ€” HTTP transport (remote access)
- [ ] v1.1.0 โ€” More languages (Spanish, French, German, Hindi)
- [ ] v2.0.0 โ€” Note format plugins (Notion, Apple Notes, Bear)

## ๐Ÿค Contributing

Issues and PRs welcome. Particularly useful:

- ๐ŸŒ More language keywords (especially in cs.RO, q-fin, stat.ML)
- ๐Ÿ“‚ New paper categories
- ๐Ÿ“ Note format options (Notion API, Apple Notes, Bear)
- ๐Ÿ› Bug reports with reproduction steps

## ๐Ÿ“œ License

MIT

## ๐Ÿ™ Credits

- Built with [Anthropic MCP Python SDK](https://github.com/modelcontextprotocol/python-sdk)
- Paper data from [arXiv.org](https://arxiv.org) (open API)
- Inspired by the [modelcontextprotocol/servers](https://github.com/modelcontextprotocol/servers) reference collection

---

> ๐ŸŒŸ If this MCP saved you a few minutes of research workflow, consider starring the repo โ€” it helps others find it.