inoreader-mcp
One line summary: This is an MCP server for Inoreader that lets an AI assistant read, search, and triage your RSS articles and manage your feeds, folders, tags, and saved pages through the Inoreader API.
Read your feeds: get unread counts, fetch articles with filters (stream, read/unread/starred, date range, pagination, compact mode), grab article IDs, and retrieve full stored HTML content.
Search: keyword search across all feeds.
Organize subscriptions: list feeds with their folders, subscribe/edit/unsubscribe, bulk categorize feeds into folders, reassign feeds between folders, rename folders, and find/apply replacements for broken feeds.
Manage saved items: list saved web pages (including "removable" cleanup candidates), get a deduplicated union of starred / saved pages / Keep-tagged items, and batch-remove saved pages.
Tag and mark articles: mark read/unread/starred, apply or remove custom tags in bulk, batch per-group tag operations, and mark all items in a feed or folder read.
Analyze feed health: Bayesian category-pooled engagement analysis, cleanup title suggestions for uncategorized feeds, and feed replacement discovery by comparing stored posts.
Calibrate the Inoreader Intelligence classifier: extract existing summary recommendations/confidence, build reliability diagrams with ECE, monotonicity, threshold bounds and recall posteriors, and get audit-article recommendations.
Monitor API budget: locally cached rate-limit status and quota estimates, with verified read-back on every write (verified/unverified/failed counts) and no blind replay of ambiguous writes.
Authenticate: one-time OAuth setup via
setup_auth(browser URL plus code exchange).Optional extras (README): a local semantic "taste index" for finding similar saved items and checking novelty of an idea, and a single-process HTTP-only feed-priority system for maintaining a folder of priority sources; plus resources (
usage,rate-limits,subscriptions,folders,unread-counts, article content template) and guided prompts (triage, feed health, organize, digest, saved-page review, classifier analysis).
Provides tools for managing an Inoreader account, allowing users to triage articles, analyze feed health, manage subscriptions, and organize feeds with folders and tags.
Enables interaction with RSS feeds, allowing for article retrieval, unread count tracking, and subscription management via the Inoreader platform.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@inoreader-mcp Summarize the 5 most recent unread articles from my Tech folder"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
inoreader-mcp
MCP server for the Inoreader RSS reader API. Lets Claude help you triage articles, analyze feed health, and manage subscriptions.
Setup
1. Create an Inoreader API application
Go to the Inoreader Developer Portal and create a new application.
Set the redirect URI to
http://localhost:3333/callbackNote your Client ID and Client Secret
2. Install
This project is not published to npm. The name inoreader-mcp on the npm registry
belongs to an unrelated project, so npx inoreader-mcp installs someone else's code.
Build it from source instead (Node 24 or newer: the taste index uses node:sqlite):
git clone https://github.com/justmytwospence/inoreader-mcp
cd inoreader-mcp
npm install && npm run build3. Add to Claude Code
claude mcp add -s user \
-e INOREADER_CLIENT_ID=your-client-id \
-e INOREADER_CLIENT_SECRET=your-client-secret \
inoreader -- node /absolute/path/to/inoreader-mcp/dist/index.jsOr for Claude Desktop, add to your config file:
{
"mcpServers": {
"inoreader": {
"command": "node",
"args": ["/absolute/path/to/inoreader-mcp/dist/index.js"],
"env": {
"INOREADER_CLIENT_ID": "your-client-id",
"INOREADER_CLIENT_SECRET": "your-client-secret"
}
}
}
}4. Authenticate
On first use, ask Claude to call the setup_auth tool. It will give you an OAuth URL to open in your browser. After authorizing, copy the code parameter from the redirect URL and pass it back. Tokens are saved to ~/.config/inoreader-mcp/tokens.json and refresh automatically.
Or run it as a service (Docker)
cp .env.example .env # fill in the INOREADER_* values
docker compose up -dThe server then speaks Streamable HTTP
at http://<host>:8000/mcp (also at /), with a health check at /health, for 2026-07-28 and
older session-based clients alike. Running as a service adds two things a stdio process cannot do:
It receives the OAuth redirect. Set
INOREADER_REDIRECT_URI(and the redirect URI on your Inoreader app) tohttps://<this server>/callback.setup_auththen returns a link; authorize, land on/callback, and the tokens are saved. Nothing to paste.It keeps the grant alive. Inoreader's refresh token expires on its own after a couple of weeks unused, so the server refreshes it every
INOREADER_KEEPALIVE_HOURS(default 12) and, ifNTFY_URL+NTFY_TOPICare set, pushes an alert when a refresh fails.
Variable | Default | Meaning |
| (required) | Your Inoreader app |
|
| Must byte-match the app's redirect URI |
|
| Token and rate-limit state |
|
| Refresh interval in HTTP mode; |
| (unset) | Optional ntfy alerts for failed refreshes |
|
|
|
|
| HTTP port |
| (any) | Comma-separated hostnames allowed in the |
| (off) |
|
| (unset) | JSON configuration enabling the feed-priority tools in single-process HTTP mode |
| (built-in: starred + highlights) | Path of the JSON file naming the index's sources and tiers |
| (download on first use; | Directory holding the embedding model files, so nothing is downloaded |
|
| ONNX threads for the embedding model |
the variables a Karakeep source names | (unset) | Its base URL and API key; the config file holds only their names |
Images: ghcr.io/justmytwospence/inoreader-mcp, published for amd64 and arm64 by pushing a
vX.Y.Z tag.
Related MCP server: ttrss-mcp
Taste index
An optional, local semantic index of what you saved and valued: find saved items close to a piece of text, and check whether a text repeats something already saved. Similarity measures topical overlap, not quality: it is not a score of whether something is any good.
It is off unless INOREADER_TASTE_INDEX=on, and then adds four tools (33 instead of 29). Stdio
users who do not set it are unaffected: the model and node:sqlite are never loaded.
What gets indexed is configuration, not code. INOREADER_TASTE_CONFIG names a JSON file of
sources and ordered tiers; nothing about your tags, labels or services is built in. Without a
file the index covers what every account has, starred items and highlighted (annotated) items.
An example file, for an account that saves to an Archive label, marks the best with Clip, and
also keeps Karakeep bookmarks:
{
"sources": [
{"name": "archive", "type": "inoreader-stream", "stream": "user/-/label/Archive"},
{"name": "clip", "type": "inoreader-stream", "stream": "user/-/label/Clip"},
{"name": "highlights", "type": "inoreader-annotations"},
{"name": "karakeep", "type": "karakeep", "url_env": "KARAKEEP_API_URL", "key_env": "KARAKEEP_API_KEY", "min_words": 300}
],
"tiers": [
{"name": "clip", "sources": ["clip"]},
{"name": "good", "sources": ["clip", "highlights", "karakeep"]},
{"name": "archive", "sources": ["*"]}
],
"default_tier": "good",
"novelty_threshold": 0.75
}Sources.
inoreader-stream: any stream ID (a label, a folder, starred, saved web pages).inoreader-annotations: the annotated stream, keeping each highlight and note.karakeep: your Karakeep bookmarks, for pages saved outside Inoreader (see below). Names are 1-32 characters of letters, digits,_and-.Per-source
exclude_domains. Any source may list domains ("exclude_domains": ["github.com"]); a domain also covers its subdomains, andwww.is ignored. An item from one of them does not count as a member of that source anywhere (tiers, filters, searches); an item no source counts any more is not searched at all. Applied when the index loads, so changing it needs only a restart: nothing is re-read or re-embedded.taste_index_statusreports how many items each source excludes.Tiers are ordered narrowest first and list source names;
*means all of them. An item is in a tier when any of its sources is listed.default_tierdefaults to the last (widest) tier andnovelty_thresholdto 0.75. The file is validated at start: an unknown source in a tier, a duplicate name or an unknowndefault_tierstops the server with a message naming the problem. The built-in default has sourcesstarredandhighlights, tiershighlightsthensaved(*), default tiersaved.Items are keyed by normalized URL (https, no
www., no fragment, trailing slash or/amp, no tracking parameters), so the same page saved through different routes is one row carrying several signals, one per source it belongs to. An item is deleted once its last signal is gone.Text comes from the stored feed HTML Inoreader already returns (no paid full-text extraction is ever started). One vector per item is embedded from
title + opening(~1,200 characters). Items in any tier but the widest also keep their cleaned text (capped at 20k characters) for longer excerpts. A teaser-only feed item falls back to Karakeep's crawl when the URLs match.Why Karakeep needs its own source. Inoreader's API reports an item's state only through its categories (read, starred, labels, annotated, ...). Sending an article to Instapaper, Pocket or Karakeep leaves nothing the API can read, and most Karakeep saves never pass through Inoreader. Such signals can only come from the destination's own API. If you want a send counted without one, also tag the item in Inoreader and list that label as an
inoreader-streamsource.Karakeep source.
url_envandkey_envname the environment variables holding the base URL and an API key; the file itself holds no secrets. Only link bookmarks count. Karakeep's own reader-view classifier decides whether a page is an article (not_readableis skipped,readablekept); where it gives no definite answer (uncertain,unavailable, not yet classified) the page needs at leastmin_wordswords (default 300)."use_reader_view": falsemakes the word count the only test. Checked against Karakeep 0.34.1.
How it runs. Vectors are 384-dimensional (Xenova/bge-small-en-v1.5, 8-bit quantized) in a
SQLite file at <INOREADER_CONFIG_DIR>/taste/index.sqlite, searched exactly in memory (a few
milliseconds for thousands of items). The model runs in a worker thread, loads on first use and
exits after 10 idle minutes, so steady state stays small. The index is rebuildable: a changed
model/schema or a damaged file starts it over (a rebuild costs about 15 Zone 1 reads). Ideas and
items are both embedded as passages, without BGE's query prefix.
Syncing. In HTTP mode the 12-hour keepalive job refreshes the tokens and then syncs the index in
the same tick; the first tick (60 seconds after start) is the backfill. A sync failure never
affects the refresh or its ntfy alert: it is logged and shown by taste_index_status. In stdio mode
there is no scheduler, only sync_taste_index. Disabling the keepalive (INOREADER_KEEPALIVE_HOURS=0)
also disables the scheduled sync.
A sync costs one Zone 1 read of stream membership per 10,000 members of each stream source (which also
catches removals), one content read per 20 new items, and one annotations read per 100 highlighted
items; Karakeep is local and costs no Inoreader reads. A first full build of two streams of ~1,000 items and an
annotated stream is about 55 reads (content is read 20 items at a time: a response carries each item's full stored HTML), an incremental sync 3 to 5. A sync keeps 25 reads in reserve
(like analyze_feeds) and, if quota is short, does nothing and leaves the index unchanged. A failing
source keeps its stored members and is reported; the others still apply. If the model cannot load,
items are stored without vectors and the next sync embeds them.
Tool | Description | API Cost |
| Saved items closest to a text, preferred tier first, then wider tiers ( | 0 |
|
| 0 |
| Configured sources and tiers, counts by source and tier, last sync per source, Zone 1 reads per sync, errors, model, whether the index is complete. | 0 |
| Run a sync now; returns the reads used. | about 3-5 Z1 (about 55 for a first build of ~1,000 items) |
While the index is still building, similar_saved and check_novelty report coverage (sources
synced, items indexed) so an empty answer is not mistaken for a real one.
Filters (both tools, all optional, all must pass, applied before ranking and k). They describe
the text and where it came from, not whether it is any good; clients combine them for their own
purpose, and can filter or rank further on the metadata each result carries.
Filter | Keeps items |
| with at least / at most this many words (whole stored text) |
| from / not from these domains (subdomains included, |
| held by at least one of these configured sources (after per-source excludes); combines with |
| whose opening has at least this many prose paragraphs |
A prose paragraph is a paragraph of at least 25 words ending in sentence punctuation, counted in
the item's opening (its first ~1,200 characters, cut at a sentence end), because the opening is all
the index keeps for items in only the widest tier; every item is measured the same way.
prose_ratio is the share of the opening's words in such paragraphs. Together they are a coarse
article-versus-page test: on a real index, READMEs, product pages, docs and shop pages mostly had
0-1 prose paragraphs or a ratio under 0.6, essays 2 or more and 0.6 or more, but about half the
GitHub READMEs still passed (pair it with exclude_domains) and a few essays with unusual markup
did not.
What the novelty score can and cannot tell. Measured on a real index of about 4,000 items:
paraphrases of an archived essay's thesis scored 0.58 to 0.78 against it, while ideas on the same
topic making a different point scored 0.62 to 0.76. Similarity separates related from
unrelated well, but not same point from same topic. A high novelty_threshold (about 0.78)
makes close rare and reliable; anything below it may still be the same point, so a client that
cares should read the nearest items and their similarity rather than the verdict alone.
In the image, set INOREADER_TASTE_INDEX=on and, for a config file, mount it and point
INOREADER_TASTE_CONFIG at it. The model files are in the image (/app/models, pinned and
checksummed), and the index lives in the /data volume under taste/. The image is about 390 MB.
Resources, measured in the image (docker run --rm --memory 1g --entrypoint node <image> dist/taste/bench.js embeds 1,500 synthetic items of 1,200 characters and prints peak RSS and
timing): peak RSS about 420 MB while embedding items of that size (about 300 tokens), about 650 MB
for texts that fill the model's 512 tokens, 0.16 s per item on one thread (a first build of
~1,300 items takes about 3 to 4 minutes, in a worker thread, so the server stays responsive).
After 10 idle minutes the worker exits and most of that memory is returned: the bench process falls
from its 420 MB peak to between 115 and 165 MB, against a baseline of 45 to 80 MB (the rest is
allocator slack, which MALLOC_TRIM_THRESHOLD_ in the image keeps small). A 1 GB memory limit is a comfortable ceiling; one CPU and INOREADER_TASTE_THREADS=1
are enough.
Feed priority
An optional, single-process HTTP-only feature for maintaining a folder of priority
sources. Set INOREADER_PRIORITY_CONFIG to a JSON file of named profiles. Without it,
no priority tools or local priority state are loaded; existing tools remain available.
A profile configures its folder, explicit positive streams, excluded topic folders,
Bayesian evidence requirements and calibration policy. Folder membership is additive:
feeds keep their existing topic folders. A minimal shadow configuration is:
{
"profiles": [{
"name": "priority",
"folder": "Priority",
"positive_streams": ["user/-/state/com.google/starred"],
"excluded_topic_folders": ["Priority"],
"auto_add_enabled": false,
"promotion_probability": null
}]
}Defaults are a 12-month historical window, strength-10 priors, 20 mature observations,
five positive engagements, seven maturation days, and the benchmark
max(0.20, 2 * topic_baseline). Add only actual positive article-tag streams to the
allowlist; collection verifies their type. With MCP_TRANSPORT=http and
INOREADER_PRIORITY_CONFIG pointing to the file, start explicitly using
refresh_feed_priority({profile: "priority", start_new: true}), then resume by the
returned snapshot_id. get_feed_priority({profile: "priority"}) reads local status.
These operations collect evidence but do not populate the folder.
The signal is explicit starred/tagged engagement, not the ordinary read flag. Operational folders, automated recommendation tags and negative feedback are not positive signals. IDs identify articles: differing saved-stream dates are deduplicated rather than rejected, and feed/cohort dates determine exposure and maturity. Historical rates describe retrievable history: retention and unknown subscription dates can bias them. Calibrated additions require complete, mature forward-observed evidence. Explicitly reviewed provisional mode instead uses mature historical evidence with the same exact category-pooled Beta–Binomial model; its cutoff is not empirically calibrated.
Tool | Purpose | API cost |
| Start explicitly or resume a named evidence snapshot; checkpoint each page. Mutates local state, never Inoreader membership. | Default 25, maximum 50 base Z1 reads/call; retries extra |
| Read local evidence, coverage, calibration and durable decisions, with pagination. | 0 |
| Apply an enabled policy's guarded | Local decisions cost 0; membership operations use fresh reads and verified writes |
A newly configured profile starts in shadow mode: automatic additions are disabled,
there is no default promotion-confidence cutoff, and no membership is seeded. The default
promotion_mode: "calibrated" retains prospective calibration and two-week confirmation.
An operator can explicitly choose promotion_mode: "provisional" with a matching
provisional_review acknowledging the lack of empirical calibration and a probability
cutoff of at least 0.95. That mode can act after one complete fresh snapshot, using at
least 20 historical articles aged seven days and five positive engagements. It keeps the
same topic-relative benchmark and five-addition limits. Set the review's config_hash
from get_feed_priority, with matching probability and an ISO reviewed_at; do not
fabricate a calibration review. activation reports the mode and readiness separately
from calibration. A posterior probability is not itself empirical calibration.
Missing, stale, partial or retention-inconsistent evidence cannot authorize additions.
The first bounded scan may take several days; provisional mode does not bypass it.
There is no automatic removal or unsubscribe action. Removal suggestions are advisory;
pin and remove require the user's explicit instruction. remove means removal from the
configured folder only. A durable exclusion is recorded before the remote edit, so the
next scan cannot silently add the source back. Pins, exclusions, pending outcomes and
replacement identities live in <INOREADER_CONFIG_DIR>/priorities/, shared by clients.
A malformed preference file fails closed rather than discarding the user's decisions.
Snapshots are explicit local records with collection timestamps, coverage and configuration identity. Status and calibration load the most recent eight completed weekly snapshots plus explicitly requested or active evidence; older snapshots remain on disk and can be read by ID. This bounds the working set without deleting user decisions or archived evidence. Snapshots do not restore the hidden response caching once removed from ordinary API reads. An ambiguous membership edit is reconciled from server state before another write; never blindly replay a timed-out edit. Manual membership changes between observations can only be detected when a subsequent complete read observes them; a remove-and-readd entirely between reads leaves no API history to reconstruct.
Run a configured feature behind one HTTP process, not independent stdio writers or replicas. The profile/decision gates are safeguards, not a separate authentication boundary: MCP tool annotations and a client's claim of human approval are not proof of authorization.
Resources
Context that MCP clients can read directly without tool calls.
Resource | URI | Description | API Cost |
|
| Local guide: costs, limits, all template examples and prompt names | 0 |
|
| Cached header observations, local attempt estimates, reset/cooldown timestamps | 0 |
|
| First 500 feeds with id, title, URL and folders; total/truncation disclosed | 1 Z1 |
|
| First 500 folders and tags each; totals/truncation disclosed | 2 Z1 |
|
| First 500 non-zero counts, descending; feed/folder counts overlap | 1 Z1 |
Article content template: inoreader://articles/{article_id}/content?max_chars={max_chars}.
Percent-encode the ID and supply a required integer max_chars from 1 to 20000;
for example inoreader://articles/123/content?max_chars=8000. Reading it costs one
Zone 1 content POST (safe-read retries extra). It returns bounded stored HTML,
truncation and provenance, never starts full-text extraction or paid processing.
The static usage guide includes these examples for clients that do not list templates
or consume initialize instructions. Discovery and prompt retrieval perform no HTTP
or account writes; live resource reads use the same authorized API as tools.
Tools
API primitives
Thin wrappers around individual Inoreader API endpoints.
Reading
Tool | Description | API Cost |
| Unread counts for all feeds/folders, sorted by count | 1 Z1 |
| Fetch articles with filters (stream, status, date range, pagination). | 1-2 Z1/page |
| Lightweight ID-only fetch for counting/batch ops. Use | 1 Z1 |
| Full HTML content for specific articles by ID | 1 Z1 |
| Keyword search across all feeds. Supports | 1 Z1/page |
Subscriptions
Tool | Description | API Cost |
| All feeds with folders, URLs, metadata | 1 Z1 |
| Subscribe, edit (rename/move), or unsubscribe | Subscribe 1-2 Z2; edit 1 Z2 + 1 Z1; unsubscribe 1 Z2 |
Organization
Tool | Description | API Cost |
| Mark read/unread/starred, apply/remove tags (batch support), verified | 1 Z2 + 1 Z1 per 50, up to 2 rounds |
| Grouped tag edits with read-back verification | 1 Z2 per 50 sharing an add/remove pair + 1 Z1 per 50 intents, up to 2 rounds |
| Mark all items in a feed/folder as read | 1 Z2 |
| All folders and tags with unread counts (unread only; use | 2 Z1 |
Account
Tool | Description | API Cost |
| Authenticated user info | 1 Z1 |
| Check remaining API budget (reads persisted state) | 0 |
Composite tools
Higher-level workflows that combine multiple API calls or add client-side logic.
Feed management
Tool | Description | API Cost |
| Feeds with no folder, as compact tuples | 1 Z1 |
| Deterministic cleaned-up title proposals for uncategorized feeds — strips vendor boilerplate ( | 1 Z1 |
| Verified bulk folder assignment from | 1 Z2/assignment + 1-3 Z1; reconciliation adds up to 1 Z2/shortfall |
| Verified moves require destination present AND source absent | 1 Z2/assignment + 1-3 Z1; reconciliation adds up to 2 Z2/shortfall |
| For a broken feed: where the old address redirects, the feeds its site advertises, and conventional paths, each compared with the posts Inoreader stored from the old feed. | 2 Z1 + site fetches |
| Swap a subscription to a new feed URL keeping its title and folders; the old one is removed only after the new one is confirmed. | 2-3 Z2 + 3 Z1 |
| Bayesian feed health analysis with category-level priors. Degrades and reports rather than exhausting the read budget. | 3 + pages [+ 1 Z1/feed for volume] |
Saved items
Tool | Description | API Cost |
| Bounded, deduplicated union with | Up to 3 Ă— |
| List saved pages with | 1 Z1/page |
| Batch-remove saved pages by ID. Verified. | 1 Z2 + 1 Z1 per 50, up to 2 rounds |
Classifier calibration
Tool | Description | API Cost |
| Read existing Intelligence summaries; cap flags disclose partial coverage, errors fail loudly | 4-80 Z1 + optional population pages (default 30, max 200) |
| Reliability diagram, ECE, monotonicity violations, threshold diagnostic, Manski FNR bounds, audit-conditional recall posterior | same as extract |
| Active-learning suggestions for which recommend-skip articles to audit | same as extract |
Starred articles, saved web pages, and Keep-tagged items are separate, overlapping streams.
get_saved_items reads at most 100 items per page per collection; total_count,
by_collection and saved_via describe the fetched pages, not the whole account
unless complete=true. Resume individual streams with get_articles and the reported
continuation; membership may be incomplete while pages remain. count_only in
get_saved_web_pages counts one IDs page of at most 10000, with total_is_exact
and continuation, not an unconditional account total.
The keep tag (via manage_tags add_tag='keep') protects a page from cleanup without starring it. Use get_saved_web_pages(filter='removable') for pages that are neither starred nor kept.
Z1 = Zone 1 (read), Z2 = Zone 2 (write). Costs above are base requests;
safe-read retries are additional attempts. Read inoreader://usage and
get_rate_limit_status before expensive work. All 29 default tools (33 with the taste index, plus three when feed priority is configured) explicitly declare all
four safety hints; these are advisory, not authorization or approval enforcement.
JSON text results are preserved alongside structured data (legacy top-level arrays
appear under structuredContent.items). Output schemas are declared and validated
for stable ID/saved-union/folder-write shapes.
Prompts
Pre-built workflows that combine resources and tools into guided tasks.
Prompt | Description | Arguments |
| Review unread articles, summarize each, suggest read/star/skip |
|
| Analyze feed engagement, identify unsubscribe candidates |
|
| Find feeds with no folder and suggest assignments | -- |
| Digest recent articles grouped by source with key themes |
|
| Review saved pages, decide which to keep or remove | -- |
| Build a reliability diagram for the Inoreader Intelligence classifier from verified-tagged articles |
|
Classifier calibration workflow
If you use Inoreader Intelligence to classify articles as worth reading vs. skippable, the calibration tools let you treat that LLM as a binary classifier and analyze its reliability over time using only data already in Inoreader (no new LLM calls).
1. Configure the prompt
In Inoreader Intelligence settings, create a custom summary prompt:
Summarize this article in 2-3 sentences. Then on new lines, output exactly:
RECOMMENDATION: read | skip
CONFIDENCE: <integer 0-100>
Be conservative — most articles are not worth reading in full. Recommend "read"
only if the article likely contains substantive new information that cannot be
obtained from the summary alone.Optionally set up an Inoreader automation rule with the "Create summary" action so summaries are auto-generated for new articles in folders you care about.
2. Tag articles after reading
When you finish reading an article, apply one of these tags via manage_tags (forward slashes are part of the label name, not a folder hierarchy):
Tag | Meaning |
| Opened a recommend-read article, was worth it (true positive) |
| Opened a recommend-read article, wasn't worth it (false positive) |
| Opened a recommend-skip article as an audit, was worth it (false negative caught) |
| Opened a recommend-skip article as an audit, wasn't worth it (true negative confirmed) |
3. Run the analysis
Call the analyze-classifier prompt periodically (or once verified counts pass ~30).
It runs analyze_classifier_calibration once, checks data_summary for sufficient
labels and cap flags, then reviews the reliability diagram and diagnostics. It does
not repeat the same extraction merely to inventory labels.
4. Optionally audit
If you want to validate that the calibration curve extends below the decision threshold, call recommend_audit_articles. It returns a small batch of recommend-skip articles weighted by where the calibration curve has the most uncertainty. Read them, apply the audit/* tags, and the next analyze_classifier_calibration run will produce a posterior over recall using that data.
Why this is structured this way
This is a selective labels problem: you observe ground truth for articles the LLM recommended (you read them), and not for articles it told you to skip (unless you audit). The calibration curve on the recommended slice is fully identified from observed data — that's the headline product, with per-bin Beta-Binomial posteriors and an isotonically-smoothed monotone curve. Below the decision threshold, behavior is unobserved without audits; that's why the threshold diagnostic only states an upper bound (via monotonicity) and the recall posterior only appears once audit/* tags exist.
Write verification
Every bulk write reads its own result back and reports only what the server confirms.
This exists because of a specific failure. A 42-feed reassign_feeds call returned
{"succeeded": 42, "failed": 0} having actually moved 21: eleven feeds had not moved,
and fourteen had been added to the destination without being removed from the source —
from a single request carrying both a= and r= that Inoreader answered 200. The
discrepancy surfaced days later, by reading all 1818 subscriptions back by hand.
Two things allowed it. succeeded counted HTTP 2xx responses rather than applied
changes, and by_folder was built from the input map, so it could not represent a
shortfall at all. Inoreader also returns 200 "OK" for an edit to a feed that does not
exist, so no amount of inspecting the request or its response can establish what
happened. Only reading the state back can.
So the bulk tools preflight known worst-case write/verification costs, apply, wait, re-read, reconcile observed shortfalls once, and report. Missing articles/feeds or failed verification are unknown, not permission to replay an ambiguous write:
Field | Meaning |
| Confirmed present on the server |
| The write returned 2xx but the server does not show the change |
| The write itself errored |
| Skipped, e.g. budget |
isError is set whenever verified < intended. Trust verified, never the size of
your request. unverified is the bucket the old code reported as success.
Verification is cheap for folder writes — subscription/list returns every feed with
its labels in one request, so 4 feeds and 400 cost the same, in the zone that is not
scarce. Article tags cost one read per 50.
Rate Limits
Tool descriptions and the static guide include API costs. get_rate_limit_status
and inoreader://rate-limits make zero HTTP requests or auth probes, reading
persisted observations under ~/.config/inoreader-mcp/rate-limit.json.
Every API fetch attempt, including retries and transport failures, is counted; every response's quota headers are ingested, including 429/5xx. Usage/limit observations are timestamped per zone. Raw headers are distinct from conservative admission estimates for later local attempts or out-of-order responses. Reset/cooldown times are absolute and countdowns age. Missing/expired usage is unknown, not free calls; legacy snapshots without field-level provenance do not authorize quota estimates. Other clients/processes may consume unseen quota. Persistence is best-effort telemetry, not a cross-process lock; admission and the shared four-operation HTTP concurrency cap apply within one process (including public-site discovery and OAuth).
Safe reads alone retry up to four attempts, with jitter and Retry-After; delays over 60 seconds fail with a persisted cooldown instead of sleeping indefinitely. Writes are never blindly replayed after transport loss, 5xx or unexpected bodies. OAuth requests and public-site fetches are separate from Zone 1/2 API counts.
Expensive workflows preflight known headroom and recheck admission on each attempt.
analyze_feeds defaults to at most 100 base calls across tags/volume (max_requests
up to 500); it and classifier scans leave 25 known requests in reserve. Classifier
scans preflight the maximum page budget. Unknown quota still permits bounded work.
Preflight is not a reservation: other calls can consume budget before a workflow
finishes. Partial results/cap/degraded/error flags must not be treated as full coverage.
Offline checks (no account calls): npm test, npm run typecheck, npm run build.
CI and the release image job require these checks. INOREADER_MCP_MODEL_TESTS=1 npm test also
runs the real embedding model (set INOREADER_TASTE_MODEL_DIR to a local copy, else it is
downloaded): it checks that a paraphrase of an essay's thesis scores at or above 0.75 against it
and unrelated text below 0.6.
Do not hardcode a daily limit. This README claimed ~100/zone/day for a long time; the account it was developed against actually reports 2000. Ask the tool.
License
MIT, see LICENSE.
Available Tools
29 toolsanalyze_classifier_calibrationAnalyze classifier calibrationARead-onlyIdempotent
Build a reliability diagram for the LLM classifier on the verified-recommended slice. Bins articles by CONFIDENCE score, computes per-bin Beta-Binomial posteriors with an empirical-Bayes prior from the marginal worth-it rate, and reports posterior mean + 95% credible interval per bin. Pool-adjacent-violators (isotonic regression, weighted by bin n) gives a monotone-smoothed curve for visualization; per-bin intervals are the source of truth for inference. Reports ECE, monotonicity violations, a threshold diagnostic (lowest-score recommend-read bin gives an upper bound on what's just below threshold by monotonicity), Manski-style FNR bounds (always identifiable), and an audit-conditional recall posterior via Monte Carlo when audit data exists. Optional per-feed and per-folder slices for multicalibration-lite. Calls extract_classifier_data internally; cost is the same as that call. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: bins, refresh, min_bin_n, prompt_name, +7 more.
analyze_feedsAnalyze feedsARead-onlyIdempotent
Analyze feed health and explicit engagement with a category-pooled Beta-Binomial model (default 12 months, prior strength 10). By default counts starred, liked, broadcast and custom tags, excluding folders and passive system states; engagement_streams selects an explicit positive allowlist. Ordinary read flags are not engagement. Articles are deduplicated across positive streams. Categories with fewer than two engaged feeds use the global prior; multiple actual topic priors are averaged, excluding exclude_topic_folders. Reports exact equal-tailed 90% Beta bounds and posterior shapes only for complete, consistent counts. Missing, capped or failed coverage is unknown, not zero engagement. Retained engagement can exceed retained feed volume: this is flagged without silently flooring the denominator. Historical rates are retention/subscription-affected context, never authorization for automatic actions. Engagement and volume follow continuations within max_requests and the known 25-read reserve. Default sort unengaged_per_month estimates wasted posting volume; skipped sorts ascending by total minus engaged. Sorting engaged_count, title or days_since_newest skips engaged-feed volume reads; volume_sample optionally counts never-engaged active feeds. Costs 3 metadata reads plus engagement pages and optional volume pages EVERY call; no caching. max_requests counts base calls including failed calls; safe-read retries are extra (up to 4 attempts, counted in rate-limit status). Check get_rate_limit_status before large scans. See inoreader://usage for limits and URI examples.
Inputs: limit, folder, months, refresh, +7 more.
batch_edit_subscriptionsBatch edit subscriptionsAIdempotent
Deprecated: use categorize_feeds instead (more reliable, folder-centric input). Add multiple feeds to folders. Base cost is 1 Zone 2 request per assignment and 1-3 Zone 1 verification reads; reconciliation may add 1 Zone 2 per shortfall. Preflight requires worst-case headroom; read retries cost extra. Reports only assignments confirmed present on the server. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: edits (required). Returns: failed, rounds, intended, verified, +3 more
batch_manage_tagsBatch manage tagsADestructiveIdempotent
Apply different tags to different groups of articles in one call. Useful for triage workflows where you categorize items into multiple groups at once. Base cost is 1 Zone 2 per 50 articles sharing an add/remove pair, plus 1 Zone 1 per 50 article intents to verify, with up to a second round for observed shortfalls (preflighted). Reports verified/unverified per article and per operation, and sets an error when fewer landed than requested. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: operations (required).
categorize_feedsCategorize feedsAIdempotent
Assign feeds to folders in bulk. Pass a map of {folder_name: [stream_id, ...]}. Typical workflow: call get_uncategorized_feeds first, decide categories, then call this tool. Base cost is 1 Zone 2 request per assignment and 1-3 Zone 1 verification reads; reconciliation may add 1 Zone 2 per shortfall. Preflight requires worst-case headroom; read retries cost extra. Reads the subscription list back afterwards and retries anything that did not land, so the counts reflect what is actually on the server; sets isError when fewer changes were confirmed than requested. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: assignments (required). Returns: failed, rounds, intended, verified, +3 more
extract_classifier_dataExtract classifier dataARead-onlyIdempotent
Pull Inoreader Intelligence summaries for the four verification-tagged streams (read/worth-it, read/not-worth-it, audit/worth-it, audit/not-worth-it) and parse a binary RECOMMENDATION + CONFIDENCE classifier output from each. Optionally also scans a folder/window for the score distribution among unverified articles. The verified set is the labeled dataset for calibration analysis. The population scan is the candidate pool for audit recommendations. Costs 4-80 base Zone 1 requests for the verified set (4 streams, up to 20 pages each), plus up to population_pages if include_population=true; retries are extra. Preflights the maximum page budget plus a 25-request reserve against known quota. Missing streams fail rather than masquerading as complete data; cap flags disclose partial coverage. Reads existing summaries only: never starts paid Intelligence processing. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: refresh, prompt_name, population_pages, population_folder, +2 more.
find_feed_replacementFind a feed replacementARead-onlyIdempotent
Find a working feed for a subscription whose feed address is broken. Checks where the old address redirects, the feeds the site advertises (), and conventional feed paths, then compares each candidate with the posts Inoreader stored from the old feed. confidence 'high' means the candidate carries posts from the old feed or the old address redirects to it; 'medium' means same site but no shared posts; 'low' is anything else. recommended is the best high-confidence candidate, or null. Makes NO changes -- apply one with replace_feed. Costs 2 Zone 1 requests, plus up to 35 public-site fetch operations (each up to 6 HTTP requests including redirects, not Zone 1 API calls; shared process concurrency is capped at 4). Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: stream_id (required).
get_article_contentGet article contentARead-onlyIdempotent
Get full HTML content for specific articles by ID. Use after get_articles or search_articles to read full content. Costs 1 Zone 1 request. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: article_ids (required).
get_article_idsGet article IDsARead-onlyIdempotent
Lightweight fetch of article IDs from a stream without full content. Useful for counting or batch operations. For a middle ground with titles, use get_articles with compact=true instead. Costs 1 Zone 1 request. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: count, since, filter, stream_id, +1 more. Returns: ids, count, continuation
get_articlesGet articlesARead-onlyIdempotent
Fetch articles from a feed, folder, tag, or all items. Supports filtering by read/unread/starred status and date range. Costs 1 Zone 1 request per page plus 1 for total_count (disable with include_total=false). total_count is one IDs page of at most 10000; check total_count_is_exact and total_count_continuation before claiming a full total. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: count, order, since, filter, +4 more.
get_rate_limit_statusGet rate limit statusARead-onlyIdempotent
Check cached quota observations, reset/cooldown times and conservative local estimates. Costs 0 HTTP/auth requests. Header usage is authoritative only at observation time; missing/expired values mean unknown, not free calls. Every attempted API fetch (including retries and failures) is counted locally; other clients/processes are unseen. See inoreader://usage for request costs, URI examples and all workflow prompts.
Inputs: no named parameters.
get_saved_itemsGet saved itemsARead-onlyIdempotent
Get a bounded union of starred articles, saved web pages, and Keep-tagged items, deduplicated with saved_via membership from the fetched pages. Reads up to max_pages_per_collection (default 1, max 10) pages of 100 per collection: 3-30 Zone 1 requests before read retries. total_count is the fetched union, NOT an account-wide total unless complete=true; continuations and per-collection errors disclose partial coverage. Resume individual streams with get_articles. Preflights the maximum base cost against known remaining quota; unknown quota is not assumed unlimited. See inoreader://usage for budgets, template examples and prompts.
Inputs: compact, max_pages_per_collection. Returns: note, items, complete, collections, +3 more
get_saved_web_pagesGet saved web pagesARead-onlyIdempotent
List saved web pages (manually saved URLs, not from RSS feeds). Supports filtering to find cleanup candidates. Pages can be protected from cleanup by starring or tagging with 'Keep' (via manage_tags add_tag='Keep'). Use filter 'removable' to find pages that are neither starred nor kept -- candidates for review, not authorization to remove. Both count_only and listing apply the filter server-side via the Inoreader API. Set count_only=true to count one filtered IDs page (up to 10000 IDs, with continuation and total_is_exact; not necessarily a collection total) without content (1 Z1 request). Costs 1 Z1 request per page otherwise. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: count, filter, compact, count_only, +1 more.
get_uncategorized_feedsGet uncategorized feedsARead-onlyIdempotent
Get feeds that have no folder assignment, returned as compact [stream_id, title] tuples. Use this to identify feeds needing categorization, then call categorize_feeds with your assignments. Costs 1 Zone 1 request. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: include_url.
get_unread_countsGet unread countsARead-onlyIdempotent
Get unread article counts for all feeds and folders, sorted by count descending. Use this first to understand what needs attention. Costs 1 Zone 1 request. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: no named parameters.
get_user_infoGet user infoBRead-onlyIdempotent
Get current authenticated user information. Costs 1 Zone 1 request. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: no named parameters.
list_folders_and_tagsList folders and tagsARead-onlyIdempotent
List all folders, tags, and labels with their unread counts. Only unread_count is available here; counts including read items require separate paginated get_article_ids calls per tag (1 extra Zone 1 request per IDs page, at most 10000 IDs/page). Costs 2 Zone 1 requests. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: no named parameters.
list_subscriptionsList subscriptionsARead-onlyIdempotent
List RSS feed subscriptions with their folders, URLs, and metadata. Supports filtering by folder and searching by title/URL. Returns paginated results (default 100). Costs 1 Zone 1 request. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: limit, folder, offset, search.
manage_subscriptionManage subscriptionADestructive
Add, edit, or remove an RSS feed subscription. Base cost: subscribe 1 Zone 2 (+1 for optional title/folder edit), edit 1 Zone 2 + 1 Zone 1 read-back, unsubscribe 1 Zone 2. No ambiguous write is replayed; read retries cost extra. An edit returns the feed's resulting title and folders with an applied flag, so you can see whether the change landed -- if applied is true the work is done, do not repeat the call. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: action (required), title, feed_url, stream_id, +2 more.
manage_tagsManage tagsADestructiveIdempotent
Mark articles as read/unread/starred, or apply/remove custom tags. To mark as read: add_tag='read'. To star: add_tag='starred'. To unstar: remove_tag='starred'. To save/unsave a web page: add/remove_tag='saved-web-pages'. To protect a saved web page from cleanup: add_tag='Keep'. Supports batch operations on multiple articles. Use friendly names: 'read', 'starred', 'like', 'broadcast', 'saved-web-pages', 'Keep', or any custom label name. Base cost is 1 Zone 2 + 1 Zone 1 per 50 articles; observed shortfalls can require a second write/read round. Preflights both rounds; safe-read retries cost extra. Reports verified (confirmed on the server) separately from unverified, and sets an error when fewer landed than requested. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: article_ids (required), add_tag, remove_tag.
mark_all_readMark all readADestructive
Mark all articles in a feed or folder as read. Costs 1 Zone 2 request. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: stream_id (required), before.
reassign_feedsReassign feedsADestructiveIdempotent
Move feeds from one folder to another in bulk. Pass from_folder and a map of {new_folder: [stream_id, ...]}. Base cost is 1 Zone 2 request per assignment (combined add/remove), plus 1-3 Zone 1 verification reads. Reconciliation may add 2 Zone 2 requests per shortfall. Preflight requires worst-case headroom; read retries cost extra. A feed counts as moved only when the subscription list shows it in the destination AND no longer in the source; anything short of that is retried with the add and remove split into separate calls, and reported as unverified with isError set if it still does not land. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: assignments (required), from_folder (required). Returns: failed, rounds, intended, verified, +3 more
recommend_audit_articlesRecommend audit articlesARead-onlyIdempotent
Suggest a small batch of recommend-skip articles to read as audits. Scores candidates by bin uncertainty (CI width on the calibration curve), proximity to the decision threshold, and (optionally) sparse audit coverage. Extracts existing summaries once with include_population=true, then computes uncertainty locally (no second API scan). Base cost 4-80 Zone 1 verification pages plus up to population_pages (default 30, max 200); preflights the maximum plus a 25-request reserve. Never starts paid Intelligence processing. Already-audited articles are excluded. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: bins, feed, count, refresh, +6 more.
remove_saved_web_pagesRemove saved web pagesADestructiveIdempotent
Remove saved web pages by article ID. Use get_saved_web_pages with filter 'removable' to find candidates (pages that are neither starred nor tagged 'Keep'). To protect a page from cleanup without starring it, use manage_tags with add_tag='Keep'. Base cost is 1 Zone 2 + 1 Zone 1 per 50 pages, with up to a second round for observed shortfalls (preflighted); reports only removals confirmed on the server. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: article_ids (required).
rename_folderRename folderADestructive
Rename a folder/label. All feeds in the old folder are moved to the new name. Costs 1 Zone 2 request. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: new_name (required), old_name (required).
replace_feedReplace a feed subscriptionADestructive
Replace a subscription with a different feed URL, keeping its title and folders: subscribe to the new feed, put it in the same folders under the same title, confirm that landed, and only then unsubscribe the old one. If the new feed is already subscribed, its folders are topped up and the old one is removed. Read state of the old feed is not carried over. Use with find_feed_replacement. Costs 2-3 Zone 2 requests and 3 Zone 1 requests. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: stream_id (required), new_feed_url (required).
search_articlesSearch articlesARead-onlyIdempotent
Search for articles by keyword across all feeds. Costs 1 Zone 1 request per page. Uses undocumented but stable search endpoint. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: query (required), count, since, compact, +1 more.
setup_authSet up Inoreader authenticationADestructive
Authenticate with Inoreader via OAuth 2.0. If no code is provided, returns the authorization URL to visit. If a code is provided, exchanges it once for access tokens (overwrites locally saved credentials; OAuth requests are separate from Zone 1/2 accounting). A consumed code must not be replayed. Read inoreader://usage for workflow and budget guidance.
Inputs: code.
suggest_feed_cleanupSuggest feed cleanupARead-onlyIdempotent
Propose cleaned-up titles for feeds that have no folder assignment. Pure string normalization -- strips vendor boilerplate ("Blog on X", "X's Blog", trailing "RSS"/"Feed", and a trailing site-name suffix). Deterministic: no LLM judgment, same input always yields the same output. Makes NO changes -- apply a proposal with manage_subscription action='edit'. Costs 1 Zone 1 request. Base costs exclude safe-read retries (up to 4 attempts, each counted); honor cached status/cooldown. Never blindly replay uncertain writes. See inoreader://usage for limits, URI examples and prompts.
Inputs: include_unchanged.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 29 tools
Most tools target distinct resources+actions, and descriptions explicitly cross-reference alternatives (get_article_ids vs get_articles compact, batch_edit_subscriptions deprecated in favor of categorize_feeds). However there are several genuinely confusable pairs: get_saved_items vs get_saved_web_pages, mark_all_read vs manage_tags add_tag='read', batch_manage_tags vs manage_tags, and the analytics trio (extract_classifier_data / analyze_classifier_calibration / recommend_audit_articles). The detailed descriptions prevent most misselection, so it's above average but not clean.
Every tool is snake_case and verb-leading (get_, list_, manage_, analyze_, extract_, find_, replace_, rename_, mark_, search_). No camelCase or style mixing; the verb_noun pattern holds throughout except for intentional bulk-prefixed variants like batch_manage_tags.
29 tools is heavy for a single MCP server and pushes past the comfortable range; the set bundles core RSS operations with very niche analytics (calibration reliability diagrams, audit recommendation) that few agents will use. Each tool does have a defensible place, and the deprecated batch_edit_subscriptions adds redundancy, so it's borderline rather than clearly excessive.
Coverage is broad: auth, article reads/search/content, unread counts, folders/tags, read/star tagging, subscription add/edit/remove, bulk categorization and reassignment, saved web pages, feed health, and broken-feed replacement all exist with clear lifecycle paths. Minor gaps: no explicit delete_folder or create_folder operation (folder creation is implicit via categorize_feeds), and article-level deletion is absent, but these are workaroundable.
Maintenance
Related MCP Connectors
RSS & Atom feed manager with full-text search, AI curation, and remote MCP endpoint.
Managed cloud RSS and Atom feed reader with a remote Model Context Protocol (MCP) endpoint. Zero server setup required — enables AI agents like Claude to instantly subscribe to feeds, search full-text articles, extract readable content, and access curated AI editions ("Your Newspaper") over secure streamable HTTP.
Dive into the latest and greatest from the tech world with our Hacker News MCP server.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- FlicenseAqualityDmaintenanceAn MCP server that enables users to interact with their Feedbin RSS account directly through Claude. It provides tools for reading articles, managing read and starred states, and browsing subscribed feeds and tags.151-
- AlicenseAqualityDmaintenanceAn MCP server that enables AI assistants to manage Tiny Tiny RSS feeds, including reading articles, updating statuses, and searching content. It also provides tools for feed management and generating automated daily reports.156 npm3MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for interacting with FreshRSS via the Google Reader API, enabling subscription management, content reading, and item operations.2MIT
- AlicenseAqualityCmaintenanceAn MCP server for managing and querying RSS/news feeds, enabling real-time fetching, searching, and retrieval of feed items.521 npm1MIT