arxiv-daily-mcp
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.
[](LICENSE)
[](https://www.python.org)
[](https://modelcontextprotocol.io)
[](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.
This server cannot be deployed
Maintenance
ActivityStale
ResponsivenessNo issues