veille-mcp
# veille-mcp
[](https://github.com/Kestrall/veille-mcp/actions/workflows/ci.yml)
An [MCP](https://modelcontextprotocol.io) server that turns a curated set of RSS feeds into a **Data, AI and cloud tech watch** any MCP client can use (Claude Code, Claude Desktop, Cursor…), with digests written by a **local LLM served by Ollama**: no article leaves the network to be summarised.
It runs in my home lab, in a Proxmox LXC container, next to the Ollama server.
```
Claude Code ──MCP / Streamable HTTP──▶ veille-mcp (LXC) ──▶ 16 RSS feeds
│
└──▶ Ollama qwen3:8b (LXC, local LLM)
```
## What it exposes
| Kind | Name | Purpose |
|------|------|---------|
| Tool | `latest_news` | Newest articles from the last *n* hours, filtered by category (`ia`, `data`, `cloud`) or source |
| Tool | `search_news` | Keyword search over titles and summaries, title matches ranked first |
| Tool | `digest` | Summary written by the local LLM: key facts with numbered citations, trends, impact for a European cloud provider |
| Tool | `list_sources` | Feeds being watched |
| Resource | `veille://sources` | Feed configuration as JSON |
| Prompt | `competitive_watch` | Ready-made competitive brief on a vendor (AWS, Scaleway, Google Cloud…) |
Tools return **typed, structured output** (Pydantic models) and are annotated read-only. Feeds are fetched concurrently and cached for 15 minutes; a failing feed is reported in `unavailable_sources` instead of breaking the call.
Default feeds cover AI labs and research (Hugging Face, OpenAI, Google AI, Simon Willison, The Decoder, MIT Technology Review…), data engineering (InfoQ, Databricks) and cloud vendors (OVHcloud, Scaleway, AWS, Google Cloud, Azure). Point `VEILLE_SOURCES` at your own JSON file to change them.
## Use it
```sh
pip install -e .
veille-mcp # stdio, for a local client
OLLAMA_URL=http://localhost:11434 veille-mcp --transport streamable-http --host 0.0.0.0
```
Add it to Claude Code:
```sh
claude mcp add --transport http veille http://<host>:8000/mcp
```
Then just ask: *"What happened in AI this week? Give me a digest focused on European cloud providers."*
| Variable | Default | |
|----------|---------|---|
| `OLLAMA_URL` | *(unset)* | Ollama endpoint; `digest` is disabled without it |
| `OLLAMA_MODEL` | `qwen3:8b` | Any model pulled in Ollama |
| `VEILLE_ALLOWED_HOSTS` | *(unset)* | Comma-separated `host:port` list; enables DNS-rebinding protection |
| `VEILLE_SOURCES` | bundled list | Path to a JSON feed list |
| `VEILLE_CACHE_TTL` | `900` | Feed cache, in seconds |
`digest` runs on CPU in my lab and takes a few minutes; raise the client timeout if needed (`MCP_TOOL_TIMEOUT=600000` for Claude Code).
## Deploy (Proxmox LXC)
```sh
tar --exclude=.venv --exclude=.git -czf - . | ssh root@<ct> 'mkdir -p /opt/veille-mcp && tar -xzf - -C /opt/veille-mcp && /opt/veille-mcp/deploy/install.sh'
```
`deploy/install.sh` creates a dedicated system user, a virtualenv and a hardened systemd unit (`ProtectSystem=strict`, `NoNewPrivileges`). Settings live in `/etc/veille-mcp.env`.
## Develop
```sh
pip install -e ".[dev]"
ruff check . && pytest --cov
```
Tests run the server in-process through the MCP client, with mocked HTTP for feeds and Ollama. CI runs lint and tests on Python 3.12 and 3.13.
## License
MIT
TDQS
Scored across 4 tools
Each tool has a fairly distinct role: listing feeds, fetching the most recent articles, keyword search, and LLM synthesis. The main overlap is between latest_news and search_news, which both return articles, but the descriptions clearly differentiate them by time window versus keyword matching.
list_sources and search_news follow a clear verb_noun snake_case pattern, but latest_news is adjective_noun and digest is a bare noun, breaking the convention. The set remains readable, but the pattern is not fully predictable.
Four tools is a reasonable scope for a read-only news monitoring server, covering discovery, browsing, searching, and summarization. It is slightly thin in that there is no tool for source management or fetching a single article, but nothing feels redundant.
The core read workflows of a veille tool are covered: list sources, get latest, search, and produce a digest. Minor gaps exist, such as retrieving full article content or managing/filtering sources, but an agent can work around these for typical monitoring tasks.