Self-hosted AI news agent ā MCP tools for Claude, ChatGPT & Cursor. Ask your AI anything.
3.9K
š FREE to test, run locally, or deploy wherever containers run. Your AI assistant gets live news in under 60 seconds. Just pull and go.
docker pull jsoprych/elko-news-mcp:latest
A self-hosted news daemon that polls RSS/Atom feeds and serves articles via MCP (Model Context Protocol), REST API, and a web dashboard.
Connect your AI assistant (Claude, Cursor, etc.) and ask: "What's in the news today?" or "Summarize tech news from the last 2 hours."

š Full documentation & examples ā github.com/jsoprych/elko-docsā
š³ Docker Hub ā hub.docker.com/r/jsoprych/elko-news-mcpā
docker pull jsoprych/elko-news-mcp:latest
ok / fail / dead) is now tracked persistently. The /health endpoint reports status: degraded when feeds are broken and shows feeds_ok / feeds_fail / feeds_dead counts. New GET /v1/feed-health endpoint returns the full per-feed status table.--log-max-output 2000 to start recording every MCP tool call and REST query to SQLite. Browse recent calls at GET /v1/logs. Disabled by default (zero overhead).Assuming Docker is installed ā cut and paste into your terminal:
docker run -d \
--name elko-news \
-p 8081:8081 \
-v elko-news-data:/data \
jsoprych/elko-news-mcp:latest
Once running, open the dashboard: http://localhost:8081ā
To stop, restart, or remove the container:
docker stop elko-news # stop
docker start elko-news # restart
docker rm elko-news # remove container (data volume kept)
docker rm elko-news && docker volume rm elko-news-data # full removal (container + data)
Connect to Claude Code, Cursor, or ChatGPT:
curl -s localhost:8081/mcp.json > .mcp.json
services:
elko-news:
image: jsoprych/elko-news-mcp:latest
ports:
- "8081:8081"
volumes:
- elko-news-data:/data
restart: unless-stopped
volumes:
elko-news-data:
| Variable | Default | Description |
|---|---|---|
ELKO_EASY_KEY | bundled key | Rate-limit token (91-day demo; override with your own) |
ELKO_KEY_SECRET | ā | Enable pro-key HMAC validation (optional) |
ELKO_REVOCATION_URL | ā | Pro-key revocation list URL (requires ELKO_KEY_SECRET) |
The bundled easy key expires ~91 days after each release. To run indefinitely
without rotation, generate your own key at elko.aiā or pass
ELKO_EASY_KEY="" to disable rate limiting entirely.
# Override the bundled key
docker run -p 8081:8081 -v elko-news-data:/data \
-e ELKO_EASY_KEY=your_key \
jsoprych/elko-news-mcp:latest
# Open mode (no rate limiting)
docker run -p 8081:8081 -v elko-news-data:/data \
-e ELKO_EASY_KEY="" \
jsoprych/elko-news-mcp:latest
HTTP transport (recommended ā connect to a running container):
curl -s localhost:8081/mcp.json > .mcp.json
Claude Desktop / Cursor stdio transport:
{
"mcpServers": {
"elko-news": {
"command": "docker",
"args": ["run", "--rm", "-i",
"-v", "elko-news-data:/data",
"jsoprych/elko-news-mcp:latest",
"mcp", "--db", "/data/elko-news.db"]
}
}
}
Python / LangChain / any HTTP client (JSON-RPC 2.0):
import requests
r = requests.post("http://localhost:8081/mcp", json={
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "news_headlines",
"arguments": {"hours": 24, "limit": 10}
}
})
print(r.json())
# curl equivalent
curl -s -X POST http://localhost:8081/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"news_headlines","arguments":{"hours":24,"limit":10}}}'
The /mcp endpoint is a standard MCP JSON-RPC 2.0 HTTP endpoint ā compatible with
any client that supports the MCP spec, including LangChain (langchain-mcp-adapters),
custom Python scripts, or direct HTTP calls.
| Tool | Description |
|---|---|
news_headlines | Latest articles, filter by source / category / hours |
news_search | Full-text search across title and summary |
news_sources | List active sources and article counts |
| saved procedures | Any stored SQL procedure becomes an MCP tool automatically |
| Method | Path | Description |
|---|---|---|
GET | /health | Status + article count |
GET | /v1/key-status | Current key mode and rate-limit info |
GET | /v1/headlines | Recent articles (?source=, ?category=, ?hours=, ?limit=) |
GET | /v1/search | Full-text search (?q=, ?source=, ?limit=) |
GET | /v1/sources | Article counts per source |
GET | /v1/export | Bulk export (?format=json|csv|md) |
POST | /v1/query | Run an ad-hoc SELECT query |
GET | /v1/procedures | List saved SQL procedures |
POST | /v1/procedures | Create / update a saved procedure |
DELETE | /v1/procedures/{name} | Delete a saved procedure |
POST | /v1/procedures/{name}/run | Run a saved procedure |
GET | /mcp.json | Ready-to-use .mcp.json for this server |
POST | /mcp | MCP JSON-RPC 2.0 HTTP endpoint |
Saved procedures are named SQL queries stored in the database. Each one is automatically exposed as an MCP tool ā your AI assistant can call them by name.
Create via dashboard: open http://localhost:8081ā , go to the Procedures tab, enter a name, description, and SELECT query, then click Save Procedure. Each saved procedure shows a JSON-RPC tab with ready-to-copy curl and Python snippets.
Three example procedures are seeded automatically on first run.
Create via REST API:
curl -s -X POST localhost:8081/v1/procedures \
-H "Content-Type: application/json" \
-d '{
"name": "fed_news_today",
"description": "Fed and rates news from the last 24h",
"sql": "SELECT title, url, published FROM articles WHERE published > unixepoch() - 86400 AND (title LIKE '\''%Fed%'\'' OR title LIKE '\''%rate%'\'') ORDER BY published DESC"
}'
Run a procedure:
curl -s -X POST localhost:8081/v1/procedures/fed_news_today/run
Pro: AI-assisted procedure creation ā describe what you want in plain English and your AI assistant (Claude, GPT, or any MCP-compatible client) generates and saves the SQL for you automatically.
All articles are stored in SQLite at /data/elko-news.db inside the container.
Mount a named volume or host path to persist across restarts:
# Named volume (recommended)
docker run -v elko-news-data:/data ...
# Host path
docker run -v /path/on/host:/data ...
| Port | Protocol | Description |
|---|---|---|
8081 | TCP | REST API + MCP HTTP + web dashboard |
Port conflicts: The elko server family uses staggered defaults ā
elko-news-mcpon 8081,elko-market-mcpon 8082 ā so both can run simultaneously. If another service occupies a port, override it:docker run -p 9081:8081 ... jsoprych/elko-news-mcp:latest
Content type
Image
Digest
sha256:02b0388e7ā¦
Size
5.1 MB
Last updated
4 months ago
docker pull jsoprych/elko-news-mcp